Отсутствует много сообщений от устройств, подключенных к хосту в той же сети - PullRequest
0 голосов
/ 08 мая 2019

У меня подключено 35 модулей esp8266, и каждый из них посылает «сердцебиение» каждые 2 секунды, чтобы сообщить Java-части, что они все еще «живы».

Код esp8266, написанный с помощью Arduino IDE, пытается отправить пульс, в случае неудачи он проверит, подключено ли оно к Интернету и хосту, и переподключится, если нет. Если это не удалось 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;
      }

Он связывается через сокетное соединение с 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());
        }
     }

Проблема в том, что ESP8266s иногда не в состоянии отправлять 6 тактов подряд. Я проверил очередь блокировки, и она обрабатывает все запросы очень быстро. Что заставляет меня задуматься, если проблема связана с сетью. Я использую Teltonika -RUT955 , который, по моему мнению, должен быть более чем достаточно мощным. Все ESP8266 и хост работают на одном WiFi.

У кого-нибудь из вас есть идеи, почему он пропускает так много сердцебиений и в чем заключаются проблемы или какие тесты я могу выполнить, чтобы выяснить это?

Спасибо

...