IDLabs-IoT Le site dédié aux objets connectés

Un site des laboratoires pédagogiques de l'école CampusID

Communication Bluetooth entre un PC et un Raspberry Pi

Posted on 30 juin 2018  in Non classé

Connexion entre le Pi et le PC

 

Partie Pi

Pour commencer ouvrez un terminal, il nous faudra utiliser la commande ci-dessous pour créer un fichier à l’emplacement « home/pi » et ouvrir l’éditeur de texte dans le terminal :

sudo nano /home/pi/btserial.sh

Maintenant que l’éditeur est ouvert copiez collez le texte ci-dessous à l’intérieur :

  1. #!/bin/bash -e
  2. #Edit the display name of the RaspberryPi so you can distinguish
  3. #your unit from others in the Bluetooth console
  4. #(very useful in a class setting)
  5. echo PRETTY_HOSTNAME=raspberrypi > /etc/machine-info
  6. # Edit /lib/systemd/system/bluetooth.service to enable BT services
  7. sudo sed -i: 's|^Exec.*toothd$| \
  8. ExecStart=/usr/lib/bluetooth/bluetoothd -C \
  9. ExecStartPost=/usr/bin/sdptool add SP \
  10. ExecStartPost=/bin/hciconfig hci0 piscan \
  11. |g' /lib/systemd/system/bluetooth.service
  12. # create /etc/systemd/system/rfcomm.service to enable
  13. # the Bluetooth serial port from systemctl
  14. sudo cat <<EOF | sudo tee /etc/systemd/system/rfcomm.service > /dev/null
  15. [Unit]
  16. Description=RFCOMM service
  17. After=bluetooth.service
  18. Requires=bluetooth.service
  19. [Service]
  20. ExecStart=/usr/bin/rfcomm watch hci0 1 getty rfcomm0 115200 vt100 -a pi
  21. [Install]
  22. WantedBy=multi-user.target
  23. EOF
  24. # enable the new rfcomm service
  25. sudo systemctl enable rfcomm
  26. # start the rfcomm service
  27. sudo systemctl restart rfcomm

 

 

 

Après avoir correctement collé le code au-dessus, vous pouvez si vous le souhaitez changer le nom du Pi qui apparaitra lorsqu’un PC le cherchera.

Ligne 7 : « PRETTY_HOSTNAME=LeNomDeVotrePi »

Si vous voulez sécuriser la connexion de votre Pi en aillant à mettre vos identifiants lors de la connexion SSH vous avez juste à enlever « -a pi » à la fin de la ligne 25, sinon le login et le mot de passe seront déjà mis et vous serez directement connecté.

Lorsque que vous aurez fini tous ça il vous faudra rendre le fichier exécutable et lui changé les permissions à l’aide de la commande suivant.

chmod 755 /home/pi/btserial.sh

Maintenant que notre script est prêt à l’emploi on va faire en sorte que notre pi le lance au démarrage à l’aide de :

sudo nano /etc/rc.local

Cette commande permet de d’ouvrir le fichier où sont liste les programmes, commandes etc qui sont lancé au démarrage du système, nous allons y ajouter notre script à la fin, en y mettant les lignes suivantes :

#Launch bluetooth service startup script /home/pi/btserial.sh

sudo /home/pi/btserial.sh &

C’est principalement la 2ème ligne qui est important sachant que la première est un commentaire.

Pensez à installer la lib dev du Bluetooth sur le Pi :

sudo apt-get install libbluetooth-dev

A partir de là on redémarre son Pi et on va sur son PC, on lance la recherche de périphérique bluetooth. Et le nom que l’ont a choisi dans le script devrait apparaitre. Le périphérique sera reconnu comme un audio mais c’est normal.

 

Partie Windows

Il faudra utiliser le logiciel qui utilise les ports COM afin de se connecter à notre Pi, tout d’abord allons récupérer le port de notre Pi. Dans la fenêtre des paramètres bluetooth cliquez sur « Paramètres Bluetooth avancés » puis sur l’onglet « Ports COM ».

            Le port qui nous intéresse est le port COM sortant de notre Pi ici c’est le COM4. Allez ensuite dans le logiciel vous permettant d’utiliser les ports COM, pour moi ce sera Putty. La vitesse doit être à 115200.

Voila, vous êtes maintenant connecté à votre Pi, vous pouvez maintenant par exemple récupérer votre adresse IP si vous êtes connecté à un routeur afin de passer en version graphique en vous connectant avec VNC Viewer.

 

Partie Linux

Il nous faudra installer la lib dev pour pouvoir programmer en Bluetooth, aller dans le terminal et tapez :

sudo apt-get install libbluetooth-dev

Il nous faudra ensuite appairer le Pi à notre machine, démarrez « bluetoothctl » dans le terminal. Le programme va se lancer dans la console et vous aurez des commandes à disposition. Nous allons commencer avec la commande :

scan on

Afin de lancer la détection des dispositifs Bluetooth aux alentours. Et si vous souhaitez arrêter le scan ce sera « scan off ».

Lorsque que vous trouverez votre Pi, utilisez la commande « pair » ainsi que l’adresse mac à coté du Pi pour vous y connecter.

Une fois fais vous devriez voir apparaitre « Pairing successfull ». Après ça n’oubliez pas le « scan off » histoire de ne pas avoir des lignes qui apparaisse toutes les 20 secondes.

 

Programmation en C

A partir de là on peut faire communiquer nos dispositions en Bluetooth ! Voici 2 morceaux de codes l’un client et l’autre serveur afin de tester que tous se passe bien, vous pouvez mettre le Serveur sur Pi et le client sur le PC par exemple et inversement. Le code ici ne fonctionne que sous Unix, je n’ai pas encore trouvé pour Windows :

 

Client

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/socket.h>
  4. #include <bluetooth/bluetooth.h>
  5. #include <bluetooth/rfcomm.h>
  6. int main(int argc, char **argv)
  7. {
  8.     // Déclaration des variables
  9.     struct sockaddr_rc addr = { 0 };
  10.     int s, status;
  11.     //A qui on veut se connecter
  12.     char dest[18] = "F4:8C:50:71:93:F4";
  13.     char toSend [1024];
  14.     // Allouer un socket
  15.     s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
  16.     // Paramétrer la connexion
  17.     addr.rc_family = AF_BLUETOOTH;
  18.     addr.rc_channel = (uint8_t) 1;
  19.     // Connexion à un serveur
  20.     status = connect(s, (struct sockaddr *)&addr, sizeof(addr));
  21.     printf("Connexion...\n");
  22.     // Envoyer un message
  23.     if( status == 0 ) {
  24.         printf("Connexion réussie !\n");
  25.         printf("Quel est le message à envoyer au serveur ?");
  26.         scanf("%[^\n]", toSend);
  27.         unsigned long taille = strlen(toSend);
  28.         printf ("On envoie %lu octet\n", taille);
  29.         write (s, &taille, sizeof(unsigned long));
  30.         write (s, toSend, taille);
  31.     }
  32.     if(status < 0) perror("uh oh");
  33.     close(s);
  34.     return 0;
  35. }

Serveur

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/socket.h>
  5. #include <bluetooth/bluetooth.h>
  6. #include <bluetooth/rfcomm.h>
  7. int main(int argc, char **argv)
  8. {
  9.     printf("------------ Bluetooth Serveur v0.1 ------------\n");
  10.     // Déclaration des variables
  11.     struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 };
  12.     unsigned long tailleReception = 0;
  13.     char* buf = NULL;
  14.     int s, client, bytes_read;
  15.     socklen_t opt = sizeof(rem_addr);
  16.     // Allouer le socket
  17.     s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
  18.     // Lisaison du socket au premier port disponible
  19.     rc_family = AF_BLUETOOTH;
  20.     rc_bdaddr = *BDADDR_ANY;
  21.     rc_channel = (uint8_t) 1;
  22.     bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr));
  23.     // Met le socket en écoute
  24.     listen(s, 0);
  25.     // Accepte une seule connexion
  26.     printf("En attente d'une connexion...\n");
  27.     client = accept(s, (struct sockaddr *)&rem_addr, &opt);
  28.     // Réception depuis le client
  29.     bytes_read = read(client, &tailleReception, sizeof(unsigned long));
  30.     if(bytes_read > 0) {
  31.         printf("Taille du message d'après : %ld\n", tailleReception);
  32.     }
  33.     buf = (char*) malloc (tailleReception + 1);
  34.     bzero(buf, tailleReception + 1);
  35.     // Réception depuis le client
  36.     bytes_read = read(client, buf, tailleReception);
  37.     if(bytes_read > 0) {
  38.         printf("Recu : %s\n", buf);
  39.     }
  40.     // Ferme la connexion
  41.     close(client);
  42.     close(s);
  43.     return 0;
  44. }

 

Lancez le serveur, ensuite le client, avec la bonne adresse mac récupérer dans la manipulation précédente pour appairer. Le serveur attend un message, sur le client il faudra taper un message et l’envoyer. Le serveur le lira. Voilà votre premier échange en Bluetooth dev.

0 thoughts on “Communication Bluetooth entre un PC et un Raspberry Pi”

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *