web-dev-qa-db-fra.com

Utiliser BlueZ Stack comme périphérique (annonceur)

  • Objectif : Utilisez BlueZ et un dongle Bluetooth 4LE pour créer un périphérique qui annonce l'équivalent bluetooth de "Hello World".

  • Où je suis : J'ai actuellement la configuration de la pile BlueZ et téléchargée, je peux utiliser l'outil hci pour reconnaître et voir le dongle Bluetooth. J'ai bricolé avec hciconfig leadv mais je ne comprends pas très bien ce qui se passe.

  • De quelle aide je pense avoir besoin : je dois la faire passer à l'étape suivante. Si quelqu'un peut me diriger vers une bonne ressource, me guider à travers cela, ou quoi que ce soit, ce serait très apprécié. Si je dois faire un travail supplémentaire sur les jambes (recherche), je peux mais j'ai parcouru Google et SO avec autant de dérivés différents de cette question que je peux penser.

* J'ai également marqué cela comme CoreBluetooth dans l'espoir qu'un développeur iOS ait peut-être bricolé avec cela à un moment donné.

EDIT: En réponse à un commentaire, il semble prudent de dire quel est mon objectif final. J'aimerais finalement annoncer via le dongle le plus simple des messages/signaux simples et le récupérer sur un appareil iOS (CoreBluetooth). J'ai réussi à faire bien fonctionner le côté iOS (des tonnes de documentation par rapport au côté Linux), mais la partie difficile pour moi est d'obtenir cette configuration d'adaptateur en tant que périphérique. La pile BlueZ est une terrible énigme pour moi.

EDIT: Après plus de fouilles, je suis finalement tombé sur ce post: Connexion Raspberry Pi Bluetooth 4. . Cela m'a conduit vers le sujet d'un serveur du GATT, je vais continuer à approfondir ce sujet.

EDIT: Très bien donc ma quête d'apprentissage se poursuit. Au cours des deux derniers jours, j'ai approfondi les outils hci *, sdptool et gatttool. J'en suis arrivé au point de pouvoir configurer l'adaptateur pour qu'il annonce "hciconfig hci0 leadv". À ce stade, je peux "voir" l'adaptateur avec succès, mais je ne peux en fait rien lire. Je ne vois même pas le nom amical. Je continuerai de faire du camionnage, mais comme toujours, toute aide/suggestion est plus que bienvenue.

EDIT: Relevant Link, solide présentation de Bluetooth LE se rapportant à iOS. https://developer.Apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/AboutCoreBluetooth/Introduction.html#//Apple_ref/doc/uid/TP40013257-CH1-SW1

DERNIÈRE ÉDITION: Salut à tous, ce lien explique comment créer un iBeacon à l'aide d'un Raspberry Pi + BlueZ ... http://www.wadewegner.com/2014/05/create-an-ibeacon-transmitter-with -le-framboise-pi /

49
Ceryni

Avec votre dongle Bluetooth branché, l'exécution de la commande suivante vous indiquera le nom de l'appareil et donnera son état:

$ hciconfig

La sortie devrait ressembler à ceci:

hci0:    Type: BR/EDR  Bus: USB
     BD Address: 00:01:02:aa:bb:cc  ACL MTU: 1021:8  SCO MTU: 64:1
     DOWN
     RX bytes:1000 acl:0 sco:0 events:47 errors:0
     TX bytes:1072 acl:0 sco:0 commands:47 errors:0

Cela indique que le périphérique est appelé hci0 est dans un état inactif. Exécutez la commande suivante pour l'afficher:

$ Sudo hciconfig hci0 up

Maintenant, cela devrait ressembler à:

$ hciconfig
hci0:   Type: BR/EDR  Bus: USB
     BD Address: 00:01:02:aa:bb:cc  ACL MTU: 1021:8  SCO MTU: 64:1
     UP RUNNING
     RX bytes:1000 acl:0 sco:0 events:47 errors:0
     TX bytes:1072 acl:0 sco:0 commands:47 errors:0

Ensuite, exécutez l'exemple de commande suivant pour configurer les données publicitaires à envoyer.

$ Sudo hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 1a 1a ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5 00 00 00 00 00 00 00 00 00 00 00 00 00

Vous pouvez modifier les octets hexadécimaux (en commençant par 1e) pour envoyer des séquences d'octets différentes pour votre annonce. Celui qui envoie littéralement les codes ASCII pour "HELLO WORLD" utiliserait: 48 45 4c 4c 4f 57 4f 52 4c 44 ( EDIT: Mais vous devrez également préfixer ce message avec un en-tête valide, voir ici. )

Maintenant, utilisez la commande suivante pour activer la publicité sur le dongle, cela commencera à envoyer des paquets "Helo World".

$ Sudo hciconfig hci0 leadv 0

EDIT: la commande ci-dessus rend le service annoncé connectable. Si vous ne souhaitez pas autoriser les connexions, remplacez-le par $ Sudo hciconfig hci0 leadv 3

Vous pouvez également désactiver la publicité à l'aide de la commande suivante:

$ Sudo hciconfig hci0 noleadv

41
davidgyoung

en ajoutant plus d'informations ici (ref BlueZ5.x):

  • bluez n'expose pas l'api DBUS pour l'enregistrement du serveur gatt; vous avez une implémentation de profil disponible mais vous devez le configurer et le compiler avec l'option --enable-experimental ou activer gatt-example sous le dossier plugin qui enregistre certains serveurs gatt comme exemple

  • lorsque vous annoncez faire hciconfig hci0 leadv, faites attention aux données publiées. dans l'exemple ci-dessous pour iBeacon

    Sudo hcitool -i hci0 cmd 0x08 0x0008 1e **02 01 1a** ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5 00 00 00 00 00 00 00 00 00 00 00 00 00

    la partie en gras est pour une structure AD qui est relâchée dans le champ des drapeaux (vérifiez sous les spécifications bluetooth le format des données publicitaires). Avec ces paramètres de drapeaux, l'appareil se présente comme LE et BR-EDR simultanés.

    D'après mon expérience, lorsque vous faites de la publicité de cette manière, un appareil Android qui scanne le périphérique bluez agissant comme périphérique BLE déclenchera une connexion via Bluetooth classique (en raison des paramètres d'indicateur) et non via BLE (notez que la connexion Les procédures sont différentes pour LE et Classic.) Je ne sais pas comment Apple appareil central agit dans ce cas. Quoi qu'il en soit, vous pouvez définir 06 au lieu de 1A afin que la prise en charge BR-EDR ne soit pas annoncée. de cette façon, vous verrez une connexion via BLE.

Si vous souhaitez le tester à l'aide d'un appareil central Android, il existe une application nordique gratuite pour cela.

6
user3891941