我有一个 15 秒的定时器 Swing ,它通过我的协调器 API (XBee S2) 将数据包发送到最多 20 个路由器 AT。我通过 SerialPortEvent(我正在使用 RXTXcomm.jar 库)接收我的所有数据包,我收到的每个数据包都存储在缓冲区 ArrayList 中。 它们是两个不同的线程吗?我仍在继续使用主 GUI。
所以,我的问题是:向/从多个 XBee 模块发送和接收数据包的最佳方式是什么?我考虑了两种选择,制作一个 for 循环以将单播数据包发送到每个模块(最多 20 个),之后,如果我得到任何响应,请验证我的缓冲接收器。我目前使用这种方法,但有时我会丢失数据包,可能是因为 XBee 是半双工的并且我在发送的同时接收?
另一种选择是发送一个单播数据包并等待每个数据包的响应。在那种情况下,为了不延迟我的定时器 Swing (15 秒),我应该等待什么超时响应。我应该增加这 15 秒吗?
编辑:
我当前的 ACK 超时为 300 毫秒,响应为 450 毫秒
最佳答案
利用来自 XBee 的传输状态数据包,通知您是否在每个路由器的 radio 层接收到数据包。如果应用层的路由器 ACK 不包含任何附加信息,您可以潜在地消除它以减少网络流量。
您应该可以将每个帧发送到路由器并跟踪哪些是 ACK,然后重新发送在第一遍中未确认的帧。只要您在协调器上使用硬件流控制来监视 XBee 模块的串行缓冲区的状态,您就应该没问题。如果XBee掉落CTS,需要立即停止发送字节。
XBee以全双工方式与主机通信,但网络上一次只能发送一个 radio (类似于以太网)。 XBee 模块将管理入站/出站数据包。
最后,确保您的主机以 115,200 bps(或更快)的速度与 XBee 模块通信。使用默认值 9600 bps 效率低下并且会增加主机确认数据包所需的时间。
关于java - Java中如何正确发送和接收多个XBee的数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24632318/