Comment connecter et envoyer des données à un port série Bluetooth sous Linux?

30

J'essaie de configurer un port série virtuel via un adaptateur USB-Bluetooth sous Linux et de lui envoyer un message via un appareil Android. Je suis sur le noyau 3.6. Je suis capable de me coupler à l'appareil avec succès en utilisant gnome-bluetooth et je peux également y envoyer des fichiers.

Pour configurer le port série, j'ajoute d'abord un canal avec un profil SP à mon adaptateur:

sdptool add --channel=22 SP

Ensuite, j'appelle «écouter» avec rfcomm:

rfcomm listen /dev/rfcomm0 22

qui bloque

Waiting for connection on channel 22

Apparemment, rfcomm créera / dev / rfcomm0 lors d'une connexion réussie. Une fois que cela se produit, j'aimerais utiliser quelque chose comme cutecom pour envoyer des messages dans les deux sens à l'appareil connecté.

Sur mon appareil Android, j'ouvre un terminal Bluetooth SPP (il y en a plusieurs, j'en ai essayé plusieurs) et j'essaie de me connecter. Ils échouent tous.

Étant donné que je peux coupler avec succès et envoyer des fichiers sans aucun problème, je sais que le couplage et la communication Bluetooth fonctionnent.

Je ne sais pas trop quoi d'autre je peux essayer. J'ai utilisé «sdptool Browse» sur mon appareil local et l'appareil Android pour m'assurer qu'il n'y a pas de conflits de canaux RFCOMM.

Pris
la source

Réponses:

21

Il me semble que cela fonctionne maintenant. Bluetooth semble un peu capricieux. Je récapitule entièrement mes étapes au cas où quelqu'un d'autre le trouverait utile (bien que ce soit à peu près ce que j'ai essayé au départ). Ceci est pour Android JB (4.2.2) sur un Nexus 4 et Arch Linux 3.6.7-1, avec bluez 4.101 sur Gnome 3.6 (avec gnome-bluetooth).

(cette étape peut ne rien faire d'utile) Désactivez Bluetooth sur Android et déconnectez votre adaptateur USB / Bluetooth de votre machine Linux (ou si vous en avez un intégré, réinitialisez-le à l'aide de la réinitialisation du nom de développement hcitool)

Connectez / allumez votre adaptateur Bluetooth sous Linux. Assurez-vous que votre adaptateur est visible (peut être défini dans gnome-bluetooth - vous devriez voir une icône de la barre d'état système Bluetooth).

Activez le Bluetooth sur votre appareil Android. Utilisez Android pour l'appairer à l'adaptateur (je n'ai pas pu l'appairer dans l'autre sens depuis Linux). Une boîte de dialogue apparaîtra vous demandant une clé. Saisissez le code PIN de votre choix. Gnome devrait faire apparaître une notification vous demandant une clé; saisissez le même code PIN que vous avez saisi précédemment. Votre appareil Android et la clé doivent être associés à ce stade.

Sous Linux, ouvrez un terminal et vérifiez les services Bluetooth disponibles en tapant

sdptool browse local

Si vous disposez déjà d'un service de port série, notez de quel canal il s'agit. Sinon, vous pouvez ajouter le service:

sdptool add --channel=22 SP

Écoutez maintenant sur cette chaîne en utilisant rfcomm:

sudo rfcomm listen /dev/rfcomm0 22

rfcomm bloquera, écoutant une connexion avec un message comme

Waiting for connection on channel 22

De retour sur Android, j'ai utilisé l'application BlueTerm ( http://pymasde.es/blueterm/ , également disponible gratuitement sur le Google Play Store) bien que toute application similaire devrait fonctionner. Ouvrez BlueTerm, accédez aux options> Connecter l'appareil: sélectionnez l'adaptateur couplé.

J'espère que l'application a pu se connecter. Vous verrez une vérification supplémentaire dans le terminal où vous avez bloqué l'écoute avec un message comme:

Waiting for connection on channel 22
Connection from 22:22:22:22:22:22 to /dev/rfcomm0
Press CTRL-C for hangup

Tout ce que vous saisissez dans l'application BlueTerm doit aller dans / dev / rfcomm0. Vous pouvez voir des choses apparaître lorsque vous tapez en ouvrant un nouveau terminal et en faisant quelque chose comme:

cat /dev/rfcomm0
Pris
la source
1
Bonne réponse. Je l'ai fait fonctionner avec Ubuntu 16 / Bluez 5 et ces informations: bbs.archlinux.org/viewtopic.php?id=201672 .
wojciii
10

Les étapes ci-dessous ont fonctionné pour moi:

Vous devez d'abord coupler les appareils. Le jumelage est relativement facile. Je vais appeler le client (qui commence à parler) et le serveur (qui répond)

Vous devez configurer le serveur avant: Côté serveur (en tant que root):

sdptool add --channel=3 SP
mknod -m 666 /dev/rfcomm0 c 216 0
rfcomm watch /dev/rfcomm0 3 /sbin/agetty rfcomm0 115200 linux

Côté client (en tant que root):

sdptool add --channel=3 SP
rfcomm connect /dev/rfcomm0 [SERVER_ADDR] 3

Maintenant, pour ouvrir un terminal série sur le client:

screen /dev/rfcomm0 115200

Commentaires:

Lorsque vous appelez la dernière commande rfcomm connect ... dans le client, un périphérique /dev/rfcomm0sera créé et associé au serveur /dev/recomm0. Cela représente le lien série entre les deux

La dernière commande du serveur: rfcomm watch.... "écoutera" les connexions entrantes. En cas de perte de connexion, la commande redémarre un nouvel état «écouter».

ismaia
la source
1
La réponse fournie par ismaia vous y mène presque. Vous devez vous rappeler cependant que la nouvelle pile bluez a besoin de l' --compatoption spéciale , sinon l'ajout d'un SP peut échouer. Voir ici . Donc, ajustez / modifiez vos scripts de démarrage de démarrage systemd / initd pour qu'ils --compatsoient là.
blacktofu
5

J'ai résolu cela avec une légère variation des commandes de Pris. Donnez-leur une chance si quelqu'un a encore des problèmes pour configurer une connexion rfcomm.

sudo service bluetooth restart

Ceci ^ garantit que vous commencez avec une table rase à chaque fois que vous essayez de configurer une connexion.

rfcomm add --channel=<a_channel_#> SP

Ce numéro de canal doit être différent de tout canal actuellement attribué.

(FACULTATIF) Pour vérifier les chaînes:

sdptool browse local | grep Channel

Je ne sais pas pourquoi cette prochaine commande est nécessaire, mais cela a fonctionné pour moi.

rfcomm release 0

Ensuite, pour écouter les connexions entrantes:

rfcomm watch 0 <a_channel_#>

REMARQUE: l'adresse MAC bt dans /etc/bluetooth/rfcomm.conf mais être le MAC bt de votre téléphone. De plus, le canal dans ce fichier doit être le même que celui choisi pour a_channel_ #.

Une fois que j'ai fait tout cela, j'ai utilisé un émulateur de terminal bt sur mon téléphone pour tout vérifier.

Ethan Plummer
la source
0

J'ai essayé différents outils Bluetooth et il a été difficile de trouver la séquence correcte de commandes pour se connecter et échanger des données avec un module Bluetooth. Essayez d'utiliser rfcomm et minicom:

Ceci est mon /etc/bluetooth/rfcomm.conf

rfcomm0 {
  # Automatically bind the device at startup
  bind no;
  # Bluetooth address of the device
  device 11:22:33:44:55:66;
  # RFCOMM channel for the connection
  channel 3;
  # Description of the connection
  comment "This is Device 1's serial port.";
}

Rechercher des appareils Bluetooth:

hcitool scan
Scanning ...
    20:15:12:08:62:95   HC-06

Lier à l'aide de rfcomm

sudo rfcomm bind 0 20:15:12:08:62:95 1

NB: bind 0 fait référence au numéro de périphérique 0 (rfcomm0) et 1 est le canal.

Ensuite, utilisez minicom avec sudo et enregistrez une configuration dans laquelle vous spécifiez le débit en bauds et le port. Vous pouvez trouver plus d'informations ici .

UserK
la source