Enheden sidder bag en hjemmerouter uden port forwarding og uden offentlig adresse, og den skal stadig modtage konfiguration inden for sekunder. Tricket er ikke et hul i firewallen. Det er en forbindelse, som enheden åbner udad mod en broker, den kan nå, og som derefter sender beskeder tilbage ad samme etablerede vej. Enhver egenskab, folk kan lide ved dette design, og enhver fælde i det, kommer fra den omvendning.

Hvad der faktisk kommer gennem NAT

Når enheden åbner en TCP-forbindelse til brokeren, opretter hjemmerouteren en mapping og holder den i live, så længe flowet varer. Svar på det flow vender tilbage til enheden, fordi mappingen allerede findes. Brokeren starter aldrig noget mod huset, så der er ingen uopfordret indgående pakke, som routeren kan afvise. Det er hele netværksargumentet, og det er derfor, tilgangen virker på netværk, du ikke kontrollerer.

Enheden skal holde forbindelsen i live eller genetablere den, hvilket bliver pålidelighedsspørgsmålet, når arkitekturen er fastlagt.

Brokeren ruter emner, den proxyer ikke HTTP

MQTT definerer udvekslinger med publicering og abonnement: enheden abonnerer på et emnefilter, den har lov til at læse, og en autoriseret controller publicerer til et matchende emne. Brokeren matcher publiceringer med abonnementer og leverer kopier. Den ved ikke, hvad en browseranmodning er, og den videresender ikke en HTTP GET til enhedens webserver. Hvis den eksisterende firmware kun taler HTTP, kræver brokerdesignet en ændring i applikationen eller en bevidst oversættelseskomponent.

Emnenavne er heller ikke autorisation. De fleste brokere understøtter adgangskontrollister pr. klient, og enheder bør begrænses til deres egne publicerings- og abonnementstræer i stedet for at dele et globalt navnerum.

Enhedens ressourcer bestemmer TLS-formen

En ESP8266 har begrænset RAM, og et TLS-handshake er det dyreste, den gør. Arduino-kernen leverer BearSSL netop på grund af denne begrænsning, og valget mellem at verificere en CA og at pinne et fingeraftryk ændrer både hukommelsesforbruget og hvad en angriber med et gyldigt certifikat til et andet navn kan gøre. Verifikation af brokerens CA er den stærkere mulighed, når heapen tillader det. Nyttelastens størrelse betyder også noget: MQTT-klienten holder en buffer, og beskeder, der er større end den, afskæres lydløst, medmindre bufferen hæves bevidst.

Keepalive og socket-timeouts er en del af samme budget, fordi en klient, der aldrig bemærker en død forbindelse, holder op med at modtage kommandoer uden at rapportere en fejl.

Beskedsemantikken, der bider

En fastholdt besked gemmes af brokeren og leveres til senere matchende abonnenter, hvilket er fremragende til aktuel tilstand og farligt til engangskommandoer: en enhed, der genopretter forbindelsen, kan modtage gårsdagens kommando, som om den var ny. QoS 1 garanterer levering mindst én gang, så dubletter er normale, og applikationen skal være gentagelsessikker, ideelt med en identifikator eller et tidsstempel, den kan afvise. Det sidste testamente giver dig et statussignal, når enheden falder ud, men kun hvis forbindelsen faktisk fejler i stedet for at hænge.

Adfærden for en ren session afgør, om brokeren beholder dine abonnementer, mens du er væk, og at gøre det forkert er grunden til, at nogle enheder misser den første besked efter hver genoprettelse.

TLS beskytter strækningen til brokeren. Det er ikke ende-til-ende-kryptering af nyttelasten over for brokeroperatøren, som kan læse alt, hvad du publicerer gennem den.

Afgræns livscyklussen og test den med uskadelige data

Planlæg genoprettelse med backoff i stedet for en stram genforsøgsløkke, abonner eksplicit igen, hvis sessionen ikke er vedvarende, og log forbindelsesresultatet, så en tavs offline enhed efterlader bevis. Test genoprettelsesvejen med eksempelnyttelaster, der ikke gør noget, fordi den første produktionstest af en kommandokanal ikke bør være en rigtig kommando. Bekræft derefter, hvad en forældet fastholdt besked gør ved genoprettelse, og beslut, om den adfærd er acceptabel for hvert emne.

Gjort på denne måde fjerner designet ét indgående netværkskrav og efterlader enhedssoftwaren, brokerpolitikken og beskedsemantikken som synligt arbejde i stedet for skjulte antagelser.

Relaterede artikler