Biblioteka MQTT i dziwny kod w C

Cieszymy się, że również zauwazyłeś emotkę na końcu zdania.

Reply to
heby
Loading thread data ...

W dniu 2022-08-10 o 19:25, Atlantis pisze:

Ktoś się pomylił.

A potem znalazł i poprawił błąd :) P.G.

Reply to
Piotr Gałka

Ok, udało mi się trochę pchnąć do przodu prace nad biblioteką. Na chwilę obecną działa już nie tylko wysyłanie wiadomości, ale także jestem w stanie subskrybować temat i odbierać wiadomości od brokera. Usunąłem większość najbardziej rzucających się w oczy błędów oraz konstrukcji, które w pewnych sytuacjach powodowały zawieszanie się kodu. Pozostało jeszcze kilka rzeczy do posprzatania i poprawienia, a na chwilę obecną mierzę się z dziwnym błędem, którego nie potrafię zdiagnozować.

Sytuacja wygląda następująco:

  1. Broker (mosquitto) jest odpalony na Raspberry Pi.
  2. Do brokera podłączone jest jedno z moich urządzeń na ESP8266, które cyklicznie wrzuca dane na jeden temat.
  3. Temat na brokerze podglądam za pomocą mosquitto_sub - faktycznie się tam pojawiają.
  4. Jednocześnie jestem w stanie wrzucać swoje własne dane zapomocą mosquitto_pub - tetrafiają tam, gdzie powinny.

Dziwne zachowanie pojawia się w momencie, gdy do tego samego brokera/tematu podpinam PIC32 z testowaną biblioteką. Normalnie loguje się na brokerze i subskrybuje do tego tematu. Przez jakiś czas odbiera rozsyłane dane pochodzące z ESP8266, ale potem przestaje (na brokerze pojawiają się nadal). Dane, które wrzucam ręcznie (mosquitto_pub) nadal docierają na PIC32.

Co może być przyczyną? Zakładam, że może za to odpowiadać jakaś specyfika protokołu MQTT, której nie jestem świadom.

Reply to
Atlantis

Czyli ręcznie wrzucasz pod ten sam temat i dochodzą, a od ESP nie dochodzą? Zakładam, że qos i retained masz w obydwu przypadkach takie same? Client-id unikalne? (!) No to już czary musiały by być żeby jedno dochodziło drugie nie.

Reply to
Mirek

Ok, już znalazłem przyczynę. Tak jak piszesz - przepisując kod zapomniałem o wywołaniu funkcji, która w przypadku wykrycia ustawionej flagi QoS inicjowała odsyłanie potwierdzenia odebrania wiadomości PUBLISH. Broker nie otrzymując potwierdzeń po jakimś czasie zaprzestawał rozsyłania wiadomości do tego konkretnego subskrybenta. Natomiast wiadomości wysyłane ręcznie nie miały ustawionej flagi, więc dochodziły nadal.

Po uzupełnieniu kodu wszystko działa prawidłowo. Urządzenie pracuje już prawie dobę i cały czas odbiera wiadomości z brokera. W oczy rzuciła mi się natomiast inna kwestia - gdy sprawdzałem za pierwszym razem za pomocą tcpdumpa (odpalonego na Raspberry Pi, gdzie pracuje broker) i wiresharka, widziałem wszystkie pakiety.

Teraz natomiast wygląda to tak, jakby tcpdump nie rejestrował wiadomości wychodzących od klienta (PUBACK, PINGREQ), chociaż wiadomości są wysyłane i najwyraźniej docierają, bo powodują reakcję (np. w postaci odesłania PINGRESP). Jakiś pomysł co może być przyczyną takiego stanu rzeczy?

Reply to
Atlantis

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.