Fabio Gatti
/
poc_lorawan
poc lorawan using disco_l475vg and sx1272mb2xas
Diff: main.cpp
- Revision:
- 49:bf339fabb590
- Parent:
- 47:b6d132f1079f
--- a/main.cpp Wed Feb 13 18:37:07 2019 +0000 +++ b/main.cpp Thu Mar 14 22:05:11 2019 +0000 @@ -45,10 +45,21 @@ */ #define MAX_NUMBER_OF_EVENTS 10 -/** - * Maximum number of retries for CONFIRMED messages before giving up - */ -#define CONFIRMED_MSG_RETRY_COUNTER 3 + +// Maximum number of retries for CONFIRMED messages before giving up +#define LORAWAN_CONFIRMED_MSG_RETRY_COUNTER 3 +//DR_5=SF_7; DR_4=SF_8; DR_3=SF_9; DR_2=SF_10; DR_1=SF_11; DR_0=SF_12 +#define LORAWAN_DATA_RATE DR_5 +// app port +#define LORAWAN_APP_PORT 15 +// tx message type +#define LORAWAN_TX_MSG_TYPE MSG_UNCONFIRMED_FLAG +// number of channel +#define LORAWAN_CHANNEL_NBR 3 +// timeout retry when channel is block in msec +#define LORAWAN_CHANNEL_RETRY 3000 + + /** * Dummy pin for dummy sensor @@ -87,57 +98,103 @@ */ static lorawan_app_callbacks_t callbacks; + +static void LoRa_PrintChannels() { + /* print list of all channel frequencies */ + lorawan_channelplan_t channelPlan {}; + static loramac_channel_t channelbuf[10]; + + channelPlan.channels = channelbuf; + if (lorawan.get_channel_plan(channelPlan) == LORAWAN_STATUS_OK) { + for (uint8_t i = 0; i < channelPlan.nb_channels; i++) { + loramac_channel_t chan = channelPlan.channels[i]; + printf(" CHAN %d ID %d FREQ %lu RX1FREQ %lu Band %d DR min %d max %d\n", + (int) i, (int) chan.id, chan.ch_param.frequency, + chan.ch_param.rx1_frequency, (int) chan.ch_param.band, + (int) chan.ch_param.dr_range.fields.min, + (int) chan.ch_param.dr_range.fields.max); + } + } else { + printf(" COULD NOT GET CHANNEL PLAN\n"); + } +} + /** * Entry point for application */ int main(void) { + static loramac_channel_t ttnChannels[] = { + {0, {868100000, 0, {(DR_5 << 4) | DR_0}, 1}}, + {1, {868300000, 0, {(DR_5 << 4) | DR_0}, 1}}, + {2, {868500000, 0, {(DR_5 << 4) | DR_0}, 1}}, + {3, {867100000, 0, {(DR_5 << 4) | DR_0}, 0}}, + {4, {867300000, 0, {(DR_5 << 4) | DR_0}, 0}}, + {5, {867500000, 0, {(DR_5 << 4) | DR_0}, 0}}, + {6, {867700000, 0, {(DR_5 << 4) | DR_0}, 0}}, + {7, {867900000, 0, {(DR_5 << 4) | DR_0}, 0}} +}; + lorawan_channelplan_t channelPlan {}; // setup tracing setup_trace(); // stores the status of a call to LoRaWAN protocol lorawan_status_t retcode; - - // Initialize LoRaWAN stack + printf("---------------------------- \n"); +// LORAWAN: Initialize LoRaWAN stack if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) { - printf("\r\n LoRa initialization failed! \r\n"); + printf(" LoRa initialization failed! \n"); return -1; } + printf(" Mbed LoRaWANStack initialized \n"); - printf("\r\n Mbed LoRaWANStack initialized \r\n"); - - // prepare application callbacks +// LORAWAN: prepare application callbacks callbacks.events = mbed::callback(lora_event_handler); lorawan.add_app_callbacks(&callbacks); - // Set number of retries in case of CONFIRMED messages - if (lorawan.set_confirmed_msg_retries(CONFIRMED_MSG_RETRY_COUNTER) +// LORAWAN: Set number of retries in case of CONFIRMED messages + if (lorawan.set_confirmed_msg_retries(LORAWAN_CONFIRMED_MSG_RETRY_COUNTER) != LORAWAN_STATUS_OK) { - printf("\r\n set_confirmed_msg_retries failed! \r\n\r\n"); + printf(" Set_confirmed_msg_retries failed! \n"); return -1; } - - printf("\r\n CONFIRMED message retries : %d \r\n", - CONFIRMED_MSG_RETRY_COUNTER); - + printf(" CONFIRMED message retries : %d \n", + LORAWAN_CONFIRMED_MSG_RETRY_COUNTER); + + // LORAWAN: settaggio canali + channelPlan.channels = (loramac_channel_t*) ttnChannels; + channelPlan.nb_channels = LORAWAN_CHANNEL_NBR; + if (lorawan.set_channel_plan(channelPlan) == LORAWAN_STATUS_OK) { + printf(" [+] Setting TTN channels\n"); + } else { + printf(" [-] Failed to set TTN channels! Debug return code.\n"); + } + LoRa_PrintChannels(); + +// LORAWAN: data rate +// if (lorawan.enable_adaptive_datarate() != LORAWAN_STATUS_OK) { +// printf("\r\n enable_adaptive_datarate failed! \r\n"); +// return -1; +// } + // Enable adaptive data rate - if (lorawan.enable_adaptive_datarate() != LORAWAN_STATUS_OK) { - printf("\r\n enable_adaptive_datarate failed! \r\n"); + if (lorawan.disable_adaptive_datarate() != LORAWAN_STATUS_OK) { + printf(" disable_adaptive_datarate failed! \r\n"); return -1; } - - printf("\r\n Adaptive data rate (ADR) - Enabled \r\n"); + printf(" Adaptive data rate (ADR) - disabled \r\n"); + lorawan.set_datarate(LORAWAN_DATA_RATE); retcode = lorawan.connect(); if (retcode == LORAWAN_STATUS_OK || retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) { } else { - printf("\r\n Connection error, code = %d \r\n", retcode); + printf(" Connection error, code = %d \n", retcode); return -1; } - printf("\r\n Connection - In Progress ...\r\n"); + printf(" Connection - In Progress ...\n"); // make your event queue dispatching events forever ev_queue.dispatch_forever(); @@ -153,37 +210,39 @@ uint16_t packet_len; int16_t retcode; float sensor_value; + if (ds1820.begin()) { ds1820.startConversion(); sensor_value = ds1820.read(); - printf("\r\n Dummy Sensor Value = %3.1f \r\n", sensor_value); + printf("\n -------------------------\n"); + printf(" Dummy Sensor Value = %3.1f \n", sensor_value); ds1820.startConversion(); } else { - printf("\r\n No sensor found \r\n"); + printf(" No sensor found \n"); return; } - - packet_len = sprintf((char *) tx_buffer, "Dummy Sensor Value is %3.1f", + + packet_len = sprintf((char *) tx_buffer, " Dummy Sensor Value is %3.1f", sensor_value); - retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len, - MSG_UNCONFIRMED_FLAG); + retcode = lorawan.send(LORAWAN_APP_PORT, tx_buffer, packet_len, + LORAWAN_TX_MSG_TYPE); if (retcode < 0) { - retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - WOULD BLOCK\r\n") - : printf("\r\n send() - Error code %d \r\n", retcode); + retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf(" send - WOULD BLOCK\r\n") + : printf(" send() - Error code %d \n", retcode); if (retcode == LORAWAN_STATUS_WOULD_BLOCK) { //retry in 3 seconds if (MBED_CONF_LORA_DUTY_CYCLE_ON) { - ev_queue.call_in(3000, send_message); + ev_queue.call_in(LORAWAN_CHANNEL_RETRY, send_message); } } return; } - - printf("\r\n %d bytes scheduled for transmission \r\n", retcode); + + printf(" %d bytes scheduled for transmission \n", retcode); memset(tx_buffer, 0, sizeof(tx_buffer)); } @@ -197,7 +256,7 @@ int16_t retcode = lorawan.receive(rx_buffer, sizeof(rx_buffer), port, flags); if (retcode < 0) { - printf("\r\n receive() - Error code %d \r\n", retcode); + printf(" receive() - Error code %d \r\n", retcode); return; } @@ -205,7 +264,7 @@ for (uint8_t i = 0; i < retcode; i++) { printf("%02x ", rx_buffer[i]); } - printf("\r\n"); + printf("\n"); memset(rx_buffer, 0, sizeof(rx_buffer)); } @@ -215,9 +274,13 @@ */ static void lora_event_handler(lorawan_event_t event) { + int16_t retcode; + lorawan_tx_metadata additional_data; + int backoff_data; + switch (event) { case CONNECTED: - printf("\r\n Connection - Successful \r\n"); + printf(" Connection - Successful \n"); if (MBED_CONF_LORA_DUTY_CYCLE_ON) { send_message(); } else { @@ -227,10 +290,44 @@ break; case DISCONNECTED: ev_queue.break_dispatch(); - printf("\r\n Disconnected Successfully \r\n"); + printf(" Disconnected Successfully \n"); break; case TX_DONE: - printf("\r\n Message Sent to Network Server \r\n"); + printf(" Message Sent to Network Server \n"); + + retcode = lorawan.get_tx_metadata(additional_data); + switch (retcode) + { + case LORAWAN_STATUS_NOT_INITIALIZED: + printf(" Lorawan stack not initialized\n"); + break; + + case LORAWAN_STATUS_METADATA_NOT_AVAILABLE: + printf(" Metadata not available\n"); + break; + + case LORAWAN_STATUS_OK : + printf(" TX Channel: %d \n",additional_data.channel); + printf(" TOA (msec): %d \n",additional_data.tx_toa); + printf(" Data rate: %u \n",additional_data.data_rate); + break; + } + + retcode = lorawan.get_backoff_metadata(backoff_data); + switch (retcode) + { + case LORAWAN_STATUS_NOT_INITIALIZED: + printf(" Lorawan stack not initialized\n"); + break; + + case LORAWAN_STATUS_METADATA_NOT_AVAILABLE: + printf(" Backoff not available\n"); + break; + + case LORAWAN_STATUS_OK : + printf(" Backoff: %d \n",backoff_data); + break; + } if (MBED_CONF_LORA_DUTY_CYCLE_ON) { send_message(); } @@ -239,32 +336,33 @@ case TX_ERROR: case TX_CRYPTO_ERROR: case TX_SCHEDULING_ERROR: - printf("\r\n Transmission Error - EventCode = %d \r\n", event); + printf(" Transmission Error - EventCode = %d \r\n", event); // try again if (MBED_CONF_LORA_DUTY_CYCLE_ON) { send_message(); } break; case RX_DONE: - printf("\r\n Received message from Network Server \r\n"); + printf(" Received message from Network Server \r\n"); receive_message(); break; case RX_TIMEOUT: case RX_ERROR: - printf("\r\n Error in reception - Code = %d \r\n", event); + printf(" Error in reception - Code = %d \r\n", event); break; case JOIN_FAILURE: - printf("\r\n OTAA Failed - Check Keys \r\n"); + printf(" OTAA Failed - Check Keys \r\n"); break; case UPLINK_REQUIRED: - printf("\r\n Uplink required by NS \r\n"); + printf(" Uplink required by NS \r\n"); if (MBED_CONF_LORA_DUTY_CYCLE_ON) { send_message(); } break; - default: - MBED_ASSERT("Unknown Event"); + default: + MBED_ASSERT(" Unknown Event"); } } + // EOF