У меня подключено 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.
У кого-нибудь из вас есть идеи, почему он пропускает так много сердцебиений и в чем заключаются проблемы или какие тесты я могу выполнить, чтобы выяснить это?
Спасибо