2016-04-27 1 views
2

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, &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(); 
} 

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?

+0

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. –

+0

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

+1

Malheureusement, certains exemples Qt ont besoin d'amour avant de pouvoir être considérés comme de bonnes pratiques :( –

Répondre

1

Vous le savez peut-être déjà mais je pense que bluetoothd doit encore être démarré avec -E pour le mode expérimental.

Vous pouvez également ajouter la ligne suivante en haut de main() pour voir la journalisation à partir de QBluetooth. Dites-nous ce que vous voyez ou comprenez. J'essaie de faire une chose très similaire et d'avoir maintenant de la chance ... et la journalisation ne semble pas fonctionner sur ma plate-forme.