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).

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).

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.

  • Capitalizar cada palabra en Editar texto mientras escribe
  • Android: ¿Cómo puedo establecer un listener para el MenuButton?
  • Carga pesada en el hilo que causa problemas de memoria
  • Android: gravity = "right" no funciona en todos los dispositivos para árabe y otros idiomas RTL
  • Cómo utilizar ScriptIntrinsic3DLUT con un archivo .cube?
  • Android - ViewRootImpl $ CalledFromWrongThreadException
  • ¿Es posible perder una conexión de base de datos SQLite?
  • Código de retorno de API de Cloud = UNAUTHENTICATED, cause = java.io.IOException: Error al obtener el token de acceso para la cuenta de servicio:
  • Grabar llamadas telefónicas en el teléfono Android?
  • ValueEventListener vs ChildEventListener para RecyclerView en Android
  • Sms ContentObserver onChange () se activa varias veces
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.