Pagkontrol sa ESP8266 nang walang port forwarding: isang MQTT na palabas na landas
Ang broker na maaabot mula sa internet ay nagpapahintulot na makontrol ang isang aparato sa bahay sa pamamagitan ng koneksiyong binuksan nito mismo. Ano ang binabago nito para sa memorya ng TLS, mga paksa at pag-uulit.
Ang aparato ay nasa likod ng home router na walang port forwarding at walang pampublikong address, at kailangan pa rin nitong matanggap ang konpigurasyon sa loob ng ilang segundo. Ang daya ay hindi butas sa firewall. Ito ay isang koneksiyon na binubuksan ng aparato pakanlabas patungo sa broker na maaabot nito, at ibinabalik nito ang mga mensahe sa mismong naitatag na landas. Bawat katangiang gusto ng mga tao sa disenyong ito, at bawat bitag dito, ay nagmumula sa baligtad na iyon.
Ano ang talagang dumadaan sa NAT
Kapag binuksan ng aparato ang isang TCP na koneksiyon sa broker, gumagawa ang home router ng mapping at pinananatili itong buhay habang tumatagal ang daloy. Ang mga sagot sa daloy na iyon ay bumabalik sa aparato dahil umiiral na ang mapping. Hindi kailanman nagpapasimula ang broker ng anuman patungo sa bahay, kaya walang hindi hinihinging papasok na packet na kailangang tanggihan ng router. Iyan ang buong argumento sa networking, at iyon ang dahilan kung bakit gumagana ang pamamaraang ito sa mga network na hindi mo kontrolado.
Kailangang panatilihing buhay ng aparato ang koneksiyon o muling itatag ito, na nagiging tanong ng pagiging maaasahan kapag naitakda na ang arkitektura.
Ang broker ay nagruruta ng mga paksa, hindi ito nagpo-proxy ng HTTP
Tinutukoy ng MQTT ang mga palitan ng paglalathala at pagpapasuskribi: nagpapasuskribi ang aparato sa isang filter ng paksa na pinapayagan itong basahin, at ang awtorisadong controller ay naglalathala sa tugmang paksa. Itinatapat ng broker ang mga paglalathala sa mga suskripsiyon at naghahatid ng mga kopya. Hindi nito alam kung ano ang kahilingan ng browser, at hindi nito ipapasa ang HTTP GET sa web server ng aparato. Kung ang umiiral na firmware ay nagsasalita lamang ng HTTP, kailangan ng disenyong broker ang pagbabago sa aplikasyon o isang sadyang bahagi ng pagsasalin.
Ang mga pangalan ng paksa ay hindi rin awtorisasyon. Karamihan sa mga broker ay sumusuporta sa mga listahan ng kontrol sa pag-access bawat kliyente, at ang mga aparato ay dapat limitahan sa sarili nilang mga puno ng paglalathala at pagpapasuskribi sa halip na magbahagi ng isang pandaigdigang namespace.
Ang mga mapagkukunan ng aparato ang nagtatakda ng hugis ng TLS
Ang ESP8266 ay may limitadong RAM, at ang TLS handshake ang pinakamahal na bagay na ginagawa nito. Ang Arduino core ay nagdadala ng BearSSL para sa mismong limitasyong ito, at ang pagpili sa pagitan ng pag-verify ng CA at pag-pin ng fingerprint ay nagbabago sa bakas ng memorya at sa kaya ng isang mananakop na may valid na sertipiko para sa ibang pangalan. Ang pag-verify ng CA ng broker ang mas matibay na opsiyon kapag pinapayagan ng heap. Mahalaga rin ang laki ng payload: may hawak na buffer ang kliyenteng MQTT, at ang mga mensaheng mas malaki kaysa rito ay tahimik na pinuputol maliban kung sadyang itataas ang buffer.
Ang keepalive at mga timeout ng socket ay bahagi ng parehong badyet, dahil ang kliyenteng hindi kailanman makakapansin ng patay na koneksiyon ay tumitigil sa pagtanggap ng mga utos nang hindi nag-uulat ng error.
Ang semantika ng mensahe na kumakagat
Ang isang itinagong mensahe ay iniimbak ng broker at inihahatid sa mga tugmang suskriber sa hinaharap, na mahusay para sa kasalukuyang estado at mapanganib para sa isahang utos: ang aparatong muling kumokonekta ay maaaring makatanggap ng utos ng kahapon na parang bago. Ginagarantiyahan ng QoS 1 ang paghahatid nang hindi bababa sa isang beses, kaya normal ang mga duplicate at kailangang maging ligtas sa pag-uulit ang aplikasyon, pinakamainam na may identifier o timestamp na maaari nitong tanggihan. Ang huling habilin ay nagbibigay sa iyo ng signal ng estado kapag bumagsak ang aparato, ngunit kung talagang nabigo ang koneksiyon sa halip na nakabitin.
Ang pag-uugali ng malinis na sesyon ang nagtatakda kung itinatago ng broker ang iyong mga suskripsiyon habang wala ka, at ang pagkakamali doon ang dahilan kung bakit ang ilang aparato ay nakakaligtaan ang unang mensahe pagkatapos ng bawat muling pagkonekta.
Pinoprotektahan ng TLS ang bahagi hanggang sa broker. Hindi ito end-to-end na pag-encrypt ng payload laban sa operator ng broker, na maaaring basahin ang lahat ng inilalathala mo sa pamamagitan nito.
Limitahan ang siklo ng buhay at subukan ito gamit ang hindi mapaminsalang data
Planuhin ang muling pagkonekta nang may pag-urong sa halip na masikip na loop ng muling pagtatangka, tahasang magpasuskribi muli kung hindi persistent ang sesyon, at i-log ang resulta ng koneksiyon upang ang tahimik na offline na aparato ay mag-iwan ng ebidensiya. Subukan ang landas ng muling pagkonekta gamit ang mga sample na payload na walang ginagawa, dahil ang unang pagsubok sa produksiyon ng isang channel ng utos ay hindi dapat maging tunay na utos. Pagkatapos ay kumpirmahin kung ano ang ginagawa ng lumang itinagong mensahe sa muling pagkonekta, at magpasya kung katanggap-tanggap ang pag-uugaling iyon para sa bawat paksa.
Kapag ginawa ito sa ganitong paraan, inaalis ng disenyo ang isang pumapasok na pangangailangan sa network at iniiwan ang software ng aparato, patakaran ng broker at semantika ng mensahe bilang nakikitang gawain sa halip na nakatagong mga palagay.