Wie starte/beende ich RFcomm für die Bluetooth-Kommunikation neu?

Wie starte/beende ich RFcomm für die Bluetooth-Kommunikation neu?

Ich versuche, Raspberry Pi mit meinem Galaxy Note zu verbinden, um es für die serielle Kommunikation zu nutzen. Das ist mir einigermaßen gelungen.

Zuerst habe ich es gepaart und vertraut bluetoothctl. Dann habe ich ausgeführt sudo rfcomm watch hci0und mit geöffnet cat /dev/rfcomm. Ich konnte mich mit Raspberry Pi verbinden mitBluetooth-Terminal(nur diese App, alle anderen sind fehlgeschlagen) und von Galaxy gesendete Zeichenfolgen würden im catFenster angezeigt.

Ich habe es später irgendwie vermasselt und jetzt läuft es und sudo rfcomm watch hci0ich bekomme Can't bind RFCOMM socket: Address already in use. Ich kann es nicht mit sudo rfcomm release hci0oder sudo rfcomm release 0wie es mir dann gibt freigeben Can't release device: No such device. Ebenso cat /dev/rfcomm0gibt es mir jetzt auch No such file or directory.

Ich habe den aufgelisteten Prozess mit beendet sudo lsof | grep /dev/rfcomm0, dies hatte keine Auswirkungen auf meine Fähigkeit, RFCOMM zu verwenden. Das erneute Laden mit systemctl daemon-reloadund der Neustart mit service bluetooth restarthatten ebenfalls keine Auswirkungen.

Ich kann immer noch nach anderen Bluetooth-Geräten suchen und mich über ein Bluetooth-Terminal mit Raspberry Pi verbinden, aber RFcomm scheint weg zu sein. Ich weiß, dass ein Neustart das Problem lösen kann, aber ich würde das, wenn möglich, gerne programmgesteuert tun, ohne auf Powercycling zurückgreifen zu müssen.

Vielen Dank für Ihre Hilfe.

Antwort1

Überprüfen Sie die Ausgabe des dmesgBefehls auf dem Raspberry Pi.

Ich erhalte etwa Folgendes:

[  296.768548] ------------[ cut here ]------------
[  296.768576] WARNING: CPU: 3 PID: 40 at drivers/tty/tty_port.c:257 tty_port_put+0x94/0x98
[  296.768586] Modules linked in: rfcomm cmac bnep hci_uart btbcm serdev bluetooth ecdh_generic 8021q garp stp llc brcmfmac brcmutil bcm2835_codec(C) bcm2835_v4l2(C) v4l2_mem2mem sha256_generic bcm2835_mmal_vchiq(C) v4l2_common videobuf2_vmalloc videobuf2_dma_contig videobuf2_memops cfg80211 videobuf2_v4l2 videobuf2_common videodev media rfkill vc_sm_cma(C) v3d vc4 gpu_sched drm_kms_helper rpivid_mem raspberrypi_hwmon hwmon drm drm_panel_orientation_quirks snd_soc_core snd_bcm2835(C) snd_compress snd_pcm_dmaengine snd_pcm snd_timer syscopyarea sysfillrect sysimgblt fb_sys_fops snd rpi_backlight rpi_ft5406 uio_pdrv_genirq uio evdev joydev ip_tables x_tables ipv6
[  296.768773] CPU: 3 PID: 40 Comm: kworker/3:1 Tainted: G         C        4.19.97-v7l+ #1294
[  296.768781] Hardware name: BCM2835
[  296.768798] Workqueue: events release_one_tty
[  296.768825] [<c0212e04>] (unwind_backtrace) from [<c020d5e0>] (show_stack+0x20/0x24)
[  296.768844] [<c020d5e0>] (show_stack) from [<c09b15c8>] (dump_stack+0xe0/0x124)
[  296.768865] [<c09b15c8>] (dump_stack) from [<c0222544>] (__warn+0x104/0x11c)
[  296.768883] [<c0222544>] (__warn) from [<c0222694>] (warn_slowpath_null+0x50/0x58)
[  296.768899] [<c0222694>] (warn_slowpath_null) from [<c06cab28>] (tty_port_put+0x94/0x98)
[  296.768941] [<c06cab28>] (tty_port_put) from [<bf9dd2a0>] (rfcomm_tty_cleanup+0x5c/0x60 [rfcomm])
[  296.768999] [<bf9dd2a0>] (rfcomm_tty_cleanup [rfcomm]) from [<c06c2a38>] (release_one_tty+0x3c/0xac)
[  296.769019] [<c06c2a38>] (release_one_tty) from [<c023e028>] (process_one_work+0x170/0x458)
[  296.769036] [<c023e028>] (process_one_work) from [<c023e36c>] (worker_thread+0x5c/0x5a4)
[  296.769051] [<c023e36c>] (worker_thread) from [<c02446a0>] (kthread+0x138/0x168)
[  296.769066] [<c02446a0>] (kthread) from [<c02010ac>] (ret_from_fork+0x14/0x28)
[  296.769075] Exception stack(0xefab3fb0 to 0xefab3ff8)
[  296.769086] 3fa0:                                     00000000 00000000 00000000 00000000
[  296.769098] 3fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[  296.769108] 3fe0: 00000000 00000000 00000000 00000000 00000013 00000000
[  296.769119] ---[ end trace 545b669f95e0d2b5 ]---

Das lässt mich glauben, dass das Kernelmodul (rfcomm) und sein Verarbeitungsthread (krfcomm) beim Freigeben des TTY hängen geblieben/abgestürzt sind und es in einem beschädigten Zustand hinterlassen haben.

Dies hat zur Folge, dass Versuche, ein neues Gerät zu erstellen, mit dem noch nicht gelöschten Gerät in Konflikt geraten, während Versuche, das vorhandene zu löschen/freizugeben, zu einer Meldung führen, dass das Gerät nicht existiert.

Ich glaube nicht, dass es im Moment eine andere Lösung als einen Neustart gibt.

Ich habe irgendwo gelesen, dass der Absturz nicht auftritt und der Port erfolgreich wiederverwendet werden kann, wenn man dafür sorgt, dass die Verbindung länger als 10 Sekunden offen bleibt.

Bearbeiten: Die folgende Antwort auf dieselbe Frage auf SO schlägt vor, das modemmanagerPaket zu entfernen, was störend sein kann.

https://stackoverflow.com/a/46915801/3398351

verwandte Informationen