Подключение к новому плагину Bluez HDP с использованием DBUS из QT / C ++ - PullRequest
2 голосов
/ 15 февраля 2011

Я пытаюсь получить показания с устройства, использующего профиль Bluetooth Health Device Profile (в частности, Nonin Onyx II 9560BT).Используя это руководство , я смог сделать это, используя python поверх dbus.Сейчас я пытаюсь перенести его на 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;
}

Насколько я могу судить, объект dict«CreateApplication» соответствует 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

1 Ответ

1 голос
/ 18 февраля 2011

Теперь работает. Похоже, что ushort (0x1004) был приведен QVariant к типу int и, таким образом, выбран как код uint32 в коде bluez, что не соответствует ожиданиям.

Чтобы исправить это, я сделал следующее (может быть, другой способ, но у меня это сработало).

Я добавил объявление Metatype для ushort, затем зарегистрировал его. затем создал QVariant, содержащий значение, и использовал метод преобразования QVariants, чтобы задать метатип как ushort (или uint16 при воздействии на dbus).

#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;
}
...