Two way data over LoRaWAN using Multitech mDot
This is example firmware for the Multitech mDot. It demonstrates how to:
- Do two-way data.
- Sleep aggressively and only wake up when the wake-up pin is triggered.
- Handle errors, retries and duty cycle errors.
- Cache data in non-volatile storage.
Based on mbed OS 5.1, hard faults against mbed OS 5.3 unfortunately. Can be compiled with GCC and ARMCC (but not IAR).
To do a new transmission, short pin D6 / PA_1.
parse_keys.h@0:20fbd6f66b11, 2017-01-03 (annotated)
- Committer:
- janjongboom
- Date:
- Tue Jan 03 13:20:36 2017 +0000
- Revision:
- 0:20fbd6f66b11
- Child:
- 2:ff17ce021cfb
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
janjongboom | 0:20fbd6f66b11 | 1 | #ifndef DISPENSER_PARSE_KEYS_H |
janjongboom | 0:20fbd6f66b11 | 2 | #define DISPENSER_PARSE_KEYS_H |
janjongboom | 0:20fbd6f66b11 | 3 | |
janjongboom | 0:20fbd6f66b11 | 4 | #include "mDot.h" |
janjongboom | 0:20fbd6f66b11 | 5 | |
janjongboom | 0:20fbd6f66b11 | 6 | class ParseKeys { |
janjongboom | 0:20fbd6f66b11 | 7 | public: |
janjongboom | 0:20fbd6f66b11 | 8 | static bool initialize(mDot* dot, const char* aDevAddr, const char* aNwkSKey, const char* aAppSKey) { |
janjongboom | 0:20fbd6f66b11 | 9 | int32_t ret; |
janjongboom | 0:20fbd6f66b11 | 10 | |
janjongboom | 0:20fbd6f66b11 | 11 | // parse devkey |
janjongboom | 0:20fbd6f66b11 | 12 | std::vector<uint8_t> loriot_nwk_skey(16); |
janjongboom | 0:20fbd6f66b11 | 13 | for (uint8_t ni = 0; ni < 16; ni++) |
janjongboom | 0:20fbd6f66b11 | 14 | { |
janjongboom | 0:20fbd6f66b11 | 15 | const char hex[] = { '0', 'x', aNwkSKey[ni * 2], aNwkSKey[ni * 2 + 1], '\0' }; |
janjongboom | 0:20fbd6f66b11 | 16 | loriot_nwk_skey[ni] = strtoul(hex, NULL, 16); |
janjongboom | 0:20fbd6f66b11 | 17 | } |
janjongboom | 0:20fbd6f66b11 | 18 | |
janjongboom | 0:20fbd6f66b11 | 19 | // parse appkey |
janjongboom | 0:20fbd6f66b11 | 20 | std::vector<uint8_t> loriot_app_skey(16); |
janjongboom | 0:20fbd6f66b11 | 21 | for (uint8_t ai = 0; ai < 16; ai++) |
janjongboom | 0:20fbd6f66b11 | 22 | { |
janjongboom | 0:20fbd6f66b11 | 23 | const char hex[] = { '0', 'x', aAppSKey[ai * 2], aAppSKey[ai * 2 + 1], '\0' }; |
janjongboom | 0:20fbd6f66b11 | 24 | loriot_app_skey[ai] = strtoul(hex, NULL, 16); |
janjongboom | 0:20fbd6f66b11 | 25 | } |
janjongboom | 0:20fbd6f66b11 | 26 | |
janjongboom | 0:20fbd6f66b11 | 27 | // parse dev addr |
janjongboom | 0:20fbd6f66b11 | 28 | std::vector<uint8_t> loriot_dev_addr(4); |
janjongboom | 0:20fbd6f66b11 | 29 | for (uint8_t ai = 0; ai < 4; ai++) |
janjongboom | 0:20fbd6f66b11 | 30 | { |
janjongboom | 0:20fbd6f66b11 | 31 | const char hex[] = { '0', 'x', aDevAddr[ai * 2], aDevAddr[ai * 2 + 1], '\0' }; |
janjongboom | 0:20fbd6f66b11 | 32 | loriot_dev_addr[ai] = strtoul(hex, NULL, 16); |
janjongboom | 0:20fbd6f66b11 | 33 | } |
janjongboom | 0:20fbd6f66b11 | 34 | |
janjongboom | 0:20fbd6f66b11 | 35 | logInfo("setting network address"); |
janjongboom | 0:20fbd6f66b11 | 36 | if ((ret = dot->setNetworkAddress(loriot_dev_addr)) != mDot::MDOT_OK) { |
janjongboom | 0:20fbd6f66b11 | 37 | logError("failed to set network address %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); |
janjongboom | 0:20fbd6f66b11 | 38 | return false; |
janjongboom | 0:20fbd6f66b11 | 39 | } |
janjongboom | 0:20fbd6f66b11 | 40 | |
janjongboom | 0:20fbd6f66b11 | 41 | logInfo("setting network session key"); |
janjongboom | 0:20fbd6f66b11 | 42 | if ((ret = dot->setNetworkSessionKey(loriot_nwk_skey)) != mDot::MDOT_OK) { |
janjongboom | 0:20fbd6f66b11 | 43 | logError("failed to set network session key %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); |
janjongboom | 0:20fbd6f66b11 | 44 | return false; |
janjongboom | 0:20fbd6f66b11 | 45 | } |
janjongboom | 0:20fbd6f66b11 | 46 | |
janjongboom | 0:20fbd6f66b11 | 47 | logInfo("setting app session key"); |
janjongboom | 0:20fbd6f66b11 | 48 | if ((ret = dot->setDataSessionKey(loriot_app_skey)) != mDot::MDOT_OK) { |
janjongboom | 0:20fbd6f66b11 | 49 | logError("failed to set app session key %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); |
janjongboom | 0:20fbd6f66b11 | 50 | return false; |
janjongboom | 0:20fbd6f66b11 | 51 | } |
janjongboom | 0:20fbd6f66b11 | 52 | |
janjongboom | 0:20fbd6f66b11 | 53 | return true; |
janjongboom | 0:20fbd6f66b11 | 54 | } |
janjongboom | 0:20fbd6f66b11 | 55 | }; |
janjongboom | 0:20fbd6f66b11 | 56 | |
janjongboom | 0:20fbd6f66b11 | 57 | #endif // DISPENSER_PARSE_KEYS_H |