Android BLE外设预定义Characteristic值并广播服务的实现问题
Android BLE外设设置Characteristic预定义值问题解决
Android完全支持给BLE外设的Characteristic设置预定义值,你的问题出在使用了废弃的setValue方法,且没有遵循Android BLE外设模式的正确流程。
错误原因
你使用的rxCharacteristic.setValue(payload)是被废弃的setValue(byte[])方法,该方法在BLE外设模式下无法正确生效,导致Characteristic值为空。
正确实现方式
使用未废弃的setValue重载方法
替换废弃的setValue(byte[]),使用带偏移量和长度的重载方法:val rxCharacteristic = BluetoothGattCharacteristic( UUID.fromString("你的Characteristic UUID"), BluetoothGattCharacteristic.PROPERTY_READ, BluetoothGattCharacteristic.PERMISSION_READ ) // 使用未废弃的重载方法设置值 rxCharacteristic.setValue(payload, 0, payload.size)正确关联GattServer并处理读取请求
仅设置值还不够,需要将Characteristic添加到Service,再注册到BluetoothGattServer,并在读取回调中返回预定义值:// 创建Service val service = BluetoothGattService( UUID.fromString("你的Service UUID"), BluetoothGattService.SERVICE_TYPE_PRIMARY ) service.addCharacteristic(rxCharacteristic) // 启动GattServer并添加Service val gattServer = bluetoothManager.openGattServer(context, object : BluetoothGattServerCallback() { override fun onCharacteristicReadRequest( device: BluetoothDevice?, requestId: Int, offset: Int, characteristic: BluetoothGattCharacteristic? ) { // 返回预定义的Characteristic值 gattServer.sendResponse( device, requestId, BluetoothGatt.GATT_SUCCESS, offset, characteristic?.value ) } }) gattServer.addService(service)
对比iOS实现
iOS的CBMutableCharacteristic构造函数直接支持传入初始值,而Android需要通过未废弃的setValue重载方法设置,再结合GattServer的回调确保值能被中心设备正确读取。
内容的提问来源于stack exchange,提问作者ABDERRAHMANE OUALI
相关产品推荐
相关产品推荐

