BLE Application to open a Garage door

Dependencies:   BLE_API Crypto RNG mbed nRF51822

Fork of BLE_LED by Bluetooth Low Energy

Committer:
dgomes
Date:
Tue Aug 25 23:26:43 2015 +0000
Revision:
10:80850cd6c29e
Parent:
9:329af8cdc923
Child:
11:3de9b542eeac
Version 1; Moving to SecurityService

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 0:ed5c53845de7 1 /* mbed Microcontroller Library
rgrover1 0:ed5c53845de7 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 0:ed5c53845de7 3 *
rgrover1 0:ed5c53845de7 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 0:ed5c53845de7 5 * you may not use this file except in compliance with the License.
rgrover1 0:ed5c53845de7 6 * You may obtain a copy of the License at
rgrover1 0:ed5c53845de7 7 *
rgrover1 0:ed5c53845de7 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 0:ed5c53845de7 9 *
rgrover1 0:ed5c53845de7 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 0:ed5c53845de7 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 0:ed5c53845de7 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 0:ed5c53845de7 13 * See the License for the specific language governing permissions and
rgrover1 0:ed5c53845de7 14 * limitations under the License.
rgrover1 0:ed5c53845de7 15 */
dgomes 9:329af8cdc923 16 #define DEBUG
dgomes 9:329af8cdc923 17
dgomes 9:329af8cdc923 18 #ifndef DEBUG
dgomes 9:329af8cdc923 19 #define DEVICE_SERIAL 0 //disable SERIAL so me can use P0_8 (shared with serial)
dgomes 9:329af8cdc923 20 #define DBG(...)
dgomes 9:329af8cdc923 21 #else
dgomes 9:329af8cdc923 22 #define DBG printf
dgomes 9:329af8cdc923 23 #endif
rgrover1 0:ed5c53845de7 24
rgrover1 0:ed5c53845de7 25 #include "mbed.h"
rgrover1 6:fca54d71d10e 26 #include "BLE.h"
dgomes 9:329af8cdc923 27 #include "GaragemService.h"
dgomes 9:329af8cdc923 28 #include "ble/services/iBeacon.h"
dgomes 9:329af8cdc923 29 #include "DeviceInformationService.h"
dgomes 9:329af8cdc923 30
dgomes 9:329af8cdc923 31 #include "Crypto.h"
dgomes 9:329af8cdc923 32
dgomes 9:329af8cdc923 33 //how-to test:
dgomes 9:329af8cdc923 34 //create a string to write to the characteristic
dgomes 10:80850cd6c29e 35 //openssl enc -aes-128-cbc -K 9734062BA852A049CF5D40593B769014 -iv A2685636521871D02306E2EB8F7027B3 -out /dev/stdout -in inputfile
dgomes 10:80850cd6c29e 36 // TTTTIIIISSSSSSSS
dgomes 10:80850cd6c29e 37 // T -> 4 bytes Timestamp uint32_t
dgomes 10:80850cd6c29e 38 // I -> 4 bytes ID (chars)
dgomes 10:80850cd6c29e 39 // S -> 8 bytes SHARED_SECRET (chars)
dgomes 10:80850cd6c29e 40
dgomes 9:329af8cdc923 41 #define SHARED_KEY "figueiredo"
dgomes 9:329af8cdc923 42 #define DEVICE_NAME "Garagem"
dgomes 9:329af8cdc923 43 //openssl enc -aes-128-cbc -pass pass:********** -nosalt -P
dgomes 9:329af8cdc923 44 uint8_t myKey[16];
dgomes 9:329af8cdc923 45 uint8_t iv[16] = { 0xA2, 0x68, 0x56, 0x36, 0x52, 0x18, 0x71, 0xD0, 0x23, 0x06, 0xE2, 0xEB, 0x8F, 0x70, 0x27, 0xB3 };
rgrover1 0:ed5c53845de7 46
rgrover1 7:c9271599ec5f 47 BLE ble;
dgomes 9:329af8cdc923 48 DigitalOut actuatedLED(P0_19);
dgomes 9:329af8cdc923 49 Timeout offRelay;
dgomes 9:329af8cdc923 50
dgomes 9:329af8cdc923 51 #ifndef DEBUG
dgomes 9:329af8cdc923 52 DigitalOut relay(P0_8);
dgomes 9:329af8cdc923 53 #endif
dgomes 9:329af8cdc923 54
dgomes 9:329af8cdc923 55 static const uint16_t uuid16_list[] = {GaragemService::GARAGEM_SERVICE_UUID};
rgrover1 0:ed5c53845de7 56
dgomes 9:329af8cdc923 57 GaragemService *garagemServicePtr;
rgrover1 0:ed5c53845de7 58
dgomes 9:329af8cdc923 59 void switchOffRelay()
dgomes 9:329af8cdc923 60 {
dgomes 9:329af8cdc923 61 actuatedLED = !actuatedLED;
dgomes 9:329af8cdc923 62 DBG("JA CHEGA...\r\n");
dgomes 9:329af8cdc923 63 #ifndef DEBUG
dgomes 9:329af8cdc923 64 relay = 0;
dgomes 9:329af8cdc923 65 #endif
dgomes 9:329af8cdc923 66 }
dgomes 9:329af8cdc923 67
rgrover1 0:ed5c53845de7 68 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
dgomes 9:329af8cdc923 69 {
dgomes 9:329af8cdc923 70 ble.startAdvertising();
rgrover1 0:ed5c53845de7 71 }
rgrover1 0:ed5c53845de7 72 /**
rgrover1 0:ed5c53845de7 73 * This callback allows the LEDService to receive updates to the ledState Characteristic.
rgrover1 0:ed5c53845de7 74 *
rgrover1 0:ed5c53845de7 75 * @param[in] params
rgrover1 0:ed5c53845de7 76 * Information about the characterisitc being updated.
rgrover1 0:ed5c53845de7 77 */
rgrover1 7:c9271599ec5f 78 void onDataWrittenCallback(const GattWriteCallbackParams *params) {
dgomes 9:329af8cdc923 79 DBG("onDataWrittenCallback: handle = %d len = %d\r\n", params->handle, params->len);
dgomes 10:80850cd6c29e 80 garagemServicePtr->nextLastOpen(params->data, params->len);
dgomes 10:80850cd6c29e 81
dgomes 9:329af8cdc923 82 if ((params->handle == garagemServicePtr->getChallengeHandle()) && (params->len ==16)) {
dgomes 10:80850cd6c29e 83 DBG("We have Challenge: data = %s\r\n", (char *) (params->data));
dgomes 9:329af8cdc923 84
dgomes 9:329af8cdc923 85 AES myAES(AES_128, myKey, iv);
dgomes 9:329af8cdc923 86 uint8_t msg[16];
dgomes 9:329af8cdc923 87 myAES.decrypt(msg,(uint8_t *) (params->data),16);
dgomes 9:329af8cdc923 88
dgomes 9:329af8cdc923 89 if(garagemServicePtr->checkMessage(msg) == GARAGEM_OK) {
dgomes 10:80850cd6c29e 90 DBG("ABRE-TE SESAMO!\r\n");
dgomes 10:80850cd6c29e 91
dgomes 9:329af8cdc923 92 #ifndef DEBUG
dgomes 9:329af8cdc923 93 relay = 1;
dgomes 9:329af8cdc923 94 #endif
dgomes 10:80850cd6c29e 95 actuatedLED = !actuatedLED;
dgomes 9:329af8cdc923 96 //please cleanup afterwards
dgomes 9:329af8cdc923 97 offRelay.attach(&switchOffRelay, 1.0);
dgomes 9:329af8cdc923 98
dgomes 9:329af8cdc923 99 } else {
dgomes 9:329af8cdc923 100 DBG("NO SUCH LUCK...\r\n");
dgomes 9:329af8cdc923 101 }
dgomes 10:80850cd6c29e 102 }
rgrover1 0:ed5c53845de7 103 }
rgrover1 0:ed5c53845de7 104
rgrover1 0:ed5c53845de7 105 int main(void)
rgrover1 0:ed5c53845de7 106 {
dgomes 9:329af8cdc923 107 DBG("Garagem v0\r\n");
rgrover1 0:ed5c53845de7 108
dgomes 9:329af8cdc923 109 //Compute myKey from SHARED_KEY
dgomes 9:329af8cdc923 110 MD5::computeHash(myKey, (uint8_t*) SHARED_KEY, strlen(SHARED_KEY));
dgomes 9:329af8cdc923 111
dgomes 9:329af8cdc923 112 actuatedLED = true;
dgomes 9:329af8cdc923 113 #ifndef DEBUG
dgomes 9:329af8cdc923 114 relay = 0;
dgomes 9:329af8cdc923 115 #endif
rgrover1 0:ed5c53845de7 116
rgrover1 0:ed5c53845de7 117 ble.init();
dgomes 9:329af8cdc923 118 ble.onDisconnection(disconnectionCallback);
rgrover1 7:c9271599ec5f 119 ble.gattServer().onDataWritten(onDataWrittenCallback);
rgrover1 0:ed5c53845de7 120
dgomes 9:329af8cdc923 121 /**
dgomes 9:329af8cdc923 122 * The Beacon payload has the following composition:
dgomes 9:329af8cdc923 123 * 128-Bit / 16byte UUID = E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61
dgomes 9:329af8cdc923 124 * Major/Minor = 0x1122 / 0x3344
dgomes 9:329af8cdc923 125 * Tx Power = 0xC8 = 200, 2's compliment is 256-200 = (-56dB)
dgomes 9:329af8cdc923 126 *
dgomes 9:329af8cdc923 127 * Note: please remember to calibrate your beacons TX Power for more accurate results.
dgomes 9:329af8cdc923 128 */
dgomes 9:329af8cdc923 129 const uint8_t uuid[] = {0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4,
dgomes 9:329af8cdc923 130 0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61};
dgomes 9:329af8cdc923 131 uint16_t majorNumber = 3800;
dgomes 9:329af8cdc923 132 uint16_t minorNumber = 1423;
dgomes 9:329af8cdc923 133 uint16_t txPower = 0xBE;
dgomes 9:329af8cdc923 134 iBeacon ibeacon(ble, uuid, majorNumber, minorNumber, txPower);
dgomes 9:329af8cdc923 135
dgomes 9:329af8cdc923 136 GaragemService garagemService(ble);
dgomes 9:329af8cdc923 137 garagemServicePtr = &garagemService;
dgomes 9:329af8cdc923 138
dgomes 9:329af8cdc923 139 DeviceInformationService deviceInfo(ble, "diogogomes.com", DEVICE_NAME, "SN1", "hw-rev1", "fw-rev1", "soft-rev1");
rgrover1 0:ed5c53845de7 140
rgrover1 0:ed5c53845de7 141 /* setup advertising */
rgrover1 7:c9271599ec5f 142 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
rgrover1 7:c9271599ec5f 143 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
rgrover1 7:c9271599ec5f 144 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
rgrover1 7:c9271599ec5f 145 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
dgomes 9:329af8cdc923 146
dgomes 9:329af8cdc923 147
rgrover1 7:c9271599ec5f 148 ble.gap().setAdvertisingInterval(1000); /* 1000ms. */
rgrover1 7:c9271599ec5f 149 ble.gap().startAdvertising();
rgrover1 0:ed5c53845de7 150
rgrover1 0:ed5c53845de7 151 while (true) {
rgrover1 0:ed5c53845de7 152 ble.waitForEvent();
rgrover1 0:ed5c53845de7 153 }
rgrover1 0:ed5c53845de7 154 }