Page 1 sur 1
[bluetooh] communication en c ( en cours)
Publié : lun. 09 mai 2016, 20:51
par AchilleFraisse
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.
Re: [bluetooh] communication en c ( en cours)
Publié : lun. 09 mai 2016, 22:00
par Xorg
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.

Re: [bluetooh] communication en c ( en cours)
Publié : mar. 10 mai 2016, 11:57
par AchilleFraisse
Ok.
Et pour pouvoir communiquer avec un appareil exterieur via son PC, il faut que le bluetooth de notre pc soit activé ?
Re: [bluetooh] communication en c ( en cours)
Publié : mar. 10 mai 2016, 16:56
par Xorg
Oui, sinon ça ne va pas fonctionner... Ça serait comme vouloir te connecter en WiFi avec ta carte-WiFi désactivée.
Re: [bluetooh] communication en c ( en cours)
Publié : mer. 11 mai 2016, 16:27
par AchilleFraisse
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.
Re: [bluetooh] communication en c ( en cours)
Publié : mer. 11 mai 2016, 16:35
par Xorg
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 ?

Re: [bluetooh] communication en c ( en cours)
Publié : mer. 11 mai 2016, 17:01
par AchilleFraisse
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]);
Bien sûr je boucle sur la fonction recv() et je test la valeur de buffer[1] pour savoir s'il a trouvé quelque chose.
Re: [bluetooh] communication en c ( en cours)
Publié : mer. 11 mai 2016, 17:52
par Xorg
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 :
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.

Re: [bluetooh] communication en c ( en cours)
Publié : mer. 11 mai 2016, 18:24
par AchilleFraisse
A ok, merci

Je change et ca marche

Re: [bluetooh] communication en c ( en cours)
Publié : mer. 11 mai 2016, 18:26
par AchilleFraisse
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.
Re: [bluetooh] communication en c ( en cours)
Publié : mer. 11 mai 2016, 18:43
par Xorg
Il y a la méthode "fainéant" pour afficher ce genre d'adresse :
Code : Tout sélectionner
int i;
printf("Adresse : %02x", buffer[9]);
for(i = 8; i >= 4; i--)
printf(":%02x", buffer[i]);
É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 :
Code : Tout sélectionner
if (hci_read_remote_name(dd, &bdaddr, sizeof(name), name, 25000) == 0)
printf("\tDevice Name: %s\n", name);
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.