android - 具有多种服务的 Android BLE Gatt 服务器 - onCharacteristicWriteRequest() 没有用于句柄的字符
问题描述
我正在尝试构建具有多个自定义服务和多个特征的 BLE Gatt 服务器。
首先,我使用了 Google 示例:https ://github.com/androidthings/sample-bluetooth-le-gattserver/tree/master/kotlin
这很简单,而且效果很好。我修改了 UUID 以适应我的情况,我可以毫无问题地接收通知并写入字符。
这是我定义服务和字符的地方:
fun createTimeService(): BluetoothGattService {
val service = BluetoothGattService(TIME_SERVICE,
BluetoothGattService.SERVICE_TYPE_PRIMARY)
// Current Time characteristic
val currentTime = BluetoothGattCharacteristic(CURRENT_TIME,
//Read-only characteristic, supports notifications
BluetoothGattCharacteristic.PROPERTY_READ or BluetoothGattCharacteristic.PROPERTY_NOTIFY,
BluetoothGattCharacteristic.PERMISSION_READ)
val configDescriptor = BluetoothGattDescriptor(CLIENT_CONFIG,
//Read/write descriptor
BluetoothGattDescriptor.PERMISSION_READ or BluetoothGattDescriptor.PERMISSION_WRITE)
currentTime.addDescriptor(configDescriptor)
// Local Time Information characteristic
val localTime = BluetoothGattCharacteristic(LOCAL_TIME_INFO,
BluetoothGattCharacteristic.PROPERTY_WRITE,
BluetoothGattCharacteristic.PERMISSION_WRITE)
service.addCharacteristic(currentTime)
service.addCharacteristic(localTime)
return service
}
fun createSerialService(): BluetoothGattService {
val service = BluetoothGattService(serialPortServiceID,
BluetoothGattService.SERVICE_TYPE_PRIMARY)
val serialData = BluetoothGattCharacteristic(serialDataCharacteristicID,
BluetoothGattCharacteristic.PROPERTY_WRITE,
BluetoothGattCharacteristic.PERMISSION_WRITE)
service.addCharacteristic(serialData)
return service
}
在这里,我将它们应用于我的服务器:
private fun startServer() {
bluetoothGattServer = bluetoothManager.openGattServer(this, gattServerCallback)
bluetoothGattServer?.addService(TimeProfile.createTimeService())
?: Log.w(TAG, "Unable to create GATT server")
bluetoothGattServer?.addService(TimeProfile.createSerialService())
?: Log.w(TAG, "Unable to create GATT server")
// Initialize the local UI
updateLocalUi(System.currentTimeMillis())
}
我希望在添加第二项服务后一切都会像以前一样工作。但是现在,如果我尝试编写/订阅任何特征(无论在哪个服务中),我都会收到以下信息:
W/BluetoothGattServer: onCharacteristicWriteRequest() no char for handle 42
W/BluetoothGattServer: onDescriptorWriteRequest() no desc for handle 43
解决方案
我发现出了什么问题。显然,您不能像我一样一次添加所有服务。在确认第一个服务之前添加第二个服务会导致将服务设置为空的异常。
最后,我最初只添加了一项服务来解决这个问题。然后在 BleGattServerCallback() 的 onServiceAdded() 回调中我一个接一个地启动。
推荐阅读
- javascript - 从 (click)= 调用多个函数
- arrays - 将 Javascript 变量数据存储到 MongoDB
- c# - Xamarin.IOS 防止在选择时滚动到底部
- google-chrome - 我在 Chrome 77 上的网站不加载任何数据,但在 Chrome 76 上运行良好
- c - 读取文本文件行上特定字符串后面的所有数字
- gradle - gradle 多项目构建覆盖子项中的依赖项
- javascript - 过滤后的数组输出一个空数组。如何解决?
- javascript - 使用 'this' 初始化常量时出错 | 'this' 隐含类型为 'any' 因为它没有类型注释
- r - 如何从 R 中的自相关双变量分布中生成数字?
- json - JSON Schema 草案 4 布尔值定义了必填字段