BLE ADV Gateway, converts advertisement to proper JSON serial output

Dependencies:   BLE_API mbed mbedtls nRF51822

Committer:
electronichamsters
Date:
Sat Jul 29 22:03:27 2017 +0000
Revision:
12:30c6e83f0fe5
Parent:
11:d5edb6e3edab
Child:
13:e136665cf993
added spoof checking and match ADV format changes with sensor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
electronichamsters 11:d5edb6e3edab 1 /*
electronichamsters 9:1ea51b2048a8 2 Eric Tsai
electronichamsters 11:d5edb6e3edab 3
electronichamsters 11:d5edb6e3edab 4 7/29/2017: Added spoof checking using clock algorithm.
electronichamsters 12:30c6e83f0fe5 5 Changes:
electronichamsters 12:30c6e83f0fe5 6 1) Modify "Periodicity" to match sensors
electronichamsters 12:30c6e83f0fe5 7
electronichamsters 9:1ea51b2048a8 8
electronichamsters 11:d5edb6e3edab 9 */
electronichamsters 8:46c5e0bfab05 10
electronichamsters 9:1ea51b2048a8 11 #include "mbed.h"
electronichamsters 9:1ea51b2048a8 12 #include "ble/BLE.h"
electronichamsters 9:1ea51b2048a8 13 #include "mbedtls/aes.h"
electronichamsters 8:46c5e0bfab05 14
electronichamsters 8:46c5e0bfab05 15
electronichamsters 9:1ea51b2048a8 16 //comment out when done with debug uart, else eats batteries
electronichamsters 9:1ea51b2048a8 17 #define MyDebugEnb 0
sunsmile2015 0:3dc6e424dba0 18
electronichamsters 8:46c5e0bfab05 19
electronichamsters 11:d5edb6e3edab 20
electronichamsters 9:1ea51b2048a8 21 //DigitalOut led1(LED1, 1);
electronichamsters 9:1ea51b2048a8 22 Ticker ticker;
electronichamsters 8:46c5e0bfab05 23
electronichamsters 11:d5edb6e3edab 24 const uint16_t Periodicity = 180; //clock periodicity used for spoof checking, should be 1800 seconds for 30minutes
electronichamsters 11:d5edb6e3edab 25
electronichamsters 9:1ea51b2048a8 26 //aes stuff
electronichamsters 9:1ea51b2048a8 27 uint8_t src_buf[16] = {0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4};
electronichamsters 9:1ea51b2048a8 28 uint8_t des_buf[16] = {0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4};
electronichamsters 9:1ea51b2048a8 29 mbedtls_aes_context aes;
electronichamsters 9:1ea51b2048a8 30 unsigned char iv[16] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x1, 0x2}; //16-byte key
electronichamsters 9:1ea51b2048a8 31 size_t input_len = 16;
electronichamsters 9:1ea51b2048a8 32 size_t output_len = 0;
electronichamsters 9:1ea51b2048a8 33
electronichamsters 9:1ea51b2048a8 34 Serial device(p9, p11); //nRF51822 uart : TX=p9. RX=p11
electronichamsters 9:1ea51b2048a8 35
electronichamsters 11:d5edb6e3edab 36 //data structures for tracking wake time of BLE end nodes, for to prevent spoofing
electronichamsters 11:d5edb6e3edab 37 struct MAC_Birth_Record
electronichamsters 11:d5edb6e3edab 38 {
electronichamsters 11:d5edb6e3edab 39 uint8_t MAC_Addr[6]; //mac[0] is low order byte in mac address
electronichamsters 11:d5edb6e3edab 40 uint16_t MAC_Time; //The time of birth for this end node
electronichamsters 11:d5edb6e3edab 41 uint16_t Attempt_MAC_Time;
electronichamsters 11:d5edb6e3edab 42 uint8_t Attempt_Cnt;
electronichamsters 11:d5edb6e3edab 43 uint8_t Xmit_Cnt;
electronichamsters 11:d5edb6e3edab 44 };
electronichamsters 11:d5edb6e3edab 45 const uint8_t sizeOfSpoof = 50;
electronichamsters 11:d5edb6e3edab 46 MAC_Birth_Record Spoof_Check[sizeOfSpoof]; //array tracking end node birth times
electronichamsters 11:d5edb6e3edab 47 uint8_t Spoof_Ray_Tail = 0; //array index for next record
electronichamsters 11:d5edb6e3edab 48 uint8_t Received_MAC_Addr[6]; //mac[0] is low order byte in mac address
electronichamsters 11:d5edb6e3edab 49 uint16_t Received_MAC_Time;
electronichamsters 11:d5edb6e3edab 50 static Timer Gateway_Time;
electronichamsters 11:d5edb6e3edab 51 static uint16_t Expected_MAC_Time;
electronichamsters 11:d5edb6e3edab 52 uint8_t Received_Xmit_Cnt;
electronichamsters 11:d5edb6e3edab 53
electronichamsters 11:d5edb6e3edab 54
electronichamsters 11:d5edb6e3edab 55 const uint8_t ADVisUnknown = 0;
electronichamsters 11:d5edb6e3edab 56 const uint8_t ADVisNew = 1;
electronichamsters 11:d5edb6e3edab 57 const uint8_t ADVisDuplicate = 2;
electronichamsters 11:d5edb6e3edab 58 const uint8_t ADVisSpoof = 3;
electronichamsters 11:d5edb6e3edab 59
electronichamsters 11:d5edb6e3edab 60 //********************
electronichamsters 11:d5edb6e3edab 61 // Takes into account 30-minute clock, wrap arounds and edge cases
electronichamsters 11:d5edb6e3edab 62 // returns:
electronichamsters 11:d5edb6e3edab 63 // TRUE: if sensor's reported time lines up to gateway's recorded time
electronichamsters 11:d5edb6e3edab 64 // Expected_MAC_Time
electronichamsters 11:d5edb6e3edab 65 //*******************
electronichamsters 11:d5edb6e3edab 66 bool Is_Birth_Time_Correct (uint16_t gateway_mac_time, uint16_t sensor_mac_time, uint8_t margin)
electronichamsters 11:d5edb6e3edab 67 {
electronichamsters 11:d5edb6e3edab 68 bool return_val = 0;
electronichamsters 11:d5edb6e3edab 69 uint16_t current_time = (uint16_t)(Gateway_Time.read_ms()/1000);
electronichamsters 11:d5edb6e3edab 70 int16_t gateway_time_zone = current_time - sensor_mac_time;
electronichamsters 11:d5edb6e3edab 71
electronichamsters 11:d5edb6e3edab 72 if (current_time >= sensor_mac_time)
electronichamsters 11:d5edb6e3edab 73 {
electronichamsters 11:d5edb6e3edab 74 Expected_MAC_Time = current_time - sensor_mac_time;
electronichamsters 11:d5edb6e3edab 75 }
electronichamsters 11:d5edb6e3edab 76 else
electronichamsters 11:d5edb6e3edab 77 {
electronichamsters 11:d5edb6e3edab 78 Expected_MAC_Time = (Periodicity - sensor_mac_time + current_time);
electronichamsters 11:d5edb6e3edab 79 }
electronichamsters 11:d5edb6e3edab 80
electronichamsters 11:d5edb6e3edab 81 if (1) //check for count==0 situations
electronichamsters 11:d5edb6e3edab 82 {
electronichamsters 11:d5edb6e3edab 83 if ( (gateway_mac_time < (Expected_MAC_Time + margin)) && (gateway_mac_time > (Expected_MAC_Time - margin)) )
electronichamsters 11:d5edb6e3edab 84 {
electronichamsters 11:d5edb6e3edab 85 return_val = 1;
electronichamsters 11:d5edb6e3edab 86 }
electronichamsters 11:d5edb6e3edab 87 else
electronichamsters 11:d5edb6e3edab 88 {
electronichamsters 11:d5edb6e3edab 89 return_val = 0;
electronichamsters 11:d5edb6e3edab 90
electronichamsters 11:d5edb6e3edab 91 }
electronichamsters 11:d5edb6e3edab 92 }
electronichamsters 11:d5edb6e3edab 93
electronichamsters 11:d5edb6e3edab 94 /*
electronichamsters 11:d5edb6e3edab 95 //if positive, not a wrap around edge case
electronichamsters 11:d5edb6e3edab 96 //todo: take into account low count, indicates reset?
electronichamsters 11:d5edb6e3edab 97 if ((gateway_time_zone >= 0) && (1))
electronichamsters 11:d5edb6e3edab 98 {
electronichamsters 11:d5edb6e3edab 99 Expected_MAC_Time = gateway_time_zone;
electronichamsters 11:d5edb6e3edab 100 if ( (gateway_mac_time < (Expected_MAC_Time + margin)) && (gateway_mac_time > (Expected_MAC_Time - margin)) )
electronichamsters 11:d5edb6e3edab 101 {
electronichamsters 11:d5edb6e3edab 102 return_val = 1; //valid birth time
electronichamsters 11:d5edb6e3edab 103 }
electronichamsters 11:d5edb6e3edab 104
electronichamsters 11:d5edb6e3edab 105 }
electronichamsters 11:d5edb6e3edab 106 else //wrap around edge case, gateway_time_zone is negative
electronichamsters 11:d5edb6e3edab 107 {
electronichamsters 11:d5edb6e3edab 108 gateway_time_zone = (Periodicity - sensor_mac_time + current_time);
electronichamsters 11:d5edb6e3edab 109 Expected_MAC_Time = gateway_time_zone; //todo: 2 declarations??
electronichamsters 11:d5edb6e3edab 110 //if ( (Periodicity-gateway_mac_time)+current_time == sensor_mac_time) //wrong, need bands
electronichamsters 11:d5edb6e3edab 111 if ( (gateway_mac_time < (Expected_MAC_Time + margin)) && (gateway_mac_time > (Expected_MAC_Time - margin)) )
electronichamsters 11:d5edb6e3edab 112 {
electronichamsters 11:d5edb6e3edab 113 return_val = 1;
electronichamsters 11:d5edb6e3edab 114 }
electronichamsters 11:d5edb6e3edab 115 else
electronichamsters 11:d5edb6e3edab 116 {
electronichamsters 11:d5edb6e3edab 117 return_val = 0;
electronichamsters 11:d5edb6e3edab 118
electronichamsters 11:d5edb6e3edab 119 }
electronichamsters 11:d5edb6e3edab 120
electronichamsters 11:d5edb6e3edab 121 }
electronichamsters 11:d5edb6e3edab 122 */
electronichamsters 11:d5edb6e3edab 123 return return_val;
electronichamsters 11:d5edb6e3edab 124
electronichamsters 11:d5edb6e3edab 125 }//end Is_Birth_Time_Correct
electronichamsters 11:d5edb6e3edab 126
electronichamsters 11:d5edb6e3edab 127
electronichamsters 11:d5edb6e3edab 128
electronichamsters 11:d5edb6e3edab 129 /* **************************************
electronichamsters 11:d5edb6e3edab 130 check adv against birth records to detect spoofing
electronichamsters 11:d5edb6e3edab 131 add device to birth records if new
electronichamsters 11:d5edb6e3edab 132 returns
electronichamsters 11:d5edb6e3edab 133 TRUE: if device reported birth time matches real birth time
electronichamsters 11:d5edb6e3edab 134 if device is first encountered
electronichamsters 11:d5edb6e3edab 135 if X consecutive birth time matches
electronichamsters 11:d5edb6e3edab 136 FALSE: if device reported birth time does not match
electronichamsters 11:d5edb6e3edab 137
electronichamsters 11:d5edb6e3edab 138 ToDo: add attempts
electronichamsters 11:d5edb6e3edab 139 ToDo: wrap around of gateway clock not accounted for. Like if Gateway_Time.read_ms() - Received_MAC_Time < 0
electronichamsters 11:d5edb6e3edab 140 */
electronichamsters 11:d5edb6e3edab 141 uint8_t Is_Not_Spoofed ()
electronichamsters 8:46c5e0bfab05 142 {
electronichamsters 11:d5edb6e3edab 143 uint8_t return_val = ADVisUnknown;
electronichamsters 11:d5edb6e3edab 144 //iterate through all of birth records looking for one that matches MAC address
electronichamsters 11:d5edb6e3edab 145 for (int i=0; i<sizeOfSpoof; i++)
electronichamsters 11:d5edb6e3edab 146 {
electronichamsters 11:d5edb6e3edab 147 //Search for matching MAC address
electronichamsters 11:d5edb6e3edab 148 if (Spoof_Check[i].MAC_Addr[0] == Received_MAC_Addr[0] &&
electronichamsters 11:d5edb6e3edab 149 Spoof_Check[i].MAC_Addr[1] == Received_MAC_Addr[1] &&
electronichamsters 11:d5edb6e3edab 150 Spoof_Check[i].MAC_Addr[2] == Received_MAC_Addr[2] &&
electronichamsters 11:d5edb6e3edab 151 Spoof_Check[i].MAC_Addr[3] == Received_MAC_Addr[3] &&
electronichamsters 11:d5edb6e3edab 152 Spoof_Check[i].MAC_Addr[4] == Received_MAC_Addr[4] &&
electronichamsters 11:d5edb6e3edab 153 Spoof_Check[i].MAC_Addr[5] == Received_MAC_Addr[5])
electronichamsters 11:d5edb6e3edab 154 {
electronichamsters 11:d5edb6e3edab 155
electronichamsters 11:d5edb6e3edab 156
electronichamsters 11:d5edb6e3edab 157
electronichamsters 11:d5edb6e3edab 158 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 159 device.printf("found MAC address in array\r\n");
electronichamsters 11:d5edb6e3edab 160 device.printf(" Index = %d \r\n", i);
electronichamsters 11:d5edb6e3edab 161 device.printf(" MAC = %02x:%02x:%02x:%02x:%02x:%02x \r\n", Received_MAC_Addr[5],Received_MAC_Addr[4],Received_MAC_Addr[3],Received_MAC_Addr[2],Received_MAC_Addr[1],Received_MAC_Addr[0]);
electronichamsters 11:d5edb6e3edab 162 device.printf(" Received MAC Time = %d \r\n", Received_MAC_Time);
electronichamsters 11:d5edb6e3edab 163 device.printf(" Gateway time = %d \r\n", (uint16_t)(Gateway_Time.read_ms()/1000));
electronichamsters 11:d5edb6e3edab 164 device.printf(" Array.MAC_Time = %d \r\n", Spoof_Check[i].MAC_Time);
electronichamsters 11:d5edb6e3edab 165 device.printf(" Array.Attempt_MAC_Time = %d \r\n", Spoof_Check[i].Attempt_MAC_Time);
electronichamsters 11:d5edb6e3edab 166 device.printf(" Array.Attempt_Cnt = %d \r\n", Spoof_Check[i].Attempt_Cnt);
electronichamsters 11:d5edb6e3edab 167 device.printf(" Array.Xmit_Cnt = %d \r\n", Spoof_Check[i].Xmit_Cnt);
electronichamsters 11:d5edb6e3edab 168 device.printf(" expected time = %d \r\n", ((uint16_t)(Gateway_Time.read_ms()/1000)) - Received_MAC_Time);
electronichamsters 11:d5edb6e3edab 169 #endif
electronichamsters 11:d5edb6e3edab 170
electronichamsters 11:d5edb6e3edab 171 //calcuate the time of birth of this bluetooth module @ gateway time zone relative to received MAC_Time.
electronichamsters 11:d5edb6e3edab 172 //int16_t expected_mac_time = ((uint16_t)(Gateway_Time.read_ms()/1000)) - Received_MAC_Time;
electronichamsters 11:d5edb6e3edab 173 //uint16_t expected_mac_time = 0;
electronichamsters 11:d5edb6e3edab 174
electronichamsters 11:d5edb6e3edab 175
electronichamsters 11:d5edb6e3edab 176 //todo: this needs to be a POSITIVE VALUE, calculated by Is_MAC_Time_Correct();
electronichamsters 11:d5edb6e3edab 177
electronichamsters 11:d5edb6e3edab 178
electronichamsters 11:d5edb6e3edab 179 // ToDo: there's a bug here. Need to use count to figure out when it's a first-powered on device. Can't use time?
electronichamsters 11:d5edb6e3edab 180
electronichamsters 11:d5edb6e3edab 181 //*****
electronichamsters 11:d5edb6e3edab 182 // check primary Mac_Time
electronichamsters 11:d5edb6e3edab 183 //****
electronichamsters 11:d5edb6e3edab 184 if
electronichamsters 11:d5edb6e3edab 185 (
electronichamsters 11:d5edb6e3edab 186 Is_Birth_Time_Correct(Spoof_Check[i].MAC_Time, Received_MAC_Time, 3)
electronichamsters 11:d5edb6e3edab 187 )
electronichamsters 11:d5edb6e3edab 188 {
electronichamsters 11:d5edb6e3edab 189 if (Spoof_Check[i].Xmit_Cnt != Received_Xmit_Cnt)
electronichamsters 11:d5edb6e3edab 190 {
electronichamsters 11:d5edb6e3edab 191 return_val = ADVisNew; //MAC Time checks out and not duplicate
electronichamsters 11:d5edb6e3edab 192 Spoof_Check[i].MAC_Time = Expected_MAC_Time; //update birth time for this device.
electronichamsters 11:d5edb6e3edab 193 Spoof_Check[i].Xmit_Cnt = Received_Xmit_Cnt;
electronichamsters 11:d5edb6e3edab 194 //i = sizeOfSpoof; //exit for loop, we've found the MAC address. But can't do it this way.
electronichamsters 11:d5edb6e3edab 195 //ToDo: hey, what happens if the array holds entries w/ same MAC? Is that possible?
electronichamsters 11:d5edb6e3edab 196 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 197 device.printf("Pirmary MAC Time as expected...expected=%d...Spoof_mac_tmr=%d \r\n", Expected_MAC_Time, Spoof_Check[i].MAC_Time);
electronichamsters 11:d5edb6e3edab 198 #endif
electronichamsters 11:d5edb6e3edab 199 }
electronichamsters 11:d5edb6e3edab 200 else
electronichamsters 11:d5edb6e3edab 201 {
electronichamsters 11:d5edb6e3edab 202 return_val = ADVisDuplicate; //MAC Time checks out and is duplicate
electronichamsters 11:d5edb6e3edab 203 }
electronichamsters 11:d5edb6e3edab 204 }//if primary MAC_time match
electronichamsters 11:d5edb6e3edab 205 else
electronichamsters 11:d5edb6e3edab 206 {
electronichamsters 11:d5edb6e3edab 207 //*****
electronichamsters 11:d5edb6e3edab 208 // check secondary Mac_Time
electronichamsters 11:d5edb6e3edab 209 //****
electronichamsters 11:d5edb6e3edab 210 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 211 device.printf(" MAC Time No Match!!...expected=%d...Spoof_mac_tmr=%d \r\n", Expected_MAC_Time, Spoof_Check[i].MAC_Time);
electronichamsters 11:d5edb6e3edab 212
electronichamsters 11:d5edb6e3edab 213 #endif
electronichamsters 11:d5edb6e3edab 214
electronichamsters 11:d5edb6e3edab 215 //increment count if matches secondary
electronichamsters 11:d5edb6e3edab 216 //if ( (Spoof_Check[i].Attempt_MAC_Time < (expected_mac_time + 5)) && (Spoof_Check[i].Attempt_MAC_Time > (expected_mac_time - 5)) )
electronichamsters 11:d5edb6e3edab 217 if (Is_Birth_Time_Correct(Spoof_Check[i].Attempt_MAC_Time, Received_MAC_Time, 3))
electronichamsters 11:d5edb6e3edab 218 {
electronichamsters 11:d5edb6e3edab 219 if (Spoof_Check[i].Xmit_Cnt != Received_Xmit_Cnt)
electronichamsters 11:d5edb6e3edab 220 {
electronichamsters 11:d5edb6e3edab 221
electronichamsters 11:d5edb6e3edab 222 //Spoof_Check[i].Attempt_MAC_Time = expected_mac_time;
electronichamsters 11:d5edb6e3edab 223 Spoof_Check[i].Attempt_Cnt++;
electronichamsters 11:d5edb6e3edab 224 Spoof_Check[i].Xmit_Cnt = Received_Xmit_Cnt;
electronichamsters 11:d5edb6e3edab 225 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 226 device.printf(" Match on secondary, Attempt_Cnt= %d, Attempt_MAC_Time = %d, Expected_MAC_Time=%d \r\n", Spoof_Check[i].Attempt_Cnt, Spoof_Check[i].Attempt_MAC_Time, Expected_MAC_Time);
electronichamsters 11:d5edb6e3edab 227 #endif
electronichamsters 11:d5edb6e3edab 228 //this takes care of usecase where a module is reset after it's already been seen by gateway
electronichamsters 11:d5edb6e3edab 229 //after 3 consecutive correlated MAC_Time attempts we assume is our long lost friend and not a spoof.
electronichamsters 11:d5edb6e3edab 230 if (Spoof_Check[i].Attempt_Cnt >= 3)
electronichamsters 11:d5edb6e3edab 231 {
electronichamsters 11:d5edb6e3edab 232 return_val = ADVisNew;
electronichamsters 11:d5edb6e3edab 233
electronichamsters 11:d5edb6e3edab 234 //promote this MAC_Time to primary and start accepting data @ this MAC_Time
electronichamsters 11:d5edb6e3edab 235 Spoof_Check[i].MAC_Time = Expected_MAC_Time;
electronichamsters 11:d5edb6e3edab 236 Spoof_Check[i].Xmit_Cnt = Received_Xmit_Cnt;
electronichamsters 11:d5edb6e3edab 237 Spoof_Check[i].Attempt_Cnt = 0;
electronichamsters 11:d5edb6e3edab 238 }
electronichamsters 11:d5edb6e3edab 239 else //Received_MAC_Time matches Attempt, but not enough times to be considered as valid.
electronichamsters 11:d5edb6e3edab 240 {
electronichamsters 11:d5edb6e3edab 241 return_val = ADVisSpoof;
electronichamsters 11:d5edb6e3edab 242
electronichamsters 11:d5edb6e3edab 243 }
electronichamsters 11:d5edb6e3edab 244
electronichamsters 11:d5edb6e3edab 245
electronichamsters 11:d5edb6e3edab 246 }//is not duplicate, and transmit count matches
electronichamsters 11:d5edb6e3edab 247 else
electronichamsters 11:d5edb6e3edab 248 {
electronichamsters 11:d5edb6e3edab 249 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 250 device.printf(" is Duplicate , but matches Attempt_MAC_Time matches\r\n");
electronichamsters 11:d5edb6e3edab 251 #endif
electronichamsters 11:d5edb6e3edab 252 return_val = ADVisDuplicate;
electronichamsters 11:d5edb6e3edab 253 }
electronichamsters 11:d5edb6e3edab 254 } //Recevied MAC_Time matches secondary MAC_Time
electronichamsters 11:d5edb6e3edab 255 else
electronichamsters 11:d5edb6e3edab 256 {
electronichamsters 11:d5edb6e3edab 257 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 258 device.printf(" No Match on secondary either, ===setting return_val = Spoof ===\r\n");
electronichamsters 11:d5edb6e3edab 259 #endif
electronichamsters 11:d5edb6e3edab 260 return_val = ADVisSpoof; //it should still be zero, so this is just for clarification
electronichamsters 11:d5edb6e3edab 261 //at this point: MAC matches, MAC_Time doesn't match primary nor secondary.
electronichamsters 11:d5edb6e3edab 262 Spoof_Check[i].Attempt_Cnt = 0; //reset secondary count
electronichamsters 11:d5edb6e3edab 263
electronichamsters 11:d5edb6e3edab 264 }
electronichamsters 11:d5edb6e3edab 265 //update second backup regardless whether it matches exptected_mac_time matches secondary or not.
electronichamsters 11:d5edb6e3edab 266 Spoof_Check[i].Attempt_MAC_Time = Expected_MAC_Time;
electronichamsters 11:d5edb6e3edab 267 Spoof_Check[i].Xmit_Cnt = Received_Xmit_Cnt;
electronichamsters 11:d5edb6e3edab 268 }//if Primary MAC_Time doesn't match
electronichamsters 11:d5edb6e3edab 269
electronichamsters 11:d5edb6e3edab 270 break; //return_val tells us if this is a valid or not. Don't need to search through remainder of array
electronichamsters 11:d5edb6e3edab 271 }//if matching MAC address
electronichamsters 11:d5edb6e3edab 272 else //MAC doesn't match
electronichamsters 11:d5edb6e3edab 273 {
electronichamsters 11:d5edb6e3edab 274 //MAC doesn't match and we've searched through entire record
electronichamsters 11:d5edb6e3edab 275 //let's add this MAC as new, an initialze records to match this sensor
electronichamsters 11:d5edb6e3edab 276 if (i >= (sizeOfSpoof - 1)) //we've searched through entire array and didn't find this MAC
electronichamsters 11:d5edb6e3edab 277 {
electronichamsters 11:d5edb6e3edab 278 //we've searched through the entire array and didn't find this MAC address
electronichamsters 11:d5edb6e3edab 279 //add this MAC to array, and report this as valid MAC_Time
electronichamsters 11:d5edb6e3edab 280 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 281 device.printf("MAC not found, creating new at %d \r\n", Spoof_Ray_Tail);
electronichamsters 11:d5edb6e3edab 282 device.printf(" sizeOfSpoof=%d ... and i=%d \r\n", sizeOfSpoof, i);
electronichamsters 11:d5edb6e3edab 283 #endif
electronichamsters 11:d5edb6e3edab 284
electronichamsters 11:d5edb6e3edab 285 return_val = ADVisNew;
electronichamsters 11:d5edb6e3edab 286
electronichamsters 11:d5edb6e3edab 287 //create new entry for newly seen MAC @ tail
electronichamsters 11:d5edb6e3edab 288 // why refigure?? Spoof_Check[Spoof_Ray_Tail].MAC_Time = ((uint16_t)(Gateway_Time.read_ms()/1000)) - Received_MAC_Time;
electronichamsters 11:d5edb6e3edab 289 Spoof_Check[Spoof_Ray_Tail].MAC_Addr[0] = Received_MAC_Addr[0];
electronichamsters 11:d5edb6e3edab 290 Spoof_Check[Spoof_Ray_Tail].MAC_Addr[1] = Received_MAC_Addr[1];
electronichamsters 11:d5edb6e3edab 291 Spoof_Check[Spoof_Ray_Tail].MAC_Addr[2] = Received_MAC_Addr[2];
electronichamsters 11:d5edb6e3edab 292 Spoof_Check[Spoof_Ray_Tail].MAC_Addr[3] = Received_MAC_Addr[3];
electronichamsters 11:d5edb6e3edab 293 Spoof_Check[Spoof_Ray_Tail].MAC_Addr[4] = Received_MAC_Addr[4];
electronichamsters 11:d5edb6e3edab 294 Spoof_Check[Spoof_Ray_Tail].MAC_Addr[5] = Received_MAC_Addr[5];
electronichamsters 11:d5edb6e3edab 295 Spoof_Check[Spoof_Ray_Tail].Xmit_Cnt = Received_Xmit_Cnt;
electronichamsters 11:d5edb6e3edab 296
electronichamsters 11:d5edb6e3edab 297 //calculate Expected_MAC_Time
electronichamsters 11:d5edb6e3edab 298 Is_Birth_Time_Correct (0, Received_MAC_Time, 3);
electronichamsters 11:d5edb6e3edab 299 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 300 device.printf("Expected_MAC_Time should be %d \r\n", Expected_MAC_Time);
electronichamsters 11:d5edb6e3edab 301
electronichamsters 11:d5edb6e3edab 302 #endif
electronichamsters 11:d5edb6e3edab 303 Spoof_Check[Spoof_Ray_Tail].MAC_Time = Expected_MAC_Time; //wrong!!!
electronichamsters 11:d5edb6e3edab 304 Spoof_Check[Spoof_Ray_Tail].Xmit_Cnt = Received_Xmit_Cnt;
electronichamsters 11:d5edb6e3edab 305 Spoof_Check[Spoof_Ray_Tail].Attempt_Cnt = 0;
electronichamsters 11:d5edb6e3edab 306
electronichamsters 11:d5edb6e3edab 307 //increment tail pointer to next position or wrap around
electronichamsters 11:d5edb6e3edab 308 //todo: might not be using the last index position of this array, not sure. Doesn't matter IDK.
electronichamsters 11:d5edb6e3edab 309 if (Spoof_Ray_Tail >= (sizeOfSpoof-1) ) //FIFO at end of array, return to beginning
electronichamsters 11:d5edb6e3edab 310 {
electronichamsters 11:d5edb6e3edab 311 Spoof_Ray_Tail = 0;
electronichamsters 11:d5edb6e3edab 312 }
electronichamsters 11:d5edb6e3edab 313 else
electronichamsters 11:d5edb6e3edab 314 {
electronichamsters 11:d5edb6e3edab 315 Spoof_Ray_Tail++;
electronichamsters 11:d5edb6e3edab 316 }
electronichamsters 11:d5edb6e3edab 317
electronichamsters 11:d5edb6e3edab 318 }//end if loop at end of array
electronichamsters 11:d5edb6e3edab 319 }//end else not maching MAC
electronichamsters 11:d5edb6e3edab 320
electronichamsters 11:d5edb6e3edab 321 }//loop through Spoof_Check array
electronichamsters 11:d5edb6e3edab 322
electronichamsters 11:d5edb6e3edab 323
electronichamsters 11:d5edb6e3edab 324 return return_val;
electronichamsters 11:d5edb6e3edab 325 }//end Is_Not_Spoofed()
electronichamsters 11:d5edb6e3edab 326
electronichamsters 11:d5edb6e3edab 327
electronichamsters 11:d5edb6e3edab 328
electronichamsters 11:d5edb6e3edab 329
electronichamsters 11:d5edb6e3edab 330 void periodicCallback(void) //every 1800 seconds = 30 minutes, max for ticker.
electronichamsters 11:d5edb6e3edab 331 {
electronichamsters 11:d5edb6e3edab 332 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 333 device.printf("===== reset timer ===== \r\n");
electronichamsters 11:d5edb6e3edab 334 #endif
electronichamsters 9:1ea51b2048a8 335 //led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
electronichamsters 9:1ea51b2048a8 336 //device.printf("periodic 5...");
electronichamsters 9:1ea51b2048a8 337 //device.printf("\r\n");
electronichamsters 11:d5edb6e3edab 338 Gateway_Time.reset();
electronichamsters 11:d5edb6e3edab 339 }
electronichamsters 11:d5edb6e3edab 340
electronichamsters 11:d5edb6e3edab 341
electronichamsters 11:d5edb6e3edab 342 //with the current beacon, I see 3 valid advertisements per wake period with ambient other beacons. sometimes 4.
electronichamsters 11:d5edb6e3edab 343 //even with 2 phones broadcasting at 10Hz, still see 3 adv's.
electronichamsters 11:d5edb6e3edab 344 bool is_ours(const uint8_t * adv_data, const uint8_t * adv_address)
electronichamsters 11:d5edb6e3edab 345 {
electronichamsters 11:d5edb6e3edab 346 //if ((adv_data[5] == adv_address[3]) && (adv_data[6] == adv_address[2]) && (adv_data[7] == adv_address[1]) && (adv_data[8] == adv_address[0]))
electronichamsters 11:d5edb6e3edab 347 if ((adv_data[5] == adv_address[3]) && (adv_data[6] == adv_address[2]))
electronichamsters 11:d5edb6e3edab 348 return 1;
electronichamsters 11:d5edb6e3edab 349 else
electronichamsters 11:d5edb6e3edab 350 return 0;
electronichamsters 8:46c5e0bfab05 351 }
electronichamsters 8:46c5e0bfab05 352
electronichamsters 9:1ea51b2048a8 353 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) {
electronichamsters 8:46c5e0bfab05 354
electronichamsters 8:46c5e0bfab05 355
electronichamsters 9:1ea51b2048a8 356 //BLE MAC Address (6 bytes):
electronichamsters 9:1ea51b2048a8 357 // params->peerAddr[5]
electronichamsters 9:1ea51b2048a8 358 // params->peerAddr[4]
electronichamsters 9:1ea51b2048a8 359 // ...
electronichamsters 9:1ea51b2048a8 360 // params->peerAddr[0]
electronichamsters 9:1ea51b2048a8 361 //RSSI = params->rssi
electronichamsters 9:1ea51b2048a8 362 //Payload
electronichamsters 9:1ea51b2048a8 363 // params->advertisingData[#<advertisingDataLen]
electronichamsters 8:46c5e0bfab05 364
electronichamsters 8:46c5e0bfab05 365
electronichamsters 8:46c5e0bfab05 366
electronichamsters 9:1ea51b2048a8 367 // [<---MY DATA-->]
electronichamsters 9:1ea51b2048a8 368 //0x02 0x01 0x06 0x06 0xff D E C ? ?
electronichamsters 9:1ea51b2048a8 369 //0 1 2 3 4 5 6 7 8 9
electronichamsters 8:46c5e0bfab05 370
electronichamsters 9:1ea51b2048a8 371 if ( (params->advertisingDataLen) >= 8)
electronichamsters 9:1ea51b2048a8 372 {
electronichamsters 9:1ea51b2048a8 373 //if one of "ours", these UUID fields will be this value. Arbitrary "
electronichamsters 11:d5edb6e3edab 374
electronichamsters 11:d5edb6e3edab 375 //if ( (params->advertisingData[5] == 0x44) && (params->advertisingData[6] == 0x45) && (params->advertisingData[7]==0x43) )
electronichamsters 11:d5edb6e3edab 376 //if (is_ours(params->advertisingData[5],params->advertisingData[6],params->advertisingData[7], params->advertisingData[8], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0] ))
electronichamsters 11:d5edb6e3edab 377 if (is_ours(params->advertisingData, params->peerAddr))
electronichamsters 9:1ea51b2048a8 378 {
electronichamsters 11:d5edb6e3edab 379 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 380 device.printf("----------- ADV CAll Back -----------------\r\n ");
electronichamsters 11:d5edb6e3edab 381 #endif
electronichamsters 11:d5edb6e3edab 382 //**************
electronichamsters 11:d5edb6e3edab 383 // Decrypt data
electronichamsters 11:d5edb6e3edab 384 //**************
electronichamsters 11:d5edb6e3edab 385 //prep array for deciphering the encrypted portion of advertisement
electronichamsters 11:d5edb6e3edab 386 //device.printf("\r\n copy adv length: %d \r\n", params->advertisingDataLen); //always 31
electronichamsters 11:d5edb6e3edab 387 for (int i = 0; i<16; i++)
electronichamsters 11:d5edb6e3edab 388 {
electronichamsters 11:d5edb6e3edab 389 src_buf[i]=params->advertisingData[i+15];
electronichamsters 11:d5edb6e3edab 390 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 391 //device.printf("%x ", src_buf[i]);
electronichamsters 11:d5edb6e3edab 392 #endif
electronichamsters 11:d5edb6e3edab 393 }
electronichamsters 11:d5edb6e3edab 394 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 395 //device.printf("...\r\n ");
electronichamsters 11:d5edb6e3edab 396 #endif
electronichamsters 11:d5edb6e3edab 397
electronichamsters 11:d5edb6e3edab 398
electronichamsters 11:d5edb6e3edab 399 mbedtls_aes_crypt_ecb( &aes, MBEDTLS_AES_DECRYPT, src_buf, des_buf ); //execution time not an issue
electronichamsters 11:d5edb6e3edab 400
electronichamsters 11:d5edb6e3edab 401
electronichamsters 11:d5edb6e3edab 402 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 403
electronichamsters 11:d5edb6e3edab 404 //device.printf("decoded first 16 bytes \r\n");
electronichamsters 11:d5edb6e3edab 405 for (int i = 0; i<16; i++)
electronichamsters 11:d5edb6e3edab 406 {
electronichamsters 11:d5edb6e3edab 407 //device.printf("%02x", params->advertisingData[index]);
electronichamsters 11:d5edb6e3edab 408 if (i < 2)
electronichamsters 11:d5edb6e3edab 409 {
electronichamsters 11:d5edb6e3edab 410 //device.printf("%x ", des_buf[i]);
electronichamsters 11:d5edb6e3edab 411 }
electronichamsters 11:d5edb6e3edab 412 else
electronichamsters 11:d5edb6e3edab 413 {
electronichamsters 11:d5edb6e3edab 414 //device.printf("%c ", des_buf[i]);
electronichamsters 11:d5edb6e3edab 415 }
electronichamsters 11:d5edb6e3edab 416 }
electronichamsters 11:d5edb6e3edab 417 //device.printf("done----- \r\n");
electronichamsters 11:d5edb6e3edab 418 #endif
electronichamsters 11:d5edb6e3edab 419 //save MAC address
electronichamsters 11:d5edb6e3edab 420 Received_MAC_Addr[0] = params->peerAddr[0];
electronichamsters 11:d5edb6e3edab 421 Received_MAC_Addr[1] = params->peerAddr[1];
electronichamsters 11:d5edb6e3edab 422 Received_MAC_Addr[2] = params->peerAddr[2];
electronichamsters 11:d5edb6e3edab 423 Received_MAC_Addr[3] = params->peerAddr[3];
electronichamsters 11:d5edb6e3edab 424 Received_MAC_Addr[4] = params->peerAddr[4];
electronichamsters 11:d5edb6e3edab 425 Received_MAC_Addr[5] = params->peerAddr[5];
electronichamsters 11:d5edb6e3edab 426
electronichamsters 11:d5edb6e3edab 427 uint16_t beacon_timer = des_buf[0] | (des_buf[1] << 8); //it's a 2 byte uint little endian
electronichamsters 11:d5edb6e3edab 428 Received_MAC_Time = beacon_timer;
electronichamsters 11:d5edb6e3edab 429 Received_Xmit_Cnt = des_buf[2];
electronichamsters 11:d5edb6e3edab 430
electronichamsters 11:d5edb6e3edab 431
electronichamsters 11:d5edb6e3edab 432
electronichamsters 9:1ea51b2048a8 433 /*
electronichamsters 9:1ea51b2048a8 434 BLE Received from MAC C2F154BB0AF9
electronichamsters 9:1ea51b2048a8 435 volt:3.11,mag:1
electronichamsters 9:1ea51b2048a8 436
electronichamsters 9:1ea51b2048a8 437 uart-transmit:
electronichamsters 9:1ea51b2048a8 438 mac:C2F154BB0AF9,rssi:##,volt:3.11,mag:1
electronichamsters 9:1ea51b2048a8 439
electronichamsters 9:1ea51b2048a8 440 /ble/C2F154BB0AF9/rssi
electronichamsters 9:1ea51b2048a8 441 /ble/C2F154BB0AF9/1st_token
electronichamsters 9:1ea51b2048a8 442 /ble/c2F153
electronichamsters 9:1ea51b2048a8 443
electronichamsters 9:1ea51b2048a8 444 */
electronichamsters 9:1ea51b2048a8 445 /*
electronichamsters 9:1ea51b2048a8 446 device.printf("Adv peerAddr: [%02x%02x%02x%02x%02x%02x] rssi %d, ScanResp: %u, AdvType: %u\r\n",
electronichamsters 9:1ea51b2048a8 447 params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],
electronichamsters 9:1ea51b2048a8 448 params->rssi, params->isScanResponse, params->type);
electronichamsters 9:1ea51b2048a8 449 */
electronichamsters 9:1ea51b2048a8 450
electronichamsters 11:d5edb6e3edab 451 // punch out the data as json
electronichamsters 11:d5edb6e3edab 452 //---------------------------------------
electronichamsters 11:d5edb6e3edab 453 // 1. MAC and RSSI
electronichamsters 11:d5edb6e3edab 454 // "mac":xxxxxxxx,rssi:xx,
electronichamsters 11:d5edb6e3edab 455 //---------------------------------------
electronichamsters 11:d5edb6e3edab 456 uint8_t ADV_Result = Is_Not_Spoofed();
electronichamsters 11:d5edb6e3edab 457 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 458 device.printf("--------ADV_Result = %d", ADV_Result);
electronichamsters 11:d5edb6e3edab 459 #endif
electronichamsters 11:d5edb6e3edab 460
electronichamsters 11:d5edb6e3edab 461
electronichamsters 11:d5edb6e3edab 462 if (ADV_Result == ADVisNew)
electronichamsters 9:1ea51b2048a8 463 {
electronichamsters 11:d5edb6e3edab 464 device.printf("{\"mac\":\"%02x%02x%02x%02x%02x%02x\",\"rssi\":%d,",
electronichamsters 11:d5edb6e3edab 465 params->peerAddr[5],
electronichamsters 11:d5edb6e3edab 466 params->peerAddr[4],
electronichamsters 11:d5edb6e3edab 467 params->peerAddr[3],
electronichamsters 11:d5edb6e3edab 468 params->peerAddr[2],
electronichamsters 11:d5edb6e3edab 469 params->peerAddr[1],
electronichamsters 11:d5edb6e3edab 470 params->peerAddr[0],
electronichamsters 11:d5edb6e3edab 471 params->rssi
electronichamsters 11:d5edb6e3edab 472 );
electronichamsters 11:d5edb6e3edab 473 //mac:"c2f154bb0af9"
electronichamsters 11:d5edb6e3edab 474
electronichamsters 11:d5edb6e3edab 475 //---------------------------------------
electronichamsters 11:d5edb6e3edab 476 // 2. Volt
electronichamsters 11:d5edb6e3edab 477 // "volt":3.03,
electronichamsters 11:d5edb6e3edab 478 //---------------------------------------
electronichamsters 11:d5edb6e3edab 479 device.printf("\"volt\":%c%c%c%c,",
electronichamsters 11:d5edb6e3edab 480 params->advertisingData[9],
electronichamsters 11:d5edb6e3edab 481 params->advertisingData[10],
electronichamsters 11:d5edb6e3edab 482 params->advertisingData[11],
electronichamsters 11:d5edb6e3edab 483 params->advertisingData[12]);
electronichamsters 11:d5edb6e3edab 484
electronichamsters 11:d5edb6e3edab 485
electronichamsters 11:d5edb6e3edab 486
electronichamsters 11:d5edb6e3edab 487
electronichamsters 11:d5edb6e3edab 488 //---------------------------------------
electronichamsters 11:d5edb6e3edab 489 // 3. clock
electronichamsters 11:d5edb6e3edab 490 // "tmr":xxx,
electronichamsters 11:d5edb6e3edab 491 //---------------------------------------
electronichamsters 11:d5edb6e3edab 492 //print clock
electronichamsters 11:d5edb6e3edab 493 // "tmr":3232,
electronichamsters 11:d5edb6e3edab 494 //---------------------------------------
electronichamsters 11:d5edb6e3edab 495
electronichamsters 11:d5edb6e3edab 496 device.printf("\"tmr\":%d,", beacon_timer);
electronichamsters 11:d5edb6e3edab 497 //device.printf("\"tmr\":%d,", des_buf[0]);
electronichamsters 11:d5edb6e3edab 498 device.printf("\"xmit_cnt\":%d,", Received_Xmit_Cnt);
electronichamsters 11:d5edb6e3edab 499
electronichamsters 11:d5edb6e3edab 500 //---------------------------------------
electronichamsters 11:d5edb6e3edab 501 // 4. rest of payload as json
electronichamsters 11:d5edb6e3edab 502 // "tmr":xxx,
electronichamsters 11:d5edb6e3edab 503 //---------------------------------------
electronichamsters 11:d5edb6e3edab 504 for (int i = 3; i< 16; i++)
electronichamsters 9:1ea51b2048a8 505 {
electronichamsters 11:d5edb6e3edab 506 //device.printf("%02x", params->advertisingData[index]);
electronichamsters 11:d5edb6e3edab 507 device.printf("%c", des_buf[i]); //print as character
electronichamsters 9:1ea51b2048a8 508 }
electronichamsters 11:d5edb6e3edab 509
electronichamsters 11:d5edb6e3edab 510
electronichamsters 11:d5edb6e3edab 511
electronichamsters 11:d5edb6e3edab 512 /*
electronichamsters 11:d5edb6e3edab 513 for (unsigned index = 8; index < params->advertisingDataLen; index++)
electronichamsters 9:1ea51b2048a8 514 {
electronichamsters 9:1ea51b2048a8 515 //device.printf("%02x", params->advertisingData[index]);
electronichamsters 9:1ea51b2048a8 516 device.printf("%c", params->advertisingData[index]);
electronichamsters 11:d5edb6e3edab 517 }
electronichamsters 11:d5edb6e3edab 518 */
electronichamsters 11:d5edb6e3edab 519
electronichamsters 11:d5edb6e3edab 520 device.printf("}");
electronichamsters 11:d5edb6e3edab 521 device.printf("\r\n");
electronichamsters 11:d5edb6e3edab 522
electronichamsters 11:d5edb6e3edab 523 /*
electronichamsters 11:d5edb6e3edab 524 mac:c2f154bb0af9,rssi:-55,volt:3.05,mag:1
electronichamsters 11:d5edb6e3edab 525 mac:c2f154bb0af9,rssi:-67,volt:3.05,mag:1
electronichamsters 11:d5edb6e3edab 526 mac:c2f154bb0af9,rssi:-60,volt:3.07,mag:0
electronichamsters 11:d5edb6e3edab 527 */
electronichamsters 9:1ea51b2048a8 528 }
electronichamsters 11:d5edb6e3edab 529 if (ADV_Result == ADVisDuplicate)
electronichamsters 9:1ea51b2048a8 530 {
electronichamsters 11:d5edb6e3edab 531 device.printf("{\"mac\":\"%02x%02x%02x%02x%02x%02x\",\"duplicate\": %d}\r\n",
electronichamsters 11:d5edb6e3edab 532 params->peerAddr[5],
electronichamsters 11:d5edb6e3edab 533 params->peerAddr[4],
electronichamsters 11:d5edb6e3edab 534 params->peerAddr[3],
electronichamsters 11:d5edb6e3edab 535 params->peerAddr[2],
electronichamsters 11:d5edb6e3edab 536 params->peerAddr[1],
electronichamsters 11:d5edb6e3edab 537 params->peerAddr[0],
electronichamsters 11:d5edb6e3edab 538 ADV_Result);
electronichamsters 9:1ea51b2048a8 539 }
electronichamsters 11:d5edb6e3edab 540 if (ADV_Result == ADVisSpoof)
electronichamsters 11:d5edb6e3edab 541 {
electronichamsters 11:d5edb6e3edab 542 device.printf("{\"mac\":\"%02x%02x%02x%02x%02x%02x\",\"spoof\": %d}\r\n",
electronichamsters 11:d5edb6e3edab 543 params->peerAddr[5],
electronichamsters 11:d5edb6e3edab 544 params->peerAddr[4],
electronichamsters 11:d5edb6e3edab 545 params->peerAddr[3],
electronichamsters 11:d5edb6e3edab 546 params->peerAddr[2],
electronichamsters 11:d5edb6e3edab 547 params->peerAddr[1],
electronichamsters 11:d5edb6e3edab 548 params->peerAddr[0],
electronichamsters 11:d5edb6e3edab 549 ADV_Result);
electronichamsters 11:d5edb6e3edab 550 }
electronichamsters 11:d5edb6e3edab 551 if (ADV_Result == ADVisUnknown)
electronichamsters 11:d5edb6e3edab 552 {
electronichamsters 11:d5edb6e3edab 553 device.printf("{\"mac\":\"%02x%02x%02x%02x%02x%02x\",\"unknown\": %d}\r\n",
electronichamsters 11:d5edb6e3edab 554 params->peerAddr[5],
electronichamsters 11:d5edb6e3edab 555 params->peerAddr[4],
electronichamsters 11:d5edb6e3edab 556 params->peerAddr[3],
electronichamsters 11:d5edb6e3edab 557 params->peerAddr[2],
electronichamsters 11:d5edb6e3edab 558 params->peerAddr[1],
electronichamsters 11:d5edb6e3edab 559 params->peerAddr[0],
electronichamsters 11:d5edb6e3edab 560 ADV_Result);
electronichamsters 11:d5edb6e3edab 561 }
electronichamsters 9:1ea51b2048a8 562 }//end if it's our adv
electronichamsters 9:1ea51b2048a8 563 }//end if advertisingDataLen
electronichamsters 8:46c5e0bfab05 564
electronichamsters 11:d5edb6e3edab 565 }//end advertisementCallback
electronichamsters 8:46c5e0bfab05 566
electronichamsters 8:46c5e0bfab05 567
electronichamsters 8:46c5e0bfab05 568
andresag 7:0a8bbb6dea16 569 /**
electronichamsters 9:1ea51b2048a8 570 * This function is called when the ble initialization process has failed
andresag 7:0a8bbb6dea16 571 */
andresag 7:0a8bbb6dea16 572 void onBleInitError(BLE &ble, ble_error_t error)
andresag 7:0a8bbb6dea16 573 {
andresag 7:0a8bbb6dea16 574 /* Initialization error handling should go here */
electronichamsters 9:1ea51b2048a8 575 device.printf("periodic callback ");
electronichamsters 9:1ea51b2048a8 576 device.printf("\r\n");
andresag 7:0a8bbb6dea16 577 }
andresag 7:0a8bbb6dea16 578
andresag 7:0a8bbb6dea16 579 /**
andresag 7:0a8bbb6dea16 580 * Callback triggered when the ble initialization process has finished
andresag 7:0a8bbb6dea16 581 */
andresag 7:0a8bbb6dea16 582 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
sunsmile2015 2:b935358da5ba 583 {
andresag 7:0a8bbb6dea16 584 BLE& ble = params->ble;
andresag 7:0a8bbb6dea16 585 ble_error_t error = params->error;
andresag 7:0a8bbb6dea16 586
andresag 7:0a8bbb6dea16 587 if (error != BLE_ERROR_NONE) {
andresag 7:0a8bbb6dea16 588 /* In case of error, forward the error handling to onBleInitError */
andresag 7:0a8bbb6dea16 589 onBleInitError(ble, error);
andresag 7:0a8bbb6dea16 590 return;
andresag 7:0a8bbb6dea16 591 }
andresag 7:0a8bbb6dea16 592
andresag 7:0a8bbb6dea16 593 /* Ensure that it is the default instance of BLE */
andresag 7:0a8bbb6dea16 594 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
andresag 7:0a8bbb6dea16 595 return;
andresag 7:0a8bbb6dea16 596 }
electronichamsters 9:1ea51b2048a8 597
electronichamsters 9:1ea51b2048a8 598 // in ms. Duty cycle = (interval / window); 200ms/500ms = 40%
electronichamsters 9:1ea51b2048a8 599 ble.gap().setScanParams(500 /* scan interval */, 200 /* scan window */);
electronichamsters 9:1ea51b2048a8 600 ble.gap().startScan(advertisementCallback);
sunsmile2015 4:e5fa4c8838db 601 }
sunsmile2015 4:e5fa4c8838db 602
sunsmile2015 2:b935358da5ba 603 int main(void)
sunsmile2015 2:b935358da5ba 604 {
electronichamsters 11:d5edb6e3edab 605 for (int i=0; i<sizeOfSpoof; i++)
electronichamsters 11:d5edb6e3edab 606 {
electronichamsters 11:d5edb6e3edab 607 Spoof_Check[i].MAC_Addr[0]= 0;
electronichamsters 11:d5edb6e3edab 608 Spoof_Check[i].MAC_Addr[1]= 0;
electronichamsters 11:d5edb6e3edab 609 Spoof_Check[i].MAC_Addr[2]= 0;
electronichamsters 11:d5edb6e3edab 610 Spoof_Check[i].MAC_Time = 0;
electronichamsters 11:d5edb6e3edab 611 Spoof_Check[i].Attempt_MAC_Time = 0;
electronichamsters 11:d5edb6e3edab 612 Spoof_Check[i].Attempt_Cnt = 0;
electronichamsters 11:d5edb6e3edab 613 Spoof_Check[i].Attempt_Cnt = 0;
electronichamsters 11:d5edb6e3edab 614 Spoof_Check[i].Xmit_Cnt = 0;
electronichamsters 11:d5edb6e3edab 615 }
electronichamsters 11:d5edb6e3edab 616
electronichamsters 11:d5edb6e3edab 617 Gateway_Time.start();
electronichamsters 8:46c5e0bfab05 618 device.baud(9600);
electronichamsters 11:d5edb6e3edab 619 device.printf("started main 06 hashed observer... ");
electronichamsters 8:46c5e0bfab05 620 device.printf("\r\n");
electronichamsters 11:d5edb6e3edab 621 ticker.attach(periodicCallback, Periodicity);
electronichamsters 8:46c5e0bfab05 622
electronichamsters 9:1ea51b2048a8 623 //mbedtls_aes_init(&aes);
electronichamsters 9:1ea51b2048a8 624 mbedtls_aes_setkey_dec( &aes, iv, 128 );
electronichamsters 9:1ea51b2048a8 625 //mbedtls_aes_crypt_ecb( &aes, MBEDTLS_AES_DECRYPT, input, output );
sunsmile2015 0:3dc6e424dba0 626
andresag 7:0a8bbb6dea16 627 BLE &ble = BLE::Instance();
andresag 7:0a8bbb6dea16 628 ble.init(bleInitComplete);
rgrover1 5:f4d74a8cad43 629
sunsmile2015 0:3dc6e424dba0 630 while (true) {
electronichamsters 9:1ea51b2048a8 631 ble.waitForEvent();
electronichamsters 9:1ea51b2048a8 632 }
electronichamsters 9:1ea51b2048a8 633 }