サーバーでBluetooth接続をリッスンします。
rfcomm listen rfcomm1 1
次に、Bluetoothクライアントに接続すると、次のメッセージが表示されます。
Connection from XX:XX:XX:XX:XX:XX to /dev/rfcomm1
Press CTRL-C for hangup
これはすべてが大丈夫であることを意味します...
次に、サーバーまたはクライアントでCtrl + Cを実行して接続を終了します。
この後、私は再び行います:
rfcomm listen rfcomm1 1
しかし今回は、クライアントに接続すると、次のメッセージが表示されます。
Can't create RFCOMM TTY: Address already in use
だから私は行き、どの接続が開いているかを確認します:
rfcomm -a
そして、接続が閉じたように表示されますが、切断されると表示されないはずです...
rfcomm1: XX:XX:XX:XX:XX:XX -> XX:XX:XX:XX:XX:XX channel 1 closed [reuse-dlc release-on-hup ]
奇妙なことに、切断が成功して、まったく問題なく再接続できる場合があります。
[〜#〜]編集[〜#〜]
デバイスが約10秒以上接続され続けると、切断が成功することに気付きました。ただし、この時間が短い場合(高速接続/切断)、問題が発生します。
そして、失敗が起こっている間に、私はそうします:
dmesg
これは印刷されます:
[11800.001527] Bluetooth: TIOCGSERIAL is not supported
[11800.033063] Bluetooth: TIOCGSERIAL is not supported
[11926.708438] Bluetooth: TIOCGSERIAL is not supported
[11934.918197] Bluetooth: TIOCGSERIAL is not supported
[11934.926194] Bluetooth: TIOCGSERIAL is not supported
[11934.926284] ------------[ cut here ]------------
[11934.926297] WARNING: CPU: 1 PID: 2316 at /build/linux-Pcn0xK/linux-4.4.0/drivers/tty/tty_port.c:143 tty_port_destructor+0x7a/0x80()
[11934.926300] Modules linked in: minidriver(OE) nls_utf8 isofs rfcomm bnep arc4 ath5k snd_hda_codec_realtek uvcvideo ath mac80211 snd_hda_codec_hdmi snd_hda_codec_generic snd_hda_intel videobuf2_vmalloc snd_hda_codec samsung_laptop videobuf2_memops snd_hda_core btusb videobuf2_v4l2 btrtl snd_hwdep videobuf2_core coretemp btbcm cfg80211 snd_pcm v4l2_common btintel snd_seq_midi joydev videodev bluetooth snd_seq_midi_event serio_raw media snd_rawmidi input_leds snd_seq snd_seq_device snd_timer snd soundcore shpchp lpc_ich mac_hid binfmt_misc parport_pc ppdev lp parport autofs4 hid_logitech ff_memless uas usb_storage hid_generic usbhid hid amdkfd AMD_iommu_v2 radeon psmouse pata_acpi i2c_algo_bit ttm sky2 drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops video fjes drm [last unloaded: minidriver]
[11934.926401] CPU: 1 PID: 2316 Comm: kworker/1:1 Tainted: G W OE 4.4.0-97-generic #120-Ubuntu
[11934.926404] Hardware name: SAMSUNG ELECTRONICS CO., LTD. R520/R522/R620 /R520/R522/R620 , BIOS 05LL.M025.20090916.Jay 09/16/20
[11934.926410] Workqueue: events release_one_tty
[11934.926413] 0000000000000286 c977cef9c84bca31 ffff88012ea3fd48 ffffffff813fabe3
[11934.926419] 0000000000000000 ffffffff81d386c0 ffff88012ea3fd80 ffffffff810812e2
[11934.926425] ffff8800b5153800 ffff8800b67f6400 ffff8800b67f6400 ffffffffc06dc840
[11934.926430] Call Trace:
[11934.926438] [<ffffffff813fabe3>] dump_stack+0x63/0x90
[11934.926445] [<ffffffff810812e2>] warn_slowpath_common+0x82/0xc0
[11934.926450] [<ffffffff8108142a>] warn_slowpath_null+0x1a/0x20
[11934.926455] [<ffffffff8150357a>] tty_port_destructor+0x7a/0x80
[11934.926460] [<ffffffff81503ce8>] tty_port_put+0x28/0x30
[11934.926471] [<ffffffffc06d5fa8>] rfcomm_tty_cleanup+0x68/0x70 [rfcomm]
[11934.926475] [<ffffffff814f91fb>] release_one_tty+0x3b/0xc0
[11934.926481] [<ffffffff8109a635>] process_one_work+0x165/0x480
[11934.926486] [<ffffffff8109a99b>] worker_thread+0x4b/0x4c0
[11934.926491] [<ffffffff8109a950>] ? process_one_work+0x480/0x480
[11934.926496] [<ffffffff810a0c75>] kthread+0xe5/0x100
[11934.926500] [<ffffffff810a0b90>] ? kthread_create_on_node+0x1e0/0x1e0
[11934.926507] [<ffffffff81843b8f>] ret_from_fork+0x3f/0x70
[11934.926511] [<ffffffff810a0b90>] ? kthread_create_on_node+0x1e0/0x1e0
[11934.926515] ---[ end trace a33c33d1fdbe410d ]---
[11936.001325] Bluetooth: TIOCGSERIAL is not supported
[11936.033194] Bluetooth: TIOCGSERIAL is not supported
すべてが正常に機能する場合(10秒以上)、次のメッセージのみが表示されます。
[11936.001325] Bluetooth: TIOCGSERIAL is not supported
[11936.033194] Bluetooth: TIOCGSERIAL is not supported
[11936.001325] Bluetooth: TIOCGSERIAL is not supported
[11936.033194] Bluetooth: TIOCGSERIAL is not supported
解決
問題は、Ubuntuにインストールされたパッケージが、デバイスの通常のリリースを妨害していたことでした。
ただしてください:
apt-get remove --purge modemmanager
切断する前に10秒待っても問題がないことを考えると、私たちは確固たるリードを持っていると思います:RFCOMM仕様( https://www.bluetooth.org/docman/handlers/DownloadDoc.ashx?doc_id= 263754 )は、データACK(「確認タイマー(T1)」)および制御チャネル応答(「マルチプレクサ制御チャネル(T2)の応答タイマー」)の最小タイムアウトとして10秒を定義します。ほとんどの場合、クライアントからの制御チャネルにACKされていないデータがあります(データを送信したようには聞こえません)。これが切断時に問題を引き起こすとは思わないが、このACKを待っている間にTTYを解放しようとすると、BlueZスタック内の問題が問題を引き起こしている可能性があります。
チャネルでデータを送信してみましたか?制御チャネルが本当にACK解除されている場合、データを交換できれば驚くでしょう。
RFCOMMクライアントとして別のデバイスを使用してみましたか?おそらく、クライアント側のスタックの問題は、制御信号のACK処理ではありません。
私はBlueZスタックを広範囲に使用していないため、正確なコード変更を提供することはできませんが、回避策を策定するのに十分な情報であるといいのですが(たとえば、このACKを待機しているタイマーを追跡できる場合など)あなたはそれを殺すことができます)。
リリースを使ってみましたか?
Sudorfcommリリース0
または、デバイスを/etc/bluetooth/rfcomm
に直接追加し、代わりにバインドして、終了後にリリースを試してください。
Sudo rfcomm bind 0
このエラーは、プロセスがポートを開いたままにしていて、ポートが閉じている場合にのみ解放されるために発生します。
どのデバイスがポートを解放していないかを確認するには:Sudo lsof | grep/dev/rfcomm0(または割り当てられているポート)
簡単な答えは、アプリケーション内の通信ポートを閉じて、幸せな日々を過ごすことです。