Fabio Gatti
/
poc_lorawan
poc lorawan using disco_l475vg and sx1272mb2xas
Revision 49:bf339fabb590, committed 2019-03-14
- Comitter:
- fabio_gatti
- Date:
- Thu Mar 14 22:05:11 2019 +0000
- Parent:
- 48:dfce67eca082
- Commit message:
- initial relase.; LORAWAN poc using disco_l475vg and sx1272mb2xas
Changed in this revision
--- 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
--- a/mbed-lora-radio-drv.lib Wed Feb 13 18:37:07 2019 +0000 +++ b/mbed-lora-radio-drv.lib Thu Mar 14 22:05:11 2019 +0000 @@ -1,1 +1,1 @@ -https://github.com/ARMmbed/mbed-semtech-lora-rf-drivers#16958f814d505cfbbedfa16d9bf8b9dff0e0442b +https://github.com/ARMmbed/mbed-semtech-lora-rf-drivers/#16958f814d505cfbbedfa16d9bf8b9dff0e0442b
--- a/mbed-os.lib Wed Feb 13 18:37:07 2019 +0000 +++ b/mbed-os.lib Thu Mar 14 22:05:11 2019 +0000 @@ -1,1 +1,1 @@ -https://github.com/ARMmbed/mbed-os/#ecb3c8c837162c73537bd0f3592c6e2a42994045 +https://github.com/ARMmbed/mbed-os/#51d55508e8400b60af467005646c4e2164738d48
--- a/mbed_app.json Wed Feb 13 18:37:07 2019 +0000 +++ b/mbed_app.json Thu Mar 14 22:05:11 2019 +0000 @@ -2,7 +2,7 @@ "config": { "lora-radio": { "help": "Which radio to use (options: SX1272,SX1276)", - "value": "SX1276" + "value": "SX1272" }, "main_stack_size": { "value": 4096 }, @@ -27,15 +27,19 @@ }, "target_overrides": { "*": { - "platform.stdio-convert-newlines": true, + "platform.stdio-convert-newlines": false, "platform.stdio-baud-rate": 115200, "platform.default-serial-baud-rate": 115200, - "lora.over-the-air-activation": true, - "lora.duty-cycle-on": true, + "lora.over-the-air-activation": false, + "lora.duty-cycle-on": false, "lora.phy": "EU868", - "lora.device-eui": "{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }", - "lora.application-eui": "{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }", - "lora.application-key": "{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }" + "lora.device-eui": "{ 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }", + "lora.application-eui": "{ 0x70, 0xB3, 0xD5, 0x7E, 0xD0, 0x01, 0x6E, 0x3D }", + "lora.application-key": "{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }", + "lora.device-address": "0x260113FF", + "lora.nwkskey": "{ 0x47, 0x39, 0x2F, 0xC9, 0x71, 0xA3, 0x23, 0x81, 0xD6, 0x82, 0x9D, 0x91, 0xA4, 0xDD, 0x38, 0xEF }", + "lora.appskey": "{ 0xDF, 0x75, 0x91, 0x07, 0xC1, 0x2F, 0x49, 0xA3, 0x03, 0xD7, 0x52, 0x94, 0x8B, 0xAD, 0xE1, 0x67 }" + }, "K64F": { @@ -58,6 +62,28 @@ "lora-pwr-amp-ctl": "NC", "lora-tcxo": "NC" }, + "DISCO_L475VG_IOT01A": { + "main_stack_size": 1024, + "lora-radio": "SX1272", + "lora-spi-mosi": "PA_7", + "lora-spi-miso": "PA_6", + "lora-spi-sclk": "PA_5", + "lora-cs": "PA_2", + "lora-reset": "PC_5", + "lora-dio0": "PD_14", + "lora-dio1": "PB_0", + "lora-dio2": "PA_3", + "lora-dio3": "PB_4", + "lora-dio4": "NC", + "lora-dio5": "NC", + "lora-rf-switch-ctl1": "NC", + "lora-rf-switch-ctl2": "NC", + "lora-txctl": "NC", + "lora-rxctl": "NC", + "lora-ant-switch": "PC_1", + "lora-pwr-amp-ctl": "NC", + "lora-tcxo": "NC" + }, "DISCO_L072CZ_LRWAN1": { "main_stack_size": 1024,