web-dev-qa-db-fra.com

Impossible de créer RFCOMM TTY: adresse déjà utilisée

J'écoute pour une connexion Bluetooth sur mon serveur en faisant:

rfcomm listen rfcomm1 1

Puis je me connecte avec mon client Bluetooth et ce message apparaît:

Connection from XX:XX:XX:XX:XX:XX to /dev/rfcomm1
Press CTRL-C for hangup

Cela signifie que tout va bien ...

Ensuite, je termine ma connexion en faisant Ctrl + C sur le serveur ou sur le client.

Après cela, je refais:

rfcomm listen rfcomm1 1

Mais cette fois-ci, lorsque je connecte le client, je reçois ce message:

Can't create RFCOMM TTY: Address already in use

Alors je vais et je vérifie quelles connexions sont ouvertes:

rfcomm -a

Et je peux voir que la connexion apparaît, comme fermée, mais ne devrait pas apparaître une fois déconnectée ...

rfcomm1: XX:XX:XX:XX:XX:XX -> XX:XX:XX:XX:XX:XX channel 1 closed [reuse-dlc release-on-hup ]

Le plus étrange est que, parfois, la déconnexion réussit et que je peux me reconnecter sans aucun problème.

MODIFIER

Je me suis rendu compte que lorsque le périphérique reste connecté environ 10 secondes ou plus, la déconnexion est réussie. Mais lorsque ce temps est plus court (connexion/déconnexion rapide), le problème se produit. 

Et si pendant que l’échec se produit, je fais:

dmesg

Ceci est imprimé:

[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

Lorsque tout fonctionne correctement (10 secondes ou plus), seuls ces messages sont affichés:

[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
8
Sergio

SOLUTION

Le problème était un paquet installé avec Ubuntu qui interférait avec la version normale du périphérique.

Il suffit de faire:

apt-get remove --purge modemmanager
3
Sergio

Étant donné qu’il n’ya pas de problème si vous attendez 10 secondes avant de vous déconnecter, je pense que nous avons une solide avance: la spécification RFCOMM ( https://www.bluetooth.org/docman/handlers/DownloadDoc.ashx?doc_id=263754 ) définit le délai d'expiration minimal de 10 secondes pour les ACK de données ("minuteur d'accusé de réception (T1)") et les réponses du canal de commande ("minuteur de réponse pour le canal de commande de multiplexeur (T2)"). Très probablement, vous avez des données non-ACKed sur le canal de contrôle provenant de votre client (vous n’avez pas l’impression que vous avez envoyé des données). Bien que je ne m'attende pas à ce que cela pose des problèmes lors de la déconnexion, il est probable qu'un problème dans la pile BlueZ le soit lorsque vous essayez de libérer le téléscripteur pendant qu'il attend cet ACK.

  1. Avez-vous essayé d'envoyer des données sur le canal? Si le canal de contrôle est vraiment non ACK, il serait étonnant de pouvoir échanger des données. 

  2. Avez-vous essayé d'utiliser un autre périphérique en tant que client RFCOMM? Peut-être qu'un problème dans la pile côté client n'est pas ACKing signaux de contrôle. 

Je n'ai pas beaucoup travaillé avec la pile BlueZ, je ne peux donc pas fournir de changements de code exacts, mais j'espère que ces informations sont suffisantes pour permettre de contourner le problème (par exemple, si vous pouvez localiser le minuteur qui attend ce ACK, peut-être tu pourrais le tuer).

4
Jacob Torres

Avez-vous essayé d'utiliser release?

Sudo version rfcomm 0

Vous pouvez également ajouter directement votre appareil dans /etc/bluetooth/rfcomm, le lier puis essayer la version une fois que vous avez terminé.

Sudo rfcomm bind 0

4
Adam

Cette erreur se produit car un processus maintient le port ouvert et n'est publié que si le port est fermé.

Pour vérifier quel périphérique ne libère pas le port: Sudo lsof | grep/dev/rfcomm0 (ou le port attribué)

La réponse est si simple: fermez le port de communication dans l'application et passez des jours heureux!

0
robert