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

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

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

sdptool add --channel=22 SP 

Dann rufe ich mit rfcomm „listen“ auf:

rfcomm listen /dev/rfcomm0 22 

welche Blöcke auf

Waiting for connection on channel 22 

Anscheinend erstellt rfcomm nach einer erfolgreichen Verbindung / dev / rfcomm0. Sobald dies geschieht, möchte ich etwas wie cutecom verwenden, um Nachrichten hin und her zu senden an das angeschlossene Gerät.

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

Da ich erfolgreich koppeln und Dateien ohne Probleme senden kann, weiß ich, dass Bluetooth-Pairing und -Kommunikation funktionieren.

Ich bin mir nicht sicher, was ich sonst noch versuchen kann „sdptool browse“ auf meinem lokalen Gerät und dem Android-Gerät, um sicherzustellen, dass keine RFCOMM-Kanalkonflikte auftreten.

Kommentare

Antwort

Ich habe das jetzt anscheinend zum Laufen gebracht. 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 ursprünglich 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 nichts Nützliches bewirken) Schalten Sie Bluetooth auf Android aus und trennen Sie Ihren USB / Bluetooth-Adapter von Ihrem Linux-Computer (oder wenn Sie einen eingebauten haben, setzen Sie ihn mit hcitool devname reset zurück)

Verbinden / Schalten Sie Ihren Bluetooth-Adapter unter Linux. Stellen Sie sicher, dass Ihr Adapter sichtbar ist (kann in gnome-bluetooth eingestellt werden – – Sie sollten ein Bluetooth-Taskleistensymbol sehen.

Schalten Sie Bluetooth auf Ihrem Android-Gerät ein. Verwenden Sie Android zum Koppeln mit dem Adapter (ich konnte von Linux aus nicht umgekehrt koppeln). Ein Dialogfeld wird angezeigt Fragen Sie nach einem Schlüssel. 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 gepaart sein.

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

sdptool browse local 

eingeben. Wenn Sie bereits einen Dienst mit serieller Schnittstelle haben, erstellen Sie a Beachten Sie, 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/ (auch frei im Google Play Store erhältlich), obwohl jede ähnliche Anwendung funktionieren sollte. Öffnen Sie BlueTerm und gehen Sie zu Optionen> Gerät verbinden: Wählen Sie den gekoppelten Adapter aus.

Hoffentlich konnte die Anwendung eine Verbindung herstellen. In dem Terminal, in dem Sie das Abhören blockiert haben, wird eine zusätzliche Überprüfung 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, wie Dinge während der Eingabe angezeigt werden, indem Sie ein neues Terminal öffnen und Folgendes tun:

cat /dev/rfcomm0 

Kommentare

Antwort

Die folgenden Schritte haben bei mir funktioniert:

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

Sie müssen den Server vorher einrichten: Serverseite (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 

Öffnen Sie nun ein serielles Terminal auf dem Client:

screen /dev/rfcomm0 115200 

Kommentare:

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

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

Kommentare

  • Die von ismaia bereitgestellte Antwort bringt Sie fast dorthin.Sie müssen sich jedoch daran erinnern, dass ein neuerer Bluez-Stack die spezielle Option --compat benötigt, da sonst das Hinzufügen eines SP fehlschlagen kann. Siehe hier . Passen Sie daher Ihre Systemd / Initd-Startskripte an, sodass --compat vorhanden ist.

Antwort

Ich habe dies mit einer geringfügigen Abweichung 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 lauten anders als jeder aktuell zugewiesene Kanal.

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

sdptool browse local | grep Channel 

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

rfcomm release 0 

Dann auf eingehende Verbindungen warten:

rfcomm watch 0 <a_channel_#> 

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

Sobald ich das alles getan habe, benutze ich da bt Terminal Emulator auf meinem Telefon, um alles zu überprüfen.

Antwort

Ich habe verschiedene Bluetooth-Tools ausprobiert und es war schwierig um 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 

Hinweis: Bindung 0 bezieht sich auf 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 .

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.