mirror of
https://github.com/lupyuen/lupyuen.github.io.git
synced 2025-01-13 12:38:31 +08:00
Commit from GitHub Actions
This commit is contained in:
parent
cd4fa09383
commit
ff31c5ca1f
1 changed files with 127 additions and 130 deletions
|
@ -238,80 +238,139 @@ git submodule add --branch nuttx https://github.com/lupyuen/lora-sx1262 libsx126
|
|||
</li>
|
||||
</ol>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-title2.jpg" alt="PineDio Stack BL604 RISC-V Board (left) talking LoRaWAN to RAKwireless WisGate LoRaWAN Gateway (right)" /></p>
|
||||
<p>TODO1</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-build.png" alt="" /></p>
|
||||
<p>TODO2</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-build2.png" alt="" /></p>
|
||||
<p>TODO3</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-build3.png" alt="" /></p>
|
||||
<p>TODO4</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-run.png" alt="" /></p>
|
||||
<p>TODO5</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-run2.png" alt="" /></p>
|
||||
<p>TODO6</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-build4.png" alt="" /></p>
|
||||
<p>TODO7</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-config.png" alt="" /></p>
|
||||
<p>TODO8</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-config2.png" alt="" /></p>
|
||||
<p>TODO9</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-config3.png" alt="" /></p>
|
||||
<p>TODO10</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-build5.png" alt="" /></p>
|
||||
<p>TODO11</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-run4.png" alt="" /></p>
|
||||
<p>TODO12</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-secure.png" alt="" /></p>
|
||||
<p>TODO13</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-secure2.png" alt="" /></p>
|
||||
<p>https://github.com/lupyuen/LoRaMac-node-nuttx</p>
|
||||
<p>#LoRaWAN needs Real Time Clock and Non-Volatile Memory … Now porting to #NuttX OS 🤔</p>
|
||||
<p>https://docs.google.com/spreadsheets/d/12EFS72JFjjuK-2yWQVYrImkUjyEA_iGlnsEu1d42r68/edit#gid=0</p>
|
||||
<p>Fixing the missing references for #LoRaWAN on Apache #NuttX OS</p>
|
||||
<p>Run Log: https://gist.github.com/lupyuen/b91c1f88645eedb813cfffa2bdf7d7a0</p>
|
||||
<p>LoRa Frequency and Sync Word are OK … Let’s fix the Device EUI and Join EUI for #LoRaWAN on #NuttX OS</p>
|
||||
<p>TODO55</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-run2a.png" alt="" /></p>
|
||||
<p>https://github.com/lupyuen/LoRaMac-node-nuttx/blob/master/src/nuttx.c</p>
|
||||
<p>#LoRaWAN on #NuttX OS: Let’s stub out the functions for Non-Volatile Memory and Real Time Clock … And watch what happens 🌋</p>
|
||||
<p>https://github.com/lupyuen/LoRaMac-node-nuttx/blob/master/src/peripherals/soft-se/se-identity.h#L100-L115</p>
|
||||
<p>For #NuttX OS we hardcode the #LoRaWAN App Key … Into the “Soft” Secure Element</p>
|
||||
<p>Run Log: https://gist.github.com/lupyuen/a8e834e7b4267345f01b6629fb7f5e33</p>
|
||||
<p>#NuttX OS doesn’t handle the Join Response from #LoRaWAN Gateway … Let’s fix this</p>
|
||||
<p>TODO56</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-run3.png" alt="" /></p>
|
||||
<p>Run Log: https://gist.github.com/lupyuen/a8e834e7b4267345f01b6629fb7f5e33</p>
|
||||
<p>#LoRaWAN Gateway receives the Join Request from #NuttX OS … And accepts the Join Request! 🎉</p>
|
||||
<p>https://github.com/lupyuen/incubator-nuttx-apps/tree/lorawan</p>
|
||||
<p>https://github.com/lupyuen/incubator-nuttx/tree/lorawan</p>
|
||||
<p>#LoRaWAN builds OK on #NuttX OS! 🎉 … Will it run? 🤔</p>
|
||||
<p>https://lupyuen.github.io/articles/wisgate</p>
|
||||
<p>Let’s connect Apache #NuttX OS to a #LoRaWAN Gateway … RAKwireless WisGate D4H with ChirpStack</p>
|
||||
<p>https://github.com/lupyuen/LoRaMac-node-nuttx/blob/master/src/peripherals/soft-se/se-identity.h#L65-L79</p>
|
||||
<p>#LoRaWAN gets its Device EUI, Join EUI and App Key from the Secure Element … But since #NuttX doesn’t have a Secure Element, we hardcode them in the “Soft” Secure Element</p>
|
||||
<p>TODO61</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-secure1.png" alt="" /></p>
|
||||
<p>TODO60</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-secure2a.png" alt="" /></p>
|
||||
<p>Log: https://gist.github.com/lupyuen/d3d9db37a40d7560fc211408db04a81b</p>
|
||||
<p>Our #NuttX App was waiting for the #LoRaWAN Join Request to be transmitted before receiving the Join Response … But because we’re polling SX1262, we missed the Join Response … Let’s fix this with the multithreading functions from NimBLE Porting Layer</p>
|
||||
<p>TODO57</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-run4a.png" alt="" /></p>
|
||||
<p>https://github.com/lupyuen/nimble-porting-nuttx</p>
|
||||
<p>NimBLE Porting Layer is a portable library of Multithreading Functions … We’ve used it for #LoRa on Linux and FreeRTOS … Now we call it from Apache #NuttX OS</p>
|
||||
<p>https://github.com/lupyuen/lora-sx1262/blob/lorawan/src/sx126x-nuttx.c#L863-L892</p>
|
||||
<p>Our #NuttX Background Thread handles the GPIO Interrupts (SX1262 DIO1) … By adding to the #LoRaWAN Event Queue</p>
|
||||
<p>TODO48</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-gpio4a.png" alt="" /></p>
|
||||
<p>TODO46</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-gpio2.png" alt="" /></p>
|
||||
<p>https://github.com/lupyuen/lora-sx1262/blob/lorawan/src/sx126x-nuttx.c#L835-L861</p>
|
||||
<p>We handle GPIO Interrupts (SX1262 DIO1) in a #NuttX Background Thread … Awaiting the Signal for GPIO Interrupt</p>
|
||||
<p>TODO49</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-gpio1.png" alt="" /></p>
|
||||
<p>TODO47</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-gpio3.png" alt="" /></p>
|
||||
<p>https://github.com/lupyuen/nimble-porting-nuttx</p>
|
||||
<p>To build NumBLE Porting Layer on #NuttX OS we need to enable: 1️⃣ POSIX Timers & Message Queues 2️⃣ Clock Monotonic 3️⃣ Work Queues 4️⃣ SIGEV_THHREAD</p>
|
||||
<p>https://github.com/lupyuen/lora-sx1262/blob/lorawan/src/sx126x-nuttx.c#L742-L778</p>
|
||||
<p>SX1262 will trigger a GPIO Interrupt on #NuttX OS when it receives a #LoRa Packet … We wait for the GPIO Interrupt to be Signalled in a Background Thread</p>
|
||||
<p>https://github.com/lupyuen/lora-sx1262/blob/lorawan/src/sx126x-nuttx.c#L184-L199</p>
|
||||
<p>Here’s how we check the SX1262 Busy Pin on #NuttX OS … By reading the GPIO Input</p>
|
||||
<p>https://gist.github.com/lupyuen/cad58115be4cabe8a8a49c0e498f1c95</p>
|
||||
<p>#LoRaWAN runs neater on Apache #NuttX OS … After implementing Timers and Multithreading with NimBLE Porting Layer … No more sleep()!</p>
|
||||
<p>https://github.com/lupyuen/incubator-nuttx-apps/blob/lorawan/examples/lorawan_test/lorawan_test_main.c#L814-L857</p>
|
||||
<p>Here’s our #LoRaWAN Event Loop for #NuttX OS … Implemented with NimBLE Porting Library … No more polling!</p>
|
||||
<p>TODO58</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-run5a.png" alt="" /></p>
|
||||
<p>TODO54</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-npl1.png" alt="" /></p>
|
||||
<p>https://gist.github.com/lupyuen/b38434c3d27500444382bb4a066691e5</p>
|
||||
<p>Our #NuttX App resends the same Nonce to the #LoRaWAN Gateway … Which (silently) rejects the Join Request due to Duplicate Nonce … Let’s fix our Random Number Generator</p>
|
||||
<p>https://github.com/lupyuen/LoRaMac-node-nuttx/blob/master/src/mac/LoRaMacCrypto.c#L980-L996</p>
|
||||
<p>#LoRaWAN gets the Nonce from the Secure Element’s Random Number Generator … Let’s simulate the Secure Element on Apache #NuttX OS</p>
|
||||
<p>TODO51</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce2a.png" alt="" /></p>
|
||||
<p>https://github.com/lupyuen/LoRaMac-node-nuttx/blob/master/src/nuttx.c#L136-L153</p>
|
||||
<p>Here’s how we generate #LoRaWAN Nonces on #NuttX OS … With Strong Random Numbers thanks to Entropy Pool</p>
|
||||
<p>TODO53</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce6.png" alt="" /></p>
|
||||
<p>Log: https://gist.github.com/lupyuen/8f012856b9eb6b9a762160afd83df7f8</p>
|
||||
<p>Our #NuttX App now sends Random #LoRaWAN Nonces to the LoRaWAN Gateway … And are happily accepted by the gateway! 🎉</p>
|
||||
<p>TODO43</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-chirpstack.png" alt="" /></p>
|
||||
<p>TODO36</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce7a.png" alt="" /></p>
|
||||
<p>For #NuttX Random Number Generator, select the Entropy Pool … To generate Strong Random Numbers for our #LoRaWAN Nonce</p>
|
||||
<p>TODO35</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce4a.png" alt="" /></p>
|
||||
<p>We enable the Entropy Pool in #NuttX OS … To generate Strong Random Numbers for our #LoRaWAN Nonce</p>
|
||||
<p>TODO52</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce3a.png" alt="" /></p>
|
||||
<p>Log: https://gist.github.com/lupyuen/8f012856b9eb6b9a762160afd83df7f8</p>
|
||||
<p>Our #NuttX App was too busy to receive the #LoRaWAN Join Response … Let’s disable the logging</p>
|
||||
<p>TODO62</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx.png" alt="" /></p>
|
||||
<p>Log: https://gist.github.com/lupyuen/0d301216bbf937147778bb57ab0ccf89</p>
|
||||
<p>Our #LoRaWAN Gateway receives Data Packets from #NuttX OS! 🎉 The Message Payload is empty … Let’s figure out why 🤔</p>
|
||||
<p>TODO44</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-chirpstack5.png" alt="" /></p>
|
||||
<p>TODO59</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-run1.png" alt="" /></p>
|
||||
<p>Log: https://gist.github.com/lupyuen/0d301216bbf937147778bb57ab0ccf89</p>
|
||||
<p>After disabling logging, our #NuttX App successfully joins the #LoRaWAN Network! 🎉 Now we transmit some Data Packets over LoRaWAN</p>
|
||||
<p>TODO63</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx3.png" alt="" /></p>
|
||||
<p>https://gist.github.com/lupyuen/5fc07695a6c4bb48b5e4d10eb05ca9bf</p>
|
||||
<p>Our #NuttX App sent an empty #LoRaWAN Message because our message is too long for LoRaWAN Data Rate 2 (max 11 bytes) … Let’s increase the Data Rate to 3</p>
|
||||
<p>TODO65</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx4a.png" alt="" /></p>
|
||||
<p>https://github.com/lupyuen/nimble-porting-nuttx/blob/master/porting/npl/nuttx/src/os_callout.c#L35-L70</p>
|
||||
<p>NimBLE Porting Layer doesn’t work for multiple Callout Timers on #NuttX OS, unless we loop the thread … Will submit a Pull Request to Apache NimBLE 👍</p>
|
||||
<p>TODO42</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-callout.png" alt="" /></p>
|
||||
<p>https://github.com/lupyuen/incubator-nuttx/blob/lorawan/drivers/ioexpander/gpio.c#L544-L547</p>
|
||||
<p>Switching a #NuttX GPIO Interrupt Pin to Trigger On Rising Edge … Crashes with an Assertion Failure … I’ll submit a NuttX Issue, meanwhile I have disabled the assertion</p>
|
||||
<p>TODO50</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-int.png" alt="" /></p>
|
||||
<p>https://github.com/lupyuen/lorawan_test/blob/main/lorawan_test_main.c#L311-L339</p>
|
||||
<p>Here’s how we send a #LoRaWAN Data Packet on #NuttX OS … And validate the Packet Size before sending</p>
|
||||
<p>TODO68</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx6.png" alt="" /></p>
|
||||
<p>https://gist.github.com/lupyuen/83be5da091273bb39bad6e77cc91b68d</p>
|
||||
<p>#LoRaWAN Gateway now receives the correct Data Packet from our #NuttX App! 🎉</p>
|
||||
<p>https://gist.github.com/lupyuen/83be5da091273bb39bad6e77cc91b68d</p>
|
||||
<p>#LoRaWAN Data Rate has been increased to 3 … Max Message Size is now 53 bytes for our #NuttX App</p>
|
||||
<p>TODO67</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx5a.png" alt="" /></p>
|
||||
<p>TODO37</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx7a.png" alt="" /></p>
|
||||
<p>https://github.com/lupyuen/lorawan_test/blob/main/lorawan_test_main.c#L57-L70</p>
|
||||
<p>Here’s how we increase the #LoRaWAN Data Rate to 3 in our #NuttX App</p>
|
||||
<p>https://github.com/lupyuen/LoRaMac-node-nuttx</p>
|
||||
<p>#LoRaWAN tested OK on Apache #NuttX OS … From #PineDio Stack BL604 @ThePine64 to RAKwireless WisGate … And back! 🎉</p>
|
||||
<p>TODO45</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-chirpstack6.png" alt="" /></p>
|
||||
<p>TODO14</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-config4.png" alt="" /></p>
|
||||
<p>TODO15</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-config5.png" alt="" /></p>
|
||||
<p>TODO16</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-config6.png" alt="" /></p>
|
||||
<p>TODO17</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-chirpstack2.png" alt="" /></p>
|
||||
<p>TODO18</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce.png" alt="" /></p>
|
||||
<p>TODO19</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-gpio.png" alt="" /></p>
|
||||
<p>TODO20</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-gpio4.png" alt="" /></p>
|
||||
<p>TODO21</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce2.png" alt="" /></p>
|
||||
<p>TODO22</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce3.png" alt="" /></p>
|
||||
<p>TODO23</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce4.png" alt="" /></p>
|
||||
<p>TODO24</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce5.png" alt="" /></p>
|
||||
<p>TODO25</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce7.png" alt="" /></p>
|
||||
<p>TODO26</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce8.png" alt="" /></p>
|
||||
<p>TODO27</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce9.png" alt="" /></p>
|
||||
<p>TODO28</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-npl.png" alt="" /></p>
|
||||
<p>TODO29</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-run5.png" alt="" /></p>
|
||||
<p>TODO30</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-chirpstack3.png" alt="" /></p>
|
||||
<p>TODO31</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-chirpstack4.png" alt="" /></p>
|
||||
<p>TODO32</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx2.png" alt="" /></p>
|
||||
<p>TODO33</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-config1.png" alt="" /></p>
|
||||
<p>TODO34</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-chirpstack2a.png" alt="" /></p>
|
||||
<p>TODO35</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce4a.png" alt="" /></p>
|
||||
<p>TODO36</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce7a.png" alt="" /></p>
|
||||
<p>TODO37</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx7a.png" alt="" /></p>
|
||||
<p>TODO38</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-build2a.png" alt="" /></p>
|
||||
<p>TODO39</p>
|
||||
|
@ -320,68 +379,6 @@ git submodule add --branch nuttx https://github.com/lupyuen/lora-sx1262 libsx126
|
|||
<p><img src="https://lupyuen.github.io/images/lorawan3-build5a.png" alt="" /></p>
|
||||
<p>TODO41</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-build1.png" alt="" /></p>
|
||||
<p>TODO42</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-callout.png" alt="" /></p>
|
||||
<p>TODO43</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-chirpstack.png" alt="" /></p>
|
||||
<p>TODO44</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-chirpstack5.png" alt="" /></p>
|
||||
<p>TODO45</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-chirpstack6.png" alt="" /></p>
|
||||
<p>TODO46</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-gpio2.png" alt="" /></p>
|
||||
<p>TODO47</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-gpio3.png" alt="" /></p>
|
||||
<p>TODO48</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-gpio4a.png" alt="" /></p>
|
||||
<p>TODO49</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-gpio1.png" alt="" /></p>
|
||||
<p>TODO50</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-int.png" alt="" /></p>
|
||||
<p>TODO51</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce2a.png" alt="" /></p>
|
||||
<p>TODO52</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce3a.png" alt="" /></p>
|
||||
<p>TODO53</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-nonce6.png" alt="" /></p>
|
||||
<p>TODO54</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-npl1.png" alt="" /></p>
|
||||
<p>TODO55</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-run2a.png" alt="" /></p>
|
||||
<p>TODO56</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-run3.png" alt="" /></p>
|
||||
<p>TODO57</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-run4a.png" alt="" /></p>
|
||||
<p>TODO58</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-run5a.png" alt="" /></p>
|
||||
<p>TODO59</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-run1.png" alt="" /></p>
|
||||
<p>TODO60</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-secure2a.png" alt="" /></p>
|
||||
<p>TODO61</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-secure1.png" alt="" /></p>
|
||||
<p>TODO62</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx.png" alt="" /></p>
|
||||
<p>TODO63</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx3.png" alt="" /></p>
|
||||
<p>TODO64</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx4.png" alt="" /></p>
|
||||
<p>TODO65</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx4a.png" alt="" /></p>
|
||||
<p>TODO66</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx5.png" alt="" /></p>
|
||||
<p>TODO67</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx5a.png" alt="" /></p>
|
||||
<p>TODO68</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx6.png" alt="" /></p>
|
||||
<p>TODO69</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx7.png" alt="" /></p>
|
||||
<p>TODO70</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-tx8.png" alt="" /></p>
|
||||
<p>TODO71</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-title2.jpg" alt="" /></p>
|
||||
<p>TODO72</p>
|
||||
<p><img src="https://lupyuen.github.io/images/lorawan3-title.jpg" alt="" /></p>
|
||||
|
||||
|
||||
</body>
|
||||
|
|
Loading…
Reference in a new issue