Android BLE: no se puede escribir una característica (no PROPERTY_WRITE)
Tengo una aplicación Android (Glass) que actúa como BLE central y se conecta a un BLE periférico (que es un dispositivo iOS que utiliza Core Bluetooth). Estoy tratando de leer y escribir en el periférico.
La lectura funciona bien (y recibir notificaciones funciona bien también).
- Gson convierte una matriz de objetos de datos en json - Android
- Uso del patrón de diseño Singleton para SQLiteDatabase
- ¿Utilizar BottomBar evita que se abran fragmentos?
- ¿Cómo cambiar de para a foreach en este caso?
- Android python integración completa
Sin embargo no logré escribir una característica. Aquí está mi código:
@Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { BluetoothGattService bse = gatt.getService(TRANSFER_SERVICE_UUID); BluetoothGattCharacteristic bgc = bse.getCharacteristic(TRANSFER_CHARACTERISTIC_UUID); bgc.setValue("Hello"); boolean writeOk = gatt.writeCharacteristic(bgc); } } @Override public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { // never called }
writeOk
siempre es false
. Lo depuré y descubrí que la razón son las propiedades. bgc.getProperties()
devuelve siempre 50
, independientemente de las propiedades que se establezcan en el lado de iOS. 50
es PROPERTY_READ
, PROPERTY_NOTIFY
y PROPERTY_INDICATE
, pero su falta PROPERTY_WRITE
, así que BluetoothGatt.writeCharacteristic()
sale inmediatamente:
public boolean writeCharacteristic(BluetoothGattCharacteristic characteristic) { if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_WRITE) == 0 && (characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) == 0) return false; ... }
Me parece que las propiedades no se transmiten correctamente desde el periférico iOS a la central de Android. Cuando se conecta al periférico iOS con una central iOS, las propiedades se transmiten correctamente y la escritura funciona.
Yo he tratado:
- Emparejar los dispositivos
- Usando la escritura confiable ( pero no sé realmente cuál es de todos modos )
Entonces, ¿estoy haciendo algo mal en el lado de Android? Si no, ¿esto es un error? ¿O iOS sólo quiere obtener escritos de dispositivos iOS?
Estoy usando Android 4.4.2 (Glass XE18.11).
- Implementación de mensajería de Google Cloud en Java con MySql
- Opacidad incremental, que desea una opacidad constante Vista de imagen con Drawable
- Android: ksoap, "UnknownHostException: host no resuelto" dependiendo de la API
- Barra de desplazamiento horizontal y vertical en Android con tablelayout?
- "Acción completa usando" al intentar cargar en un WebView
- Cómo guardar la imagen a través de la captura en android a php?
- Cómo validar String usando expresión regular en java
- Inicie el visor de intenciones para mostrar la imagen desde url
Parece que se trataba de un error en la API BLE de Android. Después de la última actualización (Glass XE18.3) este comportamiento se ha ido y transmitir las propiedades funciona como se esperaba.
Puede encontrar la respuesta en este enlace:
https://devzone.nordicsemi.com/question/1423/writing-to-a-characteristic-using-the-android-43-api/
Saludos
- Cómo hacer una copia de seguridad / restaurar la base de datos SQLite en Android a Dropbox
- Google Maps de Google – Error al inflar el fragmento de clase