使用 Andrew Rapp 的XBee-API,我如何通过协调器从两个以上的端点采样I/O数据?
我有 17 系列 1 XBees。我已经将一个编程为协调器(API 模式 = 2),其余的编程为端点。使用 XBee-API 我正在发送一个强制 I/O 样本(“IS”)远程 AT 命令,单播到每个端点。这在最多有两个端点时效果很好,但是一旦添加了第三个端点,三个端点中的一个总是变得无响应(XBeeTimeoutException 超时)。停止响应的并不总是同一个物理单元,但总是第三个(例如,如果我将 Force I/O Sample 发送到 Device1、Device2 和 Device3,Device3 将超时,如果我将顺序更改为Device3、Device1、Device2、Device2 将超时。
如果我设置了三个以上的 XBees,大约三分之一的 XBees 会超时——但不是每三分之一。
我已经证实 XBees 本身没有问题。我已经搜索了 Internet 和 Stack Overflow,尤其是无济于事。我尝试过使用简单的 ZNetRemoteAtRequest。我尝试为所有三个设备打开和关闭 XBee 协调器串行连接一次,每个设备一次,每个程序运行一次。我尝试改变协调器和端点之间的距离(相距不超过五英尺)。我尝试了不同的协调器配置参数(来自 Digi 文档)。我已经尝试为协调员更换 XBee。
这是我用来向每个端点发送 Force I/O Sample 请求并读取响应的代码:
xbee = new XBee(); // Coordinator
xbee.open("/dev/ttyUSB0, 115200)); // Happens before any of the endpoints are contacted
... // Loop through known endpoint addresses
XBeeRequest request = new ZBForceSampleRequest(new XBeeAddress64(endpointAddress));
ZNetRemoteAtResponse response = null;
response = (ZNetRemoteAtResponse) xbee.sendSynchronous(request, remoteXBeeTimeout);
if (response.isOk()) {
// Process response payload
}
... // End loop and finally close coordinator connection
什么可能有助于从两个以上的端点轮询 I/O 样本?
编辑:我发现 Andrew Rapp 的 XBee-API 库伪造了多线程行为,这导致了这个问题中描述的同步问题。我编写了一个替换库,它实际上是多线程的,并且可以正确映射来自多个 XBee 端点的响应:https ://github.com/steveperkins/xbee-api-for-java-1-4 。当我编写它时,Java 1.4 是在 BeagleBone、Plug 和 Zotac 单板 PC 上使用所必需的,但它很容易转换到 1.7+。