丢失了来自连接到同一网络上主机的设备的大量消息

时间:2019-05-08 11:39:05

标签: java c++ networking tcp wireless

我连接了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上运行。

你们中的任何一个人有什么主意,为什么它会错过这么多的心跳,问题出在哪里,或者我可以进行哪些测试找出答案?

谢谢

0 个答案:

没有答案