socket - how to use bluetooth android studio
Conexión RFCOMM/SDP de Bluetooth a un adaptador RS232 en Android (5)
¿A qué velocidad de baudios tiene configurado su dispositivo bluetooth? Estoy conectado, pero mis datos se muestran como la típica mezcla distorsionada que se obtiene con las velocidades en baudios mixtas. Tengo el mío configurado en 57600, esto es lo que he visto usar a otras personas. Oh, gracias por publicar sus resultados, el UUID también me hizo trabajar durante unos días.
Estoy tratando de usar la aplicación de ejemplo de la API de Bluetooth Chat que Google proporciona para conectarse a un adaptador Bluetooth RS232 conectado a otro dispositivo. Aquí está la aplicación para referencia:
http://developer.android.com/resources/samples/BluetoothChat/index.html
Y aquí está la hoja de especificaciones para el conector RS232 solo como referencia:
http://serialio.com/download/Docs/BlueSnap-guide-4.77_Commands.pdf
Bueno, el problema es que cuando voy a conectarme al dispositivo con:
mmSocket.connect(); (BluetoothSocket::connect())
Siempre obtengo un error IOException
generado por el método connect()
. Cuando hago un toString
en la excepción, toString
en el descubrimiento del servicio". Mi pregunta es, en su mayoría, ¿cuáles son los casos que harían que se arrojara una IOException
al método de conexión? Sé que están en el origen en algún lugar, pero no sé exactamente cómo la capa Java en la que escribes las aplicaciones y la capa C / C ++ que contiene la interfaz de las pilas reales. Sé que utiliza la pila de bluez bluetooth que está escrita en C / C ++ pero no estoy segura de cómo eso se vincula con la capa de Java, que es lo que creo que es lanzar la excepción. Cualquier ayuda para indicarme dónde puedo tratar de analizar este problema sería increíble.
Además, solo debo tener en cuenta que puedo vincularme con el adaptador RS232 muy bien, pero nunca puedo conectarme realmente. Aquí está la salida logcat para más referencia:
I/ActivityManager( 1018): Displayed activity com.example.android.BluetoothChat/.DeviceListActivity: 326 ms (total 326 ms) E/BluetoothService.cpp( 1018): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session) D/BluetoothChat( 1729): onActivityResult -1 D/BluetoothChatService( 1729): connect to: 00:06:66:03:0C:51 D/BluetoothChatService( 1729): setState() STATE_LISTEN -> STATE_CONNECTING E/BluetoothChat( 1729): + ON RESUME + I/BluetoothChat( 1729): MESSAGE_STATE_CHANGE: STATE_CONNECTING I/BluetoothChatService( 1729): BEGIN mConnectThread E/BluetoothService.cpp( 1018): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session) E/BluetoothEventLoop.cpp( 1018): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/1498/hci0/dev_00_06_66_03_0C_51 I/BluetoothChatService( 1729): CONNECTION FAIL TOSTRING: java.io.IOException: Service discovery failed D/BluetoothChatService( 1729): setState() STATE_CONNECTING -> STATE_LISTEN D/BluetoothChatService( 1729): start D/BluetoothChatService( 1729): setState() STATE_LISTEN -> STATE_LISTEN I/BluetoothChat( 1729): MESSAGE_STATE_CHANGE: STATE_LISTEN V/BluetoothEventRedirector( 1080): Received android.bleutooth.device.action.UUID I/NotificationService( 1018): enqueueToast pkg=com.example.android.BluetoothChat callback=android.app.ITransientNotification$Stub$Proxy@446327c8 duration=0 I/BluetoothChat( 1729): MESSAGE_STATE_CHANGE: STATE_LISTEN E/BluetoothEventLoop.cpp( 1018): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/1498/hci0/dev_00_06_66_03_0C_51 V/BluetoothEventRedirector( 1080): Received android.bleutooth.device.action.UUID
El dispositivo al que estoy tratando de conectarme es el 00:06:66:03:0C:51
que puedo escanear y aparentemente aparearse bien.
Lo siguiente se combina a partir de una pregunta similar que se resolvió exitosamente con la respuesta seleccionada aquí:
¿Cómo puede uno conectarse a un dispositivo rfcomm que no sea otro teléfono en Android?
La API de Android proporciona ejemplos del uso de listenUsingRfcommWithServiceRecord() para configurar un socket y createRfcommSocketToServiceRecord() para conectarse a ese socket.
Estoy tratando de conectarme a un dispositivo integrado con un chip BlueSMiRF Gold . Mi código Python en funcionamiento (usando la biblioteca PyBluez ), que me gustaría PyBluez a Android, es el siguiente:
sock = bluetooth.BluetoothSocket(proto=bluetooth.RFCOMM)
sock.connect((device_addr, 1))
return sock.makefile()
... así que el servicio para conectarse se define simplemente como el canal 1, sin ninguna búsqueda de SDP.
Como el único mecanismo documentado que veo en la API de Android hace una búsqueda SDP de un UUID, estoy un poco perdido. El uso de "sdptool browse" de mi host Linux aparece vacío, por lo que supongo que el chip en cuestión simplemente carece de soporte SDP.
La velocidad de transmisión que establezca debe coincidir con el dispositivo al que está conectado. Tienen el valor predeterminado de 115200 o cambiar a 9600, pero si necesita otro (1200 en mi caso para un instrumento de levantamiento), debe configurarlo a través de hiperterminio * y un cable de módem nulo.
* Aunque los documentos para el dispositivo de bluesnap sugieren el uso del hiperterminio, hay problemas con él. Después de unas cuantas llamadas a bluesnap, sugirieron:
Primero, cuando conecte el dispositivo a una PC, intente volver a poner la configuración del puente en sus posiciones originales usando 115200 8, N, 1 y X desactivados. Cuando DTE está habilitado, no se puede establecer una conexión de terminal sin usar un software especial diseñado específicamente para conexiones DTR / DTE.
En segundo lugar, HyperTerminal tiene problemas conocidos con BlueSnap. Recomendaría probar TeraTerm o PuTTY.
¡Me tomó 4 días para averiguarlo!
Ok, la respuesta corta es que tuve que usar este UUID para conectarme a mi dispositivo SPP:
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
Intenté cambiarlo, ya que pensé que solo la parte "1101" era importante, ya que veo que se mencionaba con material SPP en todo el lugar en los intertubos, pero eso hizo que no se volviera a conectar. Aparentemente, ese UUID específico es lo que se supone que debe usarse para conectarse a dispositivos SPP genéricos. De todos modos, solo pensé que lo publicaría aquí, así que cualquiera que este tipo de problema tenga una respuesta. Me tomó cerca de 3 días encontrarlo LOL!
Si ''sdptool browse'' no informa información sobre el dispositivo, intente ''sdptool records [device-mac-here]''
Supongo que está relacionado con un error en los teléfonos de Sony-Ericsson ( ver aquí ).
Pude conectarme desde / a un dispositivo Android 2.0 y mi mac usando bluetooth y un UUID totalmente creado. Tratar de hacer lo mismo con un dispositivo j2me (un sony ericsson w910i) funcionaba solo si Android era el servidor; de lo contrario, obtendré la misma excepción que usted.
El UUID que está utilizando, por lo que sé, es una "dirección base" para el perfil spp, y en el campo ServiceClassIDList del ServiceRecord devuelto por el dispositivo del servidor al emitir un descubrimiento de servicio, debe aparecer en la lista DESPUÉS del UUID decidí utilizar ... aparentemente, este no es el caso en algunas situaciones (por ejemplo, mi teléfono primero enumeró el UUID genérico y luego mi UUID personalizado).
Parece que es la misma situación aquí. Puede intentar cambiar manualmente el ServiceRecord y devolver la ServiceClassIDList adecuada. Tal vez funcione para ti ... desafortunadamente, mi estúpido teléfono celular se niega a cambiarlo :(
PD. una cosa extraña es que mi mac es capaz de ver el servicio, incluso si el registro de servicio está "roto", supongo que Android simplemente se molesta en ver el primer UUID en la lista de identificación de servicio (ServiceClassIDList), mientras que mi PC revisa la lista buscando todos los elementos. Pero esto es solo mi suposición :)