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
- für diejenigen, die sich fragen Warum alle unten aufgeführten Antworten nicht funktionieren ‚: Mit BlueZ > = 5 benötigen Sie den Kompatibilitätsmodus, siehe hier: raspberrypi.stackexchange.com/questions/41776/…
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
- Gute Antwort. Ich habe es mit Ubuntu 16 / Bluez 5 und diesen Informationen zum Laufen gebracht: bbs.archlinux.org/viewtopic.php?id=201672 .
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 .