odesílání dat tam a zpět přes Věci Síti, budete muset použít bajtů. Tato příručka vám pomůže zakódovat různé typy dat co nejméně bajtů.
bezprecedentní rozsah LoRaWAN technologie stavíme na dodáván za cenu pásma a omezeného vysílacího času (počet krát velikost balení, odeslání). Naštěstí nepotřebujete obrázek toho inteligentního garážového koše, který je třeba vyprázdnit. Dokonce i jediný bit
1
by udělal!,
co je bajt?
bajt je skupina 8 bitů. Trochu je nejzákladnější jednotka a může být buď 1 nebo 0. Byte není jen 8 hodnot mezi 0 a 1, ale 256 (28) různých kombinací (spíše permutací) v rozmezí od 00000000
prostřednictvím např. 01010101
11111111
. Jeden bajt tedy může představovat desetinné číslo mezi 0(00) a 255.
zmatený? Pamatujte si, že 3 desetinná čísla také nestůj pro 3 hodnoty mezi 0 a 9, ale 1000 (103) permutace z 0(00) do 999.,
Přečtěte si více o tom, jak věci fungují: jak fungují bity a bajty a výukový program Arduino Bit Math se o tom dozvíte více.
co je vyrovnávací paměť bajtů?
myslete na buffer jako jen další slovo pro pole, Seznam, co rezonuje s vaším programovacím zážitkem. Jako byte je skupina 8 bitů, buffer je skupina předem definovaného počtu bajtů. Pokud máme skupinu 3 bajtů, mohlo by to představovat 3 hodnoty mezi 0 a 255, ale také jednu jedinou hodnotu mezi 0 a 16777216 (2563).
viz vzor?, Počet možností na pozici (n) na sílu počtu pozic (r) je počet permutací: nr. Více se dozvíte na MathIsFun.com.
Co to hex?
Často, uvidíte skupinu bajtů zobrazí jako:
FF F0 0F 11
Nebyla byte skupina 8 0
1
y?, 🤔 Máš naprostou pravdu, ale jak jsme již viděli, 11111111
překládá do 255 ve staré dobré desítkové soustavě, můžeme také přeložit na FF v šestnáctkové soustavě, kde každá pozice má 16 (0-9, A-F) možné hodnoty. Výhodou je, že je kratší a explicitní o maximální hodnotě (257 není volba).,
výše uvedený příklad přeloží do desítkové soustavy a polstrovaný pro čitelnost by bylo:
255 240 015 017
uveďte, že máte na mysli 11
v hex a ne dva kousky, nebo číslo jedenáct, předpony s 0x
formatter. Chcete-li to říct, máte na mysli binární použití B
.,h>Code
11
0x11
B11
An example for Arduino:
Yeah, I know… 0x
kind of blows the shorter-to-write advantage of hex., 🙃
kolik bajtů mohu poslat?
technicky můžete odeslat 51 bajtů. Ale čím více bajtů budete posílat, tím více vysílacího času vás balíček bude stát a čím dříve dosáhnete svého maximálního přiděleného času. Tak, neptejte se sami sebe, kolik můžete případně poslat, ale spíše se zeptat, jak málo by mohl dělat práci.
jak posílat velká čísla?
lepší otázkou by bylo, jak poslat rozsahy větší než 255.
Index
Pokud možné hodnoty, které byste museli podporovat, nezačínají na 0 a znáte minimální hodnotu, začněte indexováním tohoto čísla.,
například si představte, že bychom očekávali hodnoty mezi 3400 a 3600.,
Na zařízení budeme kódovat jako:
int myVal = 3450;const int myBase = 3400;byte payload = { myVal - myBase };
v aplikaci náklad funkce:
var myBase = 3400;decoded.myVal = bytes + myBase;
další způsob, jak kolem, v aplikaci encoder náklad funkce budeme mít:
var myVal = 3450;var myBase = 3400;var bytes = ;
A na zařízení dekódovat tento:
int myBase = 3400;int myVal = payload + myBase;
Jak můžete vidět, tak dlouho, jak minimální hodnota je známá a rozsahu našich hodnota je 256 nebo méně, stále můžeme použít jeden byte, aniž by se zapotil., Ujistěte se, že vaše hodnota není větší než 3655, aby se zabránilo ošklivé chyby.😅
Round
Co když je rozsah větší než 256? Další otázkou by bylo, pokud potřebujete znát přesnou hodnotu. Pokud má váš senzor rozsah 400 a chybové rozpětí 2, neztratíte žádný význam zaokrouhlením hodnoty. Oba 299 a 300 by se zaokrouhlily na 150, což je v pořádku.
Na zařízení budeme kódovat jako:
int myVal = 300;int errorMargin = 2byte payload = { round(myVal / errorMargin) };
v aplikaci náklad funkce:
var errorMargin = 2;decoded.myVal = bytes * errorMargin;
Budete mít nápad na další cestu kolem.,
použijte slova
slovo je 2 bajty (s výjimkou splatných, nulových a podobných desek, kde je to 4 bajty), což vám již přináší obrovský rozsah 65536 (2562). Int typ dat je slovo a Arduino, přichází s highByte()
lowByte()
extrahovat levé a pravé byte od slova. Díky tomu je opravdu snadné kódovat a dekódovat.
Encode (Arduino):
int myVal = 20000;byte payload;payload = highByte(myVal);payload = lowByte(myVal);
Decode (náklad funkce):
decoded.myVal = (bytes << 8) + bytes;
Zajímá vás, k čemu
<<
je o?, To vlevo posune 8 bitů prvního bajtu 8 pozic doleva. Zmatený? Přemýšlejte o tom, jak bychom mohli kódovat číslo 11 jako dvě 1 a dekódovat posunutím první 1 o jednu pozici (což je 10) před přidáním druhého. Budeme mluvit více o bit posunu další.
Encode (náklad funkce):
var myVal = 20000;var bytes = ;bytes = (myVal & 0xFF00) >> 8;bytes = (myVal & 0x00FF);
Nikdy neviděl
&
používá se tímto způsobem předtím? To je trochu moudré a., Používá se tímto způsobem pravá strana výrazu bude působit jako maska nulovat jeden bajt, takže můžeme pracovat jen s druhým.
Decode (Arduino):
int myVal = ((int)(payload) << 8) + payload;
Shift bitů
v Případě, že rozsah očekávaných hodnot je větší než 65536 můžeme použít stejný trik. Jediný rozdíl je v tom, že musíme ručně posunout bity, když kódujeme Arduino, stejně jako jsme to udělali ve funkci užitečného zatížení.
řekněme, že musíme kódovat dlouhý, který používá 4 bajty pro rozsah až 4294967296.,
kódovat (Arduino):
dekódovat (užitečné funkce):
decoded.myVal = ((long)(bytes) << 24) + ((long)(bytes) << 16) + ((long)(bytes) << 8) + ((long)(bytes));
jak odeslat záporná čísla?
Chcete-li zjistit rozdíl mezi -100 a 100, budete potřebovat podepsaný datový typ. Ty nastavují nejvyšší (vlevo-nejvíce) bit na 1
, aby označily, že je to záporné číslo. To znamená, že například ve slově je pro skutečné číslo k dispozici pouze 15 ze 16 bitů, což omezuje rozsah od 65536 do 32768.,
Index, round and shift
datové typy, které jsme dosud používali, jsou podepsány, což znamená, že všechny triky fungují stejně dobře pro záporné hodnoty. Jen si uvědomte maximální hodnotu.
nepodepsané datové typy
pokud neočekáváte záporná čísla a potřebujete větší rozsah, explicitně použijte unsigned int
nebo unsigned long
.
jak odeslat desetinná místa?
zatím jsme se zabývali pouze zaokrouhlenými čísly. Co když budete potřebovat větší přesnost? Odpověď velmi podobná tomu, jak jsme indexovali nebo zaokrouhlovali velká čísla., Jednoduše vícenásobné a rozdělit hodnotu při kódování a dekódování.
Encode (Arduino):
float myVal = 1.22;byte payload;payload = round(myVal * 100);
Decode (náklad funkce):
decoded.myVal = bytes / 100;
Encode (náklad funkce):
bytes = Math.round(1.22 * 100);
Decode (Arduino):
float myVal = payload / 100.00;
Jak poslat více čísel?
v mnoha případech budete chtít odeslat více hodnot v jedné zprávě. Začněte kódováním každého jednotlivého čísla do vyrovnávací paměti bajtů a poté je zkombinujte do jediné vyrovnávací paměti.,
Encode (Arduino):
možná se divíte, proč
memcpy()
přijímápayload + sizeOfPayloadA
jak se zdá, 🍏 a 🍊. Berte to jako návod na kopírování dopayload
buffer, ale po přesunutí bodu se bude kopírovat do, s délkou náklad jsme přidali tak daleko.,
Decode (náklad funkce)
decoded.myValA = bytes.slice(0, 2);decoded.myValB = bytes.slice(2, 5);// Decode both byte arrays as we did before
Encode (náklad funkce)
// Encode both values as we did beforevar bytes = bytesA.concat(bytesB);
Decode (Arduino):
var payloadA;var payloadB;memcpy(payloadA,
Jak poslat text?
krátká odpověď zní: don ‚ t. Text používá mnoho bajtů. Unicode definuje více než 128000 znaků, takže to bude trvat 3 bajty na znak! Zřídka existují dobré důvody pro použití textu namísto čísel, kromě možná přenosu nějakého uživatelského vstupu., Většinu času stačí pouze alfanumerické znaky, v takovém případě se můžete dostat pryč pomocí znaků ASCII, které používají pouze jeden bajt na znak. Každý řetězec musí být ukončen znakem NULL (0x00, ‚\0‘) pro označení konce řetězce.
neslyšel Jsi to ode mě, ale tady je návod, jak byste zakódovat řetězec:
Které byste dekódovat s:
decoded.myVal = String.fromCharCode.apply(null, bytes);