web-dev-qa-db-fra.com

Connexion Bluetooth RFCOMM/SDP à un adaptateur RS232 sous Android

J'essaie d'utiliser l'exemple d'application d'API Bluetooth Chat que Google fournit pour se connecter à un adaptateur Bluetooth RS232 connecté à un autre appareil. Voici l'application pour référence:

http://developer.Android.com/resources/samples/BluetoothChat/index.html

Et voici la fiche technique du connecteur RS232 juste pour référence:

http://serialio.com/download/Docs/BlueSnap-guide-4.77_Commands.pdf

Eh bien, le problème est que lorsque je vais me connecter à l'appareil avec:

mmSocket.connect(); (BluetoothSocket::connect())

Je reçois toujours une erreur IOException générée par la méthode connect(). Lorsque je fais un toString à l'exception, j'obtiens "Échec de la découverte du service". Ma question est principalement de savoir quels sont les cas dans lesquels une IOException serait projetée dans la méthode connect. Je sais que ceux-ci se trouvent quelque part dans le code source, mais je ne sais pas exactement comment la couche Java dans laquelle vous écrivez des applications et la couche C/C++ contenant l’interface réelle des piles. Je sais qu'il utilise la pile bluetooth bluez qui est écrite en C/C++, mais je ne sais pas comment cela se lie à la couche Java, ce qui, selon moi, jetterait l'exception. Toute aide pour me diriger vers où je peux essayer de disséquer ce problème serait incroyable.

De plus, je peux jumeler avec l’adaptateur RS232, mais je ne parviens jamais à me connecter. Voici la sortie logcat pour plus de références:

 I/ActivityManager (1018): Activité affichée com.example.Android.BluetoothChat/.DeviceListActivity: 326 ms (total 326 ms) 
 E/BluetoothService.cpp (1018): stopDiscoveryNative: erreur D-Bus dans StopDiscovery : org.bluez.Error.Failed (session de découverte non valide) 
 D/BluetoothChat (1729): onActivityResult -1 
 D/BluetoothChatService (1729): connectez-vous à: 00: 06: 66: 03: 0C: 51 
 D/BluetoothChatService (1729): setState () STATE_LISTEN -> STATE_CONNECTING 
 E/BluetoothChat (1729): + SUR REPRISE + 
 I/BluetoothChat (1729): MESSAGE_STATE_CHANGE: STATE_CONNECTING 
 (1729): COMMENCEZ mConnectThread 
 E/BluetoothService.cpp (1018): stopDiscoveryNative: erreur D-Bus dans StopDiscovery: org.bluez.Error.Failed (session de détection non valide) 
 E/BluetoothEventLoop.cpp (1018) : event_filter: signal reçu org.bluez.Device: PropertyChanged de/org/bluez/1498/hci0/dev_00_06_66_03_0C_51 
 I/BluetoothChatService (1729): TOSTRING DES ÉCHECS DE CONNEXION: Java.io.IOEx: exception de détection de service d 
 D/BluetoothChatService (1729): setState () STATE_CONNECTING -> STATE_LISTEN 
 D/BluetoothChatService (1729): début 
 D/BluetoothChatService (1729): setState () STATE_LISTEN -> STATE_LISTEN 
/BluetoothChat (1729): MESSAGE_STATE_CHANGE: STATE_LISTEN 
 V/BluetoothEventRedirector (1080): A reçu Android.bleutooth.device.action.UUID 
 I/NotificationService (1018): EnvoyéToast pkg = com.example.Android.BluetoothChat =Android.app.ITransientNotification$Stub$Proxy@446327c8 duration = 0 
 I/BluetoothChat (1729): MESSAGE_STATE_CHANGE: STATE_LISTEN 
 E/BluetoothEventLoop.cpp (1018): event_filter: Signal reçu org.bluez.Device: PropertyChanged à partir de/org/bluez/1498/hci0/dev_00_06_66_03_0C_51 
 V/BluetoothEventRedirector (1080): reçu par Android.bleutooth.device.action.UUID 

Le périphérique auquel j'essaie de me connecter est le 00:06:66:03:0C:51 que je peux rechercher et qui semble bien se coupler parfaitement.


Le texte ci-dessous est issu d’une question similaire qui a été résolue avec succès par la réponse sélectionnée ici:

Comment peut-on se connecter à un appareil rfcomm autre qu'un autre téléphone sous Android?

L'API Android fournit des exemples d'utilisation de listenUsingRfcommWithServiceRecord () pour configurer un socket et createRfcommSocketToServiceRecord () pour se connecter à ce socket.

J'essaie de me connecter à un périphérique intégré doté d'un BlueSMiRF Gold . Mon code de travail Python (en utilisant la bibliothèque PyBluez ), que je voudrais porter sur Android, est le suivant:

sock = bluetooth.BluetoothSocket(proto=bluetooth.RFCOMM)
sock.connect((device_addr, 1))
return sock.makefile()

... le service auquel se connecter est défini simplement comme le canal 1, sans aucune recherche SDP.

Comme le seul mécanisme documenté que je vois dans l'API Android effectue la recherche SDU d'un UUID, je suis un peu perdu. Utiliser "sdptool browse" depuis mon hôte Linux est vide, donc je suppose que la puce en question manque tout simplement du support SDP.

20
ThePosey

Ok, la réponse courte est que je devais utiliser cet UUID pour me connecter à mon périphérique SPP:

private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

J'ai essayé de le changer car je pensais que seule la partie "1101" était importante car je vois que cela est mentionné avec du matériel SPP partout sur les intertubes, mais cela a empêché la connexion. Apparemment, cet UUID spécifique est censé être utilisé pour se connecter à des périphériques SPP génériques. Quoi qu'il en soit, je me contenterais de l'afficher ici pour que toute personne à qui ce genre de problème puisse trouver une réponse. Il m'a fallu environ 3 jours pour le trouver LOL!

33
ThePosey

Je suppose que cela est lié à un bug des téléphones Sony-ericsson ( voir ici ).

Je pouvais me connecter depuis/vers un appareil Android 2.0 et mon Mac en utilisant Bluetooth et un UUID totalement inventé. Essayer de faire la même chose avec un appareil j2me (un sony ericsson w910i) ne fonctionnait que si Android était le serveur, sinon je reçois la même exception que vous.

L'UUID que vous utilisez, pour autant que je sache, est une "adresse de base" pour le profil spp et, dans le champ ServiceClassIDList du ServiceRecord renvoyé par le périphérique serveur lors de l'émission d'une découverte de service, il doit être répertorié APRÈS l'UUID que vous avez indiqué. a décidé d’utiliser .. ce n’est pas le cas dans certains cas (par exemple, mon téléphone a tout d’abord répertorié l’UUID générique, puis mon UUID personnalisé).

On dirait que c'est la même situation ici . Vous pouvez essayer de modifier manuellement le ServiceRecord et de renvoyer la liste ServiceClassIDList appropriée. Peut-être que cela fonctionnera pour vous .. malheureusement, mon stupide téléphone portable refuse de le changer :(

PS Une chose étrange est que mon mac est en effet capable de voir le service, même si le ServiceRecord est "cassé", je suppose qu'Android se donne la peine de voir le premier UUID dans le ServiceClassIDList, tandis que mon ordinateur parcourt la liste en recherchant chaque élément. Mais ce n'est que ma supposition :)

2
cheng81

Le débit en bauds que vous avez défini doit correspondre au périphérique auquel il est relié. Ils ont la valeur par défaut 115200 ou passent à 9600, mais si vous en avez besoin (1200 dans mon cas pour un instrument de sondage), vous devez le configurer via un câble hyperterminal * et un modem nul. 

* Bien que la documentation du périphérique bluesnap suggère d'utiliser l'hyperterminal, il présente des problèmes. Après quelques appels au bluesnap, ils ont suggéré:

Tout d’abord, lorsque vous connectez l’appareil à un PC, essayez de remettre les réglages du cavalier dans leur position initiale en utilisant 115200 8, N, 1 et X off. Lorsque DTE est activé, une connexion de terminal ne peut pas être établie sans utiliser un logiciel spécial spécialement conçu pour les connexions DTR/DTE.

Deuxièmement, HyperTerminal a connu des problèmes avec le BlueSnap. Je recommanderais d'essayer TeraTerm ou PuTTY.

m'a pris 4 jours pour le découvrir!

1
John

Quel est le débit en bauds de votre appareil Bluetooth? Je suis connecté, mais mes données apparaissent comme la bouillie brouillée typique que vous obtenez avec des vitesses de transmission mixtes. Le mien est réglé sur 57600, c'est ce que j'ai vu d'autres personnes utiliser. Oh, merci d'avoir posté vos résultats, l'UUID m'a aussi fait travailler quelques jours.

0
user293272

Si 'sdptool browse' ne rapporte aucune information sur le périphérique, essayez 'sdptool records [device-mac-here]'

0
Gilead