Documente Academic
Documente Profesional
Documente Cultură
Proiect de diplomă
prezentat ca cerință parțială pentru obținerea titlului de
Inginer în domeniul Electronică și Telecomunicații
programul de studii de licență Rețele și Software de Telecomunicații
2018
1
2
3
4
Anexa 5
Bucureşti, 30.06.2018
(semnătura în original)
5
6
Cuprins
LISTĂ DE FIGURI ............................................................................................................................ 8
LISTĂ DE ACRONIME ................................................................................................................... 9
LISTĂ DE TABELE ........................................................................................................................ 10
1 Capitolul INTRODUCERE ........................................................................................................ 11
1.1 Introducere........................................................................................................................... 11
2 Capitolul Introducere în IoT ....................................................................................................... 12
2.1 IoT ....................................................................................................................................... 12
2.2 LoRa .................................................................................................................................... 12
2.3 Raspberry............................................................................................................................. 13
2.3.1 Raspberry Pi 3 model B ............................................................................................... 15
3 Capitolul LoRa............................................................................................................................ 17
3.1 Noțiuni generale .................................................................................................................. 17
3.2 Rata de transmisie a datelor................................................................................................. 18
3.3 Bugetul de legatura (Link Budget) ...................................................................................... 19
3.4 Structura pachetelor LoRA .................................................................................................. 22
4 Capitolul LoRaWAN .................................................................................................................. 24
4.1 Noțiuni generale .................................................................................................................. 24
4.2 Clase LoraWAN .................................................................................................................. 25
4.3 Rețele ................................................................................................................................... 26
5 Capitolul SX127X ...................................................................................................................... 27
5.1 Regiștrii ............................................................................................................................... 27
5.2 Moduri de operare ale modemurilor LoRa. ......................................................................... 28
5.3 Configurația regiștrilor pentru modificarea parametrilor LoRa .......................................... 33
6 Capitolul Implementare .............................................................................................................. 35
6.1 Măsurători ale performanțelor protocolului ........................................................................ 35
7 Capitolul 6 .................................................................................................................................. 41
7.1 Implementarea software ...................................................................................................... 41
Concluzii ........................................................................................................................................... 49
Bibliografie ....................................................................................................................................... 51
ANEXE .............................................................................................................................................. 52
7
LISTĂ DE FIGURI
8
LISTĂ DE ACRONIME
9
LISTĂ DE TABELE
Tabel 2.3.1 Schema pinilor de uz general pentru Raspberry Pi A și B
Tabel 2.3.2 Pini suplimentari pentru versiunea B rev.2
Tabel 3.3.1 Zgomotul maxim acceptat pentru diferite valori ale BW și SF
Tabel 5.2.1 Tipuri de mesaje LoRaWAN
Tabel 5.2.2 Conținutul FCtrl pentru mesaje descendente
Tabel 5.2.3 Conținutul FCtrl pentru mesaje ascendente
Tabel 5.3.1 Utilizarea CRC pentru diferite stări ale bitului RxPayloadCrcOn cazul antetului explicit
Tabel 5.3.2 Utilizarea CRC pentru diferite stări ale bitului RxPayloadCrcOn cazul antetului implicit
10
1 Capitolul INTRODUCERE
1.1 Introducere
Scopul lucrării este de a implementa schimbarea dinamică a ratei de transmisie in funcție de
parametrii de comunicație. Se dorește a se realiza acest lucru pentru o comunicație fără fir de tip
LoRa. Pentru a realiza acest lucru este nevoie să se cunoască in primul rând care sunt capacitățile
LoRa, și care sunt parametrii modulației LoRa care pot fi ajustați. Pentru a realiza schimbarea ratei
de transmisiune a fost necesar să cunoaștem câteva detalii și despre propagarea semnalului respectiv
cum influențează canalul transmisia. De asemeni a trebuit să luăm in considerare si limitările
dispozitivelor folosite. Dispozitivele care făceau transmisia si recepția erau produse de Ai Thinker pe
baza specificațiilor firmei Semtech care deține drepturile asupra modulației LoRa. Dispozitivele
folosite au fost de varianta sx1276.
Pentru a realiza partea software am folosit ca punct de plecare o implementare in Node js pentru
acest model de dispozitiv. Această implementare a trebuit să o verific atât cu datasheetul disponibil
cât și măsurând cu un analizor de spectru dacă unele funcțiile implementate fac ceea ce este specificat
in standardul Semtech. Singura informație asupra calității mesajului primit este indicele rssi. A trebuit
să realizăm o serie de măsurători pentru a vedea pentru ce valori ale rssi se pierde comunicația dintre
plăcuțe pentru a ști în cazul implementării noastre ce valoare a rssi trebuie evitată. Pentru a mări
valoarea rssi avem la dispoziție trei parametrii ai dispozitivului : lățimea de bandă, factorul de
împrăștiere și puterea de transmisie. În implementarea noastră am păstrat lățimea benzii constantă si
am variat ceilalți doi factori.
În realizarea acestui lucru mari probleme au fost aduse de către cablurile care conectau
dispozitivele sx1276 la antenele folosite. Și de asemenea probleme au fost atunci când am schimbat
factorul de împrăștiere deoarece emițătorul și receptorul trebuie să folosească același factor de
împrăștiere pentru a putea comunica.
11
2 Capitolul Introducere în IoT
2.1 IoT
În ultimii ani LPWANs – Low Power Wide Area Networks au devenit una din tehnologiile cu
cea mai rapidă creștere printre tehnologiile wireless. Aceste rețele sunt de fapt pilonul de bază pentru
viitorul interconectat prevestit prin sintagma: Internet Of Things, care defapt este mutat în prezentul
pe care îl trăim. Dezvoltarea Internet Of Things a prins viteză o dată cu apariția rețelelor LPWAN și
odată cu micșorarea accelerată a dispozitivelor de calcul și a dezvoltării diferiților senzori de mărimi
foarte mici, și de asemenea datorate prețului redus al dispozitivelor electronice.
Tehnologiile LPWAN sunt complementare rețelelor convenționale celulare și wireless în
termeni de consum energie, distanță, costuri și bandă oferită. În general tehnologiile LPWAN oferă
o bandă foarte mică, distanță de până la 15 km, consum mic de energie și costuri foarte mici fiind
ideale pentru aplicații de tipul intern of things. Aceste aplicații având nevoie doar de bandă mică
deoarece, informațiile transmise sunt valori transmise de senzori, valorile transmise de acești senzori
vor fi agregate la un concentrator. Mai multe concentratoare vor fi conectate prin tehnologii
convenționale la servere de aplicație care vor face centralizarea datelor și prelucrarea lor. Deci
dispozitivele de la marginea rețelei nu vor avea nevoie de putere mare de calcul. Aceasta abordare
este total diferita de cealalta abordare populara in acest moment care are in vedere mutarea puterii de
calcul la periferia retelei miscare ce poarta denumirea de edge-computing.
Lucrarea de față are ca scop realizarea unor măsuratori pentru a observa comportamentul
acestui tip de comunicație, și implicit pentru a realiza acest lucru este nevoie de scrierea unor
programe software care să simplifice realizarea acestui lucru. În urma unor masurători amănunțite și
a unor experimente practice putem realiza care sunt capacitățile reale ale modulației LoRa și a implicit
a tehnologiilor de tip IoT. Desigur pentru a realiza acest lucru este necesară o înțelegere a modului
de operare al transmițătoarelor, modulației și a uneltelor hardware și software necesare pentru a obține
aceste rezultate.
2.2 LoRa
LoRaWAN folosește modulația LORA care este bazată pe chirp spread spectrum, care o face
să se comporte bine pe un canal cu zgomot, cu căi multiple, și effect dopler chiar și folosind puteri de
transmisie scăzute. Rata datelor depinde de banda utilizată și de factorul de împrăștiere. Factorul de
împrăștiere – cu cât factorul crește mai mult cu atât pachetele se transmit mai rar. LoRa Spread
Spectrum Modulation – modulație utilizată de LoRaWAN proprietară, deținută de Semtech. Lora este
o modulație de tip spread spectrum bazată pe Chirp Spread Spectrum modulation. Chirp Spread
Spectrum este o modulație care își are originea în 1940 și a fost folosită de atunci în comunicațiile
militare și spațiale datorită rezistenței sale la interferență. Într-o modulație de tip spread spectrum
semnalul transmis este împrăștiat peste o bandă de frecvențe mai largă mult mai mare decât bandă
minimă necesară transmiterii datelor. Rata de transmisie este influențată de următorii 3 factori:
factorul de împrăștiere, lățimea de bandă, puterea de transmisie. Dacă micșorăm puterea de transmisie
vom economisi baterie, dar distanța de transmisie va fi evident mai mică. Ceilalți doi factori adăugați
împreună formează data rate-ul. Rata de transfer (Baud Rate) este dată de de ceilalți doi factori:
factorul de împrăștiere și lățimea de bandă. Dacă mărim lățimea de bandă sau micșorăm factorul de
12
împrăștiere putem obține rate de transfer mai mari. LoRa – definește standardul pentru layer fizic.
LoraWan – definește layerul fizic plus nivelul MAC și nivelul aplicație.
Caracteristici principale LoRaWAN:
• Distanță de transmisie mare: >5 km urban, >10 km rural, >80km condiții ideale
• Durata de viață lungă a bateriei: >10 ani (datorita consumului redus de putere)
• Cost scăzut: 100 lei modul
• Rata de transmisie scăzută: 0.3 bps – 50 kbps
• Operează într-o bandă nelicențiată. Transmisia fiind de tip bidirecționale
LoRaWAN este gândită cu gândul la rețele clasice telecom, în care doar câțiva operatori
mențin și controlează rețeaua, și milioane de utilizatori folosesc rețeaua și nu e nevoie să se îngrijească
de starea infrastructurii. Cu toate acestea LoRa operează în zona de spectru nelicențiată. Este posibil
să îți setezi propriul gateway, și să îți construiești propria rețea.
Arhitecura:
În cazul tipic un senzor trimite la un anumit un pachet, care va fi interceptat de una sau mai multe
gateway-uri care apoi vor trimite pachetul printr-o rețea convențională către un server de aplicație,
care va face prelucrare pe baza datelor primate și vor lua decizii.
2.3 Raspberry
Raspberry Pi este o serie de computere cu dimensiuni mici , dezvoltate în Regatul Unit de către
Fundația Raspberry Pi pentru a promova predarea informaticii în școli și în țările în curs de dezvoltare.
Mai multe generații de Raspberry PI au fost comercializate pana in prezent. Viteza procesorului
variază de la 700 MHz la 1,4 GHz pentru Pi 3 Model B+; memoria variază de la 256 MB la 1 GB de
RAM. Placutele pot avea de la o iesire la patru iesiri USB. Pentru ieșire video, avem un port HDMI ,
de asemeni putem avea si iesire de sunet cu ajutorului portului standard de 3,5 mm jack pentru ieșire
audio. Deasemenea acest microcalculator dispune si de iesiri programabile care sunt asigurate de un
număr de pini GPIO care acceptă protocoalele obișnuite precum I²C si SPI.
13
Schemele pinilor de uz general :
Funcție
GPIO Funcție secundară Pin Pin GPIO
secundară
+3.3 V 1 2 +5 V
SDA1
2 3 4 +5 V
SCL1
3 5 6 GND
GCLK
4 7 8 TXD0 (UART) 14
GND
9 10 RXD0 (UART) 15
GEN0
17 11 12 GEN1 18
GEN2
27 13 14 GND
GEN3
22 15 16 GEN4 23
+3.3 V
17 18 GEN5 24
MOSI (SPI)
10 19 20 GND
MSO (SPI)
9 21 22 GEN6 25
SCLK (SPI)
11 23 24 CE0_N (SPI) 8
GND
25 26 CE1_N (SPI) 7
14
Modelul B rev.2 are de asemenea un pad (numit P5 pe bord si P6 pe schema) de 8 pini oferă acces la
o suplimentare 4 GPIO conexiuni.
Modelele A și B permite GPIO accesul la statutul de ACT LED folosind GPIO 16. Modelele A și B
oferă acces GPIO ACT statutul LED folosind GPIO 47, şi starea de putere LED folosind GPIO 35.
Raspberry Pi 3 model este un computer de mici dimensiuni care are toate componentele de bază ale
unui computer obișnuit. Dispune de un processor quad core, Wi-Fi si bluetooth.
Pentru a putea interacționa cu alte dispositive Raspberry Pi dispune de porturi I/O, și de 40 de pini
denumiți GPIO (General-purpose input/output). Interacțiunea cu chip-ul Lora se realizează cu
ajutorul SPI (Serial Peripheral Interface bus) o interfață de comunicații alcatuită din 4 cai de
comunicație (4 pini GPIO). Interfața comunică bidirectional folosind o arhitectură de tip master-slave
cu un singur master. Sunt disponibile mai multe device-uri slave legate la același master cu ajutorul
chip select.
15
Fig 2.3.1.2 Structura SPI
16
3 Capitolul LoRa
3.1 Noțiuni generale
LoRa este modulația proprietară de tip spectru împrăștiat (spread spectrum modulation).
Modulația este derivată din modulația chirp spread spectru. Aceste tipuri de modulație renunță la rata
de transmisie a datelor în favoarea unei sensibilități mai mari care se traduce în final la distanțe mai
mari de transmisie.LoRa (Long Range) operează la nivelul fizic din modelul OSI (Open Systems
Interconnection). LoRa este folosit în comunicații fără fir pe distanțe lungi. Distanță este un termen
relative, în cazul nostru în condiții teoretice se pot obține distanțe de transmisie de până la 40 km,
această distanță teoretică este însă afectată de mai mulți factori dintre care putem aminti: zgomotul
de pe canal, inia de vedere și zona Fresnel.
Pentru a putea vorbi de transmisiuni trebuie să amintim teorema Shannon-Hartley care indică
capacitatea de transmisie a unui canal în prezența zgomotului.
𝑆
𝐶 = 𝐵 ∗ 𝑙𝑜𝑔2 (1 + )
𝑁
C = Capacitatea canalului (bit/s)
B = Banda (Hz)
S = Puterea medie a semnalului recepționat (Watt)
N = Puterea medie a zgomotului (Watt)
S/N = Raportul semnal zgomot
Rearanjând ecuația putem obține următoarea formă a ecuației:
𝐶 𝑆
=1.433*𝑁
𝐵
Din această ecuație putem deduce că pentru a putea transmite fără pierderi în cazul în care
raportul semnal zgomot S/N << 1 putem folosi o bandă mai mare de frecvența. Astfel mărind bandă
putem compensa pentru degradarea raportului semnal-zgomot. Există mai multe sisteme de tip spread
spectrum dar toate au ceva în comun: cheia asociată canalului de comunicație. Felul în care această
cheie este introdusă în semnal definește tipul modulației. Termenul spread-spectrum se referă la
utilizarea unui semnal cu perioada mult mai mică decât semnalul util pentru a mări bandă utilizată de
semnalul modulat. O consecință a acestui fapt este că energia utilizată este împrăștiată peste o bandă
mai mare astfel încât apare că și cum ar fi zgomot. Raportul în decibeli între semnalul modulat și
semnalul util se numește câștig de împrăștiere a spectrului. Valori tipice ale acestui parametru variază
între 10 dB și 60 dB.
Procesul de creare a semnalului spread spectrum poartă numele de împrăștiere, și poate avea
loc oriunde în interiorul lanțului de transmisiune înaintea antenei de transmisie. La receptor codul de
împrăștiere a semnalului este eliminat, semnalul revenind la bandă sa inițială. Desigur că același cod
folosit la modulare trebuie folosit și la demodulare.Beneficii ale tehnologiilor spread spectrum sunt
rezistență la interferență și antibruiaj. De asemeni datorită folosirii codului (cheii de modulație) mai
17
multe semnale de tip spread spectrum pot fi transmise peste aceeași bandă în aceeași manieră că și
semnalele CDMA, receptorul decodand doar semnalul care conține cheia de modulație.
Chirp este un semnal sinusoidal a cărei frecvența scade sau crește în timp (de obicei între timp
și frecvența avem o relație sinusoidală). Că și celelalte tehnlogii de tip spectru împrăștiată, chirp
folosește întreagă bandă pentru a transmite mesajul făcându-l rezistent la interferență. Mai mult
deoarece se utilizează o bandă largă a spectrului de frecvențe, spectrul răspândit va fi de asemenea
rezistent la fenomenul de fading cauzat de transmisia de mai multe cai. Fading. Prezența obiectelor
care reflectă semnalul în zona dintre un transmițător și un receptor creează mai multe cai pe care
semnalul transmis le urmează către receptor. Ca rezultat receptorul va vedea superpoziția dintre
fiecare copie a semnalului original, afectată de o întârziere diferită în funcție de calea urmată. Fiecare
copie a semnalului va avea o atenuare, întârziere și fază diferită atunci când ajunge la receptor. Acest
fenomen va duce de la receptor la interferență, care poate fi constructivă sau destructivă, amplificând
sau atenuând puterea semnalului util. Interferențele puternice pot duce la o pierdere temporară a
legăturii de comunicație, datorită scăderii profunde a raportului semnalului zgomot.
Chirp Spread Spectrum a fost dezvoltat pentru a fi folosit în aplicații radar în anii 1940. De
asemeni folosit în aplicații militare și comunicații care au nevoie de securitate sporită. În ultimii 20
de ani acest tip de modulație ș- a găsit mai multe aplicații practice datorită consumului relativ mic de
putere și rezistență la interferență.
2𝑆𝐹
𝑇𝑠 = 𝑠𝑒𝑐𝑢𝑛𝑑𝑒
𝐵𝑊
Ts = Perioada unui simbol
1
𝑅𝑆 = 𝑠𝑖𝑚𝑏𝑜𝑙𝑢𝑟𝑖/𝑠𝑒𝑐
𝑇𝑆
Rs = Rata simbolurilor (inversul perioadei)
𝑅𝐶 = 𝑅𝑆 ∗ 2𝑆𝐹 𝑐𝑖𝑝𝑢𝑟𝑖/𝑠𝑒𝑐
18
Rc = Rata semnalului chirp
Rata chirp = un chirp este generat pe secundă pe Hz ai lățimii de bandă
𝑅𝐶 = 𝑅𝑆 ∗ 2𝑆𝐹
𝐵𝑊
𝑅𝐶 = 2𝑆𝐹 *2𝑆𝐹 cipuri/sec
LoRa include și un mecanism de corectare al erorilor care îmbunătățește semnalul transmis, dar cu
costul transmiterii unei informatii redundante.
4
[4 + 𝐶𝑅 ]
𝑅𝑏 = 𝑆𝐹 ∗
2𝑆𝐹
[𝐵𝑊 ]
SF
7 8 9 10 11 12
BW
125 kHz −123 −126 −129 −132 −133 −136
250 kHz −120 −123 −125 −128 −130 −133
500 kHz −116 −119 −122 −125 −128 −130
Tabel 3.3.1 Zgomotul maxim acceptat pentru diferite valori ale BW și SF
Bugetul de legături al unui sistem sau rețea fără fir este o măsură a tuturor câștigurilor și
pierderilor din transmițător, prin canalul de propagare, către receptorul țintă. Aceste câștiguri și
pierderi includ câștigurile și pierderile de sistem asociate cu antena, potrivirea rețelelor etc., precum
și pierderile (fie prin modelare, fie prin măsurători). De obicei, sunt luate în considerare mecanisme
de canal care variază aleatoriu, cum ar fi multipath și Doppler contravând marjei suplimentare în
funcție de gravitatea anticipată. Bugetul de legătură al unei conexiuni fără fir poate fi exprimat ca:
𝑃𝑅𝑋 (𝑑𝐵𝑚) = 𝑃𝑇𝑥 (𝑑𝐵𝑚) + 𝐺𝑆𝐼𝑆𝑇𝐸𝑀 (𝑑𝐵) − 𝐿𝑆𝐼𝑆𝑇𝐸𝑀 (𝑑𝐵) − 𝑙𝐶𝐴𝑁𝐴𝐿 (𝑑𝐵)
19
Unde :
Un canal de comunicații se spune că este limitat în legătură atunci când pierderile asociate
canalului fac ca puterea asociată semnalului incident la receptor să fie sub minimul necesar pentru
receptor pentru a demodula corect semnalul transmis. Legături cu interferență limitată. În practică
operarea într-un spectru de licențe nelicențiat nu asigură calitatea serviciului, în opoziție cu operarea
într-un spectru licențiat, pentru care s-a plătit o taxă pentru accesul exclusiv la acea porțiune de
spectru De obicei un dispozitiv care funcționează într-o bandă nelicențiată este mai probabil să fie
afectat de interferență datorită celorlalți utilizatori ai spectrului de frecvența decât de bugetul de
legătură.
Un scenariu tipic are în vedere câteva dispozitive aflate în vecinătate încercând în același
moment de timp să acceseze aceeași bandă de frecvente pentru a transmite. În timp ce sunt mai multe
modalități de atenuare a efectelor interferenței, care pot fi implementate, fie prin intermediul
reglementării (cum ar fi limitarea ciclului de funcționare al emițătorului) sau prin mecanisme cum ar
fi CSMA/CSMA-CA, prin natura nepredictibilă a interferențelor evaluarea canalului de la emițător
poate să nu coincidă cu condițiile canalului de la receptor și transmisia să fie blocată , cu toate că
pentru dispozitivul care transmite, transmisia pare să poată avea loc. Pentru a evita interferența
sistemelor care folosesc transmisii de tip bandă îngustă se implementează frecvent înclinarea
frecvenței (frequency hopping) pentru a evita o operație repetată pe același canal sau frecvența. După
cum se știe această tehnică este folosită de sistemele de bandă îngustă pentru a atenua efectele căilor
multiple de transmisie. Cu toate acestea, reglementările în vigoare spun că schimbarea de frecvența
trebuie să fie pseudo-aleatoare, acest tip de schimbare poate face ca transmițătorul sau receptorul să
facă un salt de frecvența pe un canal deja ocupat, sau un alt dispozitiv să facă trecerea simultan pe
același canal.
Cerință de salt a frecvenței duce la o redundanța a pachetelor, pentru ca receptorul să fie sigur
că mesajul i se adresează, transmițătorul va transmite din nou antetul mesajului, cu toate că
receptoarele moderne au nevoie doar de un mic preambul pentru sincronizare. În plus în majoritatea
sistemelor receptorul rămâne doar pe un canal pentru câteva milisecunde, pentru a minimiza riscul de
interferență pe canal. Pentru o transmisie cu rată mică de date raportul dintre numărul de octeți utili
și numărul total de octeți fiind destul de mic. Orice pierdere de sincronizare între transmițător și
receptor va necesita ca dispozitivele să treacă printr-o perioadă de redescoperire și sincronizare.
Existența semnalelor spectru larg și spectru îngust. După cum am mai vorbit semnalele de tip
bandă îngustă se vor folosi de puterea mai mare concentrată într-o lățime de bandă mai mică și de
saltul de frecvența pentru a transmite într-un spectru de frecvențe unde coexistă și semnale de tip
spectru împrăștiat, pentru ca puterea folosită să fie necesară sistemele bandă îngustă vor utiliza mai
20
multă energie. Însă schimbări recente de reguli în ceea ce privește transmisia în benzile libere de
frecvețe din Statele Unite permit acum dispozitivelor de tip bandă împrăștiată să transmită la o putere
semnificativ mai mare în timp ce se vor încadra în continuare în limitele de densitate spectrală de
putere.Profitând de această actualizare a regulamentelor un semnal modulat LoRa cu lățime de bandă
500 kHz de 6 dB poate transmite până la +27 dBm, aproape de +30 dBm permis pentru semnalele de
bandă îngustă, în cadrul semnalelorde tip bandă largă fără restricții în ceea ce privește timpul de
staționare în respectiva bandă, pe când semnalele de tip bandă îngustă au timp de staționare în bandă
scurt. După cum am mai spus, modulația de tip spectru împrăștiat impactul semnalelor de interferență
este redus. Aceste semnale sunt împrăștiate de procesul de demodulare apoi ușor de eliminat prin
filtrare.
Sistemele cu modulare de bandă îngustă nu împrăștie semnalele interferențe în cadrul
procesului de demodulare și pot suferi pierderi de pachete în prezența unui semnal de interferență de
tip bandă largă. Desigur că și sistemele de modulație de bandă largă sunt supuse de interferență
produse de sisteme de modulație de bandă largă adiacente. Cu toate aceste putem apela la folosirea
pentru semnale de tip bandă largă adiacente de schimbarea factorului de împrăștiere al semnalelor
sau de schimbarea secvenței (chirp) în acest fel cel de al doilea semnal va apărea ca zgomot și prin
urmare va fi ignorat. Durata de transmisie în aer a unui semnal de tip bandă largă poate fi mult mai
lungă decât a unui semnal de bandă îngustă, așa că ne putem aștepta că mai multe semnale bandă
îngustă să fie interferențe cu un singur semnal de tip bandă largă. Însă în domeniul timp interferență
produsă de semnalul bandă îngustă este mică comparativă cu perioada semnalului bandă largă.
Spreading factor = chip rate / symbol rate, asta înseamnă că un singur simbol este reprezentat de mai
multe chirpuri. Astfel, se poate observă că implementarea modulației LoRa asigură o capacitate totală
a canalului de 21,5 kb / s. Aceasta este o creștere a capacității canalului de aproape 50% în comparație
cu FSK.
Preambul. Preambulul este folosit pentru a sincroniza receptorul cu fluxul de date de intrare.
Implicit pachetul este configurat cu o secvență de 12 simboluri. Această secvență este programabilă,
astfel încât lungimea preambulului poate fi extinsă. Cu toate acestea secventa minimă pentru
sincronizare este de 12 simboluri. Lungimea preambulului poate fi modificată prin setarea registrului
PreambleLength cu valori cuprinse între 6 și 65535. Dând o lungime posibilă a preambulului de 6 +
4 până la 65535 +4 simboluri, cele 4 simblouri sunt fixate, nu se pot modifică prin intermediul
software.
Receptorul efectuează un proces de detectare a preambulului care repornește periodic. Din acest
motiv lungimea preambulului trebuie să fie setată și la receptor și la emițător identic. În cazul în care
22
lungimea preambulului nu este cunoscută sau poate varia, lungimea maximă a preambulului trebuie
programată pe partea receptorului.
Antet. În funcție de modul de funcționare ales, sunt disponibile două tipuri de antet. Tipul
antetului este selectat de către bitul ImplicitHeaderModeOn care se află în registrul
RegModemConfig1.
Modul de antet explicit. Acesta este modul implicit de funcționare. Aici antetul va furniza
următoarele informații despre pachet: lungime încărcăturii în octeți, rata de corecție a erorilor, dacă
avem sau nu prezent un cod ciclic de redundanță de 16 biți folosit pentru încărcătură, acest cod este
doar pentru detecția erorilor. Valoarea maximă pentru rata de corecție a erorilor este de 4/8, deci
dintr-un total de 8 biți, 4 biți vor fi biți de dat, 4 biți folosiți pentru redundanță. Antetul are propriul
cod de verificare a erorilor, pentru ca un receptor să poată ignora un pachet cu antet corupt.
Modul de antet implicit. În anumite scenarii unde sarcina utilă, rata de codare și prezența
codurilor de detecție a erorilor sunt cunoscute în avans, este avantajos să folosim modul de antet
implicit pentru reducerea timpului de transmisie și reducere a dimensiunii pachetului. În acest mod
antetul este eliminat din pachet. În cazul acesta trebuie configurat manual la receptor și la transmițător
lungimea sarcinii utile, rata de codare a erorilor și prezența sau absența codului detector de erori.
Modul implicit poate fi folosit doar cu factorul de împrăștiere SF = 6.
Modulația LoRa este o implementare simplă pentru nivelul fizic care asigura un buget de legături
semnificativ pentru legături îmbunătățite față de modulația convențională de bandă îngustă. În plus
selectivitatea oferită de modificarea factorului de împrăștiere și protecția crescută la interferență
permit să obținem distanțe mai mari de transmisie chiar și în medii mai puțîn prietenoase. Folosirea
factorilor de împrăștiere ortogonali permite modulației să îmbunătățească eficiența spectrală a rețelei,
deoarece pachetele cu factori diferiți de împrăștiere pot coexista în aceeași bandă spectrală în același
moment de timp.
23
4 Capitolul LoRaWAN
4.1 Noțiuni generale
După cum am vorbit în capitolul precedent LoRa se referă la modulația de tip spectrum
imprăștiat, iar LoRa MAC se referă la nivelul legatură de date correspondent cu stiva OSI (open
systems interconnection). LoRaWAN se referă la protocolul care este construit peste nivelul MAC
pentru a face sistemul mai scalabil.
Rețelele LoRaWAN sunt de obicei construite într-o topologie stea în care concentratoarele
(gateways) transportă mesajele între nodurile rețelei (end devices) și un server de rețea apoi serverul
de rețea ruteaza respectivele pachete la serverul de aplicație care va lua decizii în funcție de pachetele
primate. Pentru a asigura transmisiile radio, protocolul LoRaWAN se bazează pe criptografia
simetrică folosind chei de sesiune derivate din cheile rădăcina ale dispozitivului, acestea fiind 2 chei
asimetrice, generate de producătorul dispozitivului. Vom vorbi mai târziu despre asigurarea securității
în protocolul LoRaWAN ea este implementată cu ajutorul unui dispozitiv extern care poartă denumire
de server de alăturare (join server). Toate comunicațiile sunt de tip bidirecțional, deși comunicarea
majoritară este de la nodurile rețelei (senzori, actuatori etc) către concentratoare. Comunicația între
noduri și concentratoare este împărțită în mai multe canale de diferite frecvențe și folosind diferite
rate de transmisie. Selectarea ratei de transmisie este un compromis între distanță necesară pentru
comunicație și durata mesajului, comunicații cu rate de date diferite nu interferează unele cu altele.
Ratele de transmisie a datelor în LoRa variază de la 0.3 kbps până la 50 kbps. Pentru a
maximiza durata bateriilor nodurilor rețelei cât și capacitatea generală a rețelei, rețeaua LoRa poate
gestiona rata de transmisie a datelor și parametrii comunicației de radiofrecvență ale nodurilor
folosind o schemă de tip rată de transmisie adaptive (adaptive data rate). Un dispozitiv poate folosi
pe orice canal disponibil, în orice moment de timp, folosind orice rată de transmisie a datelor, atât
timp cât regulile următoare sunt respectate. Dispozitivul final (nodul) schimbă canalul într-o
modalitate pseudo-aleatoare pentru fiecare transmisie, diversitatea de frecvența face sistemul mai
rezistent la interferențe. Dispozitivul respectă ciclul de transmie (duty cycle) reglementat în bandă
24
de frecvențe pe care o folosește. Dispozitivul respectă durata maximă de transmisie (timp de
așteptare) în banda locală și în funcție de reglementările local.
25
4.3 Rețele
Rețeaua de tip stea. Rețeaua de tip stea este un tip de rețea ușor de implementat și foarte comun
pentru dispozitivele care au constranwgeri din punct de vedere al energiei consumate. De obicei un
punct central acționează ca concentrator pentru tot traficul generat de rețea. Tot traficul va fi rutat de
către concentrator. O rețea de tip stea minimizează traficul prin rețea. Pentru o rețea care nu este
constrânsă de numărul de linkuri este nevoie doar de 3 dispozitive și două legături pentru a stabili o
comunicație între oricare două dispozitive. În plus nodurile nu sunt conectate decât la concentrator,
fără a fi legate la alte noduri de aici și ușurință de a le înlocui.
Centralizarea ajută și la securitate sporită fiind posibilă scanarea pachetelor dintr-un loc
central. Un mare dezavantaj este faptul că nu avem redundanța în cazul defecțiunii concentratorului.
Rețeaua de tip plasă. În rețeaua de tip plasă datele se propagă prin intermediul tuturor
nodurilor. Acest tip de rețea este cu tip de inundare deoarece fiecare mesaj ajunge la fiecare dispozitiv,
indiferent de rutare sau de destinația finală. Avantajul unei acest tip de configurație îl reprezintă
capacitatea rețelei de a se vindecă și reconfigura în urmă defectării unui dispozitiv sau grup de
dispozitive. Un dezavantaj este complexitatea relative mai mare față de rețelele stea și un traficul
crescut față de rețelele stea. De asemenea un trafic crescut înseamnă și un consum de energie mai
mare, așa că acest tip de rețea nu este implementat în cazul în care rețeaua va avea constrângeri severe
din punct de vedere energetic. Bugetul de legături. Bugetul de legături al unei rețele wireless
reprezintă o măsură a tuturor câștigurilor și pierderilor pornind de la transmițător, prin canalul de
propagare până la receptor. Aceste câștiguri și pierderi pot fi asociate cu antena, canalul de
comunicații precum și pierderi datorate măsurătorilor.
Efecte asociate canalului cum ar fi transmiterea pe mai multe cai și efectul Doppler sunt luate
în considerare atunci când se calculează bugetul de legături de asemeni se mai adaugă și o margine
de rezervă în funcție de anticiparea stării canalului.
26
5 Capitolul SX127X
5.1 Regiștrii
Interfață digitală a modemului. ModemurileLoRa SX1276/77/78/79 au în componentă trei tipuri
de interfețe digitale: registre cu configurație statică, registre de stare și o memorie tampon de tip
primul-intrat primul-ieșit. Toate pot fi accesate prin interfață SPI.
Regiștrii de configurație. Regiștrii de configratie sunt accesați prin intermediul interfeței SPI.
Regiștrii pot fi citiți din orice mod de funcționare care include și modul SLEEP. Însă ei pot fi scriși
doar în modul SLEEP și STANDBY.
Regiștrii de stare. Regiștrii de stare furnizează informații de stare în timpul funcționarii
receptorului. Memoria tampon FIFO. Chipul LoRa SX1276/77/78/79 vine echipat cu 256 octeți RAM
memorie tampon care poate fi accesată doar în modul de funcționare LoRa. Această memorie
denumită memorie tampon de tip primul-intrat primul-ieșit este complet accesibilă utilizatorului și
permit accessul la mesajele trimise, primate și date de configurație. Orice acces la memoria tampon
FIFO se face prin interfața SPI. Această memorie tampon poate fi citită în toate modurile de operare
de aici făcând excepție modul SLEEP și atunci când se stochează conținutul ultimului mesaj primit.
Principiul de operație. Datorită configurației cu două porturi a memoriei, este posibil simultan
să stocăm atât pachetele care trebuie transmise cât și pachetele primate în memoriei tampon. Registrul
RegFifoTxBaseAddr specifică punctul în memorie unde informația care urmează să fie transmisă este
stocată. Similar pentru operația de recepție registrul RegFifoRxBaseAddr ne indică loculdin memorie
unde informația va fi stocată în cazul unei recepției.
Inițial dispozitivul este configurat la pornire astfel încât jumătate din memoria disponibilă să
fie dedicată recepției (RegFifoRxBaseAddr inițializat la adresa 0x00) iar cealaltă jumătate este
27
dedicate pentru transmisie (RegFifoTxBaseAddr inițializat la adresa 0x80). Totuși adresele de bază
pentru receptive și transmisie sunt configurabile și pot trimite unde dorește programatorul în memoria
de 256 octeți. Pentru a exploata dimensiunea maximă a memoriei tampon în modul de recepție, putem
seta adresa la care trimit cele două registre RegFifoTxBaseAddr și RegFifoRxBaseAddr în partea
inferioară a memoriei (0x00). Conținutul memoriei tampon este șters atunci când dispozitivul este
pus în modul SLEEP, prin urmare accesul la memoria tampon nu este posibilă din modul SLEEP. Cu
toate acestea la comutarea între celelalte moduri conținut memoriei tampon este păstrat, astfel încât
un pachet recepționat să poată fi retransmis cu manipulare minimă a datelor din partea controlerului.
Memoria tampon se eliberează doar atunci când suprascriem datele aflate la o anumită locație
de memorie. Locațiile din memoria tampon care trebuie scrisă sau citită prin intermediul interfeței
SPI este definită de indicator (pointer) RegFifoAddrPtr. Deci înainte de orice operație de scriere sau
citire trebuie inițializat acest pointer cu adresa corespunzătoare. La scrierea sau citirea în memoria
tampon, pointerul de adresă se va incrementă automat.
Registrul RegRxNbBytes definește dimensiunea locului de memorie care trebuie scris în cazul
unei operații de recepție care s-a realizat cu succes. Registrul RegPayloadLength definește
dimensiunea locului de memorie care trebuie utilizat în cazul unei operații de transmisie. În modul
de operare cu antet implicit registrul RegRxNbBytes nu este utilizat deoarece numărul de octeți al
pachetului recepționat este cunoscut în avans. În celălalt mod de operare, modul cu antet explicit,
dimensiune zonei din memoria tampon este setată la lungimea zonei de informație utilă, specificată
în antetul pachetului. Registrul RegFifoRxCurrentAddr indică locația ultimului pachet primit în
memoria tampon, astfel încât ultimul pachet primit poate fi citit cu ușurință utilizând pointerul
RegFifoAddrPtr care pointează către acest registru. Foarte important este că toate datele primite vor
fi scrise în memoria tampon chiar dacă codul de detecție al erorilor indică conținutul pachetului ca
fiind eronat, acest lucru permite prelucrarea ulterioară a utilizatorului a pachetelor cu erori. De
asemeni dacă dimensiunea pachetului recepționat depășește zona din memorie dedicată recepției,
atunci pachetul va fi recepționat și va suprascrie o parte din zona de memorie dedicate transmisiei.
Întreruperi. Două registre sunt utilizate pentru a controla întreruperile atunci folosim modul
LoRa, registrul RegIrqFlagsMask utilizat pentru a masca întreruperile, și registrul RegIrqFlags care
indică ce tip de întrerupere a fost declanșată. În registrul RegIrqFlagsMask fiecare bit corespunde
unei întreruperi, setarea acelui pe 1 logic indică faptul că întreruperea va fi mascată. În mod implicit
toate întreruperile sunt disponibile. În registrul RegIrqFlags un bit cu valoarea de 1 înseamnă
declanșarea unei întreruperi, după servirea întreruperii, bitul trebuie setat cu valoarea 0.
Modul de operare LoRa sunt activate pe modem setând bitul LongRangeMode din registrul
RegOpMode. În funcție de modul selectat avem următoarele cazuri:
SLEEP – Mod economisire energie. În acest mod sunt accesibile doar registrele de configurație prin
intermediul interfeței SPI (serial peripheral interface). Doar în acest mod ne este permis să schimbăm
între modurile FSK/OOK și modul LoRa.
STANBY – Oscilatorul este oprit, cât și blocurile LoRa.
FSTX – Acesta este un mod de sinteză a frecvenței pentru transmisie.
28
FSRX – Acesta este un mod de sinteză a frecvenței pentru recepție.
TX – Când suntem în acest mod chipul SX1276/77/78/79 activează celelalte blocuri necesare pentru
a transmite, pornește amplificatorul de putere, și se întoarce la modul de funcționare STANDBY
RXCONTINUOS - Când suntem în acest mod chipul SX1276/77/78/79 activează celelalte blocuri
necesare pentru a recepționa date, starea această se schimbă doar când sunt modificați regiștrii pentru
a schimba starea de funcționare.
RXSINGLE - Când suntem în acest mod chipul SX1276/77/78/79 activează celelalte blocuri necesare
pentru a recepționa, după recepționarea primului pachet se întoarce la modul de funcționare
STANDBY
CAD - În acest mod chipul va verifica un canal introdus pentru a detecta un preambul de mesaj LoRa
Este posibil să accesăm orice mod din alt mod prin modificarea valorii din registrul
RegOpMode. Erori în setarea frecvenței. Chipul SX1276/77/78/79 își ia frecvența centrală de la un
oscilator care are o precizie limitată. Erorile date de generarea eronată a frecvenței de referință vor
afecta frecvența centrală utilizată în cazul transmisiei, și frecvența pe care se face recepția. În modul
LoRa este posibil să măsurăm diferența de frecvența dintre frecvența centrală pe care ascultă un
receptor și frecvența centrală a unui mesaj de tip LoRa. Modemul este capabil să detecteze un semnal
Mesajele de legătură în sus (uplink). Aceste mesaje sunt transmise de nodurile rețelei prin
intermediul concentratoarelor, unul sau mai multe, în funcție de câte ascultă frecvența respectivă și
respectiva rată de transmisie, către serverul de rețea.
Modul de recepție continuă. În modul de recepție continuu, modemul scanează canal
încontinuu după un preambul. De fiecare dată când sedetectează un preambul, pachetulvafi memorat,
apoi modemul va scana în continuare pentru apariția altui preambul. Dacă lungimea preambulului
depășește valoarea anticipat stabilită de registrele RegPreambleMsb și RegPreambleLsb (măsurate în
perioade de symbol), pachetul nu va fi recepționat, în schimb se va reîncepe ascultarea canalului. În
cazul în care s-a detectat un preambul mai lung nu se declanșează nicio întrerupere. În modul de
recepție continuă nu apare întreruperea RxTimeout (apare un alt semnal de întrerupere), spre
deosebire de modul recepție singulară în care după apariția întreruperii chipul va trece din starea
STANDBY în mod automat.
Este de asemeni important de precizat că octeții recepționați sunt scriși în memoria tampon în
ordinea în care au fost recepționați. Asta înseamnă că primul octet al unui nou pachet va fi scris după
ultimul bit al pachetului precedent. Pointerul Rx nu este reinițializat cât timp lucrăm în modul recepție
continuă, prin urmare este datoria programatorului să se asigure că memoria tampon nu este niciodată
plină.
În modul de recepție continuă secvență prelucrării pachetelor este următoarea:
Din modul SLEEP sau STANDBY se selectează modul RXCONT.
La primirea unui mesaj cu un cod valid de detecție a erorilor este activate întreruperea RxDone.
Modulul rămâne în modul RxCONT așteptând următorul pachet LoRa
Trebuie citită valoarea fanionului PayloadCrcError pentru a verifică integritatea pachetulu
Dacă conținutul mesajului a fost validat de codul detector de erori, putem citi memoria tampon
29
Repetăm pașii 2, 3, 4 până când dorim să schimbăm modul de funcționar
În modul continuu regiștrii conțin informații doar despre ultimul pachet recepționat.
Mesajele de tip ascendențe. Mesajele ascendente sunt mesajele care vin dinspre dispozitivele aflate
la periferia rețelei (senzori, actuatori) trimise prin intermediul concentratoarelor către serverele de
aplicație.
Structura unui pachet ascendant:
Câmpurile Antet, CRC Antet și CRC sunt introduse de către modulul radio când utilizăm modul
explicit.
Mesajele de tip descendent. Mesajele descendente sunt mesaje transmise de serverele de aplicație
către unul sau mai multe noduri de rețea si sunt transporatate cu ajutorul concentratoarelor.
Structura unui pachet descendent:
Fereastra de recepție:
După fiecare mesaj ascendent fiecare nod trebuie să deschidă două ferestre de recepție a
mesajelor. Momentul de referință pentru începerea ascultării canalului îl reprezintă sfârșitul
transmisiei mesajului ascendent. Voi notacele două ferestre de ascultare cu RX1 și RX2. Prima
fereastră RX1 utilizează aceeași frecvența și aceeași rată de transmisie că și mesajul ascendent. Se
deschide prima fereastră de recepție după așteptarea unui interval de timp RECEIVE_DELAY1 (+/-
20 microsecunde) de la terminarea transmisiei. A doua fereastră RX2 are o frecvența și o rată a datelor
configurabilă. Ascultarea canalului începe după RECEIVE_DELAY2 (+/- 20 microsecunde) de la
terminarea transmisiei. Durata ferestrei de recepție trebuie să fie evident cel puțin egală cu perioada
necesară nodului să detecteze un preambul al pachetului.
Activitatea modemului în timpul ferestrelor de primire. Dacă un preambul este identificat în
timpul unei perioade de recepție, receptorul va sta activat până când se va termină demodularea
pachetului. Dacă pachetul a fost detectat și demodulat, și desigur mesajul destinat acestui nod, și dacă
integritatea pachetului se verifică, dispozitivul trebuie să nu mai deschidă a două fereastră de recepție.
Un nod al rețelei nu trebuie să transmită alt mesaj înainte să primească un mesaj descendent, sau pot
transmite doar după ce au trecut ambele ferestre de așteptare. Mesajele de date sunt utilizate pentru a
transfera atât comenzi MA, cât și date de aplicație, care pot să fie combinate într-un singur mesaj.
Comenzile MAC se află în câmpul antet. Conținutul MAC are câmpurile: antet MAC și opțional mai
poate conține câmpurile: FPort și FRMPayload.
30
Structura antentului:
Tipurile de mesaje MAC. Antetul MAC conține un câmp care se numește MType.
MType este un câmp de 3 biți care descriu 8 mesaje diferite MAC:Cerere alăturare, Acceptare
alăturare, Flux ascendant fără confirmare, Flux descendent fără confirmare, Flux ascendant cu
confirmare, Flux descendent cu confirmare, Menținere alăturare, Proprietar
31
Mtype
Dacă în antetul unui mesaj, câmpul MType conține valoarea 100 sau 101, confirmed data
activat înseamnă că receptorul va trebui să confirme primirea mesajului, pe un când dacă câmpul
MType conține unconfirmed data receptorul nu trebuie să confirme primirea mesajului. Valoarea
MType 111 care semnifică proprietary, este lăsat liber pentru a implementa noi funcții.
Antetul MAC. Antetul MAC conține adresa dispozitivului (DevAddr), un octet pentru
controlul pachetului (FCtrl) și opțional poate cuprinde opțiuni pentru pachet (FOpts) până la 15 octeti
pentru diferite funcții MAC. Dacă FOpts este prezent acest câmp trebuie criptat.
Conținutul FCtrl pentru mesaje descendente:
7 6 5 4 [3…0]
ADR RFU ACK FPending FOptsLen
Tabel 5.2.2 Conținutul FCtrl pentru mesaje descendente
7 6 5 4 [3…0]
ADR ADRACKReq ACK Class B FoptsLen
Tabel 5.2.3 Conținutul FCtrl pentru mesaje ascendente
Antet explicit. În cazul antetului explicit prezența codului de detecție a erorilor la sfârșitul
sarcinii utile este selectat doar pe partea transmițătorului prin intermediul bitului RxPayloadCrcOn
pe care îl găsim în registrul RegModemConfig1.
Pe partea receptorului bitul RxPayloadCrcOn din registrul RegModemConfig1 nu este
utilizat. Odată ce pachetul a fost recepționat utilizatorul trebuie să verifice bitul CrcOnPayload aflat
în registrul RegHopChannel. Dacă bitul are valoarea 1 atunci utilizatorul trebuie să verifice fanionul
de întrerupere PayloadCrcError pentru a fi sigur că pachetul a fost primit fără erori.
Dacă bitul CrcOnPayload este setat cu valoarea 0 înseamnă că nu există cod de detective a erorilor și
astfel întreruperea dată de PayloadCrcError nu se declanșează chiar dacă pachetul conține erori.
33
Antet Explicit Transmițător Receptor Stare CRC
Tabel 5.3.1 Utilizarea CRC pentru diferite stări ale bitului RxPayloadCrcOn cazul antetului explicit
Antet implicit. În modul antet implicit este necesar să setați bitul RxPayloadCrcOn în registrul
RegModemConfig1 și pe transmițător și pe receptor.
Tabel 5.3.2 Utilizarea CRC pentru diferite stări ale bitului RxPayloadCrcOn cazul antetului implicit
34
6 Capitolul Măsurători
6.1 Măsurători ale performanțelor protocolului
35
Fig 6.1.2 Perioada semnalului pentru SF=12
36
Fig 6.1.3 Transmisie la distanța de 3 metrii
Folosind specificația standardului LoRa diferența între două nivele de putere adiacente ar
trebui să fie de 1 dBm, însă din primele măsurători rezultatul ar fi că acest lucru nu se respectă. Aceste
prime măsurători le-am făcut folosindu-mă de plăcuța de recepție care avea și opțiunea de a calcula
valoarea rssi a pachetului primit. Am repetat această măsurătoare datorită suspiciunii mari de erori
măsurate, rezultatele nerespectând standardul LoRa. Următoarele măsurători având același rezultat
am decis să fac o măsurătoare folosind un echipament dedicat Tektronix RSA306B. Am folosit
software Tek SignalVue și am comparat rezultatele raportate de plăcută cu rezultatele date de
analizorul spectral, pentru a vedea cât de corecte sunt măsurătorile realizate de plăcuțe. Pentru prima
măsurătoare am setat puterea de transmisie la valoarea maximă, valoarea teoretică ar fi trebuit să fie
14 dBm. Însă practic valoarea măsurată de receptorul LoRa era de -12 dBm, apoi am făcut o
măsurătoare cu analizorul spectral, și valoarea afișată era de -8 dBm, acesta este singurul caz în care
am legat analizorul direct la receptor în locul antenei. În cazul măsurătorii cu receptorul LoRa am
păstrat antenele la o distanță de 1 metru, antele fiind așezate fiecare pe câte un obiect metalic de
dimensiuni considerabile, în raport cu dimensiunea antenei.
Apoi am făcut măsurători pe teren pentru a vedea cât de bine se comportă transmisia în mediu
urban. Valori la care mă așteptăm pentru distanța de transmisie ar fi de aproximativ 2 km pentru
mediul urban. Posibil mai puțin în acest experiment, datorită folosirii unor transmițător/receptor cu o
performanță medie. Am dorit să analizez și influența factorului de împrăștiere asupra distanței de
transmisie. În cadrul acestei măsurători am folosit SF=7, această valoarea a factorului de împrăștiere
ne dă o rată a datelor de xxx b/s. Formula de calcul pentru rată biților în LoRa fiind ilustrată mai jos.
4
[4 + 𝐶𝑅 ]
𝑅𝑏 = 𝑆𝐹 ∗
2𝑆𝐹
[ ]
𝐵𝑊
În funcție de cerințele aplicației putem modifică parametrii CR, SF, BW. Pentru a obține rata
biților dorită dar și protecția necesară pentru a mari distanță la care se face transmisia. Valori posibile
ale variabilelor ecuației :SF=6,7,8,9,10,11,12; CR = 1,2,3,4; BW = 10.4, 15.6, 20.8, 31.25, 41.7, 62.5,
125, 250, 500 kHz. În cazul experimentului am încercat să obținem o rată cât mai bună a datelor așa
că am folosit următorii parametrii SF=7 ,BW=250 ,CR=1; în urma unui calcul simplu putem vedea
că rata datelor va fi egală cu b/s (rezultă o valoare de 10.681 kb/s). O valoare relativ mică pentru
aplicații care solicită transferuri mari de date dar o valoare suficientă pentru aplicații IoT, unde se
transmit date preluate de senzori și se comandă anumite actuatoare sau motorașe, care în mod obișnuit
nu necesită rate ale datelor foarte mari.
39
Dispozitivul fix a fost amplasat la etajul 7 al clădirii Leu A. Și măsurătorile s-au făcut în
următoarele puncte prezentate în figura 5.1.5. Iar cu dispozitivul mobil m-am deplasat în mai multe
locații pentru a obține raza de transmisie a chipului pentru valoarea cea mai bună a ratei datelor. Am
mărit distanță de unde am făcut transmisia până în momentul în care unul din 30 de pachete nu
conținea mesajul pe care l-am trimis. Acest lucru însemnând o probabilitate de primire a pachetelor
eronate de aproximativ 3.3 %. În figura 13 se poate vedea locurile în care s-au făcut măsurătorile, și
am atașat și grafice ale variației factorului rssi cu schimbarea SF.
Prima locație de unde am făcut măsutori a fost la metrou Politehnica după vis-a-vis de cladirea
IBM, apoi la benzinaria OMV. Rezultatele măsurătorilor sunt atașate în anexă în figurile
A2,A3,A4,A5. În funcție de rezultatele măsurătorilor pentru diferite distanțe am atașat o legendă unde
se poate vedea distanțele obținute pentru diferite valori ale SF pentru a obține o conexiune cu un nivel
de pierde al pachetelor de sub 3,3%. După ce am măsurat pentru SF = 7, au urmat măsurători pentru
SF = 10, SF = 12. Puterea de transmisie a fost setată din software la puterea maximă. Dispozitivul a
fost alimentat în timpul măsurătorilor de la o baterie externă de capacitate 4000 mAh s i a fost conectat
la portul care injectează curent de 2 mA. Puterea a fost suficientă din informațiile care le afișa
Raspberry pi, în schimb am avut probleme cu conectorul de la antena care introducea pierderi mari
de până la -30 dBm.Cu toate acestea am observat în timpul măsurătorilor că am reușit să primim
semnale care aveau factorul RSSI = -127 dBm, valoarea minimă specificată de producătorul Semtech
fiind de -147 dBm. Deci pentru un aparat extern sau o altă sursă de recepție externă, care urmărește
o lățime de bandă mai mare, acest mesaj LoRa va apărea ca scufundat în zgomot și nu se poate
vizualiza, nefiind cazul să fie decodat. Desigur că un receptor centrat pe această frecvența va putea
vizualiza mesajul. Dacă folosim criptare mesajul va putea fi vizualizat dar nu și înțeles, securitatea
transmisiei fiind un subiect de actualitate, mai ales în domeniul IoT.
40
7 Capitolul Implementare
7.1 Implementarea software
Datorită timpului scurt am folosit o librărie care implementează setarea regiștriilor plăcuței
sx127x, acestă librărie este scrisă în limbajul Node js. Pentru a implementa comunicația și a face
măsurători am folosit tot limbajul node js, fiind simplu de importat librăria și de făcut analiză
defectelor software. Desigur folosind acest limbaj am întâmpinat și destule probleme datorită naturii
limbajului node js, fiind defapt derivat din standardul ECMA script care este folosit și pentru
javascript. Codul sursă de node este interpretat de către motorul V8 creat de Google și care este
motorul browserului Chrome. Cel mai dificil pas este de a lucra cu node js pentru utilizarea plăcuței
deoarece node js utilizează pentru mărirea vitezei apelărilor de funcții asincrone. Mai precis pentru
operațiile costisitoare ca timp când sunt implicate și dispozitive periferice, putem face un apel
asincron, mai precis procesul de node nu se va bloca în așteptarea răspunsului de la dispozitivul
periferic în schimb el va memora o adresa de întoarcere, și va continuă execuția codului. Din acest
motiv trebuie să avem grijă la scrierea codului pentru a fi siguri că operația executată de plăcută a
fost dusă cu bine la sfârșit. Dacă nu reușim să ne asigurăm de asta riscăm să generăm situații
inexplicabile care sunt foarte greu de rezolvat și necesită verificarea conținutului regiștriilor.
Importarea implementării MAC disponibilă de git-hub:
Git clone: https://github.com/sandeepmistry/node-sx127x
Această comandă ne copiază codul sursă local pentru a putea face modificări sau a îl utiliza mai
departe.
pi@raspberrypi:~/node_modules $ ls -lrt
total 4
drwxr-xr-x 5 pi pi 4096 Jun 6 19:17 sx127x
In interiorul directorului:
pi@raspberrypi:~/node_modules/sx127x $ ls -lrt
total 36
-rw-r--r-- 1 pi pi 1071 Nov 12 2016 LICENSE
-rw-r--r-- 1 pi pi 42 Nov 12 2016 index.js
-rw-r--r-- 1 pi pi 1219 Nov 12 2016 README.md
-rw-r--r-- 1 pi pi 4339 Nov 12 2016 API.md
-rw-r--r-- 1 pi pi 1708 Jun 6 19:17 package.json
drwxr-xr-x 2 pi pi 4096 Jun 21 22:55 lib
drwxr-xr-x 7 pi pi 4096 Jun 26 22:04 node_modules
drwxr-xr-x 2 pi pi 4096 Jun 27 07:20 examples
41
În directorului lib avem implementarea modurilor de utilizare a transmițătorului LoRa de la
Semtech. Acesta va putea fi importat în orice fișier de tip .js dacă se știe calea acestuia. L-am importat
în index.js pentru a testa dacă funcționează. Am făcut câteva teste simple unde am transmis câteva
mesaje în care conținutul era reprezentat de “Hello” la care am adăugat numărul pachetului, pentru
aceste pachete am afișat parametrii măsurați de receptor: rssi și snr. Pentru a putea face schimb rapid
între modul de transmițător și receptor am adăugat event listener pe anumite combinații de butoane
pentru a funcționa în modul transmițător (CTRL + W) și modul receptor (CTRL + Q). Pentru a realiza
acest lucru am importat un pachet care se numește keypress:
pi@raspberrypi:~ $ npm install keypress
keypress@0.2.1 node_modules/keypress
Apoi am adăugat event listener pe combinațiile de taste specificate :
var keypress = require('keypress');
// folosim `process.stdin` pentru a emite evenimente la apăsarea tastelor
keypress(process.stdin);
// listen for the "keypress" event
process.stdin.on('keypress', function (ch, key) {
console.log('got "keypress"', key);
if (key && key.ctrl && key.name == 'c') {
// cod pentru transmițator || receptor
}
});
Dintre toate transmițătoarele folosite până acum, cele actuale având cel mai mic rssi .
Am transmis urmatoarele mesaje:
pi@raspberrypi:~/node_modules/sx127x/examples $ node p83.js
got "keypress" { name: 'w',
ctrl: true,
meta: false,
shift: false,
sequence: '\u0017' }
open success
write: hello 0
write: hello 1
write: hello 2
42
write: hello 3
write: hello 4
Am si logat tastele apăsate pentru a avea că întradevar corespund .
La recepție am primit următoarele date :
pi@raspberrypi:~$ node p83.js
got "keypress" { name: 'q',
ctrl: true,
meta: false,
shift: false,
sequence: '\u0011' }
open success
receive success
data: 'hello 0' rssi: -20 snr: 12.75
data: 'hello 1' rssi: -21 snr: 12.75
data: 'hello 2' rssi: -22 snr: 11.75
data: 'hello 3' rssi: -23 snr: 12.25
data: 'hello 4' rssi: -25 snr: 12.75
Aceste transmisii inițiale le-am făcut folosind următoarea configurație a parametrilor:
Lățime de bandă: 250 Khz
Putere de transmisie: 2
Factor de împrăștiere: 7 (rata chipurile / rata simbolurilor)
Frecvența: 443 Mhz
Utilizând valoarea 7 pentru factorul de împrastiere însemna că puteam obține cea mai bună rată a
datelor, dar aceasta având influență asupra distanței la care se putea desfașura transmisia.
In implementarea software am realizat deasemeni functia de schimbare a factorului de
imprastiere dinamic la cererea unei parti. Uzual acest lucru poate fi cerut de catre receptor daca
observa ca mesajele primite au parametrul rssi destul de mic si exista riscul de a pierde conexiunea.
Din acest motiv am facut si masuratorile de laborator, sa vad cat de bine interpreteaza receptorul
parametrul rssi pentru un mesaj primit. Dupa cum am spus mai sus, receptorul masoara cu o marja de
eroare destul de mica pentru un mesaj relativ puternic, analizorul spectral aratand o valoare de -8
dBm iar valoarea afisata de placuta era de -14 dBm. Pentru semnale cu valoarea intre -8 dBm si -30
dBm erorile raportate de receptor au avut valori intre -6 dBm si -12 dBm . Insa pentru valori mai mici
ale semnalului, sub -30 dBm valoarea erorilor se incadra intre -20 dBm si -40 dBm, erori foarte mari
43
care pot limita functionarea unui algoritm care sa faca schimbarea dinamica a parametrilor
comunicatiei .
Acest algoritm va adauga informatie in plus care trebuie transmisa si astfel consumand o parte
din simbolurile utile. Desigur ca aceasta implementare trebuie sa fie foarte bine optimizata pentru a
nu folosi multe resurse de calcul, cu toate ca majoritatea micro-computerelor prezente in ziua de astazi
au performante ridicate asta permitand programarea intr-un limbaj mai inalt care face posibili
adaugarea unor functionalitati greu de implementat folosind un limbaj mai apropiat de limbajul
masina. Pentru a usura munca in cazul masuratorilor a care am aratat influenta parametrului rssi
asupra distantei de transmisie, am elaborat un software prin care transmitatorul ii trimite receptorului
un mesaj care il determina sa isi schimbe factorul de imprastiere. In partea codului in care se apeleaza
functia care seteaza valoarea registrilor astfel incat placuta sa functioneze ca receptor, respectiv se
seteaza registrul RegOpMode bitii 0-2 cu valoarea 101, care inseamna ca placuta este setata pe modul
de receptie continua. Apoi in interiorul apelului acestei functii se insereaza in partea care verifica
continutul pachetului inca o verificare pentru un pachet predefinit.
La primirea acestui pachet se apeleaza functia de schimbare a factorului rssi. In cazul meu codul
arata asa :
sx127x.open(function(err) {
if (err) {
throw err;
if (data.toString() == '!_setsfp=10') {
sx127x.setSpreadingFactor(10, function(err) {
});
});
Apoi in cazul in care se pierdeau prea multe pachete trebuia implementata o functie de reset
a parametrilor care pot fi setati de utilizator. Aceasta se putea implementa automat cu un timeout, de
exemplu in cazul in care mesajele sunt programate sa se trimita la 30 de minute si nu se primeste un
mesaj, placuta sa isi reseteze valorile parametrilor de comunicatie la o valoare standard precizata de
programator. Aceasta implementare ar putea fi foarte nefericita din pricina ceasului care ar putea sa
difere foarte mult in timp de la un dispozitiv la altul si ar crea o stare haotica a intregii retele care ar
fi greu , daca nu imposibil de rezolvat. Asa ca cealalta varianta la care m-am gandit a fost aceea de a
transmite un mesaj care sa fie stiut si de receptor, in momentul primirii acestui mesaj standard
receptorul sa isi reseteze parametrii cu niste parametrii programati. Functia de reset trebuia sa acopere
44
toate valorile factorilor de imprastiere , si trebuia sa tina cont de natura asincrona a limbajului node
js, care la schimbari ale valorilor registrilor ar putea bloca prea multe incercari de scriere a registrilor
in acelasi timp ceea ce ar duce la o exceptie, programul oprindu-se. Pentru aceasta am implementat
un ceas care sa trimita mesajul o data la doua secunde folosind al factor de imprastiere ; problema de
aici fiind cu transmitatorul mesajului de reset care trebuie sa isi schimbe valoarea registrului
SpreadingFactor. Implementarea este atasata pentru a transmite mesajul cu doua valori ale factorului
de imprastiere , fiind similara pentru celelalte :
if (key && key.ctrl && key.name == 'r') {
sx127x.open(function(err) {
if (err) {
throw err;
function send2() {
if (rst === 1) {
sx127x.setSpreadingFactor(7, function(err) {
rst = rst + 1;
});
console.log('SEND');
});
if (rst === 0) {
sx127x.setSpreadingFactor(12, function(err) {
rst = rst + 1;
});
console.log('SEND');
});
}
45
}
});
Pentru a realiza o retea cu trei noduri am imprumutat inca doua transmitatoare LoRa si am setat o
retea ca in imaginea alaturata :
Scopul a fost pentru a reusi sa obtin o coliziune de pachete. Am transmis pachete numerotate
de la fiecare emitator , scopul era sa vad daca apar pierderi de pachete datorita coliziunii, pentru astfel
de distante mici fiind foarte greu sa am transmisia intrerupta de alti factori. Nereusind pana acum sa
obtin o pierdere de pachete de la aceasta distanta cu urmatoarele setari : SF=7, BW=250 kHz,
TxPower=17. Aceste masuratori le-am facut pastrand acesti parametrii pentru ca masuratorile sa aiba
coerenta. Software-ul pe care l-am scris pentru aceasta masuratoare primeste mesaje numerotate si se
opreste daca pierde un mesaj. Am atasat portiunea de software care este importanta ini acest caz.
Pentru a ilustra ca a avut loc o coliziune. Pentru a folosi cat mai multe pachete, am folosit ca
numerotare variabile cu valori intre 100 si 999. Considerand ca 899 de pachete este un numar suficient
de pachete pentru a beneficia de o congestie. Pentru celelalte doua transmitatoare codul este similar,
diferente doar la conventia pachetelor primite, si in ce variabila se pastreaza contorul care ne indica
numarul de pachete care s-au receptionat cu succes.
if (data.toString() == new RegExp(/t1:.../)) {
46
noOfMsg = data.toString.replace(/\D/g,'');
sx127x.close();
x=x+1;
});
Pentru a obține schimbarea ratei de transmisie a trebuit să folosesc parametru rssi primit de receptor.
În cazul în care ultimul rssi primit are valoare mai mică decât o valoare presetată anterior, în cazul
meu fiind de -80 dBm , atunci receptorul îi va comunica transmițătorului să iși modifice factorul de
împrăștiere cu unul trimis de el.
Diagrama stărilor prin care trece dispozitivul :
47
RegOpMode = 0x01//inițiază plăcuța in modul LoRa
While(true) // buclă infinită
If IRQ1==1// întrerupere ne arată că avem pachete de transmis
Then mem_buff[addr_send]=msg // copiem mesajul in care buffer-ul pentru transmisie
Send(mem_buff[addr_send]) //trimitem informația din buffer
Else // dacă nu avem informație de trimis
If IRQ2 == 1 // verificăm dacă avem pachete de primit
Rpi_memory = mem_buff[rssi] //dacă avem pachet copiem valoarea rssi in
memoria raspberry
If Rpi_memory < -80 //dacă valoarea rssi a pachetului
Then IRQ1 = 1 //atunci avem un pachet de trimis
mem_buff[addr_send] = SET_SF_12 // pachet pentru modificarea valorii SF
Send(mem_buff[addr_send]) //trimitem pachetul
48
Concluzii
Am văzut această lucrare de licență mai mult ca pe o încercare practică de a dobândi o inițiere in
domeniul IoT. Acum înțeleg defapt tehnicile care au favorizat dezvoltarea tehnologiei în această
direcție; o bună parte din avântul acestor tehnologii a fost folosirea modulațiilor de tip bandă îngustă
și de tip bandă largă care utilizează foarte puțină energie pentru a transmite cu ajutorul unor
microcalculatoare informații prelucrate de la diferiți senzori, sau comandă diferite motorașe. De
asemeni prețul scăzut al acestor echipamente și eficientă lor energetică vor duce în viitor la folosirea
pe scară mult mai largă a acestor echipamente, și o dată cu acest pas se va trece la o standardizare a
acestor tehnologii.
Prin încercarea de a implementa această funcție de rată a datelor dinamică mi-am dat seama de toate
problemele care pot apărea atunci când se trece de la gândirea proiectului la implementarea. Dacă in
partea de proiectare nu se iau în calcul toate variabilele si toate lucrurile care nu vor merge așa cum
era de așteptat, atunci proiectul va avea întârzieri mari sau îi va lipsi din funcționalitățile pe care
promitea să le aducă, având doar o parte din ele.
Măsurătorile făcute asupra semnalului LoRa nu au fost de la bun început în plan, ele au apărut ca
necesitate după ce în urma măsurătorilor rezultatele nu au fost cele așteptate. Așa că a fost nevoie de
depanare pentru a remedia lucrurile. Prima problemă a fost un pin introdus greșit, a doua problemă
am întâmpinat-o în momentul în care un dispozitiv nu mai transmitea cu toate că totul arăta bine. A
trebuit să vizionăm pe analizorul de spectru cum arată semnalul trimis de către acest dispozitiv, și
întradevăr acesta nu arăta ca un semnal LoRa, nu am reușit să surprindem la acest semnale fenomenul
de creștere a frecvenței de transmisie, aceasta fiind o caracteristică a semnalelor LoRa. Dacă tot am
reușit să obținem acel analizor de spectru am făcut mai multe măsurători prin care am realizat
pierderile mari introduse de conectorii care fac legătura între antenă si dispozitiv.
49
50
Bibliografie
[1] SX1276/77/78/79 - 137 MHz to 1020 MHz Low Power Long Range Transceiver, Rev. 5 - August
2016 , Semtech Corporation
[2] AN1200.22 - LoRa™ Modulation Basics , Revision 2, May 2015, Semtech Corporation
[3] https://www.raspberrypi.org/documentation/usage/gpio/README.md
[4] https://nodejs.org/en/docs/guides/
51
ANEXE
52
Fig A.3 Transmisie efectuata la baza militare de pe Iuliu Maniu
Metrou Politehnica
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
-20
-40
-60
RSSI
-80
-100
-120
-140
Numărul pachetului
Transmisia 1 Transmisia 2 Transmisia 3 Transmisia 4
Transmisia 5 Transmisia 6 Transmisia 7
53
IBM (Iuliu Maniu)
-100
1 2 3 4 5 6 7 8 9 101112131415161718192021222324252627282930313233343536373839
-105
-110
RSSI
-115
-120
-125
Numărul pachetului
Transmisia 1 Transmisia 2 Transmisia 3 Transmisia 4
Transmisia 5 Transmisia 6 Transmisia 7 Transmisia 8
-110
-112
-114
RSSI
-116
-118
-120
-122
-124
Numărul pachetului
Transmisia 1 Transmisia 2
54
-102
1 2 3 4 5 6 7 8 9 101112131415161718192021222324252627282930313233343536
-104
-106
-108
-110
-112
RSSI
-114
-116
-118
-120
-122
-124
Numărul pachetului
Transmisia 1 Transmisia 2 Transmisia 3 Transmisia 4
Codul sursă :
var SX127x = require('../index'); // or require('sx127x')
var keypress = require('keypress');
var sx127x = new SX127x({
frequency: 433e6,
signalBandwidth: 250e3,
txPower: 17,
spreadingFactor: 12, //un simbol il scriu pe 12 chip-uri !!!
});
var t = 0;
var count = 0;
var cntlimit = 0;
var txPow = 17;
var rst = 0;
var stop = 7;
keypress(process.stdin);
process.stdin.on('keypress', function(ch, key) {
console.log('got "keypress"', key);
//setare implicita
if (key && key.ctrl && key.name == 'q') {
sx127x.open(function(err) {
console.log('open', err ? err : 'success');
if (err) {
throw err;
}
sx127x.on('data', function(data, rssi, snr) {
console.log('data:', '\'' + data.toString() + '\'', rssi, ' ', snr);
if (data.toString() == 'hello 5') {
sx127x.setSpreadingFactor(11, function(err) {
55
console.log('SF : 11 ', err ? err : 'success');
});
}
if (data.toString() == 'hello 10') {
sx127x.setSpreadingFactor(10, function(err) {
console.log('SF : 10 ', err ? err : 'success');
});
}
if (data.toString() == 'hello 15') {
sx127x.setSpreadingFactor(9, function(err) {
console.log('SF : 9 ', err ? err : 'success');
});
}
if (data.toString() == 'hello 20') {
sx127x.setSpreadingFactor(8, function(err) {
console.log('SF : 8 ', err ? err : 'success');
});
}
if (data.toString() == 'hello 25') {
sx127x.setSpreadingFactor(7, function(err) {
console.log('SF : 7 ', err ? err : 'success');
});
}
if (data.toString() == 'RESET') {
sx127x.setSpreadingFactor(12, function(err) {
console.log('RESET !! SF : 12 ', err ? err : 'success');
});
}
});
// enable receive mode
sx127x.receive(function(err) {
console.log('receive', err ? err : 'success');
});
});
}
//setarea numarul do
if (key && key.ctrl && key.name == 'w') {
sx127x.open(function(err) {
console.log('open', err ? err : 'success');
if (err) {
throw err;
}
cntlimit = count;
function send1() {
console.log('write: hello ' + count);
sx127x.write(new Buffer('hello ' + count++), function(err) {
console.log('\t', err ? err : 'success');
});
if (cntlimit + 5 === count) {
56
clearInterval(t);
}
if (count == 8) {
sx127x.setSpreadingFactor(11, function(err) {
console.log('SF : 11 ', err ? err : 'success');
});
}
if (count == 13) {
sx127x.setSpreadingFactor(10, function(err) {
console.log('SF : 10 ', err ? err : 'success');
});
}
if (count == 18) {
sx127x.setSpreadingFactor(9, function(err) {
console.log('SF : 9 ', err ? err : 'success');
});
}
if (count == 23) {
sx127x.setSpreadingFactor(8, function(err) {
console.log('SF : 8 ', err ? err : 'success');
});
}
if (count == 28) {
sx127x.setSpreadingFactor(7, function(err) {
console.log('SF : 7 ', err ? err : 'success');
});
}
}
var t = setInterval(send1, 1500);
});
}
if (key && key.ctrl && key.name == 'p') {
if (count < 9) {
t = 5;
}
if (count >= 9 && count <= 12) {
t = 10;
}
if (count >= 13 && count <= 18) {
t = 15;
}
if (count >= 19 && count <= 23) {
t = 20;
}
if (count >= 24 && count <= 28) {
t = 25;
}
sx127x.open(function(err) {
console.log('open', err ? err : 'success');
57
if (err) {
throw err;
}
console.log('write: hello ' + count);
sx127x.write(new Buffer('hello ' + t), function(err) {
console.log('\t', err ? err : 'success');
});
});
}
//partea de oprire
if (key && key.ctrl && key.name == 'd') {
// close the device
sx127x.close(function(err) {
console.log('close', err ? err : 'success');
});
}
if (key && key.ctrl && key.name == 'n') {
txPow = txPow - 1;
sx127x.setTxPower(txPow, function(err) {
console.log('TxPow', err ? err : txPow)
});
}
if (key && key.ctrl && key.name == 'b') {
txPow = txPow + 1;
sx127x.setTxPower(txPow, function(err)
console.log('TxPow', err ? err : txPow)
});
}
if (key && key.ctrl && key.name == 't') {
count = 0;
sx127x.setSpreadingFactor(12, function(err) {
console.log('RESET !!! SF : 12 ', err ? err : 'success');
});
}
// RESET !!
if (key && key.ctrl && key.name == 'r') {
sx127x.open(function(err) {
console.log('open', err ? err : 'success');
if (err) {
throw err;
}
function send2() {
if (rst === 6) {
sx127x.setSpreadingFactor(12, function(err) {
console.log('RESET SF : 12 ', err ? err : 'success');
rst = rst + 1;
});
sx127x.write(new Buffer('RESET'), function(err) {
console.log('\t', err ? err : 'success');
58
console.log('SEND');
});
}
if (rst === stop) {
clearInterval(t1);
rst = 0;
count = 0;
}
if (rst === 5) {
sx127x.setSpreadingFactor(11, function(err) {
console.log('RESET SF : 11 ', err ? err : 'success');
rst = rst + 1;
});
sx127x.write(new Buffer('RESET'), function(err) {
console.log('\t', err ? err : 'success');
console.log('SEND');
});
}
if (rst === 4) {
sx127x.setSpreadingFactor(10, function(err) {
console.log('RESET SF : 10 ', err ? err : 'success');
rst = rst + 1;
});
sx127x.write(new Buffer('RESET'), function(err) {
console.log('\t', err ? err : 'success');
console.log('SEND');
});
}
if (rst === 3) {
sx127x.setSpreadingFactor(9, function(err) {
console.log('RESET SF : 9 ', err ? err : 'success');
rst = rst + 1;
});
sx127x.write(new Buffer('RESET'), function(err) {
console.log('\t', err ? err : 'success');
console.log('SEND');
});
}
if (rst === 2) {
sx127x.setSpreadingFactor(8, function(err) {
console.log('RESET SF : 8 ', err ? err : 'success');
rst = rst + 1;
});
sx127x.write(new Buffer('RESET'), function(err) {
console.log('\t', err ? err : 'success');
console.log('SEND');
});
}
if (rst === 1) {
59
sx127x.setSpreadingFactor(7, function(err) {
console.log('RESET SF : 8 ', err ? err : 'success');
rst = rst + 1;
});
sx127x.write(new Buffer('RESET'), function(err) {
console.log('\t', err ? err : 'success');
console.log('SEND');
});
}
if (rst === 0) {
sx127x.setSpreadingFactor(12, function(err) {
console.log('RESET SF : 12 ', err ? err : 'success');
rst = rst + 1;
});
sx127x.write(new Buffer('RESET'), function(err) {
console.log('\t', err ? err : 'success');
console.log('SEND');
});
}
}
var t1 = setInterval(send2, 2000);
});
}
if (key && key.ctrl && key.name == 'u') {
console.log('TxPow ! :', sx127x._txPower);
console.log('SF ! :', sx127x._spreadingFactor);
}
});
process.stdin.setRawMode(true);
process.stdin.resume();
60