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
main.cpp@10:9db2ac7e1eea, 2017-07-10 (annotated)
- Committer:
- electronichamsters
- Date:
- Mon Jul 10 04:20:46 2017 +0000
- Revision:
- 10:9db2ac7e1eea
- Parent:
- 9:1ea51b2048a8
- Child:
- 11:d5edb6e3edab
working gateway
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
electronichamsters | 9:1ea51b2048a8 | 1 | /* |
electronichamsters | 8:46c5e0bfab05 | 2 | |
electronichamsters | 9:1ea51b2048a8 | 3 | |
electronichamsters | 9:1ea51b2048a8 | 4 | Eric Tsai |
electronichamsters | 10:9db2ac7e1eea | 5 | BLE Gateway to bridge sensor data. Works. |
electronichamsters | 9:1ea51b2048a8 | 6 | Scans for advertisements and captures the ones identified as mine |
electronichamsters | 9:1ea51b2048a8 | 7 | Takes UUID fields and injects the MAC and RSSI data. Assumes UUID JSON data. |
electronichamsters | 8:46c5e0bfab05 | 8 | |
electronichamsters | 8:46c5e0bfab05 | 9 | |
electronichamsters | 8:46c5e0bfab05 | 10 | |
electronichamsters | 9:1ea51b2048a8 | 11 | ---------------------------------------------- |
electronichamsters | 9:1ea51b2048a8 | 12 | |
electronichamsters | 9:1ea51b2048a8 | 13 | |
electronichamsters | 9:1ea51b2048a8 | 14 | Example output: |
electronichamsters | 9:1ea51b2048a8 | 15 | {"mac":"c56e806d7cfb","rssi":-54,"volt":3.01,"mag/p":2} |
electronichamsters | 9:1ea51b2048a8 | 16 | added timer |
electronichamsters | 9:1ea51b2048a8 | 17 | {"mac":"c56e806d7cfb","rssi":-54,"tmr":3232,"volt":3.01,"mag/p":2} |
electronichamsters | 9:1ea51b2048a8 | 18 | {"mac":"c2f154bb0af9","rssi":-76,"tmr":250,"volt":3.14,"mag/p":1} |
electronichamsters | 8:46c5e0bfab05 | 19 | |
electronichamsters | 9:1ea51b2048a8 | 20 | todo: hash MAC to create unique identifiers for sensors seen as "mine" |
electronichamsters | 9:1ea51b2048a8 | 21 | todo: create search for ensure gateway only accepts tmr values that match, else |
electronichamsters | 9:1ea51b2048a8 | 22 | are consecutive transmits in case we miss power up transmit. |
electronichamsters | 9:1ea51b2048a8 | 23 | */ |
electronichamsters | 8:46c5e0bfab05 | 24 | |
electronichamsters | 9:1ea51b2048a8 | 25 | #include "mbed.h" |
electronichamsters | 9:1ea51b2048a8 | 26 | #include "ble/BLE.h" |
electronichamsters | 9:1ea51b2048a8 | 27 | #include "mbedtls/aes.h" |
electronichamsters | 8:46c5e0bfab05 | 28 | |
electronichamsters | 8:46c5e0bfab05 | 29 | |
electronichamsters | 9:1ea51b2048a8 | 30 | //comment out when done with debug uart, else eats batteries |
electronichamsters | 9:1ea51b2048a8 | 31 | #define MyDebugEnb 0 |
sunsmile2015 | 0:3dc6e424dba0 | 32 | |
electronichamsters | 8:46c5e0bfab05 | 33 | |
electronichamsters | 9:1ea51b2048a8 | 34 | //DigitalOut led1(LED1, 1); |
electronichamsters | 9:1ea51b2048a8 | 35 | Ticker ticker; |
electronichamsters | 8:46c5e0bfab05 | 36 | |
electronichamsters | 9:1ea51b2048a8 | 37 | //aes stuff |
electronichamsters | 9:1ea51b2048a8 | 38 | uint8_t src_buf[16] = {0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4}; |
electronichamsters | 9:1ea51b2048a8 | 39 | uint8_t des_buf[16] = {0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4}; |
electronichamsters | 9:1ea51b2048a8 | 40 | |
electronichamsters | 9:1ea51b2048a8 | 41 | mbedtls_aes_context aes; |
electronichamsters | 9:1ea51b2048a8 | 42 | |
electronichamsters | 9:1ea51b2048a8 | 43 | 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 | 44 | size_t input_len = 16; |
electronichamsters | 9:1ea51b2048a8 | 45 | size_t output_len = 0; |
electronichamsters | 9:1ea51b2048a8 | 46 | |
electronichamsters | 9:1ea51b2048a8 | 47 | Serial device(p9, p11); //nRF51822 uart : TX=p9. RX=p11 |
electronichamsters | 9:1ea51b2048a8 | 48 | |
electronichamsters | 9:1ea51b2048a8 | 49 | void periodicCallback(void) |
electronichamsters | 8:46c5e0bfab05 | 50 | { |
electronichamsters | 9:1ea51b2048a8 | 51 | //led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */ |
electronichamsters | 9:1ea51b2048a8 | 52 | //device.printf("periodic 5..."); |
electronichamsters | 9:1ea51b2048a8 | 53 | //device.printf("\r\n"); |
electronichamsters | 8:46c5e0bfab05 | 54 | } |
electronichamsters | 8:46c5e0bfab05 | 55 | |
electronichamsters | 9:1ea51b2048a8 | 56 | void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) { |
electronichamsters | 8:46c5e0bfab05 | 57 | |
electronichamsters | 8:46c5e0bfab05 | 58 | |
electronichamsters | 9:1ea51b2048a8 | 59 | //BLE MAC Address (6 bytes): |
electronichamsters | 9:1ea51b2048a8 | 60 | // params->peerAddr[5] |
electronichamsters | 9:1ea51b2048a8 | 61 | // params->peerAddr[4] |
electronichamsters | 9:1ea51b2048a8 | 62 | // ... |
electronichamsters | 9:1ea51b2048a8 | 63 | // params->peerAddr[0] |
electronichamsters | 9:1ea51b2048a8 | 64 | //RSSI = params->rssi |
electronichamsters | 9:1ea51b2048a8 | 65 | //Payload |
electronichamsters | 9:1ea51b2048a8 | 66 | // params->advertisingData[#<advertisingDataLen] |
electronichamsters | 8:46c5e0bfab05 | 67 | |
electronichamsters | 8:46c5e0bfab05 | 68 | |
electronichamsters | 8:46c5e0bfab05 | 69 | |
electronichamsters | 9:1ea51b2048a8 | 70 | // [<---MY DATA-->] |
electronichamsters | 9:1ea51b2048a8 | 71 | //0x02 0x01 0x06 0x06 0xff D E C ? ? |
electronichamsters | 9:1ea51b2048a8 | 72 | //0 1 2 3 4 5 6 7 8 9 |
electronichamsters | 8:46c5e0bfab05 | 73 | |
electronichamsters | 9:1ea51b2048a8 | 74 | if ( (params->advertisingDataLen) >= 8) |
electronichamsters | 9:1ea51b2048a8 | 75 | { |
electronichamsters | 9:1ea51b2048a8 | 76 | //if one of "ours", these UUID fields will be this value. Arbitrary " |
electronichamsters | 9:1ea51b2048a8 | 77 | //todo: use MAC to make a hash of what these 3 bytes should be. |
electronichamsters | 9:1ea51b2048a8 | 78 | if ( (params->advertisingData[5] == 0x44) && (params->advertisingData[6] == 0x45) && (params->advertisingData[7]==0x43) ) |
electronichamsters | 9:1ea51b2048a8 | 79 | { |
electronichamsters | 9:1ea51b2048a8 | 80 | /* |
electronichamsters | 9:1ea51b2048a8 | 81 | BLE Received from MAC C2F154BB0AF9 |
electronichamsters | 9:1ea51b2048a8 | 82 | volt:3.11,mag:1 |
electronichamsters | 9:1ea51b2048a8 | 83 | |
electronichamsters | 9:1ea51b2048a8 | 84 | uart-transmit: |
electronichamsters | 9:1ea51b2048a8 | 85 | mac:C2F154BB0AF9,rssi:##,volt:3.11,mag:1 |
electronichamsters | 9:1ea51b2048a8 | 86 | |
electronichamsters | 9:1ea51b2048a8 | 87 | /ble/C2F154BB0AF9/rssi |
electronichamsters | 9:1ea51b2048a8 | 88 | /ble/C2F154BB0AF9/1st_token |
electronichamsters | 9:1ea51b2048a8 | 89 | /ble/c2F153 |
electronichamsters | 9:1ea51b2048a8 | 90 | |
electronichamsters | 9:1ea51b2048a8 | 91 | */ |
electronichamsters | 9:1ea51b2048a8 | 92 | /* |
electronichamsters | 9:1ea51b2048a8 | 93 | device.printf("Adv peerAddr: [%02x%02x%02x%02x%02x%02x] rssi %d, ScanResp: %u, AdvType: %u\r\n", |
electronichamsters | 9:1ea51b2048a8 | 94 | params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0], |
electronichamsters | 9:1ea51b2048a8 | 95 | params->rssi, params->isScanResponse, params->type); |
electronichamsters | 9:1ea51b2048a8 | 96 | */ |
electronichamsters | 9:1ea51b2048a8 | 97 | device.printf("{\"mac\":\"%02x%02x%02x%02x%02x%02x\",\"rssi\":%d,", |
electronichamsters | 9:1ea51b2048a8 | 98 | params->peerAddr[5], |
electronichamsters | 9:1ea51b2048a8 | 99 | params->peerAddr[4], |
electronichamsters | 9:1ea51b2048a8 | 100 | params->peerAddr[3], |
electronichamsters | 9:1ea51b2048a8 | 101 | params->peerAddr[2], |
electronichamsters | 9:1ea51b2048a8 | 102 | params->peerAddr[1], |
electronichamsters | 9:1ea51b2048a8 | 103 | params->peerAddr[0], |
electronichamsters | 9:1ea51b2048a8 | 104 | params->rssi |
electronichamsters | 9:1ea51b2048a8 | 105 | ); |
electronichamsters | 9:1ea51b2048a8 | 106 | //mac:"c2f154bb0af9" |
electronichamsters | 9:1ea51b2048a8 | 107 | |
electronichamsters | 9:1ea51b2048a8 | 108 | //device.printf("\r\n copy adv length: %d \r\n", params->advertisingDataLen); |
electronichamsters | 9:1ea51b2048a8 | 109 | for (int i = 0; i<16; i++) |
electronichamsters | 9:1ea51b2048a8 | 110 | { |
electronichamsters | 9:1ea51b2048a8 | 111 | |
electronichamsters | 9:1ea51b2048a8 | 112 | src_buf[i]=params->advertisingData[i+8]; |
electronichamsters | 9:1ea51b2048a8 | 113 | #if MyDebugEnb |
electronichamsters | 9:1ea51b2048a8 | 114 | device.printf("%x ", src_buf[i]); |
electronichamsters | 9:1ea51b2048a8 | 115 | #endif |
electronichamsters | 9:1ea51b2048a8 | 116 | } |
electronichamsters | 9:1ea51b2048a8 | 117 | #if MyDebugEnb |
electronichamsters | 9:1ea51b2048a8 | 118 | device.printf("...\r\n "); |
electronichamsters | 9:1ea51b2048a8 | 119 | #endif |
electronichamsters | 9:1ea51b2048a8 | 120 | mbedtls_aes_crypt_ecb( &aes, MBEDTLS_AES_DECRYPT, src_buf, des_buf ); |
electronichamsters | 9:1ea51b2048a8 | 121 | #if MyDebugEnb |
electronichamsters | 9:1ea51b2048a8 | 122 | |
electronichamsters | 9:1ea51b2048a8 | 123 | device.printf("decoded first 16 bytes \r\n"); |
electronichamsters | 9:1ea51b2048a8 | 124 | for (int i = 0; i<16; i++) |
electronichamsters | 9:1ea51b2048a8 | 125 | { |
electronichamsters | 9:1ea51b2048a8 | 126 | //device.printf("%02x", params->advertisingData[index]); |
electronichamsters | 9:1ea51b2048a8 | 127 | if (i < 2) |
electronichamsters | 9:1ea51b2048a8 | 128 | { |
electronichamsters | 9:1ea51b2048a8 | 129 | device.printf("%x ", des_buf[i]); |
electronichamsters | 9:1ea51b2048a8 | 130 | } |
electronichamsters | 9:1ea51b2048a8 | 131 | else |
electronichamsters | 9:1ea51b2048a8 | 132 | { |
electronichamsters | 9:1ea51b2048a8 | 133 | device.printf("%c ", des_buf[i]); |
electronichamsters | 9:1ea51b2048a8 | 134 | } |
electronichamsters | 9:1ea51b2048a8 | 135 | } |
electronichamsters | 9:1ea51b2048a8 | 136 | device.printf("done----- \r\n"); |
electronichamsters | 9:1ea51b2048a8 | 137 | #endif |
electronichamsters | 8:46c5e0bfab05 | 138 | |
electronichamsters | 9:1ea51b2048a8 | 139 | //print clock |
electronichamsters | 9:1ea51b2048a8 | 140 | // "tmr":3232, |
electronichamsters | 9:1ea51b2048a8 | 141 | //des_buf[0] = lower byte, des_buf[1] = higher byte |
electronichamsters | 9:1ea51b2048a8 | 142 | uint16_t beacon_timer = des_buf[0] | (des_buf[1] << 8); |
electronichamsters | 9:1ea51b2048a8 | 143 | device.printf("\"tmr\":%d,", beacon_timer); |
electronichamsters | 9:1ea51b2048a8 | 144 | //device.printf("\"tmr\":%d,", des_buf[0]); |
electronichamsters | 9:1ea51b2048a8 | 145 | |
electronichamsters | 9:1ea51b2048a8 | 146 | for (int i = 2; i< 16; i++) |
electronichamsters | 9:1ea51b2048a8 | 147 | { |
electronichamsters | 9:1ea51b2048a8 | 148 | //device.printf("%02x", params->advertisingData[index]); |
electronichamsters | 9:1ea51b2048a8 | 149 | device.printf("%c", des_buf[i]); |
electronichamsters | 9:1ea51b2048a8 | 150 | } |
electronichamsters | 8:46c5e0bfab05 | 151 | |
electronichamsters | 9:1ea51b2048a8 | 152 | if (params->advertisingDataLen > 24) |
electronichamsters | 9:1ea51b2048a8 | 153 | { |
electronichamsters | 9:1ea51b2048a8 | 154 | for (unsigned index = 24; index < params->advertisingDataLen; index++) |
electronichamsters | 9:1ea51b2048a8 | 155 | { |
electronichamsters | 9:1ea51b2048a8 | 156 | //device.printf("%02x", params->advertisingData[index]); |
electronichamsters | 9:1ea51b2048a8 | 157 | device.printf("%c", params->advertisingData[index]); |
electronichamsters | 9:1ea51b2048a8 | 158 | } |
electronichamsters | 9:1ea51b2048a8 | 159 | } |
electronichamsters | 9:1ea51b2048a8 | 160 | |
electronichamsters | 9:1ea51b2048a8 | 161 | /* |
electronichamsters | 9:1ea51b2048a8 | 162 | for (unsigned index = 8; index < params->advertisingDataLen; index++) |
electronichamsters | 9:1ea51b2048a8 | 163 | { |
electronichamsters | 9:1ea51b2048a8 | 164 | //device.printf("%02x", params->advertisingData[index]); |
electronichamsters | 9:1ea51b2048a8 | 165 | device.printf("%c", params->advertisingData[index]); |
electronichamsters | 9:1ea51b2048a8 | 166 | } |
electronichamsters | 9:1ea51b2048a8 | 167 | */ |
electronichamsters | 9:1ea51b2048a8 | 168 | |
electronichamsters | 9:1ea51b2048a8 | 169 | device.printf("}"); |
electronichamsters | 9:1ea51b2048a8 | 170 | device.printf("\r\n"); |
electronichamsters | 9:1ea51b2048a8 | 171 | |
electronichamsters | 9:1ea51b2048a8 | 172 | /* |
electronichamsters | 9:1ea51b2048a8 | 173 | mac:c2f154bb0af9,rssi:-55,volt:3.05,mag:1 |
electronichamsters | 9:1ea51b2048a8 | 174 | mac:c2f154bb0af9,rssi:-67,volt:3.05,mag:1 |
electronichamsters | 9:1ea51b2048a8 | 175 | mac:c2f154bb0af9,rssi:-60,volt:3.07,mag:0 |
electronichamsters | 9:1ea51b2048a8 | 176 | */ |
electronichamsters | 9:1ea51b2048a8 | 177 | |
electronichamsters | 9:1ea51b2048a8 | 178 | }//end if it's our adv |
electronichamsters | 9:1ea51b2048a8 | 179 | }//end if advertisingDataLen |
electronichamsters | 8:46c5e0bfab05 | 180 | |
electronichamsters | 8:46c5e0bfab05 | 181 | |
electronichamsters | 8:46c5e0bfab05 | 182 | |
electronichamsters | 8:46c5e0bfab05 | 183 | |
electronichamsters | 9:1ea51b2048a8 | 184 | }//end advertisementCallback |
electronichamsters | 8:46c5e0bfab05 | 185 | |
andresag | 7:0a8bbb6dea16 | 186 | /** |
electronichamsters | 9:1ea51b2048a8 | 187 | * This function is called when the ble initialization process has failed |
andresag | 7:0a8bbb6dea16 | 188 | */ |
andresag | 7:0a8bbb6dea16 | 189 | void onBleInitError(BLE &ble, ble_error_t error) |
andresag | 7:0a8bbb6dea16 | 190 | { |
andresag | 7:0a8bbb6dea16 | 191 | /* Initialization error handling should go here */ |
electronichamsters | 9:1ea51b2048a8 | 192 | device.printf("periodic callback "); |
electronichamsters | 9:1ea51b2048a8 | 193 | device.printf("\r\n"); |
andresag | 7:0a8bbb6dea16 | 194 | } |
andresag | 7:0a8bbb6dea16 | 195 | |
andresag | 7:0a8bbb6dea16 | 196 | /** |
andresag | 7:0a8bbb6dea16 | 197 | * Callback triggered when the ble initialization process has finished |
andresag | 7:0a8bbb6dea16 | 198 | */ |
andresag | 7:0a8bbb6dea16 | 199 | void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) |
sunsmile2015 | 2:b935358da5ba | 200 | { |
andresag | 7:0a8bbb6dea16 | 201 | BLE& ble = params->ble; |
andresag | 7:0a8bbb6dea16 | 202 | ble_error_t error = params->error; |
andresag | 7:0a8bbb6dea16 | 203 | |
andresag | 7:0a8bbb6dea16 | 204 | if (error != BLE_ERROR_NONE) { |
andresag | 7:0a8bbb6dea16 | 205 | /* In case of error, forward the error handling to onBleInitError */ |
andresag | 7:0a8bbb6dea16 | 206 | onBleInitError(ble, error); |
andresag | 7:0a8bbb6dea16 | 207 | return; |
andresag | 7:0a8bbb6dea16 | 208 | } |
andresag | 7:0a8bbb6dea16 | 209 | |
andresag | 7:0a8bbb6dea16 | 210 | /* Ensure that it is the default instance of BLE */ |
andresag | 7:0a8bbb6dea16 | 211 | if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { |
andresag | 7:0a8bbb6dea16 | 212 | return; |
andresag | 7:0a8bbb6dea16 | 213 | } |
electronichamsters | 9:1ea51b2048a8 | 214 | |
electronichamsters | 9:1ea51b2048a8 | 215 | // in ms. Duty cycle = (interval / window); 200ms/500ms = 40% |
electronichamsters | 9:1ea51b2048a8 | 216 | ble.gap().setScanParams(500 /* scan interval */, 200 /* scan window */); |
electronichamsters | 9:1ea51b2048a8 | 217 | ble.gap().startScan(advertisementCallback); |
sunsmile2015 | 4:e5fa4c8838db | 218 | } |
sunsmile2015 | 4:e5fa4c8838db | 219 | |
sunsmile2015 | 2:b935358da5ba | 220 | int main(void) |
sunsmile2015 | 2:b935358da5ba | 221 | { |
electronichamsters | 8:46c5e0bfab05 | 222 | device.baud(9600); |
electronichamsters | 9:1ea51b2048a8 | 223 | device.printf("started main 04... "); |
electronichamsters | 8:46c5e0bfab05 | 224 | device.printf("\r\n"); |
electronichamsters | 9:1ea51b2048a8 | 225 | ticker.attach(periodicCallback, 5); |
electronichamsters | 8:46c5e0bfab05 | 226 | |
electronichamsters | 9:1ea51b2048a8 | 227 | //mbedtls_aes_init(&aes); |
electronichamsters | 9:1ea51b2048a8 | 228 | mbedtls_aes_setkey_dec( &aes, iv, 128 ); |
electronichamsters | 9:1ea51b2048a8 | 229 | //mbedtls_aes_crypt_ecb( &aes, MBEDTLS_AES_DECRYPT, input, output ); |
sunsmile2015 | 0:3dc6e424dba0 | 230 | |
andresag | 7:0a8bbb6dea16 | 231 | BLE &ble = BLE::Instance(); |
andresag | 7:0a8bbb6dea16 | 232 | ble.init(bleInitComplete); |
rgrover1 | 5:f4d74a8cad43 | 233 | |
sunsmile2015 | 0:3dc6e424dba0 | 234 | while (true) { |
electronichamsters | 9:1ea51b2048a8 | 235 | ble.waitForEvent(); |
electronichamsters | 9:1ea51b2048a8 | 236 | } |
electronichamsters | 9:1ea51b2048a8 | 237 | } |