我连接了35个esp8266单元,它们每2秒发送一次“心跳”,以通知Java部分它们仍然“处于活动状态”。
用Arduino IDE编写的esp8266代码正尝试发送心跳信号,如果不成功,它将检查它是否仍连接到Internet和主机,如果没有,则重新连接。如果连续6次失败,它将重新启动。
if(client.println(_heartbeat) == 0){
heartbeat_attempt ++;
Serial.print("Failed attempt to send heartbeat");
if(heartbeat_attempt > maximum_heartbeat_attempt){
Emergancy_procedure();
}
if (WiFi.status() != WL_CONNECTED){
Serial.println("lost internet connection");
}
if(client.connected() != true){
Serial.println("lost connection to host");
client.connect(host,port);
}
}
else{
client.flush();
heartbeat_attempt = 0;
}
它通过socket connection与Java通信,Java接收该消息并将其添加到阻塞队列(名为 queue_pulse )进行处理。
input = new Scanner(connection.getInputStream());
while (input.hasNextLine()) {
String message = (String) input.nextLine();
information_list = Arrays.asList(message, Client, Client.getInetAddress());
queue_pulse.add(information_list);
此信息然后由队列处理,并更新名为 Online_devices 的并发哈希图
public static ConcurrentHashMap<String, Units> Online_devices = new ConcurrentHashMap<String, Units>();
public static boolean heartbeat (String DeviceID) {
Online_devices.get(DeviceID).heartbeat = System.currentTimeMillis();
我有第二个脚本运行所有 Online_devices ,并检查Java是否在最近10秒钟内收到了心跳信号;如果没有,它将从 Online_Devices 中删除该单元>列出并停止与该单位关联的任何活动。
for (Entry<String, Units> unit : MES_Server.Online_devices.entrySet()) {
if (unit.getValue().heartbeat +10200 < System.currentTimeMillis()) {
remove_unit(unit.getKey());
}
}
问题是,ESP8266有时确实无法连续发送6个心跳。我已经检查了阻塞队列,并且正在真正快速地处理所有请求。这使我想知道问题是否与网络有关。我正在使用Teltonika -RUT955,我认为它应该足够强大。所有ESP8266和主机都在同一WiFi上运行。
你们中的任何一个人有什么主意,为什么它会错过这么多的心跳,问题出在哪里,或者我可以进行哪些测试找出答案?
谢谢