Wiki source code of Point to Point Communication of LT-22222-L
Show last authors
author | version | line-number | content |
---|---|---|---|
1 | {{box cssClass="floatinginfobox" title="**Contents**"}} | ||
2 | {{toc/}} | ||
3 | {{/box}} | ||
4 | |||
5 | = **1. Overview** = | ||
6 | |||
7 | ((( | ||
8 | Shipped LT-22222-L is base on LoRaWAN protocol. We also develop a open source Point to Point LoRa protocol for LT-22222-L. The source code and hex file can be found at: | ||
9 | ))) | ||
10 | |||
11 | ((( | ||
12 | [[Point to Point Software for LT-22222-L>>https://github.com/dragino/LT-22222-L]]. | ||
13 | ))) | ||
14 | |||
15 | == == | ||
16 | |||
17 | = **2. Features for this firmware** = | ||
18 | |||
19 | |||
20 | == **2.1 Point To Point** == | ||
21 | |||
22 | |||
23 | [[image:image-20220602111219-1.png||height="472" width="972"]] | ||
24 | |||
25 | |||
26 | (% class="wikigeneratedid" id="H2.2.Configure" %) | ||
27 | (% style="color:blue" %)**Configure:** | ||
28 | |||
29 | (% border="1" style="background-color:#f7faff; color:black; width:500px" %) | ||
30 | |=**A's configuration**|=**B's configuration** | ||
31 | |AT+GROUPMOD=0|AT+GROUPMOD=0 | ||
32 | |AT+TXCHS=868700000|AT+TXCHS=869000000 | ||
33 | |AT+RXCHS=869000000|AT+RXCHS=868700000 | ||
34 | |AT+TRIG1=2,50|AT+TRIG1=2,50 | ||
35 | |AT+TRIG2=2,50|AT+TRIG2=2,50 | ||
36 | |AT+DI1TODO1=2|AT+DI1TODO1=2 | ||
37 | |AT+DI1TORO1=2|AT+DI1TORO1=2 | ||
38 | |AT+DI2TODO2=2 |AT+DI2TODO2=2 | ||
39 | |AT+DI2TORO2=2|AT+DI2TORO2=2 | ||
40 | |||
41 | == **2.2 Point To Mult-Point ** == | ||
42 | |||
43 | |||
44 | [[image:image-20220602111219-2.png]] | ||
45 | |||
46 | |||
47 | [[image:image-20220602111219-3.png]] | ||
48 | |||
49 | ((( | ||
50 | If the sender does not get the ACK reply from the receiver, it will retransmit up to 4 times, each interval is 6 seconds, and the UplinkCounter of the retransmission will not increase. | ||
51 | ))) | ||
52 | |||
53 | |||
54 | == **2.3 AT command** == | ||
55 | |||
56 | |||
57 | ((( | ||
58 | (% style="color:#037691" %)**ATZ** (%%)**: ** Trig a reset of the MCU | ||
59 | ))) | ||
60 | |||
61 | ((( | ||
62 | (% style="color:#037691" %)**AT+FDR** (%%)**:** Reset Parameters to Factory Default, Keys Reserve | ||
63 | ))) | ||
64 | |||
65 | ((( | ||
66 | (% style="color:#037691" %)**AT+FCU** (%%)**:** Get or Set the Frame Counter Uplink | ||
67 | ))) | ||
68 | |||
69 | ((( | ||
70 | (% style="color:#037691" %)**AT+FCD** (%%)**:** Get or Set the Frame Counter Downlink | ||
71 | ))) | ||
72 | |||
73 | ((( | ||
74 | (% style="color:#037691" %)**AT+TXP** (%%)**:** Get or Set the transmit power, the maximum is 20dBm (default is 14dBm) | ||
75 | ))) | ||
76 | |||
77 | ((( | ||
78 | (% style="color:#037691" %)**AT+SYNC** (%%)**:** Get or Set the Sync word [1:0x34,0:0x12] (default is 1) | ||
79 | ))) | ||
80 | |||
81 | ((( | ||
82 | (% style="color:#037691" %)**AT+PMB** (%%)**: **Get or Set the preamble (default:8) | ||
83 | ))) | ||
84 | |||
85 | ((( | ||
86 | (% style="color:#037691" %)**AT+TXCHS **(%%)**:** Get or Set the transmit frequency of TX (default:868700000) | ||
87 | ))) | ||
88 | |||
89 | ((( | ||
90 | (% style="color:#037691" %)**AT+TXSF **(%%)**:** Get or Set the spreading factor of TX (7 to 12) (default:12) | ||
91 | ))) | ||
92 | |||
93 | ((( | ||
94 | (% style="color:#037691" %)**AT+RXCHS **(%%)**:** Get or Set the transmit frequency of RX (default:869000000) | ||
95 | ))) | ||
96 | |||
97 | ((( | ||
98 | (% style="color:#037691" %)**AT+RXSF **(%%)**:** Get or Set the spreading factor of RX (7 to 12) (default:12) | ||
99 | ))) | ||
100 | |||
101 | ((( | ||
102 | (% style="color:#037691" %)**AT+BW **(%%)**: **Get or Set the bandwidth [0:125khz,1:250khz,2:500khz] (default:0) | ||
103 | ))) | ||
104 | |||
105 | ((( | ||
106 | (% style="color:#037691" %)**AT+CR **(%%)**: **Get or Set the coding rate [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] (default:1) | ||
107 | ))) | ||
108 | |||
109 | ((( | ||
110 | (% style="color:#037691" %)**AT+TDC **(%%)**:** Get or set the application data transmission interval in ms(default 10 minutes) | ||
111 | ))) | ||
112 | |||
113 | ((( | ||
114 | (% style="color:#037691" %)**AT+VER **(%%)**:** Get firmware version number | ||
115 | ))) | ||
116 | |||
117 | ((( | ||
118 | (% style="color:#037691" %)**AT+SEND **(%%)**: **Set Custom sent hex data | ||
119 | ))) | ||
120 | |||
121 | ((( | ||
122 | (% style="color:#037691" %)**AT+GROUPMOD **(%%)**: **Set or Get the grouping mode of the device (default: 0) | ||
123 | ))) | ||
124 | |||
125 | ((( | ||
126 | ((( | ||
127 | (% style="color:#037691" %)**AT+GROUPID **(%%)**: **Set or Get the password for matching between TX group and RX group, which can be composed of numbers or characters (default: 12345678) | ||
128 | ))) | ||
129 | ))) | ||
130 | |||
131 | ((( | ||
132 | (% style="color:#037691" %)**AT+TRIG1 **(%%)**:** Set or Get the DI1 pin interrupt trigger mode (default 0,0) | ||
133 | ))) | ||
134 | |||
135 | ((( | ||
136 | (% style="color:#037691" %)**AT+TRIG2 **(%%)**: **Set or Get the DI2 pin interrupt trigger mode (default 0,0) | ||
137 | ))) | ||
138 | |||
139 | ((( | ||
140 | (% style="color:#037691" %)**AT+DI1TODO1 **(%%)**: **Set or get the mode in which DI1 maps to DO1 (default 0) | ||
141 | ))) | ||
142 | |||
143 | ((( | ||
144 | (% style="color:#037691" %)**AT+DI1TORO1 **(%%)**: **Set or get the mode in which DI1 maps to RO1(default 0) | ||
145 | ))) | ||
146 | |||
147 | ((( | ||
148 | (% style="color:#037691" %)**AT+DI2TODO2 **(%%)**:** Set or get the mode in which DI2 maps to DO2(default 0) | ||
149 | ))) | ||
150 | |||
151 | ((( | ||
152 | (% style="color:#037691" %)**AT+DI2TORO2 **(%%)**: **Set or get the mode in which DI2 maps to RO2(default 0) | ||
153 | ))) | ||
154 | |||
155 | ((( | ||
156 | |||
157 | ))) | ||
158 | |||
159 | ((( | ||
160 | |||
161 | ))) | ||
162 | |||
163 | ((( | ||
164 | (% style="color:#4f81bd" %)**Example 1:** | ||
165 | ))) | ||
166 | |||
167 | ((( | ||
168 | **AT+SEND=01020304 **will send a payload of 01020304 | ||
169 | ))) | ||
170 | |||
171 | ((( | ||
172 | |||
173 | ))) | ||
174 | |||
175 | ((( | ||
176 | (% style="color:#4f81bd" %)**Example 2: ** | ||
177 | ))) | ||
178 | |||
179 | ((( | ||
180 | **AT+TRIGx=a **Trigger directly without triggering time | ||
181 | ))) | ||
182 | |||
183 | ((( | ||
184 | **AT+TRIGx=a,b** | ||
185 | ))) | ||
186 | |||
187 | ((( | ||
188 | a=0: falling edge; | ||
189 | ))) | ||
190 | |||
191 | ((( | ||
192 | a=1: rising edge; | ||
193 | ))) | ||
194 | |||
195 | ((( | ||
196 | a=2: falling edge or rising edge; | ||
197 | ))) | ||
198 | |||
199 | ((( | ||
200 | b: triggering time in milliseconds. | ||
201 | ))) | ||
202 | |||
203 | ((( | ||
204 | AT+TRIGx=2,50 Falling edge or rising edge trigger, and the trigger time exceeds 50ms. | ||
205 | ))) | ||
206 | |||
207 | ((( | ||
208 | |||
209 | ))) | ||
210 | |||
211 | ((( | ||
212 | (% style="color:#4f81bd" %)**Example 3: ** | ||
213 | ))) | ||
214 | |||
215 | ((( | ||
216 | **AT+DI1TODO1= maps value** | ||
217 | ))) | ||
218 | |||
219 | ((( | ||
220 | **AT+DI1TORO1= maps value** | ||
221 | ))) | ||
222 | |||
223 | ((( | ||
224 | **AT+DI2TODO2= maps value** | ||
225 | ))) | ||
226 | |||
227 | ((( | ||
228 | **AT+DI2TORO2= maps value** | ||
229 | ))) | ||
230 | |||
231 | ((( | ||
232 | |||
233 | ))) | ||
234 | |||
235 | (% border="1" style="background-color:#f7faff; color:black; width:706px" %) | ||
236 | |=(% style="width: 102px;" %)((( | ||
237 | Maps value | ||
238 | )))|=(% style="width: 331px;" %)((( | ||
239 | DIx to DOx | ||
240 | )))|=(% style="width: 268px;" %)((( | ||
241 | DIx to ROx | ||
242 | ))) | ||
243 | |(% style="width:102px" %)((( | ||
244 | 0 | ||
245 | )))|(% style="width:331px" %)((( | ||
246 | No Action | ||
247 | )))|(% style="width:268px" %)((( | ||
248 | No Action | ||
249 | ))) | ||
250 | |(% style="width:102px" %)((( | ||
251 | 1 | ||
252 | )))|(% style="width:331px" %)((( | ||
253 | If DIx is high, control DOx to output low level, If DIx is low, control DOx to output high level | ||
254 | )))|(% style="width:268px" %)((( | ||
255 | ((( | ||
256 | If DIx is high, control ROx to close, | ||
257 | ))) | ||
258 | |||
259 | ((( | ||
260 | if DIx is low, control ROx to open | ||
261 | ))) | ||
262 | ))) | ||
263 | |(% style="width:102px" %)((( | ||
264 | 2 | ||
265 | )))|(% style="width:331px" %)((( | ||
266 | If DIx is high, control DOx to output high level, If DIx is low, control DOx to output low level | ||
267 | )))|(% style="width:268px" %)((( | ||
268 | ((( | ||
269 | If DIx is high, control ROx to open, | ||
270 | ))) | ||
271 | |||
272 | ((( | ||
273 | if DIx is low, control ROx to close | ||
274 | ))) | ||
275 | ))) | ||
276 | |(% style="width:102px" %)((( | ||
277 | 3 | ||
278 | )))|(% style="width:331px" %)((( | ||
279 | DOx state flip | ||
280 | )))|(% style="width:268px" %)((( | ||
281 | ROx state flip | ||
282 | ))) | ||
283 | |||
284 | ((( | ||
285 | (% style="color:#4f81bd" %)**Example 4: ** | ||
286 | ))) | ||
287 | |||
288 | ((( | ||
289 | **AT+GROUPMOD=0** Set to point to point mode | ||
290 | ))) | ||
291 | |||
292 | ((( | ||
293 | **AT+GROUPMOD=0,aa** Set the TX group that controls the number of aa (The maximum value of aa is 8) | ||
294 | ))) | ||
295 | |||
296 | ((( | ||
297 | ((( | ||
298 | **AT+GROUPMOD=1,bb** Set to the RX group controlled by the TX group, numbered bb(The maximum value of aa is 8) | ||
299 | ))) | ||
300 | ))) | ||
301 | |||
302 | ((( | ||
303 | **AT+GROUPMOD=0,2** Set to control the TX group of the two RX groups | ||
304 | ))) | ||
305 | |||
306 | ((( | ||
307 | **AT+GROUPMOD=1,1** Set the RX group numbered 1 | ||
308 | ))) | ||
309 | |||
310 | ((( | ||
311 | **AT+GROUPMOD=1,2** Set the RX group numbered 2 | ||
312 | ))) | ||
313 | |||
314 | |||
315 | == **2.4 Data Format** == | ||
316 | |||
317 | ((( | ||
318 | 8 bytes of GROUPID + 9 bytes of payload + 4 bytes of checksum | ||
319 | ))) | ||
320 | |||
321 | ((( | ||
322 | |||
323 | ))) | ||
324 | |||
325 | ((( | ||
326 | (% style="color:#4f81bd" %)**Payload:** | ||
327 | ))) | ||
328 | |||
329 | (% border="1" style="background-color:#f7faff; color:black; width:938px" %) | ||
330 | |=(% style="width: 123px;" %)((( | ||
331 | **Size (bytes)** | ||
332 | )))|=(% style="width: 107px;" %)((( | ||
333 | 1 | ||
334 | )))|=(% style="width: 107px;" %)((( | ||
335 | 1 | ||
336 | )))|=(% style="width: 107px;" %)((( | ||
337 | 1 | ||
338 | )))|=(% style="width: 107px;" %)((( | ||
339 | 1 | ||
340 | )))|=(% style="width: 107px;" %)((( | ||
341 | 1 | ||
342 | )))|=(% style="width: 107px;" %)((( | ||
343 | 1 | ||
344 | )))|=(% style="width: 107px;" %)((( | ||
345 | 1 | ||
346 | )))|=(% style="width: 107px;" %)((( | ||
347 | 1 | ||
348 | )))|=(% style="width: 107px;" %)((( | ||
349 | 1 | ||
350 | ))) | ||
351 | |(% style="width:123px" %)((( | ||
352 | **Value** | ||
353 | )))|(% style="width:38px" %)((( | ||
354 | address | ||
355 | )))|(% style="width:70px" %)((( | ||
356 | request | ||
357 | )))|(% style="width:52px" %)((( | ||
358 | ACK | ||
359 | )))|(% style="width:127px" %)((( | ||
360 | ((( | ||
361 | DI1& | ||
362 | ))) | ||
363 | |||
364 | ((( | ||
365 | DI1 level | ||
366 | ))) | ||
367 | )))|(% style="width:101px" %)((( | ||
368 | DI1TODO1 | ||
369 | )))|(% style="width:91px" %)((( | ||
370 | DI1TORO1 | ||
371 | )))|(% style="width:111px" %)((( | ||
372 | ((( | ||
373 | DI2& | ||
374 | ))) | ||
375 | |||
376 | ((( | ||
377 | DI2 level | ||
378 | ))) | ||
379 | )))|(% style="width:105px" %)((( | ||
380 | DI2TODO2 | ||
381 | )))|(% style="width:106px" %)((( | ||
382 | DI2TORO2 | ||
383 | ))) | ||
384 | |||
385 | ((( | ||
386 | (% style="color:#037691" %)**The first byte**(%%)**:** 00 is the broadcast address, 01-08 is the RX group number. | ||
387 | ))) | ||
388 | |||
389 | ((( | ||
390 | (% style="color:#037691" %)**The second byte**(%%)**:** send mapping request when not 0, not request when it is 0. | ||
391 | ))) | ||
392 | |||
393 | ((( | ||
394 | (% style="color:#037691" %)**The third byte**(%%)**:** ACK returned to the sender after the mapping is completed. | ||
395 | ))) | ||
396 | |||
397 | ((( | ||
398 | ((( | ||
399 | (% style="color:#037691" %)**The fourth byte**(%%)**:** the high four bits are 1 to represent DI1, and the low four bits are the level of DI1 when the interrupt is triggered. | ||
400 | ))) | ||
401 | ))) | ||
402 | |||
403 | ((( | ||
404 | (% style="color:#037691" %)**The Fifth byte**(%%)**: **DI1TODO1 when the interrupt is triggered, 0 when the interrupt is not triggered. | ||
405 | ))) | ||
406 | |||
407 | ((( | ||
408 | (% style="color:#037691" %)**The Sixth byte**(%%)**:** 0 does not trigger interrupt when DI1TORO1 interrupt is triggered. | ||
409 | ))) | ||
410 | |||
411 | ((( | ||
412 | ((( | ||
413 | (% style="color:#037691" %)**The seventh byte**(%%)**:** the high four bits are 2 to represent DI2, and the low four bits are the level of DI2 when the interrupt is triggered. | ||
414 | ))) | ||
415 | ))) | ||
416 | |||
417 | ((( | ||
418 | (% style="color:#037691" %)**The 8th byte**(%%)**: **DI2TODO2 when the interrupt is triggered, 0 when the interrupt is not triggered. | ||
419 | ))) | ||
420 | |||
421 | ((( | ||
422 | (% style="color:#037691" %)**The 9th byte**(%%)**:** DI2TORO2 when an interrupt is triggered, 0 when an interrupt is not triggered. | ||
423 | ))) | ||
424 | |||
425 |