我有连接到特定设备并从中读取数据的代码,然后输出显示ECG信号的数据流,我正在尝试将应用读取的设备更改为新设备,但无法确定了解如何从该设备的UUID订阅通知。
我知道该代码适用于旧设备,但要使其在类似但不同的设备上运行却很麻烦。我不确定代码中要进行哪些更改,因此它会订阅来自新UUID的通知。
override fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) {
runOnUiThread { update("Services discovered!") }
/* For every service */
for (gattService: BluetoothGattService in gatt!!.services) {
/* For every characteristic */
for (gattChar: BluetoothGattCharacteristic in gattService.characteristics) {
/* Subscribe to target read characteristic */
if (gattChar.uuid.toString().contains(bluetoothReadChar) && !subscribed) {
/* Set notification flags */
subscribed = true
gatt.setCharacteristicNotification(gattChar, true)
val descriptor = gattChar.getDescriptor(
UUID.fromString(BleNamesResolver.CLIENT_CHARACTERISTIC_CONFIG)
)
descriptor.value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE
gatt.writeDescriptor(descriptor)
}
}
}
}
我希望一旦订阅了新特性的通知,我就会从新设备接收数据流,并且它将不再能够连接到旧设备。
答案 0 :(得分:0)
首先,我建议使用第三方应用检查新目标设备中的特性列表,示例应用为nRF Control Panel和LightBlue。确保新设备正在使用特征描述符中的NOTIFICATION而不是INDICATION。您的代码当前仅适用于NOTIFICATION。在应用程序中,您可以找到设备信息,例如设备地址(例如6字节的十六进制数字,例如00:08:23:af:21:84)。
从您的活动中启动设备连接,
BluetoothManager bm = (BluetoothManager)context.getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter adapter = bm.getAdapter();
BluetoothDevice device =adapter.getRemoteDevice(address);
BluetoothGatt gatt = device.connectGatt(context, true, new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
super.onConnectionStateChange(gatt, status, newState);
if (newState == BluetoothGatt.STATE_CONNECTED) {
Log.i(TAG, "Device Connected");
}
});
}
address
是您从nRF控制面板获得的字符串。在执行设备发现部分之前,请确保已打印日志。