web-dev-qa-db-fra.com

Utiliser hcitool pour définir les paquets publicitaires

Il existe un article de blog bien connu qui explique comment définir un dongle bluetooth 4 USB comme iBeacon. Cela se résume à cette commande magique:

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

Le problème avec cet exemple est qu’il est si opaque qu’il est difficile de l’utiliser dans un format plus général. J'ai pu le casser un peu:

Sudo hcitool -i hci0 cmd

envoie une commande hci au périphérique hci0

0x08 0x0008 

est tout simplement magique pour définir le package publicitaire, d’autres commandes de stackoverflow ont déclaré "utilisez-le simplement, ne demandez pas

1e

est la longueur en octets de l'ensemble du paquet de données suivant

02 01 1a 1a

Sont des drapeaux pour configurer le paquet publicitaire (détails sur demande)

ff 4c 00 ...

sont les «données spécifiques à l'entreprise» qui codent l'info iBeacon

Ce que j'ai essayé de faire est de remplacer les octets "FF ..." par les opcodes permettant de définir le paramètre NAME "04 09 41 42 43" (qui devrait le définir sur ABC), mais cela ne fonctionne pas.

Je suis surpris que hcitool ne nous donne pas quelques exemples sur la façon de définir le paquet publicitaire car cela serait très utile pour définir toutes sortes d'autres paramètres (comme TEMP ou POWER). Quelqu'un d'autre a-t-il déjà utilisé hcitool pour définir des paramètres tels que NAME?

11
ScottJenson

Non. Aucune de ces réponses n'est correcte et propre.

1) BLE a un jeu de commandes séparé. La commande "LE Set Advertising Data" doit être utilisée (voir 7.8.7 vol 2 partie E).

2) Les données publicitaires du groupe LE sont beaucoup plus complexes que celles expliquées ci-dessus. Il y a au moins deux champs d'une longueur d'un octet, le paquet doit avoir une longueur de 32 octets et être complété par un zéro, mais le premier octet de longueur ne doit pas être 0x1e (31) mais la longueur de la partie significative utilisée, contenant un ou plusieurs en-têtes. Chaque en-tête contient toujours une longueur, un octet AS Type (0x09 pour le nom local défini) et le nom.

SET LE NOM LOCAL:

hciconfig hci0 down
hciconfig hci0 up
hcitool -i hci0 cmd 0x08 0x0008 0c 0b 09 6c 69 6e 6b 6d 6f 74 69 6f 6e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
hciconfig hci0 leadv 0

0x0c: longueur du groupe d'en-têtes suivant 0x0b: longueur de cet en-tête 0x09: AD Type pour le nom complet reste 0x0a La longueur est le nom

6

Réponse tardive, mais cela pourrait être utile. Je l’ai trouvé en cherchant moi-même des solutions lors de l’utilisation de hcitool.

Si vous utilisez hcitool cmd --help, il vous dira quelque chose comme ceci: cmd <ogf> <ocf> .... Il est utile de consulter la Spécification de base Bluetooth pour savoir ce que 0x08 et 0x0008 seraient pour OGF et OCF. Plus précisément Vol. 2, partie E, 7.8

Pour les commandes de contrôleur LE, le code OGF est défini sur 0x08.

et pour l'OCF de 0x0008

Advertising_Data_Length, Advertising_Data

En résumé, avec 0x08 0x0008, vous indiquez que vous définissez (dans le contrôleur LE) la longueur des données envoyées. En ce qui concerne le nom, la longueur du paquet d’annonce BLE étant de 31 octets (1E), vous devez envoyer les 31 octets entiers. Donc, si vous n’avez que ABC comme nom, régler 04 09 41 42 43 est correct, mais ce n’est que cinq octets. Pour 31, vous devez ajouter 00 26 fois. Veillez simplement à ne pas ajouter trop ou trop peu.

En outre, je n'étais pas sous l'impression que l'annonce BLE. les paquets ont une taille fixe de 31 octets, mais ils sont au moins pour hcitool. Cela ne fonctionne pas lorsque vous définissez spécifiquement la taille sortante sur quelque chose de plus petit que 1E.

5
nomve

Découvrez cette réponse à une question similaire. En gros, il décrit comment télécharger le géant Bluetooth Core Spec et lire toutes les commandes qu'il vous propose. Vous pouvez utiliser la commande hcitool pour exécuter n'importe laquelle de ces commandes si vous pouvez simplement trouver le bon format (et déterminer ce que les commandes font réellement!)

Mise en garde majeure: Je n'ai pas essayé de définir le nom moi-même, mais en jetant un coup d'œil sur la spécification, il semble que cela soit décrit à la page 482 de la spécification dans la section "7.3.11 Écrire une commande de nom local". Selon cela, la commande consiste à:

OCF: 0x0013
Name (up to 248 bytes)

Je voudrais donc essayer une commande comme celle-ci:

hcitool -i hci0 cmd 0x08 0x0013 41 42 43

Un autre conseil: lorsque vous exécutez des commandes de ce type, essayez d’exécuter hcidump & pour que la commande s’exécute en arrière-plan. Ensuite, vous pouvez entrer des commandes expérimentales hcitool (ou même des commandes hciconfig) et consulter des détails annotés sur les commandes exécutées (lisibles par l'homme) et les erreurs éventuelles.

En utilisant le conseil ci-dessus, vous pouvez également essayer d’exécuter hciconfig name abc pour définir le nom local à l’aide de cet outil de ligne de commande, alors que vous exécutez un hcidump & en arrière-plan. Cela devrait vous montrer les valeurs de commande hcitool appropriées à utiliser.

3
davidgyoung

Il semblerait que vous deviez utiliser deux commandes plutôt qu'une. Les données iBeacon sont contenues dans les données "LE Set Advertising Data" et ont été mentionnées ailleurs dans ce message. Pour voir un nom convivial BLE, vous pouvez utiliser une commande supplémentaire "Définir les données de réponse d'analyse", le récepteur doit analyser votre appareil (plutôt que de lire passivement le paquet publicitaire). Ainsi, vous pouvez combiner l'exemple d'Angelo avec celui-ci pour définir le périphérique en tant que iBeacon et définir le "nom convivial", qui correspond aux données de réponse d'analyse.

Sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 00 00 00 00 C8 00
Sudo hcitool -i hci0 cmd 0x08 0x0009 0c 0b 09 6c 69 6e 6b 6d 6f 74 69 6f 6e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Cela a fonctionné pour moi en utilisant une boîte Ubuntu avec un dongle BLE, puis en recherchant la balise à l'aide de cette application Android BLE scanning

1
Matt Young