web-dev-qa-db-fra.com

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

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 peux coupler avec l'appareil avec succès en utilisant gnome-bluetooth et également capable de lui 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 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.

32
Pris

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). C'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) Activez Bluetooth Android désactivé et déconnectez votre adaptateur USB/Bluetooth de votre Machine Linux (ou si vous en avez une intégrée, réinitialisez-la à 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 Android. Utilisez Android pour l'appairage avec l'adaptateur (je n'ai pas pu l'appairer dans l'autre sens depuis Linux). Une boîte de dialogue s'affiche venir vous demander une clé. Mettez n'importe quel PIN que vous voulez. Gnome devrait faire apparaître une notification vous demandant une clé; mettez la même PIN vous avez entré précédemment. Votre appareil Android et la clé doivent être apparié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
21
Pris

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/rfcomm0 sera créé et associé au serveur /dev/recomm0. Cela représente le lien série entre les deux

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

11
ismaia

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.

5
Ethan Plummer

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 .

0
UserK