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

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

직렬 통신에 사용하기 위해 Raspberry Pi를 Galaxy Note에 연결하려고 합니다. 나는 이것으로 약간의 성공을 거두었습니다.

먼저 페어링하고 신뢰를 전달합니다 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

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

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

따라서 새 장치를 생성하려고 하면 아직 삭제되지 않은 장치와 충돌이 발생하며, 기존 장치를 삭제/해제하려고 하면 해당 장치가 존재하지 않는다는 메시지가 표시됩니다.

재부팅 외에는 현재로서는 해결책이 없는 것 같습니다.

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

편집: 동일한 질문에 대한 다음 답변에서는 modemmanager패키지를 제거하면 간섭이 발생할 수 있음을 제안합니다.

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

관련 정보