BLE_SecureUART

Dependencies:   nRF51BLE_API mbed nRF51822

Fork of BLE_UARTConsole by Bluetooth Low Energy

Committer:
chiang404
Date:
Tue May 31 09:19:36 2016 +0000
Revision:
10:965f3a55bc89
Parent:
9:5f0732aa3008
20160531

Who changed what in which revision?

UserRevisionLine numberNew 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 }