ESP8266:n hallinta ilman portin edelleenohjausta: lähtevä MQTT-polku
Internetistä tavoitettava broker mahdollistaa kotilaitteen hallinnan yhteyden kautta, jonka laite itse avasi. Mitä se muuttaa TLS-muistille, aiheille ja toistolle.
Laite istuu kotireitittimen takana ilman portin edelleenohjausta ja julkista osoitetta, ja sen on silti saatava kokoonpano sekunneissa. Temppu ei ole reikä palomuurissa. Se on yhteys, jonka laite avaa ulospäin brokeriin, jonka se tavoittaa, ja joka välittää viestit takaisin samaa vakiintunutta polkua pitkin. Jokainen ominaisuus, josta tässä suunnittelussa pidetään, ja jokainen siihen kätkeytyvä ansa, tulee tästä käänteisyydestä.
Mikä oikeasti kulkee NAT:n läpi
Kun laite avaa TCP-yhteyden brokeriin, kotireititin luo kartoituksen ja pitää sitä elossa vuon eliniän. Vastaukset tuolla vuolla palaavat laitteelle, koska kartoitus on jo olemassa. Broker ei koskaan aloita mitään taloa kohti, joten reitittimellä ei ole hylättävää pyytämätöntä saapuvaa pakettia. Siinä on koko verkkoperustelu, ja siksi lähestymistapa toimii verkoissa, joita et hallitse.
Laitteen on pidettävä yhteys elossa tai muodostettava se uudelleen, ja siitä tulee luotettavuuskysymys, kun arkkitehtuuri on vakiintunut.
Broker reitittää aiheita, se ei välitä HTTP:tä proxy-palvelimena
MQTT määrittelee julkaisu- ja tilausvaihdot: laite tilaa aihesuodattimen, jonka se saa lukea, ja valtuutettu ohjain julkaisee vastaavaan aiheeseen. Broker sovittaa julkaisut tilauksiin ja toimittaa kopiot. Se ei tiedä, mikä selainpyyntö on, eikä se välitä HTTP GET -pyyntöä laitteen verkkopalvelimelle. Jos olemassa oleva laiteohjelmisto puhuu vain HTTP:tä, broker-suunnittelu vaatii sovellusmuutoksen tai tarkoituksellisen käännöskomponentin.
Aiheiden nimet eivät myöskään ole valtuutus. Useimmat brokerit tukevat asiakaskohtaisia käyttöoikeusluetteloita, ja laitteet tulisi rajoittaa omiin julkaisu- ja tilaustarjoihinsa sen sijaan, että ne jakaisivat yhden maailmanlaajuisen nimiavaruuden.
Laitteen resurssit määräävät TLS:n muodon
ESP8266:ssa on rajoitettu RAM, ja TLS-kättely on kallein asia, jonka se tekee. Arduino-ydin toimittaa BearSSL:n juuri tämän rajoituksen vuoksi, ja valinta CA:n vahvistamisen ja sormenjäljen kiinnittämisen välillä muuttaa sekä muistijalanjälkeä että sitä, mitä hyökkääjä, jolla on toiselle nimelle kelpaava varmenne, voi tehdä. Brokerin CA:n vahvistaminen on vahvempi vaihtoehto, kun keko sallii sen. Myös hyötykuorman koko merkitsee: MQTT-asiakas pitää puskuria, ja sitä suuremmat viestit katkaistaan hiljaisesti, ellei puskuria kasvateta tarkoituksella.
Keepalive ja soketin aikakatkaisut ovat osa samaa budjettia, koska asiakas, joka ei koskaan huomaa kuollutta yhteyttä, lakkaa vastaanottamasta komentoja ilmoittamatta virheestä.
Viestien semantiikka, joka puree
Säilytetyn viestin broker tallentaa ja toimittaa myöhemmille vastaaville tilaajille, mikä on erinomaista nykytilalle ja vaarallista kertakäyttöisille komennoille: uudelleen yhdistävä laite voi saada eilisen komennon ikään kuin se olisi uusi. QoS 1 takaa toimituksen vähintään kerran, joten kopiot ovat normaaleja ja sovelluksen on oltava toistoturvallinen, mieluiten tunnisteella tai aikaleimalla, jonka se voi hylätä. Viimeinen tahto antaa tilasignaalin, kun laite putoaa, mutta vain jos yhteys todella epäonnistuu eikä jää roikkumaan.
Puhtaan istunnon käyttäytyminen ratkaisee, säilyttääkö broker tilauksesi poissa ollessasi, ja sen tekeminen väärin on syy siihen, miksi jotkin laitteet menettävät ensimmäisen viestin jokaisen uudelleenyhdistämisen jälkeen.
TLS suojaa osuuden brokeriin. Se ei ole hyötykuorman päästä päähän -salaus brokerin operaattoria vastaan, joka voi lukea kaiken, mitä sen kautta julkaiset.
Rajaa elinkaari ja testaa sitä vaarattomilla tiedoilla
Suunnittele uudelleenyhdistäminen perääntymisellä tiukan uudelleenyrityssilmukan sijaan, tilaa uudelleen nimenomaisesti, jos istunto ei ole pysyvä, ja kirjaa yhteyden tulos, jotta hiljainen offline-laite jättää todisteita. Testaa uudelleenyhdistämispolku esimerkkihyötykuormilla, jotka eivät tee mitään, koska komentokanavan ensimmäinen tuotantotesti ei saisi olla oikea komento. Vahvista sitten, mitä vanhentunut säilytetty viesti tekee uudelleenyhdistämisessä, ja päätä, onko se käyttäytyminen hyväksyttävää jokaiselle aiheelle.
Näin tehtynä suunnittelu poistaa yhden saapuvan verkkovaatimuksen ja jättää laitteen ohjelmiston, brokerin käytännön ja viestien semantiikan näkyväksi työksi piilotettujen oletusten sijaan.