订阅以接收来自特征的通知以读取ECG信号

时间:2019-07-15 14:08:19

标签: android kotlin bluetooth bluetooth-lowenergy

我有连接到特定设备并从中读取数据的代码,然后输出显示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)
                }
            }
        }
    }

我希望一旦订阅了新特性的通知,我就会从新设备接收数据流,并且它将不再能够连接到旧设备。

1 个答案:

答案 0 :(得分:0)

首先,我建议使用第三方应用检查新目标设备中的特性列表,示例应用为nRF Control PanelLightBlue。确保新设备正在使用特征描述符中的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控制面板获得的字符串。在执行设备发现部分之前,请确保已打印日志。