Send text with LoRaWAN.
Dependencies: LMiC SX1276Lib mbed
Fork of LoRaWAN-lmic-app by
main.cpp
- Committer:
- tamberg
- Date:
- 2015-09-14
- Revision:
- 6:fbfc95b5c979
- Parent:
- 5:1f8829bd11ed
- Child:
- 7:4adfa7248a0b
File content as of revision 6:fbfc95b5c979:
/* License: Revised BSD License, see LICENSE.TXT, (c)2015 tamberg.org, (c)2015 Semtech */ #include "mbed.h" #include "lmic.h" #include "debug.h" #define LORAWAN_NET_ID (uint32_t) 0x00000000 #define LORAWAN_DEV_ADDR (uint32_t) 0x00001056 #define APP_TX_DUTYCYCLE 5000 // ms #define APP_TX_DUTYCYCLE_RND 1000 // ms #define LORAWAN_ADR_ON 1 #define LORAWAN_CONFIRMED_MSG_ON 1 #define LORAWAN_APP_PORT 15 #define LORAWAN_APP_DATA_SIZE 51 // 6 // max 51 static const uint8_t AppEui[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const u1_t DevEui[8] = { 0xF0, 0x3D, 0x29, 0x10, 0x00, 0x00, 0x10, 0x56 }; static const uint8_t DevKey[16] = { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }; static uint8_t NwkSKey[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF }; static uint8_t ArtSKey[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF }; osjob_t sendFrameJob; static bool AppLedStateOn = false; int32_t randr (int32_t min, int32_t max) { return (int32_t) rand() % (max - min + 1) + min; } void os_getArtEui (uint8_t *buf) { debug_str("os_getArtEui\r\n"); memcpy(buf, AppEui, 8); } void os_getDevEui (uint8_t *buf) { debug_str("os_getDevEui\r\n"); memcpy(buf, DevEui, 8); } void os_getDevKey (uint8_t *buf) { debug_str("os_getDevKey\r\n"); memcpy(buf, DevKey, 16); } static void prepareTxFrame (void) { debug_str("prepareTxFrame\r\n"); for (int i = 0; i < LORAWAN_APP_DATA_SIZE; i++) { LMIC.frame[i] = i; } // LMIC.frame[0] = 0;//AppLedStateOn; // LMIC.frame[1] = 1;//LMIC.seqnoDn >> 8; // LMIC.frame[2] = 2;//LMIC.seqnoDn; // LMIC.frame[3] = 3;//LMIC.rssi >> 8; // LMIC.frame[4] = 4;//LMIC.rssi; // LMIC.frame[5] = 5;//LMIC.snr; } void processRxFrame (void) { debug_str("processRxFrame\r\n"); u1_t rxPort = LMIC.frame[LMIC.dataBeg - 1]; switch(rxPort) { case 1: // The application LED can be controlled on port 1 or 2 case 2: if(LMIC.dataLen == 1) { AppLedStateOn = LMIC.frame[LMIC.dataBeg] & 0x01; debug_val("LED3 = ", AppLedStateOn); } break; default: break; } } static void onSendFrame (osjob_t* j) { debug_str("onSendFrame\r\n"); prepareTxFrame(); // int LMIC_setTxData2 (u1_t port, xref2u1_t data, u1_t dlen, u1_t confirmed); debug_str("LMIC_setTxData2\r\n"); int result = LMIC_setTxData2( LORAWAN_APP_PORT, LMIC.frame, LORAWAN_APP_DATA_SIZE, LORAWAN_CONFIRMED_MSG_ON); debug_val("result = ", result); } static void onInit (osjob_t* j) { debug_str("onInit\r\n"); LMIC_reset(); // reset MAC state LMIC_setAdrMode(LORAWAN_ADR_ON); LMIC_setDrTxpow(DR_SF12, 14); LMIC_setSession( LORAWAN_NET_ID, LORAWAN_DEV_ADDR, NwkSKey, ArtSKey); onSendFrame(NULL); // onEvent() callback will be invoked... } int main (void) { debug_str("main\r\n"); osjob_t initjob; os_init(); os_setCallback(&initjob, onInit); os_runloop(); // blocking } void onEvent (ev_t ev) { // called by lmic.cpp, see also oslmic.h debug_str("onEvent\r\n"); bool txOn = false; debug_event(ev); switch (ev) { case EV_JOINED: // network joined, session established debug_val("Net ID = ", LMIC.netid); txOn = true; break; case EV_TXCOMPLETE: // scheduled data sent (optionally data received) debug_val("Datarate = ", LMIC.datarate); // Check if we have a downlink on either Rx1 or Rx2 windows if ((LMIC.txrxFlags & (TXRX_DNW1 | TXRX_DNW2)) != 0) { //debug_val("LED2 = ", 1); //os_setTimedCallback(&rxLedJob, os_getTime() + ms2osticks(25), onRxLed); if (LMIC.dataLen != 0) { // data received in rx slot after tx debug_buf(LMIC.frame + LMIC.dataBeg, LMIC.dataLen); processRxFrame(); } } txOn = true; break; default: break; } if (txOn == true) { os_setTimedCallback( &sendFrameJob, os_getTime() + ms2osticks(APP_TX_DUTYCYCLE + randr(-APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND)), onSendFrame); } }