Welcome to Our Website

Lær

for at sende data frem og tilbage over Things Net .ork skal du bruge bytes. Denne vejledning hjælper dig med at kode forskellige typer data i så lidt byte som muligt.

det hidtil usete udvalg af Lora .an-teknologien, vi bygger på, kommer på bekostning af lav båndbredde og begrænset sendetid (antallet gange størrelse af pakker, du sender). Heldigvis behøver du ikke et billede af den smarte garagebeholder, der skal tømmes. Selv en enkelt bit 1 ville gøre!,

Hvad er en byte?

en byte er en gruppe på 8 bit. Lidt er den mest basale enhed og kan enten være 1 eller 0. En byte er ikke bare 8 værdier mellem 0 og 1, men 256 (28) forskellige kombinationer (snarere permutationer) lige fra 00000000 via fx 01010101 til 11111111. Således kan en byte repræsentere et decimaltal mellem 0 (00) og 255.

forvirret? Husk, at 3 decimaler også ikke bare står for 3 værdier mellem 0 og 9, Men 1000 (103) permutationer fra 0(00) til 999.,

Lær mere om, hvordan ting fungerer: hvordan Bits og Bytes fungerer, og Arduino Bit Math Tutorial for at lære mere om det.

Hvad er en buffer af bytes?

tænk på buffer som bare et andet ord for en Matri list, Liste, uanset hvad der resonerer med din programmeringsoplevelse. Ligesom en byte er en gruppe på 8 bit, er en buffer en gruppe af et foruddefineret antal byte. Hvis vi har en gruppe på 3 bytes, kan dette enten repræsentere 3 værdier mellem 0 og 255, men også en enkelt værdi mellem 0 og 16777216 (2563).

se opskriften?, Antallet af valg i position (n) til antallet af positioner (r) er antallet af permutationer: nr. Læs mere på MathIsFun.com.

Hvad hex?

Ofte, vil du se en gruppe af bytes, der vises som:

FF F0 0F 11

Var der ikke en byte en gruppe af 8 0s 1s?, 🤔 Du er helt rigtigt, men lige som vi allerede så 11111111 oversætter til 255 i de gode gamle decimal system, vi kan også oversætte det til FF i det hexadecimale system, hvor hver position har 16 (0-9, A-F) mulige værdier. Fordelen er, at det er kortere og eksplicit om den maksimale værdi (257 er ikke en mulighed).,

ovenstående eksempel oversat til titalssystemet og polstret for læsbarhed ville være:

255 240 015 017

for at angive, At du mener 11 i hex og ikke to bits eller nummer elleve, du foranstil det med 0x formatter. For at fortælle det mener du binær brug 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 bytes kan jeg sende?

teknisk set kan du sende 51 bytes. Men jo flere bytes du sender, jo mere sendetid koster pakken dig, og jo hurtigere rammer du din maksimale tildelte tid. Så spørg ikke dig selv, hvor mange du muligvis kan sende, men spørg snarere, hvor få der kunne gøre jobbet.

Hvordan sendes store numre?

et bedre spørgsmål ville være, hvordan man sender intervaller større end 255.

indeks

hvis de mulige værdier, du har brug for at understøtte, ikke starter ved 0, og du kender minimumsværdien, skal du starte med at indeksere på dette nummer.,forestil dig for eksempel, at vi ville forvente værdier mellem 3400 og 3600.,

På enheden, vi ville indkode dette som:

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

Og i anvendelsen nyttelast funktioner gøre:

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

Den anden vej rundt, i anvendelsen encoder nyttelast funktion ville vi have:

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

på enheden afkode det med:

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

Som du kan se, så længe den mindste værdi er kendt, og den række af vores værdi er 256 eller mindre, kan vi stadig bruge en enkelt byte uden at bryde en sved., Sørg for at tjekke din værdi er ikke større end 3655 for at forhindre grimme bugs.

runde

hvad nu hvis området er større end 256? Det næste spørgsmål ville være, hvis du har brug for at kende den nøjagtige værdi. Hvis din sensor har en rækkevidde på 400 og en fejlmargin på 2, vil du ikke miste nogen mening ved at afrunde værdien. Både 299 og 300 ville runde til 150, hvilket er fint.

På enheden, vi ville indkode dette som:

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

Og i anvendelsen nyttelast funktioner gøre:

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

Du vil få ideen til den anden vej rundt.,

brug ord

et ord er 2 bytes (undtagen på grund, nul og lignende boards, hvor det er 4 bytes), som allerede får dig et stort udvalg af 65536 (2562). Int-datatypen er et ord, og Arduino leveres med highByte() og lowByte() for at udtrække venstre og højre byte fra et ord. Dette gør det virkelig nemt at kode og afkode.

Encode (Arduino):

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

Afkode (nyttelast funktioner):

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

gad vide, hvad << handler om?, Denne venstre skifter de 8 bits af de første byte 8 positioner til venstre. Forvirret? Tænk på, hvordan vi kunne kode tallet 11 som to 1 ‘ er og afkode ved at flytte den første 1 op en position (hvilket gør det 10), før du tilføjer den anden. Vi vil tale mere om lidt skiftende næste.

Encode (nyttelast funktioner):

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

Aldrig set & brugt på denne måde før? Dette er en smule og., Brugt på denne måde vil højre side af udtrykket fungere som en maske til nul ud en byte, så vi kan arbejde med bare den anden.

Afkode (Arduino):

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

Skift bits

Hvis vifte af forventede værdier er større end 65536 vi kan bruge det samme trick. Den eneste forskel er, at vi skal manuelt skifte bits, når vi koder for Arduino, ligesom vi gjorde i nyttelastfunktionen.

lad os sige, at vi er nødt til at kode en lang, der bruger 4 bytes til en rækkevidde op til 4294967296.,

Encode (Arduino):

afkode (nyttelastfunktioner):

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

hvordan sendes negative tal?

for at se forskellen mellem -100 og 100 skal du bruge en underskrevet datatype. Disse indstiller den højeste (venstre mest) bit til 1 for at indikere, at det er et negativt tal. Dette betyder, at for eksempel i et ord kun 15 af de 16 bits er tilgængelige for det faktiske antal, hvilket begrænser området fra 65536 til 32768.,

indeks, runde og skift

de datatyper, vi hidtil har brugt, er alle underskrevet, hvilket betyder, at alle tricks fungerer lige så godt for negative værdier. Bare vær opmærksom på den maksimale værdi.

Unsigned data typer

Hvis du ikke forventer negative tal, og har brug for et større udvalg, udtrykkeligt bruge unsigned int eller unsigned long.

Hvordan sendes decimaler?

indtil videre har vi kun behandlet afrundede tal. Hvad hvis du har brug for mere præcision? Svaret ligner meget, hvordan vi indekserede eller afrundede store tal., Du skal blot flere og opdele værdien som du indkode og afkode det.

Encode (Arduino):

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

Afkode (nyttelast funktioner):

decoded.myVal = bytes / 100;

Encode (nyttelast funktioner):

bytes = Math.round(1.22 * 100);

Afkode (Arduino):

float myVal = payload / 100.00;

Hvordan til at sende flere numre?

i mange tilfælde vil du sende flere værdier i en enkelt besked. Start med at kode hvert enkelt nummer til en buffer af byte og kombiner dem derefter i en enkelt buffer.,

Encode (Arduino):

Du kan spekulerer på, hvorfor memcpy() accepterer payload + sizeOfPayloadA, som de synes 🍏 og 🍊. Tænk på det som en instruktion til at kopiere til payload buffer, men efter at have flyttet punktet, kopieres det til, med længden af de nyttelast, vi har tilføjet indtil videre.,

Afkode (nyttelast funktioner)

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

Encode (nyttelast funktion)

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

Afkode (Arduino):

var payloadA;var payloadB;memcpy(payloadA, 

Hvordan til at sende sms?

det korte svar er: ikke. tekst bruger en masse bytes. Unicode definerer mere end 128000 tegn,så det ville tage 3 bytes pr. Der er sjældent gode grunde til at bruge tekst i stedet for tal, bortset fra måske at sende nogle brugerinput., Det meste af tiden er kun de alfanumeriske tegn tilstrækkelige, i så fald kan du komme væk ved at bruge ASCII-tegn, der kun bruger en enkelt byte pr. Hver streng skal afsluttes med et NULL (0 .00, ‘\0’) tegn for at indikere, at strengen er afsluttet.

Du hørte det ikke fra mig, men her er hvordan du ville kode en streng:

som du ville afkode med:

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *