我正在使用Java API (xbee-java-library-1.3.0.jar)编写一个Java程序,它将把XBee2/3连接到SmartThings Hub。我一直按照包的布局列在https://nzfalco.jimdofree.com/electronic-projects/xbee-to-smartthings/

我遇到了一个有趣的问题。在按顺序发送了几个数据包之后,我不再被ExplicitDataListener调用。我在日志中看到我正在接收数据包,但即使有断点,回调也从未被击中。这似乎是一个与时间相关的问题,因为它发生在序列的不同点。

例如,我收到数据包(在日志中显示):
[Thread-1] DEBUG com.digi.xbee.api.DataReader - [COM6 - 9600/8/N/1/N]
包:7 e001791286d97000206071b000001080000010411001e000100da
起始分隔符:7E
长度:00 17 (23)
框架类型:91(显式RX指示器)
64位源地址:28 6D 97 00 02 06 07 1B
16位源地址:00 00
源端点:01
终点:08
集群ID: 00 00
个人资料ID: 01 04
接收选项:11
射频数据:00 1E 00 01 00
校验和:达

但是处理程序永远不会被ExplicitXBeeMessage调用。

下面是(不完整的)听众:
@Override
公共同步void explicitDataReceived(ExplicitXBeeMessage) {
synchronized (this.myDevice) {
/ / this.myDevice.addExplicitDataListener(这个);
final int clusterID = explicitXBeeMessage.getClusterID();
final int profileID = explicitXBeeMessage.getProfileID();
system . out。println("explicitDataReceived Profile " + profileID + ", Cluster " + clusterID);

try {switch (profileID) {case 0x0000: switch (clusterID) {case ZigbeeMessage。ACTIVE_ENDPOINT_REQUEST: system . out。println(“收到ACTIVE_ENDPOINT_REQUEST”);ActiveEndpointsResponse。create(exicitxbeemessage, (byte) 0x00, (byte) 0x01, (byte) 0x08) .send(this.myDevice);打破;ZigbeeMessage。SIMPLE_DESCRIPTOR_REQUEST: system . out。println(“收到SIMPLE_DESCRIPTOR_REQUEST”);SimpleDescriptorResponse .create(explicitXBeeMessage, (byte) 0x00, (byte) 0x08, 0x0104, 0x0002, (byte) 0x30) .clusterIn(0x0000).clusterIn(0x0003).clusterIn(0x0006).send(this.myDevice);打破; default: System.out.println("Undefined Profile " + profileID + ", Cluster " + clusterID); break; } break; default: System.out.println("Undefined Profile " + profileID + ", Cluster " + clusterID); break; } } catch (final Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

我看到的一种可能性是接收器在线程池上运行。我一直在使用Listener方法来创建和发送响应包。我是否应该有一个多线程有限状态机,这样侦听器就可以简单地记录事件,然后通知前台线程发送响应?工作量很大,但我已经没主意了?

注意,我在Java API中看到的示例都非常简单,在退出之前只发送几个数据包。如果有一个完整的协议引擎就好了。

为了回答我的问题,我修改了我的设备处理程序,将来自显式datareceived的响应排队,并在前台任务中发送响应,一切似乎都在工作。现在开始处理ZHA命令请求。