繁体   English   中英

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

[英]Connecting to the new Bluez HDP plugin using DBUS from QT/C++

我正在尝试使用蓝牙健康设备配置文件(特别是Nonin Onyx II 9560BT)从设备获取读数。 使用本指南 ,我已经能够在dbus上使用python做到这一点。 现在,我试图将其移植到C ++,并且由于我已经在应用程序中使用QT,所以我正在使用QT DBus绑定。

到目前为止,我已经基于此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文档和功能强大的google,据我所知。

感谢您提供的所有帮助!

/ Keyz182

现在可以使用了。 似乎ushort(0x1004)被QVariant强制转换为int,因此被bluez代码作为uint32接收,这不是预期的。

为了解决这个问题,我做了以下工作(可能有另一种方法,但这对我有用)。

我为ushort添加了元类型声明,然后注册了它。 然后,创建一个包含值的QVariant,并使用QVariants转换方法将元类型设置为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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM