Skocz do zawartości

Pomocna odpowiedź

Podoba Ci się ten projekt? Zostaw pozytywny komentarz i daj znać autorowi, że zbudował coś fajnego!

Masz uwagi? Napisz kulturalnie co warto zmienić. Doceń pracę autora nad konstrukcją oraz opisem.

  • 3 tygodnie później...
(edytowany)

Okazjonalnie występują problemy z zawieszaniem się aplikacji serwera. Nie umiem znaleźć przyczyny w logach, ale mam przypuszczenie, że jest to związane z nieoczekiwanym zerwaniem połączenia, przez co serwer czeka na dane w nieskończoność.

Ostatnio poczytałem trochę o MQTT i uznałem, że można spróbować przepisać części programów odpowiedzialne za komunikację tak, żeby zamiast socketów, łączyły się przez ten właśnie protokół. Mam już RPi, więc postawiłem Mosquitto. Robię obsługę poszczególnych funkcji (zdjęcia, autentykacja, napięcie baterii) w oddzielnych callbackach, więc program upraszcza się nieco, bo nie muszę "ifować" po treści wiadomości, żeby wywołać odpowiedni kod do jej przetworzenia. Jeśli coś pojawi się w temacie BasementAlarm/batteryVoltage, to wiadomo co to jest i od razu wywoływana jest odpowiednia metoda.

Druga sprawa, to pozwoli to na kolejkowanie, gdyby połączenie było niestabilne. Zamierzam używać Quality of Service = 2 przy subskrypcji i persistent session dla serwera, a wszelkimi ewentualnymi zaburzeniami połączenia i dbaniem o to, żeby wiadomości dotarły zajmie się broker.

Na razie mam roboczo przepisaną aplikację serwera, trochę więcej zabawy będzie z kodem na ESP32. Ale póki co zamierzam przetestować serwer skryptami z poziomu PC - szybciej się debuguje. Póki co, nauczyłem się przesyłać zdjęcia przy pomocy pary skryptów: publishera i subskrybenta.

Jeśli starczy mi wytrwałości, to zaletą tego, że zmienię protokół komunikacji będzie też to, że przy okazji zrobię refactoring kodu. Bez "większego" celu nie chciałoby mi się tego robić, a w micropythonowych obiektach panuje lekki bałagan 🙂 Nie wiem tylko czy istnieje siła, która zmusiłaby mnie do zrobienia dokumentacji 😛

EDIT: Aplikacja serwerowa już prawidłowo łączy się z Mosquitto i prawidłowo reaguje na nadsyłane komendy oraz zdjęcia. Działa to tak jak zakładałem - dzięki persistent session, nawet jeśli aplikacja na raspberry nie jest podłączona do brokera, a klient w tym czasie prześle do niego dane, to po uruchomieniu serwera dane są mu przekazywane, nie giną.

Pora przerobić oprogramowanie ESP32.

Edytowano przez MasterYoda95
  • 2 tygodnie później...

No i dokonałem: komunikacja między alarmem i serwerem odbywa się już wyłącznie przez brokera MQTT. Ciekawe jest dla mnie to, że teraz ESP działa szybciej (operacja wykonania i przesłania zdjęcia zajmuje mniej czasu), a przecież MQTT jest zbudowane na TCP, więc używane wcześniej przeze mnie sockety są rozwiązaniem niższego poziomu (czy warstwy, nie znam się na sieciach) i sądziłem że powinny działać szybciej. Albo po prostu nieefektywnie je wykorzystywałem. Dodatkowo przesył przez MQTT oznacza konieczność przesłania wiadomości najpierw do brokera, a potem do aplikacji serwera, a jednak działa to szybciej 🙂

W każdym razie logika alarmu i serwera nie zmieniła się, ale szybkość i niezawodność po tej zmianie wzrosła.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...