我正在尝试使用蓝牙健康设备配置文件(特别是Nonin Onyx II 9560BT)从设备获取读数。使用这个guide,我已经能够使用python over dbus。现在我试图将它移植到C ++,因为我已经在应用程序中使用QT,我正在使用QT DBus绑定。
到目前为止,我已经接受了以下基于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”采用的dict对象对应于QT中对应于QVariantMap的a {sv}。 但是,我一直收到这个错误:
QDBusMessage(type=Error, service="", error name="org.bluez.Error.InvalidArguments", error message="Invalid arguments in method call", signature="", contents=([]) )
问题:我做错了什么? 根据freedesktop.org上的指南,qt文档和强大的谷歌,这是我已经得到的。
感谢您的帮助!
/ Keyz182
答案 0 :(得分:1)
现在有效。似乎ushort(0x1004)被QVariant转换为int,因此被bluez代码作为uint32拾取,这不是预期的。
要修复它,我做了以下(可能有另一种方式,但这对我有用)。
我为ushort添加了一个Metatype声明,然后注册了它。然后,创建一个包含该值的QVariant,并使用QVariants convert方法将元类型设置为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;
}