BLE_SecureUART
Dependencies: nRF51BLE_API mbed nRF51822
Fork of BLE_UARTConsole by
main.cpp@10:965f3a55bc89, 2016-05-31 (annotated)
- Committer:
- chiang404
- Date:
- Tue May 31 09:19:36 2016 +0000
- Revision:
- 10:965f3a55bc89
- Parent:
- 9:5f0732aa3008
20160531
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rgrover1 | 0:2130d7f559dc | 1 | /* mbed Microcontroller Library |
rgrover1 | 0:2130d7f559dc | 2 | * Copyright (c) 2006-2013 ARM Limited |
rgrover1 | 0:2130d7f559dc | 3 | * |
rgrover1 | 0:2130d7f559dc | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
rgrover1 | 0:2130d7f559dc | 5 | * you may not use this file except in compliance with the License. |
rgrover1 | 0:2130d7f559dc | 6 | * You may obtain a copy of the License at |
rgrover1 | 0:2130d7f559dc | 7 | * |
rgrover1 | 0:2130d7f559dc | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
rgrover1 | 0:2130d7f559dc | 9 | * |
rgrover1 | 0:2130d7f559dc | 10 | * Unless required by applicable law or agreed to in writing, software |
rgrover1 | 0:2130d7f559dc | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
rgrover1 | 0:2130d7f559dc | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
rgrover1 | 0:2130d7f559dc | 13 | * See the License for the specific language governing permissions and |
rgrover1 | 0:2130d7f559dc | 14 | * limitations under the License. |
rgrover1 | 0:2130d7f559dc | 15 | */ |
rgrover1 | 0:2130d7f559dc | 16 | |
rgrover1 | 5:2607923acfa1 | 17 | #include <string.h> |
rgrover1 | 0:2130d7f559dc | 18 | #include "mbed.h" |
rgrover1 | 8:f9bf6d403cde | 19 | #include "BLE.h" |
chiang404 | 10:965f3a55bc89 | 20 | #include <string> |
chiang404 | 10:965f3a55bc89 | 21 | using namespace std; |
rgrover1 | 0:2130d7f559dc | 22 | |
rgrover1 | 0:2130d7f559dc | 23 | #include "UARTService.h" |
rgrover1 | 0:2130d7f559dc | 24 | |
chiang404 | 10:965f3a55bc89 | 25 | #define NEED_CONSOLE_OUTPUT 0 /* Set this if you need debug messages on the console; |
rgrover1 | 0:2130d7f559dc | 26 | * it will have an impact on code-size and power consumption. */ |
rgrover1 | 0:2130d7f559dc | 27 | |
rgrover1 | 0:2130d7f559dc | 28 | #if NEED_CONSOLE_OUTPUT |
rgrover1 | 5:2607923acfa1 | 29 | #define DEBUG(STR) { if (uart) uart->write(STR, strlen(STR)); } |
rgrover1 | 0:2130d7f559dc | 30 | #else |
rgrover1 | 0:2130d7f559dc | 31 | #define DEBUG(...) /* nothing */ |
rgrover1 | 0:2130d7f559dc | 32 | #endif /* #if NEED_CONSOLE_OUTPUT */ |
rgrover1 | 0:2130d7f559dc | 33 | |
chiang404 | 10:965f3a55bc89 | 34 | /*============ settting ================*/ |
chiang404 | 10:965f3a55bc89 | 35 | #define start "1.Auto 2.Manual ?\r\n" |
chiang404 | 10:965f3a55bc89 | 36 | bool mode = false; |
chiang404 | 10:965f3a55bc89 | 37 | bool Auto = false; |
chiang404 | 10:965f3a55bc89 | 38 | |
rgrover1 | 0:2130d7f559dc | 39 | BLEDevice ble; |
rgrover1 | 0:2130d7f559dc | 40 | DigitalOut led1(LED1); |
chiang404 | 10:965f3a55bc89 | 41 | UARTService *uartServicePtr; |
chiang404 | 10:965f3a55bc89 | 42 | Serial dev(TX_PIN_NUMBER, RX_PIN_NUMBER); |
chiang404 | 10:965f3a55bc89 | 43 | DigitalIn sensor(P0_12); |
chiang404 | 10:965f3a55bc89 | 44 | char rxbuff; |
chiang404 | 10:965f3a55bc89 | 45 | int i = 0; |
chiang404 | 10:965f3a55bc89 | 46 | |
chiang404 | 10:965f3a55bc89 | 47 | |
chiang404 | 10:965f3a55bc89 | 48 | void connectionCallback(const Gap::ConnectionCallbackParams_t *params) |
chiang404 | 10:965f3a55bc89 | 49 | { |
chiang404 | 10:965f3a55bc89 | 50 | printf("Connected!\r\n"); |
chiang404 | 10:965f3a55bc89 | 51 | } |
rgrover1 | 0:2130d7f559dc | 52 | |
rgrover1 | 9:5f0732aa3008 | 53 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
rgrover1 | 0:2130d7f559dc | 54 | { |
chiang404 | 10:965f3a55bc89 | 55 | printf("Disconnected!\r\n"); |
chiang404 | 10:965f3a55bc89 | 56 | printf("Restarting the advertising process\r\n"); |
rgrover1 | 0:2130d7f559dc | 57 | ble.startAdvertising(); |
rgrover1 | 0:2130d7f559dc | 58 | } |
rgrover1 | 0:2130d7f559dc | 59 | |
chiang404 | 10:965f3a55bc89 | 60 | void passkeyDisplayCallback(Gap::Handle_t handle, const SecurityManager::Passkey_t passkey) |
chiang404 | 10:965f3a55bc89 | 61 | { |
chiang404 | 10:965f3a55bc89 | 62 | printf("Input passKey: "); |
chiang404 | 10:965f3a55bc89 | 63 | for (unsigned i = 0; i < Gap::ADDR_LEN; i++) { |
chiang404 | 10:965f3a55bc89 | 64 | printf("%c ", passkey[i]); |
chiang404 | 10:965f3a55bc89 | 65 | } |
chiang404 | 10:965f3a55bc89 | 66 | printf("\r\n"); |
chiang404 | 10:965f3a55bc89 | 67 | } |
chiang404 | 10:965f3a55bc89 | 68 | |
chiang404 | 10:965f3a55bc89 | 69 | void securitySetupCompletedCallback(Gap::Handle_t handle, SecurityManager::SecurityCompletionStatus_t status) |
chiang404 | 10:965f3a55bc89 | 70 | { |
chiang404 | 10:965f3a55bc89 | 71 | if (status == SecurityManager::SEC_STATUS_SUCCESS) { |
chiang404 | 10:965f3a55bc89 | 72 | printf("Security success\r\n"); |
chiang404 | 10:965f3a55bc89 | 73 | } else { |
chiang404 | 10:965f3a55bc89 | 74 | printf("Security failed\r\n"); |
chiang404 | 10:965f3a55bc89 | 75 | } |
chiang404 | 10:965f3a55bc89 | 76 | } |
chiang404 | 10:965f3a55bc89 | 77 | |
chiang404 | 10:965f3a55bc89 | 78 | void linkSecureCallback(Gap::Handle_t handle, SecurityManager::SecurityMode_t securityMode) |
chiang404 | 10:965f3a55bc89 | 79 | { |
chiang404 | 10:965f3a55bc89 | 80 | printf("LinkStatus: "); |
chiang404 | 10:965f3a55bc89 | 81 | switch(securityMode){ |
chiang404 | 10:965f3a55bc89 | 82 | case SecurityManager::SECURITY_MODE_NO_ACCESS: |
chiang404 | 10:965f3a55bc89 | 83 | printf("NO_ACCESS\r\n"); |
chiang404 | 10:965f3a55bc89 | 84 | break; |
chiang404 | 10:965f3a55bc89 | 85 | case SecurityManager::SECURITY_MODE_ENCRYPTION_OPEN_LINK: |
chiang404 | 10:965f3a55bc89 | 86 | printf("OPEN_LINK\r\n"); |
chiang404 | 10:965f3a55bc89 | 87 | break; |
chiang404 | 10:965f3a55bc89 | 88 | case SecurityManager::SECURITY_MODE_ENCRYPTION_NO_MITM: |
chiang404 | 10:965f3a55bc89 | 89 | printf("ENCRYPTION_NO_MITM\r\n"); |
chiang404 | 10:965f3a55bc89 | 90 | break; |
chiang404 | 10:965f3a55bc89 | 91 | case SecurityManager::SECURITY_MODE_ENCRYPTION_WITH_MITM: |
chiang404 | 10:965f3a55bc89 | 92 | printf("ENCRYPTION_WITH_MITM\r\n"); |
chiang404 | 10:965f3a55bc89 | 93 | break; |
chiang404 | 10:965f3a55bc89 | 94 | case SecurityManager::SECURITY_MODE_SIGNED_NO_MITM: |
chiang404 | 10:965f3a55bc89 | 95 | printf("SIGNED_NO_MITM\r\n"); |
chiang404 | 10:965f3a55bc89 | 96 | break; |
chiang404 | 10:965f3a55bc89 | 97 | case SecurityManager::SECURITY_MODE_SIGNED_WITH_MITM: |
chiang404 | 10:965f3a55bc89 | 98 | printf("SIGNED_WITH_MITM\r\n"); |
chiang404 | 10:965f3a55bc89 | 99 | break; |
chiang404 | 10:965f3a55bc89 | 100 | default : |
chiang404 | 10:965f3a55bc89 | 101 | printf("OPEN_LINK\r\n"); |
chiang404 | 10:965f3a55bc89 | 102 | break; |
chiang404 | 10:965f3a55bc89 | 103 | } |
chiang404 | 10:965f3a55bc89 | 104 | } |
chiang404 | 10:965f3a55bc89 | 105 | |
chiang404 | 10:965f3a55bc89 | 106 | void onDataWritten(const GattWriteCallbackParams *params) |
chiang404 | 10:965f3a55bc89 | 107 | { |
chiang404 | 10:965f3a55bc89 | 108 | if ((uartServicePtr != NULL) && (params->handle == uartServicePtr->getTXCharacteristicHandle())) { |
chiang404 | 10:965f3a55bc89 | 109 | uint16_t bytesRead = params->len; |
chiang404 | 10:965f3a55bc89 | 110 | DEBUG("received %u bytes\n\r", bytesRead); |
chiang404 | 10:965f3a55bc89 | 111 | |
chiang404 | 10:965f3a55bc89 | 112 | printf("nrfRecv : "); |
chiang404 | 10:965f3a55bc89 | 113 | for (unsigned index = 0; index < bytesRead; index++) { |
chiang404 | 10:965f3a55bc89 | 114 | printf("%c", params->data[index]); |
chiang404 | 10:965f3a55bc89 | 115 | } |
chiang404 | 10:965f3a55bc89 | 116 | printf("\r\n"); |
chiang404 | 10:965f3a55bc89 | 117 | |
chiang404 | 10:965f3a55bc89 | 118 | switch(*params->data) { |
chiang404 | 10:965f3a55bc89 | 119 | case '1': |
chiang404 | 10:965f3a55bc89 | 120 | Auto = false; |
chiang404 | 10:965f3a55bc89 | 121 | mode = true; |
chiang404 | 10:965f3a55bc89 | 122 | printf("-----Manual-----\r\n"); |
chiang404 | 10:965f3a55bc89 | 123 | //ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), params->data, bytesRead); |
chiang404 | 10:965f3a55bc89 | 124 | ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)&rxbuff, 1); |
chiang404 | 10:965f3a55bc89 | 125 | printf("nrfSend : %c\r\n", rxbuff); |
chiang404 | 10:965f3a55bc89 | 126 | i++; |
chiang404 | 10:965f3a55bc89 | 127 | break; |
chiang404 | 10:965f3a55bc89 | 128 | case '2': |
chiang404 | 10:965f3a55bc89 | 129 | Auto = true; |
chiang404 | 10:965f3a55bc89 | 130 | mode = true; |
chiang404 | 10:965f3a55bc89 | 131 | printf("----- Auto -----\r\n"); |
chiang404 | 10:965f3a55bc89 | 132 | break; |
chiang404 | 10:965f3a55bc89 | 133 | default: |
chiang404 | 10:965f3a55bc89 | 134 | Auto = false; |
chiang404 | 10:965f3a55bc89 | 135 | mode = false; |
chiang404 | 10:965f3a55bc89 | 136 | break; |
chiang404 | 10:965f3a55bc89 | 137 | } |
chiang404 | 10:965f3a55bc89 | 138 | /* |
chiang404 | 10:965f3a55bc89 | 139 | printf("received %u bytes \r\n", bytesRead); |
chiang404 | 10:965f3a55bc89 | 140 | for (unsigned index = 0; index < bytesRead; index++) { |
chiang404 | 10:965f3a55bc89 | 141 | printf("%c[%02x]", a[index], a[index]); |
chiang404 | 10:965f3a55bc89 | 142 | } |
chiang404 | 10:965f3a55bc89 | 143 | printf("\r\n"); |
chiang404 | 10:965f3a55bc89 | 144 | */ |
chiang404 | 10:965f3a55bc89 | 145 | } |
chiang404 | 10:965f3a55bc89 | 146 | } |
chiang404 | 10:965f3a55bc89 | 147 | |
rgrover1 | 0:2130d7f559dc | 148 | void periodicCallback(void) |
rgrover1 | 0:2130d7f559dc | 149 | { |
chiang404 | 10:965f3a55bc89 | 150 | //led1 = !led1; |
rgrover1 | 0:2130d7f559dc | 151 | DEBUG("ping\r\n"); |
chiang404 | 10:965f3a55bc89 | 152 | int x = sensor.read(); |
chiang404 | 10:965f3a55bc89 | 153 | |
chiang404 | 10:965f3a55bc89 | 154 | led1 = (Auto)? 0 : 1; |
chiang404 | 10:965f3a55bc89 | 155 | |
chiang404 | 10:965f3a55bc89 | 156 | if(Auto && mode){ |
chiang404 | 10:965f3a55bc89 | 157 | ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)&rxbuff, 1); |
chiang404 | 10:965f3a55bc89 | 158 | printf("nrfSend : %c\r\n", rxbuff); |
chiang404 | 10:965f3a55bc89 | 159 | } |
chiang404 | 10:965f3a55bc89 | 160 | } |
chiang404 | 10:965f3a55bc89 | 161 | |
chiang404 | 10:965f3a55bc89 | 162 | void onCreate(void) |
chiang404 | 10:965f3a55bc89 | 163 | { |
chiang404 | 10:965f3a55bc89 | 164 | while(uartServicePtr == NULL){} |
chiang404 | 10:965f3a55bc89 | 165 | ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)start, strlen((char *) start)); |
chiang404 | 10:965f3a55bc89 | 166 | |
chiang404 | 10:965f3a55bc89 | 167 | } |
chiang404 | 10:965f3a55bc89 | 168 | |
chiang404 | 10:965f3a55bc89 | 169 | void serial_rx () |
chiang404 | 10:965f3a55bc89 | 170 | { |
chiang404 | 10:965f3a55bc89 | 171 | rxbuff = dev.getc(); |
chiang404 | 10:965f3a55bc89 | 172 | printf("Recv : %c\r\n", rxbuff); |
chiang404 | 10:965f3a55bc89 | 173 | |
rgrover1 | 0:2130d7f559dc | 174 | } |
rgrover1 | 0:2130d7f559dc | 175 | |
rgrover1 | 0:2130d7f559dc | 176 | int main(void) |
rgrover1 | 0:2130d7f559dc | 177 | { |
chiang404 | 10:965f3a55bc89 | 178 | led1 = 1; // 共陽極 |
rgrover1 | 0:2130d7f559dc | 179 | Ticker ticker; |
rgrover1 | 0:2130d7f559dc | 180 | ticker.attach(periodicCallback, 1); |
chiang404 | 10:965f3a55bc89 | 181 | dev.baud(9600); |
chiang404 | 10:965f3a55bc89 | 182 | dev.attach(&serial_rx,Serial::RxIrq); |
rgrover1 | 0:2130d7f559dc | 183 | |
chiang404 | 10:965f3a55bc89 | 184 | printf("Initialising\r\n"); |
rgrover1 | 0:2130d7f559dc | 185 | ble.init(); |
chiang404 | 10:965f3a55bc89 | 186 | |
chiang404 | 10:965f3a55bc89 | 187 | /* Initialize BLE security */ |
chiang404 | 10:965f3a55bc89 | 188 | bool enableBonding = true; |
chiang404 | 10:965f3a55bc89 | 189 | bool requireMITM = true; |
chiang404 | 10:965f3a55bc89 | 190 | ble.securityManager().init(enableBonding, requireMITM, SecurityManager::IO_CAPS_DISPLAY_ONLY); |
chiang404 | 10:965f3a55bc89 | 191 | ble.securityManager().purgeAllBondingState(); |
rgrover1 | 5:2607923acfa1 | 192 | |
chiang404 | 10:965f3a55bc89 | 193 | /* Set callback functions */ |
chiang404 | 10:965f3a55bc89 | 194 | ble.gap().onConnection(connectionCallback); |
chiang404 | 10:965f3a55bc89 | 195 | ble.gap().onDisconnection(disconnectionCallback); |
chiang404 | 10:965f3a55bc89 | 196 | ble.securityManager().onPasskeyDisplay(passkeyDisplayCallback); |
chiang404 | 10:965f3a55bc89 | 197 | ble.securityManager().onSecuritySetupCompleted(securitySetupCompletedCallback); |
chiang404 | 10:965f3a55bc89 | 198 | ble.securityManager().onLinkSecured(linkSecureCallback); |
chiang404 | 10:965f3a55bc89 | 199 | ble.onDataWritten(onDataWritten); |
rgrover1 | 0:2130d7f559dc | 200 | |
rgrover1 | 0:2130d7f559dc | 201 | /* setup advertising */ |
rgrover1 | 0:2130d7f559dc | 202 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
rgrover1 | 0:2130d7f559dc | 203 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
rgrover1 | 0:2130d7f559dc | 204 | ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, |
chiang404 | 10:965f3a55bc89 | 205 | (const uint8_t *)"M10307431", sizeof("M10307431") - 1); |
rgrover1 | 0:2130d7f559dc | 206 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
rgrover1 | 0:2130d7f559dc | 207 | (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); |
rgrover1 | 0:2130d7f559dc | 208 | ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ |
rgrover1 | 0:2130d7f559dc | 209 | ble.startAdvertising(); |
chiang404 | 10:965f3a55bc89 | 210 | |
chiang404 | 10:965f3a55bc89 | 211 | UARTService uart(ble); |
chiang404 | 10:965f3a55bc89 | 212 | uartServicePtr = &uart; |
chiang404 | 10:965f3a55bc89 | 213 | onCreate(); |
chiang404 | 10:965f3a55bc89 | 214 | |
chiang404 | 10:965f3a55bc89 | 215 | while (true) { |
rgrover1 | 0:2130d7f559dc | 216 | |
rgrover1 | 0:2130d7f559dc | 217 | ble.waitForEvent(); |
rgrover1 | 0:2130d7f559dc | 218 | } |
rgrover1 | 0:2130d7f559dc | 219 | } |