[bluetooh] communication en c ( en cours)
-
- Elfe
- Messages : 623
- Inscription : dim. 27 avr. 2014, 09:32
[bluetooh] communication en c ( en cours)
Bonjour,
Je me suis fabriqué une télécommande pour commander à distance un drone, et j'aimerais pouvoir intégrer un système bluetooth à ma télécommande afin de pouvoir visualiser les mouvements sur mon ordi.
En gros, comment faire (en langage C) pour récupérer le bluetooth ? J'aimerais ensuite pouvoir manipuler ces données comme ci il y avait un jostick de brancher à mon pc.
Je me suis fabriqué une télécommande pour commander à distance un drone, et j'aimerais pouvoir intégrer un système bluetooth à ma télécommande afin de pouvoir visualiser les mouvements sur mon ordi.
En gros, comment faire (en langage C) pour récupérer le bluetooth ? J'aimerais ensuite pouvoir manipuler ces données comme ci il y avait un jostick de brancher à mon pc.
- Xorg
- Maître du Kyudo
- Messages : 1933
- Inscription : dim. 22 janv. 2012, 19:25
- Localisation : Entre le clavier et la chaise.
Re: [bluetooh] communication en c ( en cours)
Bonjour,
Je ne pense pas que la section "Aide archlinux" soit l'endroit le plus approprié, vu que ce n'est pas un soucis avec Arch Linux. Si je comprends bien, tu cherches à écrire toi-même un programme en C.
Est-ce que tu as recherché si de tels programmes existent déjà ? Ou peut-être des choses qui s'en approchent pour t'en inspirer.
Après, tu peux toujours chercher des exemples de code ou des tutoriels sur Internet. Par exemple, j'ai trouvé ce tuto qui montre un exemple avec bluez-libs.
Je ne pense pas que la section "Aide archlinux" soit l'endroit le plus approprié, vu que ce n'est pas un soucis avec Arch Linux. Si je comprends bien, tu cherches à écrire toi-même un programme en C.
Est-ce que tu as recherché si de tels programmes existent déjà ? Ou peut-être des choses qui s'en approchent pour t'en inspirer.
Après, tu peux toujours chercher des exemples de code ou des tutoriels sur Internet. Par exemple, j'ai trouvé ce tuto qui montre un exemple avec bluez-libs.

-
- Elfe
- Messages : 623
- Inscription : dim. 27 avr. 2014, 09:32
Re: [bluetooh] communication en c ( en cours)
Ok.
Et pour pouvoir communiquer avec un appareil exterieur via son PC, il faut que le bluetooth de notre pc soit activé ?
Et pour pouvoir communiquer avec un appareil exterieur via son PC, il faut que le bluetooth de notre pc soit activé ?
- Xorg
- Maître du Kyudo
- Messages : 1933
- Inscription : dim. 22 janv. 2012, 19:25
- Localisation : Entre le clavier et la chaise.
Re: [bluetooh] communication en c ( en cours)
Oui, sinon ça ne va pas fonctionner... Ça serait comme vouloir te connecter en WiFi avec ta carte-WiFi désactivée.
-
- Elfe
- Messages : 623
- Inscription : dim. 27 avr. 2014, 09:32
Re: [bluetooh] communication en c ( en cours)
Avec la doc de bluez, je me suis fais un petit programme permettant de "sniffer" les périphériques bluetooth à proximité.
Mais j'obtiens des choses assez bizzare.
Par exemple, avec mon programme j'obtiens pour un périphérique cette adresse : 00:73:FFFFFF8D:FFFFFFE6:53:FFFFFFE8
Alors que gnome-bluetooth me donne : 00:73:8D:E6:53:E8
Je ne comprend pas pourquoi des F se sont rajoutés alors que je ne fais que récupérer les octets de la trame.
Mais j'obtiens des choses assez bizzare.
Par exemple, avec mon programme j'obtiens pour un périphérique cette adresse : 00:73:FFFFFF8D:FFFFFFE6:53:FFFFFFE8
Alors que gnome-bluetooth me donne : 00:73:8D:E6:53:E8
Je ne comprend pas pourquoi des F se sont rajoutés alors que je ne fais que récupérer les octets de la trame.
- Xorg
- Maître du Kyudo
- Messages : 1933
- Inscription : dim. 22 janv. 2012, 19:25
- Localisation : Entre le clavier et la chaise.
Re: [bluetooh] communication en c ( en cours)
C'est étrange en effet tous ces octets qui se sont ajoutés. Peut-on voir le code que tu as écrit et qui permet de faire ça ? 

-
- Elfe
- Messages : 623
- Inscription : dim. 27 avr. 2014, 09:32
Re: [bluetooh] communication en c ( en cours)
Code : Tout sélectionner
char cmd[] = {0x01, 0x01, 0x04, 0x05, 0x33, 0x8B, 0x9E, 0x08, 0x0A}; /* Commande pour visualiser les périphériques */
send(sock, cmd, sizeof(cmd), 0) < 0; /* J'envoie la commande */
memset(buffer, 0, sizeof(buffer));
recv(sock, buffer, sizeof(buffer), 0) < 0; /* Je récupère la trame */
/* J'affiche les valeurs */
printf("Adresse : %02x:%02x:%02x:%02x:%02x:%02x\n",
buffer[9], buffer[8],
buffer[7], buffer[6],
buffer[5], buffer[4]);
- Xorg
- Maître du Kyudo
- Messages : 1933
- Inscription : dim. 22 janv. 2012, 19:25
- Localisation : Entre le clavier et la chaise.
Re: [bluetooh] communication en c ( en cours)
Ah oui, je vois tout à fait ce qu'il se passe. Tu as oublié de nous dire que ta variable buffer est de type char.
Tu as tout à fait raison d'utiliser ce type car les valeurs pour les adresses MAC sont comprises entre 0 et 255 (soit de 0 à 0xFF), mais le type char est un type sur 8 bits, soit de -128 à +127 (0xFFFFFF80 à 0x7F).
En gros, les valeurs qui commencent par 0xFFFFxx sont des valeurs négatives, car c'est comme ça que c'est codé. 0x80 équivaut à -127 et 0xFF à -1 pour les types signés. C'est pour ça qu'elles sont affichées comme ça.
Tu n'utilises par correctement le type char. Tu dois donc rendre ton type non-signé pour avoir la bonne plage :
Ou bien
Tu as tout à fait raison d'utiliser ce type car les valeurs pour les adresses MAC sont comprises entre 0 et 255 (soit de 0 à 0xFF), mais le type char est un type sur 8 bits, soit de -128 à +127 (0xFFFFFF80 à 0x7F).
En gros, les valeurs qui commencent par 0xFFFFxx sont des valeurs négatives, car c'est comme ça que c'est codé. 0x80 équivaut à -127 et 0xFF à -1 pour les types signés. C'est pour ça qu'elles sont affichées comme ça.
Tu n'utilises par correctement le type char. Tu dois donc rendre ton type non-signé pour avoir la bonne plage :
unsigned char
pour avoir des valeurs allant de 0 à 255.Ou bien
uint8_t
est un type défini dans stdint.h : type entiers sur 8 bits non-signés. Il a le mérite d'avoir un nom explicite, et une taille connue. 
-
- Elfe
- Messages : 623
- Inscription : dim. 27 avr. 2014, 09:32
Re: [bluetooh] communication en c ( en cours)
A ok, merci 
Je change et ca marche

Je change et ca marche

-
- Elfe
- Messages : 623
- Inscription : dim. 27 avr. 2014, 09:32
Re: [bluetooh] communication en c ( en cours)
Et où est-ce que je pourrais trouver toutes les commandes bluetooth existante comme celle-ci : 0x01, 0x01, 0x04, 0x05, 0x33, 0x8B, 0x9E, 0x08, 0x0A.
Par exemple pour récupérer le nom du périphériques, etc.
Par exemple pour récupérer le nom du périphériques, etc.
- Xorg
- Maître du Kyudo
- Messages : 1933
- Inscription : dim. 22 janv. 2012, 19:25
- Localisation : Entre le clavier et la chaise.
Re: [bluetooh] communication en c ( en cours)
Il y a la méthode "fainéant" pour afficher ce genre d'adresse :
Écrire plus de lignes pour éviter d'écrire plusieurs fois la même chose, ça c'est les joies de la programmation. 
Pour afficher le nom du périphérique, c'est :
J'ai trouvé ça là-dedans : http://code.metager.de/source/xref/linu ... /hcitool.c
Ainsi qu'ici où ça a l'air de donner des exemples simples : https://people.csail.mit.edu/albert/blu ... /c404.html
EDIT : Jette un œil au fichier /usr/include/bluetooth/hci_lib.h.
Code : Tout sélectionner
int i;
printf("Adresse : %02x", buffer[9]);
for(i = 8; i >= 4; i--)
printf(":%02x", buffer[i]);

Pour afficher le nom du périphérique, c'est :
Code : Tout sélectionner
if (hci_read_remote_name(dd, &bdaddr, sizeof(name), name, 25000) == 0)
printf("\tDevice Name: %s\n", name);
Ainsi qu'ici où ça a l'air de donner des exemples simples : https://people.csail.mit.edu/albert/blu ... /c404.html
EDIT : Jette un œil au fichier /usr/include/bluetooth/hci_lib.h.