无法创建 RFCOMM TTY:地址已被使用
Can't create RFCOMM TTY: Address already in use
我在我的服务器中侦听蓝牙连接:
rfcomm listen rfcomm1 1
然后我连接到我的蓝牙客户端并出现此消息:
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 ]
最奇怪的是,有时,断开连接成功,我可以毫无问题地重新连接。
EDIT
我发现当设备保持连接大约10秒或更长时间时,断开连接成功。但是当这个时间比较短的时候(fastconnection/disconnection),问题就出现了。
如果发生故障时,我会:
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
你试过使用release吗?
sudo rfcomm release 0
或者直接将您的设备添加到/etc/bluetooth/rfcomm
然后绑定它,然后在完成后尝试释放。
sudo rfcomm bind 0
鉴于在断开连接前等待 10 秒没有问题,我认为我们有一个可靠的领先优势:RFCOMM 规范 (https://www.bluetooth.org/docman/handlers/DownloadDoc.ashx?doc_id=263754) 将 10 秒定义为数据 ACK 的最短超时时间 ("Acknowledgement Timer (T1)") 和控制通道响应 ("Response Timer for Multiplexer Control Channel (T2)")。最有可能的是,您在客户端的控制通道上收到了未确认的数据(听起来不像您已发送数据)。虽然我不希望这会在断开连接时导致问题,但当您在等待此 ACK 时尝试释放 TTY 时,很可能是 BlueZ 堆栈中的问题导致了问题。
您试过在频道上发送数据吗?如果控制通道真的要取消确认,那么如果您能够交换数据,那将是令人惊讶的。
您是否尝试过使用不同的设备作为您的 RFCOMM 客户端?客户端堆栈中的问题可能不是 ACKing 控制信号。
我没有广泛使用 BlueZ 堆栈,所以我无法提供确切的代码更改,但希望这些信息足以制定解决方法(例如,如果您可以找到正在等待的计时器对于这个 ACK,也许你可以杀死它)。
SOLUTION
问题是安装在 Ubuntu 中的软件包干扰了设备的正常发布。
就这样:
apt-get remove --purge modemmanager
出现此错误是因为某个进程保持端口打开状态,并且仅在端口关闭时才释放。
检查哪个设备没有释放端口:
须藤lsof | grep /dev/rfcomm0(或分配的任何端口)
答案很简单,关闭应用程序内的通信端口,祝你好运!
我在我的服务器中侦听蓝牙连接:
rfcomm listen rfcomm1 1
然后我连接到我的蓝牙客户端并出现此消息:
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 ]
最奇怪的是,有时,断开连接成功,我可以毫无问题地重新连接。
EDIT
我发现当设备保持连接大约10秒或更长时间时,断开连接成功。但是当这个时间比较短的时候(fastconnection/disconnection),问题就出现了。
如果发生故障时,我会:
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
你试过使用release吗?
sudo rfcomm release 0
或者直接将您的设备添加到/etc/bluetooth/rfcomm
然后绑定它,然后在完成后尝试释放。
sudo rfcomm bind 0
鉴于在断开连接前等待 10 秒没有问题,我认为我们有一个可靠的领先优势:RFCOMM 规范 (https://www.bluetooth.org/docman/handlers/DownloadDoc.ashx?doc_id=263754) 将 10 秒定义为数据 ACK 的最短超时时间 ("Acknowledgement Timer (T1)") 和控制通道响应 ("Response Timer for Multiplexer Control Channel (T2)")。最有可能的是,您在客户端的控制通道上收到了未确认的数据(听起来不像您已发送数据)。虽然我不希望这会在断开连接时导致问题,但当您在等待此 ACK 时尝试释放 TTY 时,很可能是 BlueZ 堆栈中的问题导致了问题。
您试过在频道上发送数据吗?如果控制通道真的要取消确认,那么如果您能够交换数据,那将是令人惊讶的。
您是否尝试过使用不同的设备作为您的 RFCOMM 客户端?客户端堆栈中的问题可能不是 ACKing 控制信号。
我没有广泛使用 BlueZ 堆栈,所以我无法提供确切的代码更改,但希望这些信息足以制定解决方法(例如,如果您可以找到正在等待的计时器对于这个 ACK,也许你可以杀死它)。
SOLUTION
问题是安装在 Ubuntu 中的软件包干扰了设备的正常发布。
就这样:
apt-get remove --purge modemmanager
出现此错误是因为某个进程保持端口打开状态,并且仅在端口关闭时才释放。
检查哪个设备没有释放端口: 须藤lsof | grep /dev/rfcomm0(或分配的任何端口)
答案很简单,关闭应用程序内的通信端口,祝你好运!