2011-02-15 71 views
1

我试图从使用蓝牙健康设备配置文件(特别是Nonin Onyx II 9560BT)的设备获取读数。使用这个guide,我已经能够使用python over dbus。现在我试图将它移植到C++中,并且因为我已经在应用程序中使用QT,所以我使用QT DBus绑定。使用DBT从QT/C++连接到新的Bluez HDP插件

到目前为止,我已经得到了基于this API来测试它下面的短节目:

#include <QtCore/QCoreApplication> 
#include <QtCore/QDebug> 
#include <QtCore/QStringList> 
#include <QtDBus/QtDBus> 

int main(int argc, char **argv) 
{ 
    QCoreApplication app(argc, argv); 

    if (!QDBusConnection::sessionBus().isConnected()) { 
     fprintf(stderr, "Cannot connect to the D-Bus session bus.\n" 
       "To start it, run:\n" 
       "\teval `dbus-launch --auto-syntax`\n"); 
     return 1; 
    } 

    QDBusInterface iface("org.bluez","/org/bluez","org.bluez.HealthManager",QDBusConnection::systemBus(),0); 

    QVariantMap map; 
    map.insert("DataType",ushort(1004));//same result with simply 1004 
    map.insert("Role","Sink"); 
    map.insert("Description","HDP Test Manager"); //Optional 
    //map.insert("ChannelType","Reliable");//Optional, same result with or without 
    //QList<QVariant> argumentList; 
    //argumentList.append(map); 

    QDBusPendingReply<> r = iface.call("CreateApplication",map); 

    qDebug() << r.reply(); 
    qDebug() << r.error(); 
    return 0; 
} 

至于我可以告诉大家,采取“CreateApplication”的字典对象对应于一个{SV }在QT中对应于QVariantMap。 不过,我不断收到此错误:

QDBusMessage(type=Error, service="", error name="org.bluez.Error.InvalidArguments", error message="Invalid arguments in method call", signature="", contents=([])) 

问:我在做什么错? 根据freedesktop.org上的指南,qt文档和强大的谷歌,这是我得到的。

感谢您的任何/所有帮助!

/Keyz182

回答

0

它现在有效。似乎ushort(0x1004)被QVariant转换为int,因此被bluez代码作为uint32提取,这不是预期的结果。

要解决它我做了以下(可能有另一种方式,但这对我有用)。

我为ushort添加了一个Metatype声明,然后注册它。然后创建一个包含该值的QVariant,并使用QVariants转换方法将metatype设置为ushort(或暴露于dbus时为uint16)。

#include <QtCore/QCoreApplication> 
#include <QtCore/QDebug> 
#include <QtCore/QStringList> 
#include <QtDBus/QtDBus> 

Q_DECLARE_METATYPE(ushort); //Added this to declare ushort as a metatype 

int main(int argc, char **argv) 
{ 
    QCoreApplication app(argc, argv); 

    int ushorttype = qDBusRegisterMetaType<ushort>(); //Register the ushort metatype and get it's id 

    if (!QDBusConnection::sessionBus().isConnected()) { 
     fprintf(stderr, "Cannot connect to the D-Bus session bus.\n" 
       "To start it, run:\n" 
       "\teval `dbus-launch --auto-syntax`\n"); 
     return 1; 
    } 

    QDBusInterface iface("org.bluez","/org/bluez","org.bluez.HealthManager",QDBusConnection::systemBus(),0); 

    QVariant dt(0x1004); 
    dt.convert((QVariant::Type)ushorttype); //convert to the new type 

    QVariantMap map; 
    map.insert("DataType",dt); 
    map.insert("Role","Sink"); 
    map.insert("Description","HDP Test Manager"); //Optional 

    QDBusPendingReply<> r = iface.call("CreateApplication",map); 

    qDebug() << r.isValid(); 
    qDebug() << r.reply(); 
    return 0; 
} 
+0

你好,只是好奇你有多远这个代码。我期待着做类似的事情。 – 2015-03-05 14:05:01