【发布时间】:2013-03-11 03:55:39
【问题描述】:
使用 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 和 StackOverflow,但无济于事。我尝试过使用简单的 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+。
【问题讨论】: