Wie verbinde ich mich und sende Daten an eine serielle Bluetooth-Schnittstelle unter Linux?

30

Ich versuche, eine virtuelle serielle Schnittstelle über einen USB-Bluetooth-Adapter unter Linux einzurichten und eine Nachricht über ein Android-Gerät an diese zu senden. Ich bin auf Kernel 3.6. Ich kann mit gnome-bluetooth erfolgreich eine Verbindung zum Gerät herstellen und auch Dateien an das Gerät senden.

Um die serielle Schnittstelle einzurichten, füge ich meinem Adapter zuerst einen Kanal mit einem SP-Profil hinzu:

sdptool add --channel=22 SP

Dann rufe ich mit rfcomm 'listen':

rfcomm listen /dev/rfcomm0 22

welche blockiert auf

Waiting for connection on channel 22

Anscheinend wird rfcomm / dev / rfcomm0 nach einer erfolgreichen Verbindung erstellen. In diesem Fall würde ich gerne so etwas wie cutecom verwenden, um Nachrichten an das angeschlossene Gerät zu senden.

Auf meinem Android-Gerät öffne ich ein Bluetooth SPP-Terminal (es gibt mehrere, ich habe ein paar verschiedene ausprobiert) und versuche, eine Verbindung herzustellen. Sie alle scheitern.

Da ich eine erfolgreiche Kopplung durchführen und Dateien ohne Probleme senden kann, weiß ich, dass die Bluetooth-Kopplung und -Kommunikation funktioniert.

Ich bin mir nicht sicher, was ich sonst noch probieren kann. Ich habe auf meinem lokalen Gerät und dem Android-Gerät "sdptool browse" verwendet, um sicherzustellen, dass keine RFCOMM-Kanalkonflikte vorliegen.

Pris
quelle

Antworten:

21

Ich scheine das jetzt zum Laufen gebracht zu haben. Bluetooth scheint ein bisschen pingelig. Ich fasse meine Schritte vollständig zusammen, falls jemand anderes sie nützlich findet (obwohl es so ziemlich das ist, was ich anfangs versucht habe). Dies ist für Android JB (4.2.2) auf einem Nexus 4 und Arch Linux 3.6.7-1, mit bluez 4.101 auf Gnome 3.6 (mit Gnome-Bluetooth).

(Dieser Schritt kann möglicherweise nicht hilfreich sein.) Schalten Sie Bluetooth auf Android aus und trennen Sie den USB / Bluetooth-Adapter von Ihrem Linux-Computer (oder setzen Sie ihn mit hcitool devname reset zurück)

Schließen Sie Ihren Bluetooth-Adapter unter Linux an bzw. schalten Sie ihn ein. Stellen Sie sicher, dass Ihr Adapter sichtbar ist (kann in gnome-bluetooth eingestellt werden - es sollte ein Bluetooth-Taskleistensymbol angezeigt werden).

Schalten Sie Bluetooth auf Ihrem Android-Gerät ein. Verwenden Sie Android zum Koppeln mit dem Adapter (ich konnte unter Linux nicht andersherum koppeln). Ein Dialogfeld wird angezeigt, in dem Sie nach einem Schlüssel gefragt werden. Geben Sie eine beliebige PIN ein. Gnome sollte eine Benachrichtigung anzeigen, in der Sie nach einem Schlüssel gefragt werden. Geben Sie dieselbe PIN ein, die Sie zuvor eingegeben haben. Ihr Android-Gerät und der Schlüssel sollten zu diesem Zeitpunkt gekoppelt sein.

Öffnen Sie unter Linux ein Terminal und überprüfen Sie durch Eingeben, welche Bluetooth-Dienste verfügbar sind

sdptool browse local

Wenn Sie bereits einen seriellen Port-Dienst haben, notieren Sie sich, um welchen Kanal es sich handelt. Wenn Sie dies nicht tun, können Sie den Dienst hinzufügen:

sdptool add --channel=22 SP

Hören Sie jetzt diesen Kanal mit rfcomm:

sudo rfcomm listen /dev/rfcomm0 22

rfcomm blockiert und wartet auf eine Verbindung mit einer Nachricht wie

Waiting for connection on channel 22

Zurück auf Android habe ich die BlueTerm-Anwendung ( http://pymasde.es/blueterm/ , ebenfalls kostenlos im Google Play Store erhältlich) verwendet, obwohl jede ähnliche Anwendung funktionieren sollte. Öffnen Sie BlueTerm, gehen Sie zu Optionen> Gerät verbinden: Wählen Sie den gekoppelten Adapter aus.

Hoffentlich konnte die Anwendung eine Verbindung herstellen. Im Terminal, in dem Sie das Abhören mit einer Nachricht wie der folgenden blockiert haben, wird eine zusätzliche Bestätigung angezeigt:

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

Alles, was Sie in die BlueTerm-App eingeben, sollte nach / dev / rfcomm0 gehen. Sie können sehen, was während der Eingabe angezeigt wird, indem Sie ein neues Terminal öffnen und Folgendes ausführen:

cat /dev/rfcomm0
Pris
quelle
1
Gute Antwort. Ich habe es mit Ubuntu 16 / Bluez 5 und dieser Info zum Laufen gebracht : bbs.archlinux.org/viewtopic.php?id=201672 .
Wojciii
10

Die folgenden Schritte haben bei mir funktioniert:

Zuerst müssen Sie die Geräte koppeln. Das Pairing ist relativ einfach. Ich werde den Client (der anfängt zu sprechen) und den Server (der antwortet) anrufen

Sie müssen den Server vorher einrichten: Serverseitig (als root):

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

Client Seite (als root):

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

So öffnen Sie ein serielles Terminal auf dem Client:

screen /dev/rfcomm0 115200

Bemerkungen:

Wenn Sie im Client den letzten Befehl rfcomm connect ... aufrufen, wird ein Gerät /dev/rfcomm0erstellt und dem Server zugeordnet /dev/recomm0. Dies stellt die serielle Verbindung zwischen beiden dar

Der letzte Serverbefehl: rfcomm watch.... 'wartet' auf eingehende Verbindungen. Bei einem Verbindungsverlust startet der Befehl einen neuen 'Listen'-Status neu.

ismaia
quelle
1
Die Antwort von ismaia bringt Sie fast ans Ziel. Sie müssen sich jedoch daran erinnern, dass der neuere bluez-Stack die Sonderoption benötigt --compat, da andernfalls das Hinzufügen eines SP fehlschlagen kann. Sehen Sie hier . Passen Sie also Ihre Startup-Skripte für systemd / initd so an, dass sie --compatvorhanden sind.
Blacktofu
5

Ich habe das mit einer kleinen Variation von Pris 'Befehlen gelöst. Probieren Sie diese aus, wenn immer noch Probleme beim Einrichten einer RFComm-Verbindung auftreten.

sudo service bluetooth restart

Dies stellt sicher, dass Sie jedes Mal, wenn Sie versuchen, eine Verbindung herzustellen, mit einem sauberen Slate beginnen.

rfcomm add --channel=<a_channel_#> SP

Diese Kanalnummer sollte sich von allen derzeit zugewiesenen Kanälen unterscheiden.

(OPTIONAL) So überprüfen Sie Kanäle:

sdptool browse local | grep Channel

Ich bin nicht sicher, warum dieser nächste Befehl benötigt wird, aber er hat bei mir funktioniert.

rfcomm release 0

Dann warten Sie auf eingehende Verbindungen:

rfcomm watch 0 <a_channel_#>

HINWEIS: Die BT-MAC-Adresse in /etc/bluetooth/rfcomm.conf, aber die BT-MAC-Adresse Ihres Telefons. Außerdem muss der Kanal in dieser Datei mit dem Kanal übereinstimmen, der für a_channel_ # ausgewählt wurde.

Nachdem ich das alles getan hatte, benutzte ich einen BT-Terminal-Emulator auf meinem Telefon, um alles zu überprüfen.

Ethan Plummer
quelle
0

Ich habe verschiedene Bluetooth-Tools ausprobiert und es war schwierig, die richtige Befehlsfolge zum Verbinden und Austauschen von Daten mit einem Bluetooth-Modul zu finden. Versuchen Sie es mit rfcomm und minicom:

Dies ist meine /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.";
}

Nach Bluetooth-Geräten suchen:

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

Mit rfcomm binden

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

NB: bind 0 bezieht sich auf die Gerätenummer 0 (rfcomm0) und 1 ist der Kanal.

Verwenden Sie dann minicom mit sudo und speichern Sie eine Konfiguration, in der Sie die Baudrate und den Port angeben. Weitere Informationen finden Sie hier .

UserK
quelle