2018-10-22: This is a temporary repository to fix issue mbed OS issue 8344. I'm reverting to an earlier mbed revision that isn't messed up. Expect mbed to fix the linker issue in the next release and I'll remove this repository. I havne't tested the code at this revision - sorry!

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 }