使用 QT/C++ 中的 DBUS 连接到新的 Bluez HDP 插件
Posted
技术标签:
【中文标题】使用 QT/C++ 中的 DBUS 连接到新的 Bluez HDP 插件【英文标题】:Connecting to the new Bluez HDP plugin using DBUS from QT/C++ 【发布时间】:2011-06-27 21:30:16 【问题描述】:我正在尝试从使用蓝牙健康设备配置文件的设备(特别是 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 的 asv。 但是,我不断收到此错误:
QDBusMessage(type=Error, service="", error name="org.bluez.Error.InvalidArguments", error message="Invalid arguments in method call", signature="", contents=([]) )
问题:我做错了什么? 根据 freedesktop.org 上的指南、qt 文档和强大的 google,这是我所了解的。
感谢您的任何/所有帮助!
/Keyz182
【问题讨论】:
【参考方案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;
【讨论】:
您好,只是想知道您对这段代码做了多远。我想做类似的事情。以上是关于使用 QT/C++ 中的 DBUS 连接到新的 Bluez HDP 插件的主要内容,如果未能解决你的问题,请参考以下文章
如何将 dbus 和 policykit 连接到我在 python 中的函数?