Bluetooth通信のRFCOMMを再起動/解放するにはどうすればいいですか?

Bluetooth通信のRFCOMMを再起動/解放するにはどうすればいいですか?

私はシリアル通信に使用するために、Raspberry Pi を Galaxy Note に接続しようとしています。 ある程度成功しました。

まずペアリングして で信頼しましたbluetoothctl。それから を実行してsudo rfcomm watch hci0開きましたcat /dev/rfcomm。 を使ってラズベリーパイに接続できました。ブルートゥース端末(このアプリのみ、他のアプリはすべて失敗しました)、Galaxy から送信された文字列がウィンドウに表示されますcat

後でどういうわけか失敗してしまい、実行すると がsudo rfcomm watch hci0表示されますCan't bind RFCOMM socket: Address already in use。 または では解放できないためsudo rfcomm release hci0、が表示されます。 同様にも表示されます。sudo rfcomm release 0Can't release device: No such devicecat /dev/rfcomm0No such file or directory

でリストされているプロセスを強制終了しましたsudo lsof | grep /dev/rfcomm0が、RFCOMM を使用する機能には影響がありませんでした。 で再ロードしsystemctl daemon-reload、 で再起動してservice bluetooth restartも影響はありませんでした。

他の Bluetooth デバイスをスキャンすることはできますし、Bluetooth ターミナルを使用して Raspberry Pi に接続することもできますが、rfcomm がなくなったようです。再起動すればこの問題が解決できることはわかっていますが、可能であれば、電源を入れ直さずにプログラムで実行したいと思っています。

ご協力いただきありがとうございます。

答え1

dmesgRaspberry Pi でコマンドの出力を確認します。

次のようなものが表示されます:

[  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 ]---

これにより、カーネル モジュール (rfcomm) とその処理スレッド (krfcomm) が tty の解放中にハング/クラッシュし、壊れた状態になったと考えられます。

その結果、新しいデバイスを作成しようとすると、まだ削除されていないデバイスと競合し、既存のデバイスを削除/解放しようとすると、デバイスが存在しないというメッセージが表示されます。

現時点では、再起動以外に解決策はないと思います。

どこかで読んだのですが、接続が 10 秒以上開いたままになっているとクラッシュは発生せず、ポートを正常に再利用できるそうです。

編集: SO の同じ質問に対する次の回答ではmodemmanager、干渉している可能性のあるパッケージを削除することを提案しています。

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

関連情報