[bluetooh] communication en c ( en cours)

Reconnaissance et configuration du matériel / kernel linux
Répondre
AchilleFraisse
Elfe
Messages : 623
Inscription : dim. 27 avr. 2014, 09:32

[bluetooh] communication en c ( en cours)

Message 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.
Avatar de l’utilisateur
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)

Message 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. :)
Arch Linux x86_64 - Sway
AMD Ryzen 5 3600X - 32 Go de DDR4 - SSD NVMe 1 To + SSD SATA 250 Go - Sapphire NITRO+ Radeon RX 580
Image AUR___Image Wiki___Image GitHub
AchilleFraisse
Elfe
Messages : 623
Inscription : dim. 27 avr. 2014, 09:32

Re: [bluetooh] communication en c ( en cours)

Message par AchilleFraisse »

Ok.
Et pour pouvoir communiquer avec un appareil exterieur via son PC, il faut que le bluetooth de notre pc soit activé ?
Avatar de l’utilisateur
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)

Message par Xorg »

Oui, sinon ça ne va pas fonctionner... Ça serait comme vouloir te connecter en WiFi avec ta carte-WiFi désactivée.
Arch Linux x86_64 - Sway
AMD Ryzen 5 3600X - 32 Go de DDR4 - SSD NVMe 1 To + SSD SATA 250 Go - Sapphire NITRO+ Radeon RX 580
Image AUR___Image Wiki___Image GitHub
AchilleFraisse
Elfe
Messages : 623
Inscription : dim. 27 avr. 2014, 09:32

Re: [bluetooh] communication en c ( en cours)

Message 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.
Avatar de l’utilisateur
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)

Message 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 ? :)
Arch Linux x86_64 - Sway
AMD Ryzen 5 3600X - 32 Go de DDR4 - SSD NVMe 1 To + SSD SATA 250 Go - Sapphire NITRO+ Radeon RX 580
Image AUR___Image Wiki___Image GitHub
AchilleFraisse
Elfe
Messages : 623
Inscription : dim. 27 avr. 2014, 09:32

Re: [bluetooh] communication en c ( en cours)

Message 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.
Avatar de l’utilisateur
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)

Message 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. :)
Arch Linux x86_64 - Sway
AMD Ryzen 5 3600X - 32 Go de DDR4 - SSD NVMe 1 To + SSD SATA 250 Go - Sapphire NITRO+ Radeon RX 580
Image AUR___Image Wiki___Image GitHub
AchilleFraisse
Elfe
Messages : 623
Inscription : dim. 27 avr. 2014, 09:32

Re: [bluetooh] communication en c ( en cours)

Message par AchilleFraisse »

A ok, merci ;)
Je change et ca marche :D
AchilleFraisse
Elfe
Messages : 623
Inscription : dim. 27 avr. 2014, 09:32

Re: [bluetooh] communication en c ( en cours)

Message 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.
Avatar de l’utilisateur
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)

Message 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. :mrgreen:

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.
Arch Linux x86_64 - Sway
AMD Ryzen 5 3600X - 32 Go de DDR4 - SSD NVMe 1 To + SSD SATA 250 Go - Sapphire NITRO+ Radeon RX 580
Image AUR___Image Wiki___Image GitHub
Répondre