블루투스 통신을 위해 rfcomm을 다시 시작/해제하는 방법은 무엇입니까?

블루투스 통신을 위해 rfcomm을 다시 시작/해제하는 방법은 무엇입니까?

직렬 통신에 사용하기 위해 라즈베리 파이를 갤럭시 노트에 연결하려고 합니다. 나는 그것에 어느 정도 성공했습니다.

먼저 페어링하고 bluetoothctl. 그런 sudo rfcomm watch hci0다음 cat /dev/rfcomm. 나는 다음을 사용하여 라즈베리 파이에 연결할 수있었습니다블루투스 터미널(이 앱만 실패했고 다른 앱은 모두 실패했습니다.) 갤럭시에서 전송된 문자열이 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/rfcomm0RFCOMM을 사용하는 능력에는 아무런 영향을 미치지 않았습니다. 너무 다시 로드 systemctl daemon-reload하고 다시 시작해도 service bluetooth restart효과가 없습니다.

여전히 다른 블루투스 장치를 검색할 수 있고 블루투스 터미널로 라즈베리 파이에 연결할 수 있지만 rfcomm이 사라진 것 같습니다. 재부팅하면 이 문제가 해결될 수 있다는 것을 알고 있지만 가능하면 전원을 껐다가 다시 켜지 않고 프로그래밍 방식으로 재부팅하고 싶습니다.

당신의 도움을 주셔서 감사합니다.

답변1

dmesg라즈베리 파이에서 명령 의 출력을 확인합니다 .

나는 다음과 같은 것을 얻습니다 :

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

이로 인해 tty를 해제하는 동안 커널 모듈(rfcomm)과 해당 처리 스레드(krfcomm)가 정지/충돌하여 손상된 상태로 남아 있다고 생각됩니다.

결과적으로 새로운 장치를 생성하려고 하면 아직 삭제되지 않은 장치와 충돌이 발생하고, 기존 장치를 삭제/해제하려고 하면 장치가 존재하지 않는다는 메시지가 나타납니다.

현재로서는 재부팅 외에는 해결책이 없다고 생각합니다.

연결이 10초 이상 열려 있으면 충돌이 발생하지 않고 포트를 성공적으로 재사용할 수 있다는 내용을 어딘가에서 읽었습니다.

편집: SO에 대한 동일한 질문에 대한 다음 답변은 modemmanager방해가 될 수 있는 패키지 제거를 제안합니다.

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

관련 정보