lähettää tietoja edestakaisin Asioita Verkossa sinun täytyy käyttää tavua. Tämä opas auttaa koodaamaan erilaisia tietoja mahdollisimman vähän tavuja.
ennennäkemätön valikoima LoRaWAN teknologian rakennamme siitä tulee kustannuksia alhaisen kaistanleveyden ja rajoitettu puheaikaa (useita kertoja koko paketit lähettää). Onneksi et tarvitse kuvaa siitä älytallin roskiksesta, joka pitää tyhjentää. Edes yksi bitti
1
tekisi!,
mikä on Tavu?
a tavu on 8 bitin ryhmä. Bitti on perusyksikkö ja voi olla joko 1 tai 0. Tavu ei ole vain 8 arvoja välillä 0 ja 1, mutta 256 (28) erilaisia yhdistelmiä (melko permutaatiot) vaihtelevat 00000000
kautta, esim. 01010101
ja 11111111
. Näin yksi tavu voi edustaa desimaalilukua 0(00) ja 255.
Ymmällään? Muista, että 3 desimaalin numerot myös, älä vain seistä 3 arvot väliltä 0 ja 9, mutta 1000 (103) permutaatiot 0(00) 999.,
Lue lisää siitä, Miten homma Toimii: Miten Bitit ja Tavut, Työ-ja Arduino-Bittinen Matematiikka Opetusohjelma oppia siitä lisää.
mikä on tavujen puskuri?
ajattele puskuria vain jonon, listan, mikä tahansa resonoi ohjelmointikokemuksesi kanssa. Kuten tavu on ryhmä 8 bittiä, puskuri on ryhmä ennalta määritelty määrä tavuja. Jos meillä on ryhmä 3 tavua, tämä voi joko edustaa 3 arvot väliltä 0 ja 255, mutta myös yksi arvo välillä 0 ja 16777216 (2563).
Katso kuvio?, Useita vaihtoehtoja per asema (n) teho määrä kantoja (r) on määrä permutaatiot: nr. Lue lisää MathIsFun.com.
Mitä hex?
Usein, näet joukko tavua näkyviin, niin:
FF F0 0F 11
ei Ollut tavun ryhmä 8 0
: n ja 1
s?, 🤔 Olet täysin oikeassa, mutta kuten olemme jo näki 11111111
kääntää 255 vanhoja hyviä desimaalin järjestelmä, voimme myös kääntää sen FF heksadesimaali järjestelmä, jossa jokainen asema on 16 (0-9, A-F) mahdolliset arvot. Etuna on, että se on lyhyempi ja yksiselitteinen enimmäisarvosta (257 ei ole vaihtoehto).,
yllä olevassa esimerkissä muunnetaan desimaalin järjestelmä ja pehmustettu luettavuus olisi:
255 240 015 017
osoittaa, että tarkoitat 11
hex ja ei kaksi bittiä tai numero yksitoista, etuliitteen kanssa 0x
formatter. Sen kertominen tarkoittaa binäärikäyttöä B
.,h>Code
11
0x11
B11
An example for Arduino:
Yeah, I know… 0x
kind of blows the shorter-to-write advantage of hex., 🙃
kuinka monta tavua voin lähettää?
teknisesti voi lähettää 51 tavua. Mutta, mitä enemmän tavuja lähetät, sitä enemmän lähetysaika paketti maksaa sinulle ja mitä nopeammin osut suurin varattu aika. Joten, älä kysy itseltäsi, kuinka monta voit lähettää, vaan pikemminkin kysyä, kuinka harvat voisivat tehdä työtä.
Kuinka lähettää isoja numeroita?
parempi kysymys olisi, miten lähetettäisiin yli 255: tä suurempia vaihteluvälejä.
Indeksi
Jos mahdolliset arvot, että tarvitset tukea, älä aloita 0 ja tiedät, pienin arvo, aloita indeksointi, että numero.,
esimerkiksi kuvitellaan, että arvomaailma olisi 3400-3600.,
laitteen olimme koodata tätä:
int myVal = 3450;const int myBase = 3400;byte payload = { myVal - myBase };
sovellus hyötykuorma tehdä toimintoja:
var myBase = 3400;decoded.myVal = bytes + myBase;
toisinpäin, sovellus encoder hyötykuorma toiminto, meillä olisi:
var myVal = 3450;var myBase = 3400;var bytes = ;
Ja laite purkaa tämän kanssa:
int myBase = 3400;int myVal = payload + myBase;
Kuten voit nähdä, niin kauan kuin pienin arvo on tiedossa, ja välillä meidän arvo on 256 tai vähemmän, voimme silti käyttää yhden tavun rikkomatta hiki., Muista tarkistaa arvo ei ole suurempi kuin 3655 estää ikäviä bugeja.😅
kierros
nyt mitä jos vaihteluväli on suurempi kuin 256? Seuraava kysymys olisi, jos sinun täytyy tietää tarkka arvo. Jos anturi on valikoima 400 ja virhemarginaali 2, et menetä mitään merkitystä pyöristämällä arvo. Sekä 299 että 300 pyörähtäisivät 150: een, mikä on ihan ok.
laitteen olimme koodata tätä:
int myVal = 300;int errorMargin = 2byte payload = { round(myVal / errorMargin) };
sovellus hyötykuorma tehdä toimintoja:
var errorMargin = 2;decoded.myVal = bytes * errorMargin;
saat ajatus toisinpäin.,
Käytä sanoja,
sana on 2 tavua (paitsi Vuoksi, Nolla ja vastaavat levyt, joissa on 4 tavua), joka jo saa sinut valtava valikoima 65536 (2562). Int-tietotyyppi on sana, ja Arduino mukana highByte()
ja lowByte()
ote vasemman ja oikean tavun sana. Tämä tekee todella helppo koodata ja purkaa.
Koodata (Arduino):
int myVal = 20000;byte payload;payload = highByte(myVal);payload = lowByte(myVal);
Decode (hyötykuorma toiminnot):
decoded.myVal = (bytes << 8) + bytes;
Ihmettelet, mikä
<<
on kyse?, Tämä vasemmalle siirtää 8 bittiä ensimmäisen tavun 8 paikkaa vasemmalle. Hämmentynyt? Mieti, miten voisimme koodata numeron 11 kahtena 1: nä ja purkaa siirtämällä ensimmäisen 1: n yhteen asentoon (tehden siitä 10: n) ennen kuin lisäämme toisen. Puhutaan seuraavaksi enemmän purunvaihdosta.
Koodata (hyötykuorma toiminnot):
var myVal = 20000;var bytes = ;bytes = (myVal & 0xFF00) >> 8;bytes = (myVal & 0x00FF);
nähnyt
&
käytetään tällä tavalla ennen? Tämä on vähän viisasta ja., Tällä tavoin ilmaisun oikea puoli toimii maskina nollata yksi tavu, jotta voimme työskennellä vain toisen kanssa.
Decode (Arduino):
int myVal = ((int)(payload) << 8) + payload;
Vaihto bittiä
Jos valikoima lämpötila-arvot on suurempi kuin 65536 voimme käyttää samaa temppua. Ainoa ero on, että meidän täytyy manuaalisesti siirtää bittiä, kun koodata päälle Arduino, aivan kuten teimme hyötykuorma-toiminto.
oletetaan, että meidän täytyy koodata pitkä, joka käyttää 4 tavua monille jopa 4294967296.,
Koodata (Arduino):
Decode (hyötykuorma toiminnot):
decoded.myVal = ((long)(bytes) << 24) + ((long)(bytes) << 16) + ((long)(bytes) << 8) + ((long)(bytes));
Miten lähettää negatiivisia lukuja?
kertoaksesi eron -100: n ja 100: n välillä tarvitset allekirjoitetun tietotyypin. Nämä asettivat suurimman (vasemmanpuoleisimman) bitin 1
osoittamaan sen olevan negatiivinen luku. Tämä tarkoittaa sitä, että esimerkiksi sanassa vain 15 16 bittiä on käytettävissä todellinen määrä, rajoittaen vaihteluvälin 65536-32768.,
Index, round and shift
tähän mennessä käyttämämme tietotyypit ovat kaikki allekirjoitettuja, eli kaikki temput toimivat yhtä hyvin negatiivisten arvojen puolesta. Ole vain tietoinen enimmäisarvosta.
Allekirjoittamaton tietotyyppejä
Jos et voi odottaa, negatiiviset luvut, ja tarvitset isompi alue, nimenomaisesti käyttää unsigned int
tai unsigned long
.
miten desimaalit lähetetään?
toistaiseksi olemme käsitelleet vain pyöristettyjä lukuja. Entä jos tarvitset lisää tarkkuutta? Vastaus on hyvin samanlainen kuin se, miten indeksoimme tai pyöristimme isoja lukuja., Yksinkertaisesti useita ja jakaa arvon koodata ja purkaa sen.
Koodata (Arduino):
float myVal = 1.22;byte payload;payload = round(myVal * 100);
Decode (hyötykuorma toiminnot):
decoded.myVal = bytes / 100;
Koodata (hyötykuorma toiminnot):
bytes = Math.round(1.22 * 100);
Decode (Arduino):
float myVal = payload / 100.00;
Miten lähettää useita numeroita?
monissa tapauksissa haluat lähettää useita arvoja yhdessä viestissä. Aloita koodaamalla jokainen yksittäinen numero tavujen puskuriin ja yhdistä ne sitten yhdeksi puskuriksi.,
Koodata (Arduino):
saatat ihmetellä, miksi
memcpy()
hyväksyypayload + sizeOfPayloadA
koska ne näyttävät 🍏 ja 🍊. Se on kuin ohje kopioipayload
puskuri, mutta muuton jälkeen kohta, se on kopio, pituus hyötykuormaa lisäsimme toistaiseksi.,
Decode (hyötykuorma toiminnot)
decoded.myValA = bytes.slice(0, 2);decoded.myValB = bytes.slice(2, 5);// Decode both byte arrays as we did before
Koodata (hyötykuorma-toiminto)
// Encode both values as we did beforevar bytes = bytesA.concat(bytesB);
Decode (Arduino):
var payloadA;var payloadB;memcpy(payloadA,
Miten lähettää tekstiviestejä?
lyhyt vastaus on: älä. Tekstissä käytetään paljon tavuja. Unicode määrittelee yli 128000 merkkiä, joten se veisi 3 tavua per merkki! On harvoin hyviä syitä käyttää tekstiä numeroiden sijaan, lukuun ottamatta ehkä lähettää joitakin käyttäjän syötteen., Useimmiten vain Alfanumeeriset merkit riittävät, silloin pääsee pois käyttämällä ASCII-merkkejä, jotka käyttävät vain yhtä tavua per merkki. Jokainen merkkijono on päätettävä NULL (0x00, ’\0’) – merkki ilmaisee, että merkkijono on päättynyt.
Et kuullut sitä minulta, mutta tässä miten haluat koodata merkkijono:
Joka sinun olisi purkaa kanssa:
decoded.myVal = String.fromCharCode.apply(null, bytes);