1

Téma: MQTT disconnect

K MQTT: V dokumentaci se píše, že "připojení je potřeba provést 'jen jednou' na začátku, a SDS automaticky udržuje spojení (MQTT PING, tedy formou protokolového keep alive)". To se mi ale nějak nedaří, po odpojení a připojení kabelu zůstává stav připojení v proměnné 12200 různý od nuly. Je třeba asi tedy znovu navázat spojení a znovu zaregistrovat všechny odběry. Musím tedy v programu neustále sledovat stav proměnné 12200 a v případě odpojení zareagovat?

2

Re: MQTT disconnect

V principu u všech síťových funkcí, určitě doporučim průběžné sledování stavových hodnot. Typicky stačí (resp. je doporučeno, respektive - je nutné) ověřit stav vždy před voláním kterékoliv síťové funkce, někdy i po dobu jejího průběhu (např. http_get() a jiné neblokující funkce), a pak po skončení procesu dané zavolané funkce.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

3

Re: MQTT disconnect

No já to tak řeším a funguje mi to dobře. Takže spíš jen aby to odpovídalo popisu. wink

4

Re: MQTT disconnect

Vytažení kabelu SDS ihned pozná a v SDS jsou obratem nastaveny tyto hodnoty:

pokud byl v tu dobu otevřený socket na server:
sys[12200] = 8; // 8 = probiha odpojovani - nasledne prejde na 0
sys[12201] = -1; // -1 = idle, nepřipojeno
sys[12202] = -2; // -2 = SDS není připojeno k brokeru
nebo pokud nebylo spojení na server:
sys[12200] = 0; // 0 = klid, nic se neprovádí, ODPOJENO
sys[12201] = -1; // -1 = idle, nepřipojeno
sys[12202] = -2; // -2 = SDS není připojeno k brokeru

Samozřejmě tím, že je kabel od SDS fyzicky odpojen, tak nemá SDS jak poslat správné ukončení spojení, a toto spojení zůstane (na straně serveru) viset až do jeho timeoutu.

Aplikace na straně SDS musí poznat, čtením příslušných sys[], že došlo k odpojení, a znovu se na MQTT server připojit (platí i pro další komunikační protokoly v rámci SDS).

Tedy chování SDS je tak jak bylo zamýšleno - při odpojení kabelu dojde ke zrušení spojení na straně SDS, a po znovu-připojení kabelu musí aplikace vše od začátku obnovit (připojení, subscribe). Je to výsledek analýzy, která ukázala, že jedině takto lze provést úplné a spolehlivé obnovení, než zkoušet spojení profukovat, zda-li se náhodou opraví (není to spolehlivé).

SDS skutečně automaticky odesílá MQTT PING (v rozmezí 15 až 300 sekund, výchozí hodnota 96 sekund). Toto je spolehlivé tak dlouho, dokud je síťové spojení nepřerušeno. Účelem PING je udržovat otevřený socket, který by jinak server, pro nečinnost uzavřel (kdyby SDS dlouho nepublishoval a server dlouho neměl co aktualizovat v rámci subscription) - což je určitě nežádoucí - a spoj je potřeba udržovat otevřený. Ale nic víc to řešit nemá, určitě ne obnovení celkového spojení při fyzickém výpadku připojení (odpojený kabel).

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

5

Re: MQTT disconnect

Já si publish a subscribe optimalizuji pomocí vlastních metod a tabulky, kde si udržuji poslední úspěšně odeslanou hodnotu. Při obnově připojení všechno opět odešlu, jinak odesílám jen tehdy, pokud se hodnota změnila. Takže mi to takto vyhovuje.