Přeskočit na hlavní obsah

Pakety a přenosy FLAP

Paket FLAP je jednotka protokolu, kterou si vyměňují zařízení a Cloud. Nikdy se neposílá samostatně: na cestě vždy putuje v obálce MAC nebo v obálce DTLS. Všechna vícebajtová pole jsou ve formátu big-endian.

Paket FLAP​

+-------------+----------------------+
| Header | Data |
| 2 bytes | 0 to n bytes |
+-------------+----------------------+
PoleVelikostPopis
Hlavička2 BPříznaky a sekvenční číslo, viz Hlavička FLAP
Data0 až n BJeden fragment zprávy, viz Typy zpráv

Hlavička FLAP​

Hlavička je jedna 16bitová hodnota ve formátu big-endian:

Bit1514131211 až 0
PoleFLAPSekvenční číslo
PříznakNázevVýznam
FFirstPaket nese první fragment zprávy
LLastPaket nese poslední fragment zprávy. Zpráva z jediného fragmentu má nastavené F i L
AAckPotvrzuje předchozí paket protistrany. Paket s příznakem A nikdy nenese data
PPollOd zařízení: „pošli mi downlink“. Od Cloudu: „čeká na tebe downlink“

Dvanáctibitové sekvenční číslo popisuje sekce Sekvenční číslo.

Zápis příznaků​

V logech i v této dokumentaci se příznaky zapisují jako čtyři znaky v pořadí FLAP, nenastavený příznak jako x. Například [FLxx] je zpráva z jediného fragmentu a [xxAP] je potvrzení s příznakem Poll.

HlavičkaPříznakySekvenceVýznam
0xC000[FLxx]0Zpráva z jediného fragmentu, začátek nové výměny
0x3001[xxAP]1Potvrzení, čeká downlink
0x1002[xxxP]2Poll
0x2004[xxAx]4Potvrzení
0x0000[xxxx]0Žádost Cloudu o reset, viz Reset

Sekvenční číslo​

Zařízení a Cloud sdílejí jeden sekvenční čítač. Každý paket v obou směrech nese sekvenční číslo předchozího paketu zvýšené o jedna:

  • Zařízení pošle paket se sekvenčním číslem n.
  • Cloud odpoví s n+1.
  • Další paket ze zařízení nese n+2.
  • Pokud Cloud na paket neodpoví (například na závěrečné potvrzení downlinku), další paket ze zařízení nese sekvenční číslo jeho vlastního posledního paketu zvýšené o jedna.

Potvrzení neopakuje sekvenční číslo paketu, který potvrzuje. Nese další hodnotu čítače.

Hodnota 0 je vyhrazená: paket se sekvenčním číslem 0 zahajuje novou výměnu (viz Reset). Po hodnotě 4095 následuje 1. Zařízení začíná s 0 po startu a po každé chybě.

Zařízení kontroluje, že každá odpověď nese sekvenční číslo jeho požadavku zvýšené o jedna. Pokud ne, začne znovu se sekvenčním číslem 0.

Zařízení rozdělí zprávu na fragmenty a pošle je popořadě:

  • První fragment má příznak F, poslední příznak L, fragmenty mezi nimi nemají žádný. Zpráva, která se vejde do jednoho fragmentu, se posílá jako [FLxx].
  • Cloud potvrdí každý fragment paketem [xxAx].
  • Když Cloud potvrzuje poslední fragment a čeká downlink, potvrzení je [xxAP].
  • Fragmenty nikdy nenesou příznak A ani P. Pro dotaz na downlink pošle zařízení samostatný paket bez dat.

Zařízení si downlinky vyzvedává dotazováním:

  • Zařízení pošle [xxxP] bez dat.
  • Pokud čeká downlink, Cloud odpoví jeho prvním fragmentem ([Fxxx], u jediného fragmentu [FLxx]). Pokud nic nečeká, odpoví [FLxx] bez dat.
  • Zařízení potvrdí každý fragment paketem [xxAx]. Na potvrzení fragmentu Cloud odpoví dalším fragmentem.
  • Na potvrzení posledního fragmentu Cloud neodpoví, pokud to není [xxAP]: pak odpoví dalším downlinkem.
  • Když čeká další downlink, Cloud nastaví příznak P na posledním fragmentu, například [FLxP] nebo [xLxP].

Downlink se v HARDWARIO Cloud označí jako doručený, když dorazí potvrzení jeho posledního fragmentu. Pokud se toto potvrzení ztratí, doručení potvrdí i další paket ze zařízení, který navazuje na sekvenci. Do té doby Cloud nabízí stejný downlink při každém dotazu. Downlink, který se nepodaří doručit do 30 dnů, vyprší.

Zařízení se dotazuje, když potvrzení nese příznak P, v intervalu nastaveném aplikací (například app config interval-poll) a na vyžádání příkazem shellu cloud poll. Jak se downlinky řadí do fronty, popisuje stránka Downlink.

Reset​

Ze zařízení. Paket se sekvenčním číslem 0 říká Cloudu, aby zahodil stav nedokončeného přenosu tohoto zařízení a paket zpracoval jako začátek nové výměny. Downlink, který byl celý odeslán, ale ještě nepotvrzen, se nejprve potvrdí.

Z Cloudu. Cloud žádá zařízení o nový začátek resetovacím paketem: hlavička 0x0000 (žádné příznaky, sekvenční číslo 0, žádná data). Pošle ho, když:

  • sekvenční číslo paketu je vyšší než očekávaná hodnota, například po restartu služby Cloudu,
  • tag MAC obálky MAC se známým sériovým číslem je neplatný,
  • zařízení opakuje stejný paket déle než 60 sekund.

Zařízení, které přijme resetovací paket, nastaví sekvenční číslo na 0 a pošle aktuální zprávu znovu od prvního fragmentu.

Paket se sekvenčním číslem nižším, než je očekávaná hodnota, Cloud ignoruje.

Opakování a duplicity​

Cloud nikdy sám paket nepošle, takže za opakování odpovídá zařízení. Když odpověď nepřijde včas, zařízení může:

  • Zopakovat paket. Zařízení pošle znovu identický paket (stejné sekvenční číslo, příznaky i data). Cloud ho rozpozná jako duplikát posledního paketu a na každý druhý duplikát odpoví odpovědí, kterou poslal předtím, takže zařízení by mělo paket zopakovat alespoň dvakrát. Důležité je to s RAI, kdy zařízení může přijmout odpověď jen hned poté, co něco odešle.
  • Začít znovu. Zařízení přenos vzdá a pošle zprávu znovu se sekvenčním číslem 0. Takto funguje SDK pro CHESTER: na každou odpověď čeká 5 sekund a při jakékoli chybě začne znovu.

Limity velikosti​

  • Data jednoho paketu FLAP se musí spolu s obálkou vejít do jednoho datagramu UDP. Limit datagramu je dnes 508 bajtů. Maximální velikost fragmentu proto závisí na obálce, viz Obálka MAC a Obálka DTLS.
  • Zpráva složená z fragmentů nese hodnotu o velikosti nejvýše 16383 bajtů.

Neplatné pakety​

Cloud neodpoví na paket FLAP kratší než 2 bajty, na paket s příznakem A, který nese data, ani na paket, jehož příznaky neodpovídají aktuálnímu stavu přenosu. Pakety, které odmítne obálka, se do této vrstvy vůbec nedostanou.

Scénáře​

Diagramy níže ukazují všechny kombinace uplinku a downlinku. n je aktuální hodnota sekvenčního čítače.

Zahájení relace na stránce Typy zpráv je skutečným příkladem scénáře C.