gpt4 book ai didi

c++ - 使用 QT/C++ 中的 DBUS 连接到新的 Bluez HDP 插件

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:35:34 26 4
gpt4 key购买 nike

我正在尝试从使用蓝牙健康设备配置文件的设备(特别是 Nonin Onyx II 9560BT)获取读数。使用这个 guide ,我已经能够通过 dbus 使用 python 来做到这一点。现在我正在尝试将它移植到 C++,因为我已经在应用程序中使用 QT,所以我正在使用 QT DBus 绑定(bind)。

到目前为止,我已经得到了以下基于 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对象对应于a{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

最佳答案

现在可以了。 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;
}

关于c++ - 使用 QT/C++ 中的 DBUS 连接到新的 Bluez HDP 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5008982/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com