首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt5.7 Raspberry Pi 3和BlueZ 5.39的QBluetooth LE关贸总协定服务器实例

Qt5.7 Raspberry Pi 3和BlueZ 5.39的QBluetooth LE关贸总协定服务器实例
EN

Stack Overflow用户
提问于 2016-04-27 16:50:56
回答 1查看 3.6K关注 0票数 4

我正在尝试运行Qt5.7βQBluetooth关贸总协定服务器示例( https://doc-snapshots.qt.io/qt5-dev/qtbluetooth-heartrate-server-example.html )在一个覆盆子Pi 3与它的集成宽带蓝牙芯片。

蓝牙在我的Pi 3上工作得很好,hci0界面在重新启动之后“正在运行”:

代码语言:javascript
复制
root@raspberrypi:~/bluez-5.39# hciconfig -a
hci0:   Type: BR/EDR  Bus: UART
    BD Address: B8:27:EB:6F:71:A7  ACL MTU: 1021:8  SCO MTU: 64:1
    UP RUNNING PSCAN 
    RX bytes:2316 acl:0 sco:0 events:99 errors:0
    TX bytes:2676 acl:0 sco:0 commands:99 errors:0
    Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
    Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 
    Link policy: RSWITCH SNIFF 
    Link mode: SLAVE ACCEPT 
    Name: 'raspberrypi'
    Class: 0x000000
    Service Classes: Unspecified
    Device Class: Miscellaneous, 
    HCI Version: 4.1 (0x7)  Revision: 0xb6
    LMP Version: 4.1 (0x7)  Subversion: 0x2209
    Manufacturer: Broadcom Corporation (15)

我成功地下载、编译并安装了最新的BlueZ 5.39,它包含一个完整的DBus接口,用于BlueZ BLE功能:

代码语言:javascript
复制
http://www.kernel.org/pub/linux/bluetooth/bluez-5.39.tar.xz

我已经确认在path中获得的版本是正确的版本:

代码语言:javascript
复制
[bluetooth]# version
Version 5.39

我使用buildroot交叉编译QT5.7并将它的库部署到Pi中。我可以在我的主机上成功地构建并在Pi上运行得到的可执行文件。

关贸总协定的例子从Qt是非常简单的,我只添加了2 "qDebug“行,以看到一些控制台输出。为了完整起见,我会把它粘贴到这里:

代码语言:javascript
复制
#include <QtBluetooth/qlowenergyadvertisingdata.h>
#include <QtBluetooth/qlowenergyadvertisingparameters.h>
#include <QtBluetooth/qlowenergycharacteristic.h>
#include <QtBluetooth/qlowenergycharacteristicdata.h>
#include <QtBluetooth/qlowenergydescriptordata.h>
#include <QtBluetooth/qlowenergycontroller.h>
#include <QtBluetooth/qlowenergyservice.h>
#include <QtBluetooth/qlowenergyservicedata.h>
#include <QtCore/qbytearray.h>
#include <QtCore/qcoreapplication.h>
#include <QtCore/qlist.h>
#include <QtCore/qscopedpointer.h>
#include <QtCore/qtimer.h>

#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    QLowEnergyAdvertisingData advertisingData;
    advertisingData.setDiscoverability(QLowEnergyAdvertisingData::DiscoverabilityGeneral);
    advertisingData.setIncludePowerLevel(true);
    advertisingData.setLocalName("BlueZ 5 GATT Server");
    advertisingData.setServices(QList<QBluetoothUuid>() << QBluetoothUuid::HeartRate);

    QLowEnergyCharacteristicData charData;
    charData.setUuid(QBluetoothUuid::HeartRateMeasurement);
    charData.setValue(QByteArray(2, 0));
    charData.setProperties(QLowEnergyCharacteristic::Notify);
    const QLowEnergyDescriptorData clientConfig(QBluetoothUuid::ClientCharacteristicConfiguration,
                                                QByteArray(2, 0));
    charData.addDescriptor(clientConfig);

    QLowEnergyServiceData serviceData;
    serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary);
    serviceData.setUuid(QBluetoothUuid::HeartRate);
    serviceData.addCharacteristic(charData);

    const QScopedPointer<QLowEnergyController> leController(QLowEnergyController::createPeripheral());
    const QScopedPointer<QLowEnergyService> service(leController->addService(serviceData));
    qDebug() << "Beginning to advertise...";
    leController->startAdvertising(QLowEnergyAdvertisingParameters(), advertisingData,
                                   advertisingData);

    QTimer heartbeatTimer;
    quint8 currentHeartRate = 60;
    enum ValueChange { ValueUp, ValueDown } valueChange = ValueUp;
    const auto heartbeatProvider = [&service, &currentHeartRate, &valueChange]() {
        QByteArray value;
        value.append(char(0)); // Flags that specify the format of the value.
        value.append(char(currentHeartRate)); // Actual value.
        QLowEnergyCharacteristic characteristic
                = service->characteristic(QBluetoothUuid::HeartRateMeasurement);
        Q_ASSERT(characteristic.isValid());
        qDebug() << "Changing characteristic to: " << value;
        service->writeCharacteristic(characteristic, value); // Potentially causes notification.
        if (currentHeartRate == 60)
            valueChange = ValueUp;
        else if (currentHeartRate == 100)
            valueChange = ValueDown;
        if (valueChange == ValueUp)
            ++currentHeartRate;
        else
            --currentHeartRate;
    };
    QObject::connect(&heartbeatTimer, &QTimer::timeout, heartbeatProvider);
    heartbeatTimer.start(1000);

    auto reconnect = [&leController, advertisingData]() {
        leController->startAdvertising(QLowEnergyAdvertisingParameters(), advertisingData,
                                       advertisingData);
    };
    QObject::connect(leController.data(), &QLowEnergyController::disconnected, reconnect);

    return app.exec();
}

Pro档案:

代码语言:javascript
复制
TEMPLATE = app
TARGET = qt-gatt

QT += bluetooth
CONFIG += c++11

SOURCES += main.cpp

## Install directory
target.path = /home/pi
INSTALLS += target

当我在Pi上运行这个应用程序时,它会在重新启动后作为根用户运行并输出我的打印消息:

代码语言:javascript
复制
root@raspberrypi:/home/pi# ./qt-gatt 
Beginning to advertise...
Changing characteristic to:  "\x00<"
Changing characteristic to:  "\x00="
Changing characteristic to:  "\x00>"
Changing characteristic to:  "\x00?"

没有显示错误或警告,但我的设备中没有一个能看到它。我的iPhone和Mac可以看到其他的BLE设备,但不能看到Pi。代码将Pi设置为“可发现”。

我怎样才能使这件事成功/我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-04 14:45:19

您可能已经知道这一点,但我认为,对于实验模式,蓝宝石仍然需要用-E启动。

此外,您还可以在main()顶部添加以下行,以查看来自QBluetooth的日志记录。让我们知道你看到了什么或者弄明白了什么。我正在尝试做一件非常类似的事情,现在luck...and的日志记录在我的平台上似乎不起作用。

代码语言:javascript
复制
QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true"));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36896070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档