带 RPI 的 BLE,选择了错误的端点 ID

BLE with RPI, wrong endpoint ID selected

正在尝试与 BLE 设备(智能 lamp)通信。

我使用以下依赖项:

    <dependency>
        <groupId>com.github.hypfvieh</groupId>
        <artifactId>bluez-dbus</artifactId>
        <version>0.1.3</version>
    </dependency>

非常有趣的库,在代码质量、依赖管理和清晰度方面,是迄今为止我为 BLE 找到的最好的库...

问题是,我有一个像这样的工作 gatttool 命令,运行 在 Raspberry Pi 4:

gatttool --device=C4:AC:05:42:73:A4 -t random --char-write-req -a 0x1f -n a001037F

... 将 lamp 的亮度设置为 100%。注意地址的值(即“-a 0x1f”),对应gattool“characteristics”中的属性“char value handle”:

handle: 0x001e, char properties: 0x28, char value handle: **0x001f**, uuid: **44092842-0567-11e6-b862-0002a5d5c51b**

我尝试在 java 中使用 bluez-dbus 做同样的事情。我的实现似乎是正确的,但 lamp 没有响应。我对 dbus-monitor 进行了以下跟踪:

method call time=1600276508.729104 sender=:1.184 -> destination=org.bluez serial=210 path=/org/bluez/hci0/dev_C4_AC_05_42_73_A4/service001d/**char001e**; interface=org.bluez.GattCharacteristic1; member=WriteValue
   array of bytes [
      0a 01 03 7f
   ]
   array [
   ]
method return time=1600276508.776261 sender=:1.5 -> destination=:1.184 serial=6589 reply_serial=210

看起来一切正常,除了 bluez-dbus 获取值 0x001e(也就是 gatttool 特性中的“句柄”),以驱动 lamp,它应该是 0x001f(“字符值”在 gatttool 中处理”。

您知道这是库使用不当、设备错误还是什么吗?

这里是代码的一小段摘录,如果你需要更多可以看这里:https://github.com/sebpiller/luke-roberts-lamp-f

    BluetoothDevice lampF = manager.getDevices(true)
        .stream()
        .filter(e -> Objects.equals(e.getAddress(), config.getMac()))
        .findFirst()
        .get();
....
    String uuid = config.getCustomControlService().getUuid();
    BluetoothGattService customControlService = Objects.requireNonNull(lampF.getGattServiceByUuid(uuid));
    LOG.info("found GATT custom control service {} at UUID {}", customControlService, uuid);
....
    String externalApiUuid = config.getCustomControlService().getUserExternalApiEndpoint().getUuid();
    externalApi = Objects.requireNonNull(customControlService.getGattCharacteristicByUuid(externalApiUuid));

...
private void sendCommandToExternalApi(LukeRoberts.LampF.Command command, Byte... parameters) {
    reconnectIfNeeded();

    try {
        externalApi.writeValue(/*reversed*/ command.toByteArray(parameters),    Collections.emptyMap());
    } catch (DBusException e) {
        throw new IllegalStateException("unable to change brightness: " + e, e);
    }
}

感谢您的宝贵时间!

编辑:

我是一个白痴阅读障碍者。 0x0a 与 0xa0 不同。

有时候真想把头撞在墙上....

感谢您的帮助:)

gattool 是 BlueZ 的 eight tools that have been deprecated 之一。

要对此进行调试,我建议使用 bluetoothctl 来测试连接设备的正确路径。会话可能如下所示:

pi@raspberrypi:~ $ bluetoothctl 
[bluetooth]# connect C4:AC:05:42:73:A4 
[my lamp]# menu gatt
[my lamp]# select-attribute 44092842-0567-11e6-b862-0002a5d5c51b
[my lamp:/service0032/char0036]# write 0xa0 0x01 0x03 0x7F
Attempting to write /org/bluez/hci0/dev_C4_AC_05_42_73_A4/service0032/char0036

在命令行上,向您展示可以使用通用 D-Bus 工具完成的所有路径:

pi@raspberrypi:~ $ busctl tree org.bluez

一旦你有了路径,你就可以从命令行使用 D-Bus。

pi@raspberrypi:~ $ busctl call org.bluez /org/bluez/hci0/dev_DE_82_35_E7_43_BE org.bluez.Device1 Connect
pi@raspberrypi:~ $ busctl call org.bluez /org/bluez/hci0/dev_DE_82_35_E7_43_BE/service0032/char0036 org.bluez.GattCharacteristic1 WriteValue aya{sv} 4 0xa0 0x01 0x03 0x7f 0

希望通过这些实验中的知识,您可以更好地理解 Java 应用程序的运行情况。