kimutai ngetich
/
gps_accelerometer
getting location and activity
inc/lorawan_network.h@0:68ca78749806, 2019-03-11 (annotated)
- Committer:
- kimutaingetich
- Date:
- Mon Mar 11 09:24:37 2019 +0000
- Revision:
- 0:68ca78749806
time changes
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kimutaingetich | 0:68ca78749806 | 1 | #ifndef _LORAWAN_NETWORK_H_ |
kimutaingetich | 0:68ca78749806 | 2 | #define _LORAWAN_NETWORK_H_ |
kimutaingetich | 0:68ca78749806 | 3 | |
kimutaingetich | 0:68ca78749806 | 4 | #include "mbed.h" |
kimutaingetich | 0:68ca78749806 | 5 | #include "mbed_trace.h" |
kimutaingetich | 0:68ca78749806 | 6 | #include "mbed_events.h" |
kimutaingetich | 0:68ca78749806 | 7 | #include "LoRaWANInterface.h" |
kimutaingetich | 0:68ca78749806 | 8 | #include "SX1276_LoRaRadio.h" |
kimutaingetich | 0:68ca78749806 | 9 | #include "CayenneLPP.h" |
kimutaingetich | 0:68ca78749806 | 10 | #include "lora_radio_helper.h" |
kimutaingetich | 0:68ca78749806 | 11 | |
kimutaingetich | 0:68ca78749806 | 12 | #define MBED_CONF_LORA_APP_PORT 15 |
kimutaingetich | 0:68ca78749806 | 13 | |
kimutaingetich | 0:68ca78749806 | 14 | // EventQueue is required to dispatch events around |
kimutaingetich | 0:68ca78749806 | 15 | EventQueue ev_queue; |
kimutaingetich | 0:68ca78749806 | 16 | |
kimutaingetich | 0:68ca78749806 | 17 | // Constructing Mbed LoRaWANInterface and passing it down the radio object. |
kimutaingetich | 0:68ca78749806 | 18 | static LoRaWANInterface lorawan(radio); |
kimutaingetich | 0:68ca78749806 | 19 | |
kimutaingetich | 0:68ca78749806 | 20 | // Application specific callbacks |
kimutaingetich | 0:68ca78749806 | 21 | static lorawan_app_callbacks_t callbacks; |
kimutaingetich | 0:68ca78749806 | 22 | |
kimutaingetich | 0:68ca78749806 | 23 | // LoRaWAN stack event handler |
kimutaingetich | 0:68ca78749806 | 24 | static void lora_event_handler(lorawan_event_t event); |
kimutaingetich | 0:68ca78749806 | 25 | |
kimutaingetich | 0:68ca78749806 | 26 | static void lorawan_setup(uint32_t devAddr, uint8_t nwkSKey[16], uint8_t appSKey[16], Callback<void(lorawan_event_t)> lw_event_handler) { |
kimutaingetich | 0:68ca78749806 | 27 | if (devAddr == 0x0) { |
kimutaingetich | 0:68ca78749806 | 28 | printf("Set your LoRaWAN credentials first!\n"); |
kimutaingetich | 0:68ca78749806 | 29 | return; |
kimutaingetich | 0:68ca78749806 | 30 | } |
kimutaingetich | 0:68ca78749806 | 31 | |
kimutaingetich | 0:68ca78749806 | 32 | // Enable trace output for this demo, so we can see what the LoRaWAN stack does |
kimutaingetich | 0:68ca78749806 | 33 | mbed_trace_init(); |
kimutaingetich | 0:68ca78749806 | 34 | |
kimutaingetich | 0:68ca78749806 | 35 | if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) { |
kimutaingetich | 0:68ca78749806 | 36 | printf("[LNWK][ERR ] LoRa initialization failed!\n"); |
kimutaingetich | 0:68ca78749806 | 37 | return; |
kimutaingetich | 0:68ca78749806 | 38 | } |
kimutaingetich | 0:68ca78749806 | 39 | |
kimutaingetich | 0:68ca78749806 | 40 | // prepare application callbacks |
kimutaingetich | 0:68ca78749806 | 41 | callbacks.events = lw_event_handler; |
kimutaingetich | 0:68ca78749806 | 42 | lorawan.add_app_callbacks(&callbacks); |
kimutaingetich | 0:68ca78749806 | 43 | |
kimutaingetich | 0:68ca78749806 | 44 | // Disable adaptive data rating |
kimutaingetich | 0:68ca78749806 | 45 | if (lorawan.disable_adaptive_datarate() != LORAWAN_STATUS_OK) { |
kimutaingetich | 0:68ca78749806 | 46 | printf("[LNWK][ERR ] disable_adaptive_datarate failed!\n"); |
kimutaingetich | 0:68ca78749806 | 47 | return; |
kimutaingetich | 0:68ca78749806 | 48 | } |
kimutaingetich | 0:68ca78749806 | 49 | |
kimutaingetich | 0:68ca78749806 | 50 | lorawan.set_datarate(0); // SF12BW125 |
kimutaingetich | 0:68ca78749806 | 51 | |
kimutaingetich | 0:68ca78749806 | 52 | lorawan_connect_t connect_params; |
kimutaingetich | 0:68ca78749806 | 53 | connect_params.connect_type = LORAWAN_CONNECTION_ABP; |
kimutaingetich | 0:68ca78749806 | 54 | // connect_params.connection_u.otaa.dev_eui = DEV_EUI; |
kimutaingetich | 0:68ca78749806 | 55 | // connect_params.connection_u.otaa.app_eui = APP_EUI; |
kimutaingetich | 0:68ca78749806 | 56 | // connect_params.connection_u.otaa.app_key = APP_KEY; |
kimutaingetich | 0:68ca78749806 | 57 | // connect_params.connection_u.otaa.nb_trials = 3; |
kimutaingetich | 0:68ca78749806 | 58 | |
kimutaingetich | 0:68ca78749806 | 59 | connect_params.connection_u.abp.dev_addr = devAddr; |
kimutaingetich | 0:68ca78749806 | 60 | connect_params.connection_u.abp.nwk_skey = nwkSKey; |
kimutaingetich | 0:68ca78749806 | 61 | connect_params.connection_u.abp.app_skey = appSKey; |
kimutaingetich | 0:68ca78749806 | 62 | |
kimutaingetich | 0:68ca78749806 | 63 | lorawan_status_t retcode = lorawan.connect(connect_params); |
kimutaingetich | 0:68ca78749806 | 64 | |
kimutaingetich | 0:68ca78749806 | 65 | if (retcode == LORAWAN_STATUS_OK || |
kimutaingetich | 0:68ca78749806 | 66 | retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) { |
kimutaingetich | 0:68ca78749806 | 67 | } else { |
kimutaingetich | 0:68ca78749806 | 68 | printf("[LNWK][ERR ] Connection error, code = %d\n", retcode); |
kimutaingetich | 0:68ca78749806 | 69 | return; |
kimutaingetich | 0:68ca78749806 | 70 | } |
kimutaingetich | 0:68ca78749806 | 71 | |
kimutaingetich | 0:68ca78749806 | 72 | printf("[LNWK][INFO] Connection - In Progress...\n"); |
kimutaingetich | 0:68ca78749806 | 73 | } |
kimutaingetich | 0:68ca78749806 | 74 | |
kimutaingetich | 0:68ca78749806 | 75 | // This is called from RX_DONE, so whenever a message came in |
kimutaingetich | 0:68ca78749806 | 76 | static void receive_message() |
kimutaingetich | 0:68ca78749806 | 77 | { |
kimutaingetich | 0:68ca78749806 | 78 | uint8_t rx_buffer[50] = { 0 }; |
kimutaingetich | 0:68ca78749806 | 79 | int16_t retcode; |
kimutaingetich | 0:68ca78749806 | 80 | retcode = lorawan.receive(MBED_CONF_LORA_APP_PORT, rx_buffer, |
kimutaingetich | 0:68ca78749806 | 81 | sizeof(rx_buffer), |
kimutaingetich | 0:68ca78749806 | 82 | MSG_UNCONFIRMED_FLAG); |
kimutaingetich | 0:68ca78749806 | 83 | |
kimutaingetich | 0:68ca78749806 | 84 | if (retcode < 0) { |
kimutaingetich | 0:68ca78749806 | 85 | printf("[LNWK][WARN] receive() - Error code %d\n", retcode); |
kimutaingetich | 0:68ca78749806 | 86 | return; |
kimutaingetich | 0:68ca78749806 | 87 | } |
kimutaingetich | 0:68ca78749806 | 88 | |
kimutaingetich | 0:68ca78749806 | 89 | printf("[LNWK][INFO] Data received on port %d (length %d): ", MBED_CONF_LORA_APP_PORT, retcode); |
kimutaingetich | 0:68ca78749806 | 90 | |
kimutaingetich | 0:68ca78749806 | 91 | for (uint8_t i = 0; i < retcode; i++) { |
kimutaingetich | 0:68ca78749806 | 92 | printf("%02x ", rx_buffer[i]); |
kimutaingetich | 0:68ca78749806 | 93 | } |
kimutaingetich | 0:68ca78749806 | 94 | printf("\n"); |
kimutaingetich | 0:68ca78749806 | 95 | } |
kimutaingetich | 0:68ca78749806 | 96 | |
kimutaingetich | 0:68ca78749806 | 97 | // Event handler |
kimutaingetich | 0:68ca78749806 | 98 | bool lorawan_send(CayenneLPP *payload) { |
kimutaingetich | 0:68ca78749806 | 99 | int16_t retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, payload->getBuffer(), payload->getSize(), MSG_UNCONFIRMED_FLAG); |
kimutaingetich | 0:68ca78749806 | 100 | |
kimutaingetich | 0:68ca78749806 | 101 | // for some reason send() ret\urns -1... I cannot find out why, the stack returns the right number. I feel that this is some weird Emscripten quirk |
kimutaingetich | 0:68ca78749806 | 102 | if (retcode < 0) { |
kimutaingetich | 0:68ca78749806 | 103 | retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("[LNWK][WARN] send - duty cycle violation\n") |
kimutaingetich | 0:68ca78749806 | 104 | : printf("[LNWK][WARN] send() - Error code %d\n", retcode); |
kimutaingetich | 0:68ca78749806 | 105 | return false; |
kimutaingetich | 0:68ca78749806 | 106 | } |
kimutaingetich | 0:68ca78749806 | 107 | |
kimutaingetich | 0:68ca78749806 | 108 | printf("[LNWK][INFO] %d bytes scheduled for transmission\n", retcode); |
kimutaingetich | 0:68ca78749806 | 109 | return true; |
kimutaingetich | 0:68ca78749806 | 110 | } |
kimutaingetich | 0:68ca78749806 | 111 | |
kimutaingetich | 0:68ca78749806 | 112 | #endif // _LORAWAN_NETWORK_H_ |