J'essaie d'exécuter l'exemple Qt 5.7 beta QBluetooth GATT Server (https://doc-snapshots.qt.io/qt5-dev/qtbluetooth-heartrate-server-example.html) sur un Raspberry Pi 3 avec sa puce intégrée Broadcom Bluetooth.Qt 5.7 QBluetooth LE Exemple de serveur GATT avec Raspberry Pi 3 et BlueZ 5.39
Bluetooth fonctionne très bien sur mon Pi 3 et l'interface hci0 est "UP RUNNING" après une nouvelle chaussure:
[email protected]:~/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)
J'ai téléchargé avec succès, compilé et installé le dernier BlueZ 5.39, qui contient une DBus complète interface avec la fonctionnalité BlueZ BLE:
http://www.kernel.org/pub/linux/bluetooth/bluez-5.39.tar.xz
J'ai confirmé que les versions ramassées dans le chemin sont la bonne version:
[bluetooth]# version
Version 5.39
J'ai utilisé buildroot pour compiler croisé Qt 5.7 et déployé ses bibliothèques sur le Pi. Je peux construire avec succès sur ma machine hôte et exécuter l'exécutable résultant sur le Pi. L'exemple GATT de Qt est très simple et j'ai seulement ajouté 2 lignes "qDebug" pour voir une sortie de console. Je vais le coller ici pour être complet:
#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, ¤tHeartRate, &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();
}
fichier Pro:
TEMPLATE = app
TARGET = qt-gatt
QT += bluetooth
CONFIG += c++11
SOURCES += main.cpp
## Install directory
target.path = /home/pi
INSTALLS += target
Quand je lance l'application sur la Pi en tant que root après une nouvelle chaussure - il fonctionne et envoie mes messages d'impression:
[email protected]:/home/pi# ./qt-gatt
Beginning to advertise...
Changing characteristic to: "\x00<"
Changing characteristic to: "\x00="
Changing characteristic to: "\x00>"
Changing characteristic to: "\x00?"
Aucune erreur ou aucun avertissement n'est affiché - mais aucun de mes périphériques ne peut le voir. Mon iPhone et Mac peuvent voir d'autres appareils BLE, mais pas le Pi. Le code définit le Pi comme "découvrable".
Comment puis-je faire ce travail/Qu'est-ce que je fais mal?
Remarque: Vos noms d'inclusion sont complètement faux. La pré-inclusion des noms d'inclusion avec 'QtModule /' est inutile et masque la mauvaise configuration du projet qmake. Les noms d'inclusion ont le format 'QType', pas' qtype.h'. Ce dernier * arrive * à travailler pour le moment, mais il n'est pas documenté et n'est pas garanti pour continuer à fonctionner. –
Merci Kuba, je vais considérer ça. Ceux-ci incluent les noms directement de l'exemple Qt, donc je ne les ai pas modifiés. – PhilBot
Malheureusement, certains exemples Qt ont besoin d'amour avant de pouvoir être considérés comme de bonnes pratiques :( –