Welcome to Our Website

Les

for Å sende data frem og tilbake over Ting Nettverk du trenger å bruke byte. Denne guiden vil hjelpe deg å kode forskjellige typer data i så små biter som mulig.

Den enestående utvalg av LoRaWAN teknologien vi bygger på kommer på bekostning av lav båndbredde og begrenset sendetid (antall ganger størrelsen på pakkene du sender). Heldigvis trenger du ikke et bilde av at smart garasje utskuff som må tømmes. Selv en eneste bit 1 ville gjøre!,

Hva er en byte?

En byte er en gruppe av 8 bits. En bit er den grunnleggende enhet, og kan være enten 1 eller 0. En byte er ikke bare en 8-verdier mellom 0 og 1, men 256 (28) forskjellige kombinasjoner (heller permutasjoner) alt fra 00000000 via f.eks. 01010101 til 11111111. Dermed er en byte kan representere et desimaltall mellom 0(00) og 255.

Rådvill? Husk at 3 desimaltall også ikke bare stå for 3-verdier mellom 0 og 9, men 1000 (103) permutasjoner fra 0(00) til 999.,

finn ut mer om Hvordan Ting Fungerer: Hvordan Bits og Bytes Arbeid og Arduino Bit Matematikk Opplæringen for å lære mer om det.

Hva er en buffer av byte?

Tenk på buffer som bare et annet ord for en tabell, liste, uansett resonerer med din erfaring med programmering. Som en byte er en gruppe på 8 biter, en buffer er en gruppe av en pre-definert antall byte. Hvis vi har en gruppe på 3 byte, dette kan enten representere 3 verdier mellom 0 og 255, men også en enkelt verdi mellom 0 og 16777216 (2563).

Se mønsteret?, Antall valg per stilling (n) til kraften i antall stillinger (r) er antall permutasjoner: nr. Les mer på MathIsFun.com.

Hva hex?

Ofte, vil du se en gruppe av byte som vises som:

FF F0 0F 11

Var ikke en byte en gruppe på 8 0s og 1s?, 🤔 Du er helt rett, men akkurat som vi så allerede 11111111 oversettes til 255 i de gode gamle desimal system, vi kan også oversette det til FF i det heksadesimale systemet hvor hver posisjon har 16 (0-9, A-F) mulige verdier. Fordelen er at det er kortere og eksplisitt om maksimal verdi (257 er ikke et alternativ).,

I eksemplet ovenfor oversatt til desimal system og polstret for lesbarhet ville være:

255 240 015 017

for Å indikere at du mener 11 i hex og ikke to biter eller nummer elleve, du prefiks det med 0x formatter. For å si det du mener binære bruk B.,h>Code

Byte value Decimal value Hexadecimal value 11 00001011 11 B 0x11 00010001 17 11 B11 00000011 3 3

An example for Arduino:

Yeah, I know… 0x kind of blows the shorter-to-write advantage of hex., 🙃

Hvor mange byte kan jeg sende?

Teknisk, kan du sende 51 bytes. Men, jo mer bytes du sender, jo mer ringetid pakken vil koste deg, og før du treffer din maksimale avsatte tiden. Så, ikke spør deg selv hvor mange du kan eventuelt sende, men spør heller hvordan noen kunne gjøre jobben.

Hvordan å sende store tall?

Et bedre spørsmål vil være hvordan å sende områder større enn 255.

Indeks

Hvis de mulige verdiene du hadde behov for å støtte ikke starter på 0 og du vet den minste verdien, starter du ved indeksering på det nummeret.,

For eksempel, tenk vi forventer verdier mellom 3400 og 3600.,

På den enheten vi skulle kodes dette som:

int myVal = 3450;const int myBase = 3400;byte payload = { myVal - myBase };

i programmet nyttelast funksjoner gjør du:

var myBase = 3400;decoded.myVal = bytes + myBase;

Den andre veien rundt, i programmet encoder nyttelast funksjon vi ville ha:

var myVal = 3450;var myBase = 3400;var bytes = ;

Og på enheten dekode dette med:

int myBase = 3400;int myVal = payload + myBase;

Som du kan se så lenge den minste verdien er kjent for og omfanget av vår verdi er 256 eller mindre, vi kan fortsatt bruke en eneste byte, uten å bryte en svette., Pass på å sjekke din verdi er ikke større enn 3655 å unngå ekle bugs.😅

Runde

hva Nå hvis omfanget er større enn 256? Det neste spørsmålet ville være hvis du trenger å vite den nøyaktige verdien. Hvis sensoren har en rekkevidde på 400 og en feil margin på 2, ville du ikke mister noen mening ved avrunding verdi. Både 299 og 300 ville runde til 150, som er fine.

På den enheten vi skulle kodes dette som:

int myVal = 300;int errorMargin = 2byte payload = { round(myVal / errorMargin) };

i programmet nyttelast funksjoner gjør du:

var errorMargin = 2;decoded.myVal = bytes * errorMargin;

vil Du få ideen etter den andre veien rundt.,

Bruk ord

Et ord er 2 byte (bortsett fra på Grunn, Null og lignende brett hvor det er 4 byte), som allerede får du et stort utvalg av 65536 (2562). Int datatype er et ord og Arduino kommer med highByte() og lowByte() for å trekke ut venstre og høyre byte fra et ord. Dette gjør det veldig enkelt å kode og dekode.

Kode (Arduino):

int myVal = 20000;byte payload;payload = highByte(myVal);payload = lowByte(myVal);

Dekode (nyttelast funksjoner):

decoded.myVal = (bytes << 8) + bytes;

Lurer på hva << handler om?, Dette Venstre skift på 8 biter av første byte 8 posisjoner til venstre. Forvirret? Tenke på hvordan vi kunne kode nummer 11 som to 1 og dekode ved å flytte de første 1 opp en posisjon (slik at det blir 10) før du legger den andre. Vi skal snakke mer om bit skiftende neste.

Kode (nyttelast funksjoner):

var myVal = 20000;var bytes = ;bytes = (myVal & 0xFF00) >> 8;bytes = (myVal & 0x00FF);

Aldri sett & brukes på denne måten før? Dette er en Bitvis OG., Brukt på denne måten høyre side av uttrykket vil fungere som en maske til null ut en byte, slik at vi kan jobbe med akkurat den andre.

Dekode (Arduino):

int myVal = ((int)(payload) << 8) + payload;

Shift-bits

Hvis omfanget av forventede verdier er større enn 65536 vi kan bruke det samme trikset. Den eneste forskjellen er at vi er nødt til å manuelt skift-bits når vi kode på Arduino, akkurat som vi gjorde i nyttelasten funksjon.

La oss si at vi trenger å kode en lang som bruker 4 byte for en rekkevidde opp til 4294967296.,

Kode (Arduino):

Dekode (nyttelast funksjoner):

decoded.myVal = ((long)(bytes) << 24) + ((long)(bytes) << 16) + ((long)(bytes) << 8) + ((long)(bytes));

Hvordan å sende negative tall?

for Å fortelle forskjellen mellom -100 og 100, vil du trenger en signert datatype. Disse setter høyest (venstre -) litt til 1 for å indikere at det er et negativt tall. Dette betyr at for eksempel i et ord bare 15 av 16 bits er tilgjengelig for den faktiske antallet, begrense rekkevidden fra 65536 å 32768.,

– Indeksen, runde og skift

typer data vi har brukt så langt er alle signert, noe som betyr at alle triks fungerer like godt for negative verdier. Bare vær oppmerksom på den maksimale verdien.

Usignert datatyper

Hvis du ikke forventer negative tall, og trenger et større utvalg, eksplisitt bruk unsigned int eller unsigned long.

Hvordan å sende desimaler?

Så langt har vi bare jobbet med avrundede tall. Hva hvis du trenger mer presisjon? Svaret veldig likt hvordan vi indeksert avrundet eller store tall., Bare flere og dividere verdien som du kan kode og dekode den.

Kode (Arduino):

float myVal = 1.22;byte payload;payload = round(myVal * 100);

Dekode (nyttelast funksjoner):

decoded.myVal = bytes / 100;

Kode (nyttelast funksjoner):

bytes = Math.round(1.22 * 100);

Dekode (Arduino):

float myVal = payload / 100.00;

Hvordan å sende flere numre?

I mange tilfeller vil du ønsker å sende flere verdier i en enkelt melding. Begynn med koding hvert enkelt nummer til en buffer av byte og deretter kombinere dem i en enkelt buffer.,

Kode (Arduino):

Du lurer kanskje på hvorfor memcpy() aksepterer payload + sizeOfPayloadA som de synes 🍏 og 🍊. Tenk på det som en instruks om å kopiere til payload buffer, men etter å flytte punktet det vil kopiere til, med lengden av nyttelaster vi har lagt så langt.,

Dekode (nyttelast funksjoner)

decoded.myValA = bytes.slice(0, 2);decoded.myValB = bytes.slice(2, 5);// Decode both byte arrays as we did before

Kode (nyttelast funksjon)

// Encode both values as we did beforevar bytes = bytesA.concat(bytesB);

Dekode (Arduino):

var payloadA;var payloadB;memcpy(payloadA, 

Hvordan for å sende tekst?

Det korte svaret er: ikke gjør det. Teksten bruker mye av byte. Unicode definerer mer enn 128000 tegn, så det ville ta 3 byte per tegn! Det er sjelden gode grunner til å bruke tekst i stedet for tall, bortsett fra kanskje sender noen brukerundersøkelser., Mesteparten av tiden bare Alfa-numeriske tegn nok, i så fall kan du komme unna ved hjelp av ASCII-tegn som bare bruke en eneste byte per tegn. Hver strengen må være avsluttet med en NULL (0x00, ‘\0’) tegn for å indikere strengen er avsluttet.

Du ikke høre det fra meg, men her er hvordan du vil kode en string:

Som du vil dekode med:

decoded.myVal = String.fromCharCode.apply(null, bytes);

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *