Two way data over LoRaWAN using Multitech mDot

Dependencies:   libmDot-mbed5

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.

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?

UserRevisionLine numberNew 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