无法读取从一个 BLE 设备发送到其他设备的特征值
Not able to read characteristic value sent from one BLE Device to Other
我正在开发 Android 应用程序,它通过 BLE 发送一个字符串来假设“Hello World”。当我从其他 BLE 扫描仪扫描时,我在扫描仪应用程序上获得了服务和特性名称,但无法读取特性的实际值,即“Hello World”。
以下是代码片段:-
UUID
public static final String UUID_SENSOR_SERVICE = "0000180f-0000-1000-8000-00805f9b34fb";
public static final String UUID_SENSORS_LEVEL = "00002a19-0000-1000-8000-00805f9b34fb";
正在创建 BluetoothGattService
private BluetoothGattService createService() {
Log.d(TAG, "createService: ");
BluetoothGattService service = new BluetoothGattService(UUID.fromString(SimpleGattAtributes.UUID_SENSOR_SERVICE), SERVICE_TYPE_PRIMARY);
// Counter characteristic (read-only, supports subscriptions)
BluetoothGattCharacteristic data = new BluetoothGattCharacteristic(UUID.fromString(SimpleGattAtributes.UUID_SENSORS_LEVEL), PROPERTY_READ , PERMISSION_READ);
service.addCharacteristic(data);
return service;
}
正在启动 GattServer
private void startGattServer(Context mContext){
Log.d(TAG, "startGattServer: ");
BluetoothGattServerCallback mGattServerCallback = new BluetoothGattServerCallback() {
@Override
public void onCharacteristicReadRequest(BluetoothDevice device, int requestId, int offset, BluetoothGattCharacteristic characteristic) {
if (SimpleGattAtributes.UUID_SENSORS_LEVEL.equals(characteristic.getUuid())) {
Log.d(TAG, "onCharacteristicReadRequest: I am here");
byte[] value = "HelloWorld".getBytes(Charset.forName("UTF-8"));
mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, value);
}
}
};
mGattServer = bluetoothManager.openGattServer(mContext, mGattServerCallback);
mGattServer.addService(createService());
}
在 运行 上面的代码之后,当我打开 Scanner 应用程序时,我的应用程序广播了 BLE 信标。但是当我尝试读取我的特征值“Hellow World”时。我没听懂。
在 Android 手机上测试
正在尝试读取特征值
任何人都可以帮助我吗?我使用日志,我看到 BluetoothGattServerCallback 在我单击“读取”按钮时未触发。它必须被触发。
提前致谢。
我找到了解决方案。感谢@davidgyoung
使用断点我发现 BluetoothGattServerCallback 中的 If condition 总是评估为 false。
我在 if 条件下做错的是我将 UUID 与 String 进行比较,结果始终为 false。
我必须比较 UUID 和 UUID。
已更正条件
if(UUID.fromString(SimpleGattAtributes.UUID_SENSORS_LEVEL).equals(characteristic.getUuid())){
// read logic here
}
我已经检查过了,它运行良好。
我正在开发 Android 应用程序,它通过 BLE 发送一个字符串来假设“Hello World”。当我从其他 BLE 扫描仪扫描时,我在扫描仪应用程序上获得了服务和特性名称,但无法读取特性的实际值,即“Hello World”。
以下是代码片段:- UUID
public static final String UUID_SENSOR_SERVICE = "0000180f-0000-1000-8000-00805f9b34fb";
public static final String UUID_SENSORS_LEVEL = "00002a19-0000-1000-8000-00805f9b34fb";
正在创建 BluetoothGattService
private BluetoothGattService createService() {
Log.d(TAG, "createService: ");
BluetoothGattService service = new BluetoothGattService(UUID.fromString(SimpleGattAtributes.UUID_SENSOR_SERVICE), SERVICE_TYPE_PRIMARY);
// Counter characteristic (read-only, supports subscriptions)
BluetoothGattCharacteristic data = new BluetoothGattCharacteristic(UUID.fromString(SimpleGattAtributes.UUID_SENSORS_LEVEL), PROPERTY_READ , PERMISSION_READ);
service.addCharacteristic(data);
return service;
}
正在启动 GattServer
private void startGattServer(Context mContext){
Log.d(TAG, "startGattServer: ");
BluetoothGattServerCallback mGattServerCallback = new BluetoothGattServerCallback() {
@Override
public void onCharacteristicReadRequest(BluetoothDevice device, int requestId, int offset, BluetoothGattCharacteristic characteristic) {
if (SimpleGattAtributes.UUID_SENSORS_LEVEL.equals(characteristic.getUuid())) {
Log.d(TAG, "onCharacteristicReadRequest: I am here");
byte[] value = "HelloWorld".getBytes(Charset.forName("UTF-8"));
mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, value);
}
}
};
mGattServer = bluetoothManager.openGattServer(mContext, mGattServerCallback);
mGattServer.addService(createService());
}
在 运行 上面的代码之后,当我打开 Scanner 应用程序时,我的应用程序广播了 BLE 信标。但是当我尝试读取我的特征值“Hellow World”时。我没听懂。
在 Android 手机上测试
正在尝试读取特征值
任何人都可以帮助我吗?我使用日志,我看到 BluetoothGattServerCallback 在我单击“读取”按钮时未触发。它必须被触发。 提前致谢。
我找到了解决方案。感谢@davidgyoung
使用断点我发现 BluetoothGattServerCallback 中的 If condition 总是评估为 false。
我在 if 条件下做错的是我将 UUID 与 String 进行比较,结果始终为 false。
我必须比较 UUID 和 UUID。
已更正条件
if(UUID.fromString(SimpleGattAtributes.UUID_SENSORS_LEVEL).equals(characteristic.getUuid())){
// read logic here
}
我已经检查过了,它运行良好。