SW encryption

Committer:
liamcox94
Date:
Tue Apr 30 03:03:03 2019 +0000
Revision:
49:3b27f622a798
Parent:
48:b2afcf2d41fb
Dissertation final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:7037ed05f54f 1 #include <stdio.h>
liamcox94 48:b2afcf2d41fb 2 #include <iostream>
mbed_official 3:8c7198d1a2a1 3
mbed_official 0:7037ed05f54f 4 #include "lorawan/LoRaWANInterface.h"
mbed_official 0:7037ed05f54f 5 #include "lorawan/system/lorawan_data_structures.h"
mbed_official 0:7037ed05f54f 6 #include "events/EventQueue.h"
mbed_official 0:7037ed05f54f 7
mbed_official 0:7037ed05f54f 8 // Application helpers
mbed_official 0:7037ed05f54f 9 #include "DummySensor.h"
mbed_official 0:7037ed05f54f 10 #include "trace_helper.h"
mbed_official 0:7037ed05f54f 11 #include "lora_radio_helper.h"
mbed_official 0:7037ed05f54f 12
liamcox94 48:b2afcf2d41fb 13 #include "sha256.h"
liamcox94 48:b2afcf2d41fb 14
mbed_official 0:7037ed05f54f 15 using namespace events;
mbed_official 0:7037ed05f54f 16
mbed_official 12:5015dfead3f2 17 // Max payload size can be LORAMAC_PHY_MAXPAYLOAD.
mbed_official 12:5015dfead3f2 18 // This example only communicates with much shorter messages (<30 bytes).
mbed_official 12:5015dfead3f2 19 // If longer messages are used, these buffers must be changed accordingly.
liamcox94 49:3b27f622a798 20 uint8_t tx_buffer[128];
liamcox94 49:3b27f622a798 21 uint8_t rx_buffer[128];
mbed_official 0:7037ed05f54f 22
mbed_official 0:7037ed05f54f 23 /*
mbed_official 0:7037ed05f54f 24 * Sets up an application dependent transmission timer in ms. Used only when Duty Cycling is off for testing
mbed_official 0:7037ed05f54f 25 */
mbed_official 0:7037ed05f54f 26 #define TX_TIMER 10000
mbed_official 0:7037ed05f54f 27
mbed_official 0:7037ed05f54f 28 /**
mbed_official 0:7037ed05f54f 29 * Maximum number of events for the event queue.
mbed_official 12:5015dfead3f2 30 * 10 is the safe number for the stack events, however, if application
mbed_official 0:7037ed05f54f 31 * also uses the queue for whatever purposes, this number should be increased.
mbed_official 0:7037ed05f54f 32 */
mbed_official 12:5015dfead3f2 33 #define MAX_NUMBER_OF_EVENTS 10
mbed_official 0:7037ed05f54f 34
mbed_official 0:7037ed05f54f 35 /**
mbed_official 0:7037ed05f54f 36 * Maximum number of retries for CONFIRMED messages before giving up
mbed_official 0:7037ed05f54f 37 */
mbed_official 0:7037ed05f54f 38 #define CONFIRMED_MSG_RETRY_COUNTER 3
mbed_official 0:7037ed05f54f 39
mbed_official 0:7037ed05f54f 40 /**
mbed_official 0:7037ed05f54f 41 * Dummy pin for dummy sensor
mbed_official 0:7037ed05f54f 42 */
mbed_official 0:7037ed05f54f 43 #define PC_9 0
mbed_official 0:7037ed05f54f 44
mbed_official 0:7037ed05f54f 45 /**
mbed_official 0:7037ed05f54f 46 * Dummy sensor class object
mbed_official 0:7037ed05f54f 47 */
mbed_official 0:7037ed05f54f 48 DS1820 ds1820(PC_9);
mbed_official 0:7037ed05f54f 49
mbed_official 0:7037ed05f54f 50 /**
mbed_official 0:7037ed05f54f 51 * This event queue is the global event queue for both the
mbed_official 0:7037ed05f54f 52 * application and stack. To conserve memory, the stack is designed to run
mbed_official 0:7037ed05f54f 53 * in the same thread as the application and the application is responsible for
mbed_official 0:7037ed05f54f 54 * providing an event queue to the stack that will be used for ISR deferment as
mbed_official 0:7037ed05f54f 55 * well as application information event queuing.
mbed_official 0:7037ed05f54f 56 */
mbed_official 46:a124538e2891 57 static EventQueue ev_queue(MAX_NUMBER_OF_EVENTS *EVENTS_EVENT_SIZE);
mbed_official 0:7037ed05f54f 58
mbed_official 0:7037ed05f54f 59 /**
mbed_official 0:7037ed05f54f 60 * Event handler.
mbed_official 0:7037ed05f54f 61 *
mbed_official 0:7037ed05f54f 62 * This will be passed to the LoRaWAN stack to queue events for the
mbed_official 0:7037ed05f54f 63 * application which in turn drive the application.
mbed_official 0:7037ed05f54f 64 */
mbed_official 0:7037ed05f54f 65 static void lora_event_handler(lorawan_event_t event);
mbed_official 0:7037ed05f54f 66
mbed_official 0:7037ed05f54f 67 /**
mbed_official 46:a124538e2891 68 * Constructing Mbed LoRaWANInterface and passing it the radio object from lora_radio_helper.
mbed_official 0:7037ed05f54f 69 */
mbed_official 2:dc95ac6d6d4e 70 static LoRaWANInterface lorawan(radio);
mbed_official 0:7037ed05f54f 71
mbed_official 0:7037ed05f54f 72 /**
mbed_official 0:7037ed05f54f 73 * Application specific callbacks
mbed_official 0:7037ed05f54f 74 */
mbed_official 0:7037ed05f54f 75 static lorawan_app_callbacks_t callbacks;
mbed_official 0:7037ed05f54f 76
mbed_official 0:7037ed05f54f 77 /**
mbed_official 0:7037ed05f54f 78 * Entry point for application
mbed_official 0:7037ed05f54f 79 */
mbed_official 46:a124538e2891 80 int main(void)
mbed_official 0:7037ed05f54f 81 {
mbed_official 0:7037ed05f54f 82 // setup tracing
mbed_official 0:7037ed05f54f 83 setup_trace();
mbed_official 0:7037ed05f54f 84
mbed_official 0:7037ed05f54f 85 // stores the status of a call to LoRaWAN protocol
liamcox94 48:b2afcf2d41fb 86 lorawan_status_t loraStatus;
mbed_official 0:7037ed05f54f 87
mbed_official 0:7037ed05f54f 88 // Initialize LoRaWAN stack
mbed_official 2:dc95ac6d6d4e 89 if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) {
mbed_official 0:7037ed05f54f 90 printf("\r\n LoRa initialization failed! \r\n");
mbed_official 0:7037ed05f54f 91 return -1;
mbed_official 0:7037ed05f54f 92 }
mbed_official 0:7037ed05f54f 93
mbed_official 0:7037ed05f54f 94 printf("\r\n Mbed LoRaWANStack initialized \r\n");
mbed_official 0:7037ed05f54f 95
mbed_official 0:7037ed05f54f 96 // prepare application callbacks
mbed_official 0:7037ed05f54f 97 callbacks.events = mbed::callback(lora_event_handler);
mbed_official 2:dc95ac6d6d4e 98 lorawan.add_app_callbacks(&callbacks);
mbed_official 0:7037ed05f54f 99
mbed_official 0:7037ed05f54f 100 // Set number of retries in case of CONFIRMED messages
mbed_official 2:dc95ac6d6d4e 101 if (lorawan.set_confirmed_msg_retries(CONFIRMED_MSG_RETRY_COUNTER)
mbed_official 46:a124538e2891 102 != LORAWAN_STATUS_OK) {
mbed_official 0:7037ed05f54f 103 printf("\r\n set_confirmed_msg_retries failed! \r\n\r\n");
mbed_official 0:7037ed05f54f 104 return -1;
mbed_official 0:7037ed05f54f 105 }
mbed_official 0:7037ed05f54f 106
mbed_official 0:7037ed05f54f 107 printf("\r\n CONFIRMED message retries : %d \r\n",
mbed_official 0:7037ed05f54f 108 CONFIRMED_MSG_RETRY_COUNTER);
mbed_official 0:7037ed05f54f 109
mbed_official 0:7037ed05f54f 110 // Enable adaptive data rate
mbed_official 2:dc95ac6d6d4e 111 if (lorawan.enable_adaptive_datarate() != LORAWAN_STATUS_OK) {
mbed_official 0:7037ed05f54f 112 printf("\r\n enable_adaptive_datarate failed! \r\n");
mbed_official 0:7037ed05f54f 113 return -1;
mbed_official 0:7037ed05f54f 114 }
mbed_official 0:7037ed05f54f 115
mbed_official 0:7037ed05f54f 116 printf("\r\n Adaptive data rate (ADR) - Enabled \r\n");
mbed_official 0:7037ed05f54f 117
liamcox94 48:b2afcf2d41fb 118 loraStatus = lorawan.connect();
mbed_official 0:7037ed05f54f 119
liamcox94 48:b2afcf2d41fb 120 if (loraStatus == LORAWAN_STATUS_OK ||
liamcox94 48:b2afcf2d41fb 121 loraStatus == LORAWAN_STATUS_CONNECT_IN_PROGRESS) {
mbed_official 0:7037ed05f54f 122 } else {
liamcox94 48:b2afcf2d41fb 123 printf("\r\n Connection error, code = %d \r\n", loraStatus);
mbed_official 0:7037ed05f54f 124 return -1;
mbed_official 0:7037ed05f54f 125 }
mbed_official 0:7037ed05f54f 126 printf("\r\n Connection - In Progress ...\r\n");
mbed_official 0:7037ed05f54f 127
mbed_official 0:7037ed05f54f 128 // make your event queue dispatching events forever
mbed_official 0:7037ed05f54f 129 ev_queue.dispatch_forever();
mbed_official 3:8c7198d1a2a1 130
mbed_official 3:8c7198d1a2a1 131 return 0;
mbed_official 0:7037ed05f54f 132 }
mbed_official 0:7037ed05f54f 133
mbed_official 0:7037ed05f54f 134 /**
mbed_official 0:7037ed05f54f 135 * Sends a message to the Network Server
mbed_official 0:7037ed05f54f 136 */
liamcox94 48:b2afcf2d41fb 137 static void send_message() {
liamcox94 48:b2afcf2d41fb 138 uint16_t packet_cont;
liamcox94 48:b2afcf2d41fb 139 int16_t loraStatus;
liamcox94 49:3b27f622a798 140 uint8_t hash_content;
liamcox94 49:3b27f622a798 141 uint8_t sensor_val;
liamcox94 48:b2afcf2d41fb 142 unsigned char output[32];
liamcox94 49:3b27f622a798 143
liamcox94 49:3b27f622a798 144 //Begin sensor
liamcox94 49:3b27f622a798 145 if (ds1820.begin()) {
liamcox94 49:3b27f622a798 146 ds1820.startConversion();
liamcox94 49:3b27f622a798 147 sensor_val = ds1820.read();
liamcox94 49:3b27f622a798 148 ds1820.startConversion();
liamcox94 49:3b27f622a798 149 } else {
liamcox94 49:3b27f622a798 150 printf("\r\n No sensor found \r\n");
liamcox94 49:3b27f622a798 151 return;
liamcox94 49:3b27f622a798 152 }
mbed_official 0:7037ed05f54f 153
liamcox94 49:3b27f622a798 154 hash_content = sensor_val; //Assign sensor value to hash_content
liamcox94 49:3b27f622a798 155 printf("\r\n %d sensor value \r\n", hash_content); //print to check value
liamcox94 49:3b27f622a798 156 char hash_str[] = ""; //create new char array
liamcox94 49:3b27f622a798 157 sprintf(hash_str, "%d", hash_content); //put value into new char array
liamcox94 48:b2afcf2d41fb 158
liamcox94 49:3b27f622a798 159 static const unsigned char * hash_buffer = (const unsigned char * ) hash_str; //cast char array to const unsigned char
liamcox94 49:3b27f622a798 160 static const size_t hash_len = strlen(hash_str); //get size of message
liamcox94 48:b2afcf2d41fb 161
liamcox94 49:3b27f622a798 162
liamcox94 49:3b27f622a798 163 mbedtls_sha256(hash_buffer, hash_len, output, 0); //hash message
mbed_official 0:7037ed05f54f 164
liamcox94 49:3b27f622a798 165 const char * c = (const char * ) output; //put hashed message into char
mbed_official 0:7037ed05f54f 166
liamcox94 49:3b27f622a798 167 packet_cont = sprintf((char * ) tx_buffer, "%d%s",hash_content , c); //build message with original value + hashed message
liamcox94 49:3b27f622a798 168
liamcox94 49:3b27f622a798 169 loraStatus = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_cont, //send message
liamcox94 48:b2afcf2d41fb 170 MSG_UNCONFIRMED_FLAG);
liamcox94 48:b2afcf2d41fb 171
liamcox94 49:3b27f622a798 172 if (loraStatus < 0) { //perform checks to confirm message is sent
liamcox94 48:b2afcf2d41fb 173 loraStatus == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - WOULD BLOCK\r\n") :
liamcox94 49:3b27f622a798 174 printf("\r\n send() - Error code %d \r\n", loraStatus);
liamcox94 48:b2afcf2d41fb 175 return;
liamcox94 48:b2afcf2d41fb 176 }
mbed_official 0:7037ed05f54f 177
liamcox94 49:3b27f622a798 178 printf("\r\n %d bytes scheduled for transmission \r\n", loraStatus); //print if successful and clear tx buffer
liamcox94 48:b2afcf2d41fb 179 memset(tx_buffer, 0, sizeof(tx_buffer));
mbed_official 0:7037ed05f54f 180 }
mbed_official 0:7037ed05f54f 181 /**
mbed_official 0:7037ed05f54f 182 * Receive a message from the Network Server
mbed_official 0:7037ed05f54f 183 */
mbed_official 0:7037ed05f54f 184 static void receive_message()
mbed_official 0:7037ed05f54f 185 {
mbed_official 47:b6d132f1079f 186 uint8_t port;
mbed_official 47:b6d132f1079f 187 int flags;
mbed_official 47:b6d132f1079f 188 int16_t retcode = lorawan.receive(rx_buffer, sizeof(rx_buffer), port, flags);
mbed_official 0:7037ed05f54f 189
mbed_official 0:7037ed05f54f 190 if (retcode < 0) {
mbed_official 0:7037ed05f54f 191 printf("\r\n receive() - Error code %d \r\n", retcode);
mbed_official 0:7037ed05f54f 192 return;
mbed_official 0:7037ed05f54f 193 }
mbed_official 0:7037ed05f54f 194
mbed_official 47:b6d132f1079f 195 printf(" RX Data on port %u (%d bytes): ", port, retcode);
mbed_official 0:7037ed05f54f 196 for (uint8_t i = 0; i < retcode; i++) {
mbed_official 47:b6d132f1079f 197 printf("%02x ", rx_buffer[i]);
mbed_official 0:7037ed05f54f 198 }
mbed_official 47:b6d132f1079f 199 printf("\r\n");
mbed_official 47:b6d132f1079f 200
mbed_official 12:5015dfead3f2 201 memset(rx_buffer, 0, sizeof(rx_buffer));
mbed_official 0:7037ed05f54f 202 }
mbed_official 0:7037ed05f54f 203
mbed_official 0:7037ed05f54f 204 /**
mbed_official 0:7037ed05f54f 205 * Event handler
mbed_official 0:7037ed05f54f 206 */
mbed_official 0:7037ed05f54f 207 static void lora_event_handler(lorawan_event_t event)
mbed_official 0:7037ed05f54f 208 {
mbed_official 0:7037ed05f54f 209 switch (event) {
mbed_official 0:7037ed05f54f 210 case CONNECTED:
mbed_official 0:7037ed05f54f 211 printf("\r\n Connection - Successful \r\n");
mbed_official 0:7037ed05f54f 212 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 0:7037ed05f54f 213 send_message();
mbed_official 0:7037ed05f54f 214 } else {
mbed_official 0:7037ed05f54f 215 ev_queue.call_every(TX_TIMER, send_message);
mbed_official 0:7037ed05f54f 216 }
mbed_official 0:7037ed05f54f 217
mbed_official 0:7037ed05f54f 218 break;
mbed_official 0:7037ed05f54f 219 case DISCONNECTED:
mbed_official 0:7037ed05f54f 220 ev_queue.break_dispatch();
mbed_official 0:7037ed05f54f 221 printf("\r\n Disconnected Successfully \r\n");
mbed_official 0:7037ed05f54f 222 break;
mbed_official 0:7037ed05f54f 223 case TX_DONE:
mbed_official 0:7037ed05f54f 224 printf("\r\n Message Sent to Network Server \r\n");
mbed_official 0:7037ed05f54f 225 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 0:7037ed05f54f 226 send_message();
mbed_official 0:7037ed05f54f 227 }
mbed_official 0:7037ed05f54f 228 break;
mbed_official 0:7037ed05f54f 229 case TX_TIMEOUT:
mbed_official 0:7037ed05f54f 230 case TX_ERROR:
mbed_official 0:7037ed05f54f 231 case TX_CRYPTO_ERROR:
mbed_official 0:7037ed05f54f 232 case TX_SCHEDULING_ERROR:
mbed_official 0:7037ed05f54f 233 printf("\r\n Transmission Error - EventCode = %d \r\n", event);
mbed_official 0:7037ed05f54f 234 // try again
mbed_official 0:7037ed05f54f 235 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 0:7037ed05f54f 236 send_message();
mbed_official 0:7037ed05f54f 237 }
mbed_official 0:7037ed05f54f 238 break;
mbed_official 0:7037ed05f54f 239 case RX_DONE:
mbed_official 0:7037ed05f54f 240 printf("\r\n Received message from Network Server \r\n");
mbed_official 0:7037ed05f54f 241 receive_message();
mbed_official 0:7037ed05f54f 242 break;
mbed_official 0:7037ed05f54f 243 case RX_TIMEOUT:
mbed_official 0:7037ed05f54f 244 case RX_ERROR:
mbed_official 0:7037ed05f54f 245 printf("\r\n Error in reception - Code = %d \r\n", event);
mbed_official 0:7037ed05f54f 246 break;
mbed_official 0:7037ed05f54f 247 case JOIN_FAILURE:
mbed_official 0:7037ed05f54f 248 printf("\r\n OTAA Failed - Check Keys \r\n");
mbed_official 0:7037ed05f54f 249 break;
mbed_official 26:f07f5febf97f 250 case UPLINK_REQUIRED:
mbed_official 26:f07f5febf97f 251 printf("\r\n Uplink required by NS \r\n");
mbed_official 26:f07f5febf97f 252 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 26:f07f5febf97f 253 send_message();
mbed_official 26:f07f5febf97f 254 }
mbed_official 26:f07f5febf97f 255 break;
mbed_official 0:7037ed05f54f 256 default:
mbed_official 0:7037ed05f54f 257 MBED_ASSERT("Unknown Event");
mbed_official 0:7037ed05f54f 258 }
mbed_official 0:7037ed05f54f 259 }
mbed_official 0:7037ed05f54f 260
liamcox94 48:b2afcf2d41fb 261 // EOF