我正在使用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 没有触发。它必须被触发。 提前谢谢。
答案 0 :(得分:0)
我找到了解决方案。感谢@davidgyoung
使用断点我发现 BluetoothGattServerCallback 中的条件总是评估为 false 。
如果条件是我正在将 UUID 与字符串进行比较,我总是评估错误。
我必须将 UUID 与 UUID 进行比较。
更正了条件
(size of destination buffer) - (the length of the destination string) - 1
我已经检查过并且效果很好。