-
Notifications
You must be signed in to change notification settings - Fork 0
/
LoRaHelper.h
165 lines (150 loc) · 4.81 KB
/
LoRaHelper.h
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
int16_t encryptCBC(uint8_t* myBuf, uint8_t olen, uint8_t* pKey, uint8_t* Iv);
int16_t decryptCBC(uint8_t* myBuf, uint8_t olen, uint8_t* pKey, uint8_t* Iv);
void fillRandom(uint8_t* x, size_t len);
void hexDump(uint8_t* buf, uint16_t len);
#define RegFrfMsb 0x06
#define RegFrfMid 0x07
#define RegFrfLsb 0x08
#define REG_LNA 0x0c
#define REG_MODEM_CONFIG_1 0x1d
#define REG_MODEM_CONFIG_2 0x1e
#define REG_MODEM_CONFIG_3 0x26
// Uncomment the next line if you want the code
// to check settings after changing them
#define TRUST_BUT_VERIFY 1
uint32_t myFreq = 470e6, apFreq = 0, lastPing = 0;
uint16_t sf = 12;
uint16_t bw = 7;
uint16_t cr = 5;
uint16_t preamble = 8;
uint16_t txPower = 20;
float myBWs[10] = {7.8, 10.4, 15.63, 20.83, 31.25, 41.67, 62.5, 125, 250, 500};
bool needAES = false;
bool needJSON = false;
uint8_t myPWD[16] = {0};
uint8_t myIV[16] = {0};
char myName[32] = {0};
uint8_t encBuf[256];
char msg[128]; // general-use buffer
void listenMode() {
pinMode(RADIO_RF_CRX_RX, OUTPUT);
digitalWrite(RADIO_RF_CRX_RX, HIGH); // set LoRa to receive
pinMode(RADIO_RF_CTX_PA, OUTPUT);
digitalWrite(RADIO_RF_CTX_PA, LOW);
LoRa.writeRegister(REG_LNA, 0x23); // TURN ON LNA FOR RECEIVE
LoRa.receive();
}
void sendMode() {
pinMode(RADIO_RF_CRX_RX, OUTPUT);
digitalWrite(RADIO_RF_CRX_RX, LOW); // set LoRa to send
pinMode(RADIO_RF_CTX_PA, OUTPUT);
digitalWrite(RADIO_RF_CTX_PA, HIGH); // control LoRa by PA_BOOST
LoRa.writeRegister(REG_LNA, 00); // TURN OFF LNA FOR TRANSMIT
}
void onReceive(int packetSize) {
// received a packet
if (!needAES) {
Serial.print("Received packet '");
// read packet
for (int i = 0; i < packetSize; i++) {
Serial.print((char)LoRa.read());
}
// print RSSI of packet
Serial.print("' with RSSI ");
Serial.print(LoRa.packetRssi());
Serial.print(", and SNR ");
Serial.println(LoRa.packetSnr());
} else {
for (int i = 0; i < packetSize; i++) {
encBuf[i] = (uint8_t)LoRa.read();
}
Serial.print("Received packet, size: "); Serial.print(packetSize);
Serial.print(" with RSSI ");
Serial.print(LoRa.packetRssi());
Serial.print(", and SNR ");
Serial.println(LoRa.packetSnr());
hexDump(encBuf, packetSize);
if (packetSize < 32) {
Serial.println("Size is too small for a properly formatted packet!");
return;
}
memcpy(myIV, encBuf, 16);
uint16_t olen = packetSize - 16;
memcpy((uint8_t*)msg, encBuf + 16, olen);
decryptCBC((uint8_t*)msg, olen, myPWD, myIV);
uint8_t x = encBuf[olen - 1];
encBuf[olen - x] = 0;
Serial.println((char*)encBuf);
}
LoRa.receive();
}
void checkFreq() {
unsigned char f0 = LoRa.readRegister(RegFrfLsb);
unsigned char f1 = LoRa.readRegister(RegFrfMid);
unsigned char f2 = LoRa.readRegister(RegFrfMsb);
unsigned long lfreq = f2; lfreq = (lfreq << 8) + f1; lfreq = (lfreq << 8) + f0;
float newFreq = (lfreq * 61.035) / 1e6;
Serial.print(" - Frequency: " + String((float)newFreq, 3) + " MHz");
Serial.print(F(" ---> "));
if ((myFreq / 1e6) - newFreq < 1.0) {
Serial.println(F("All good..."));
Serial.println(" Frequency calculation is slightly imprecise...");
} else Serial.println(F("Uh oh... Not a match!"));
}
void checkBW() {
uint8_t vv = LoRa.readRegister(REG_MODEM_CONFIG_1);
uint8_t x = vv >> 4;
Serial.print(" . BW: " + String(x) + " [" + String((float)myBWs[x], 3) + " KHz]");
Serial.print(F(" ---> "));
if (bw == x) Serial.println(F("All good..."));
else Serial.println(F("Uh oh... Not a match!"));
}
void checkSF() {
uint8_t vv = LoRa.readRegister(REG_MODEM_CONFIG_2);
uint8_t x = vv >> 4;
Serial.print(" . SF: " + String(x));
Serial.print(F(" ---> "));
if (sf == x) Serial.println(F("All good..."));
else Serial.println(F("Uh oh... Not a match!"));
}
void checkCR() {
uint8_t vv = LoRa.readRegister(REG_MODEM_CONFIG_1);
uint8_t x = ((vv & 0b00001110) >> 1) + 4;
Serial.print(" . CR: 4/" + String(x));
Serial.print(F(" ---> "));
if (cr == x) Serial.println(F("All good..."));
else Serial.println(F("Uh oh... Not a match!"));
}
bool checkPWD() {
uint8_t xCount = 0;
for (uint8_t i = 0; i < 16; i++) xCount += myPWD[i];
needAES = (xCount != 0);
return (xCount != 0);
}
void hex2array(char *src, uint8_t *dst, size_t sLen) {
size_t i, n = 0;
for (i = 0; i < sLen; i += 2) {
uint8_t x, c;
c = src[i] - 48;
if (c > 9) c -= 55;
x = c << 4;
c = src[i + 1] - 48;
if (c > 9) c -= 55;
dst[n++] = (x + c);
}
}
void array2hex(uint8_t *buf, size_t sLen, char *x) {
size_t i, len, n = 0;
const char *hex = "0123456789abcdef";
for (i = 0; i < sLen; ++i) {
x[n++] = hex[(buf[i] >> 4) & 0xF];
x[n++] = hex[buf[i] & 0xF];
}
x[n++] = 0;
}
void writeRegister(uint8_t reg, uint8_t value) {
LoRa.writeRegister(reg, value);
}
uint8_t readRegister(uint8_t reg) {
return LoRa.readRegister(reg);
}