Store joinned network info in flash, so that OTAA will work nicely

This commit is contained in:
geeksville 2020-01-18 13:21:00 -08:00
parent fdc0edee88
commit c263355ada
3 changed files with 74 additions and 43 deletions

View File

@ -95,44 +95,13 @@ void sleep() {
#endif #endif
} }
void printHex2(unsigned v) {
v &= 0xff;
if (v < 16)
Serial.print('0');
Serial.print(v, HEX);
}
void callback(uint8_t message) { void callback(uint8_t message) {
if (EV_JOINING == message) screen_print("Joining TTN...\n"); if (EV_JOINING == message) screen_print("Joining TTN...\n");
if (EV_JOINED == message) { if (EV_JOINED == message) {
screen_print("TTN joined!\n"); screen_print("TTN joined!\n");
Serial.println(F("EV_JOINED"));
u4_t netid = 0;
devaddr_t devaddr = 0;
u1_t nwkKey[16];
u1_t artKey[16];
LMIC_getSessionKeys(&netid, &devaddr, nwkKey, artKey);
Serial.print("netid: ");
Serial.println(netid, DEC);
Serial.print("devaddr: ");
Serial.println(devaddr, HEX);
Serial.print("AppSKey: ");
for (size_t i=0; i<sizeof(artKey); ++i) {
if (i != 0)
Serial.print("-");
printHex2(artKey[i]);
}
Serial.println("");
Serial.print("NwkSKey: ");
for (size_t i=0; i<sizeof(nwkKey); ++i) {
if (i != 0)
Serial.print("-");
printHex2(nwkKey[i]);
}
Serial.println();
} }
if (EV_JOIN_FAILED == message) screen_print("TTN join failed\n"); if (EV_JOIN_FAILED == message) screen_print("TTN join failed\n");
if (EV_REJOIN_FAILED == message) screen_print("TTN rejoin failed\n"); if (EV_REJOIN_FAILED == message) screen_print("TTN rejoin failed\n");

View File

@ -90,10 +90,18 @@ void forceTxSingleChannelDr() {
ttn_sf(LORAWAN_SF); ttn_sf(LORAWAN_SF);
} }
static void printHex2(unsigned v) {
v &= 0xff;
if (v < 16)
Serial.print('0');
Serial.print(v, HEX);
}
// LMIC library will call this method when an event is fired // LMIC library will call this method when an event is fired
void onEvent(ev_t event) { void onEvent(ev_t event) {
switch(event) { switch(event) {
case EV_JOINED: case EV_JOINED: {
#ifdef SINGLE_CHANNEL_GATEWAY #ifdef SINGLE_CHANNEL_GATEWAY
forceTxSingleChannelDr(); forceTxSingleChannelDr();
#endif #endif
@ -104,7 +112,41 @@ void onEvent(ev_t event) {
if(!LORAWAN_ADR){ if(!LORAWAN_ADR){
LMIC_setLinkCheckMode(0); // Link check problematic if not using ADR. Must be set after join LMIC_setLinkCheckMode(0); // Link check problematic if not using ADR. Must be set after join
} }
break;
Serial.println(F("EV_JOINED"));
u4_t netid = 0;
devaddr_t devaddr = 0;
u1_t nwkKey[16];
u1_t artKey[16];
LMIC_getSessionKeys(&netid, &devaddr, nwkKey, artKey);
Serial.print("netid: ");
Serial.println(netid, DEC);
Serial.print("devaddr: ");
Serial.println(devaddr, HEX);
Serial.print("AppSKey: ");
for (size_t i=0; i<sizeof(artKey); ++i) {
if (i != 0)
Serial.print("-");
printHex2(artKey[i]);
}
Serial.println("");
Serial.print("NwkSKey: ");
for (size_t i=0; i<sizeof(nwkKey); ++i) {
if (i != 0)
Serial.print("-");
printHex2(nwkKey[i]);
}
Serial.println();
Preferences p;
p.begin("lora", false);
p.putUInt("netId", netid);
p.putUInt("devAddr", devaddr);
p.putBytes("nwkKey", nwkKey, sizeof(nwkKey));
p.putBytes("artKey", artKey, sizeof(artKey));
p.end();
break; }
case EV_TXCOMPLETE: case EV_TXCOMPLETE:
Serial.println(F("EV_TXCOMPLETE (inc. RX win. wait)")); Serial.println(F("EV_TXCOMPLETE (inc. RX win. wait)"));
if (LMIC.txrxFlags & TXRX_ACK) { if (LMIC.txrxFlags & TXRX_ACK) {
@ -242,9 +284,29 @@ void ttn_join() {
LMIC.txChnl = SINGLE_CHANNEL_GATEWAY; LMIC.txChnl = SINGLE_CHANNEL_GATEWAY;
#endif #endif
Preferences p;
p.begin("lora", true);
uint32_t netId = p.getUInt("netId", UINT32_MAX);
uint32_t devAddr = p.getUInt("devAddr", UINT32_MAX);
uint8_t nwkKey[16], artKey[16];
bool keysgood = p.getBytes("nwkKey", nwkKey, sizeof(nwkKey)) == sizeof(nwkKey) &&
p.getBytes("artKey", artKey, sizeof(artKey)) == sizeof(artKey);
p.end(); // close our prefs
if(!keysgood) {
// We have not yet joined a network, start a full join attempt
// Make LMiC initialize the default channels, choose a channel, and // Make LMiC initialize the default channels, choose a channel, and
// schedule the OTAA join // schedule the OTAA join
Serial.println("No session saved, joining from scratch");
LMIC_startJoining(); LMIC_startJoining();
}
else {
Serial.println("Rejoining saved session");
LMIC_setSession(netId, devAddr, nwkKey, artKey);
// Trigger a false joined
_ttn_callback(EV_JOINED);
}
#endif #endif
} }

View File

@ -21,7 +21,7 @@ build_flags = -Wall -Wextra -Wno-missing-field-initializers -O3 -Wl,-Map,.pio/bu
; -DLOG_LOCAL_LEVEL=ESP_LOG_DEBUG -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG ; -DLOG_LOCAL_LEVEL=ESP_LOG_DEBUG -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
lib_deps = lib_deps =
arduino-lmic https://github.com/mcci-catena/arduino-lmic
TinyGPSPlus TinyGPSPlus
ESP8266_SSD1306 ESP8266_SSD1306
AXP202X_Library AXP202X_Library