带 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 应用程序的运行情况。
正在尝试与 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 应用程序的运行情况。