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 22:18:21 2015 +0000
Revision:
9:329af8cdc923
Parent:
7:c9271599ec5f
Child:
10:80850cd6c29e
Mostly Works :)

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 9:329af8cdc923 35 //openssl enc -aes-128-cbc -K 9734062BA852A049CF5D40593B769014 -iv A2685636521871D02306E2EB8F7027B3 -out /dev/stdout
dgomes 9:329af8cdc923 36 #define SHARED_KEY "figueiredo"
dgomes 9:329af8cdc923 37 #define DEVICE_NAME "Garagem"
dgomes 9:329af8cdc923 38 //openssl enc -aes-128-cbc -pass pass:********** -nosalt -P
dgomes 9:329af8cdc923 39 uint8_t myKey[16];
dgomes 9:329af8cdc923 40 uint8_t iv[16] = { 0xA2, 0x68, 0x56, 0x36, 0x52, 0x18, 0x71, 0xD0, 0x23, 0x06, 0xE2, 0xEB, 0x8F, 0x70, 0x27, 0xB3 };
rgrover1 0:ed5c53845de7 41
rgrover1 7:c9271599ec5f 42 BLE ble;
dgomes 9:329af8cdc923 43 DigitalOut actuatedLED(P0_19);
dgomes 9:329af8cdc923 44 Timeout offRelay;
dgomes 9:329af8cdc923 45
dgomes 9:329af8cdc923 46 #ifndef DEBUG
dgomes 9:329af8cdc923 47 DigitalOut relay(P0_8);
dgomes 9:329af8cdc923 48 #endif
dgomes 9:329af8cdc923 49
dgomes 9:329af8cdc923 50 static const uint16_t uuid16_list[] = {GaragemService::GARAGEM_SERVICE_UUID};
rgrover1 0:ed5c53845de7 51
dgomes 9:329af8cdc923 52 GaragemService *garagemServicePtr;
rgrover1 0:ed5c53845de7 53
dgomes 9:329af8cdc923 54 void switchOffRelay()
dgomes 9:329af8cdc923 55 {
dgomes 9:329af8cdc923 56 actuatedLED = !actuatedLED;
dgomes 9:329af8cdc923 57 DBG("JA CHEGA...\r\n");
dgomes 9:329af8cdc923 58 #ifndef DEBUG
dgomes 9:329af8cdc923 59 relay = 0;
dgomes 9:329af8cdc923 60 #endif
dgomes 9:329af8cdc923 61 }
dgomes 9:329af8cdc923 62
rgrover1 0:ed5c53845de7 63 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
dgomes 9:329af8cdc923 64 {
dgomes 9:329af8cdc923 65 ble.startAdvertising();
rgrover1 0:ed5c53845de7 66 }
rgrover1 0:ed5c53845de7 67 /**
rgrover1 0:ed5c53845de7 68 * This callback allows the LEDService to receive updates to the ledState Characteristic.
rgrover1 0:ed5c53845de7 69 *
rgrover1 0:ed5c53845de7 70 * @param[in] params
rgrover1 0:ed5c53845de7 71 * Information about the characterisitc being updated.
rgrover1 0:ed5c53845de7 72 */
rgrover1 7:c9271599ec5f 73 void onDataWrittenCallback(const GattWriteCallbackParams *params) {
dgomes 9:329af8cdc923 74 DBG("onDataWrittenCallback: handle = %d len = %d\r\n", params->handle, params->len);
dgomes 9:329af8cdc923 75
dgomes 9:329af8cdc923 76 if ((params->handle == garagemServicePtr->getChallengeHandle()) && (params->len ==16)) {
dgomes 9:329af8cdc923 77 DBG("onDataWrittenCallback: data = %s\r\n", (char *) (params->data));
dgomes 9:329af8cdc923 78 actuatedLED = !actuatedLED;
dgomes 9:329af8cdc923 79
dgomes 9:329af8cdc923 80 AES myAES(AES_128, myKey, iv);
dgomes 9:329af8cdc923 81 uint8_t msg[16];
dgomes 9:329af8cdc923 82 myAES.decrypt(msg,(uint8_t *) (params->data),16);
dgomes 9:329af8cdc923 83
dgomes 9:329af8cdc923 84 if(garagemServicePtr->checkMessage(msg) == GARAGEM_OK) {
dgomes 9:329af8cdc923 85 #ifndef DEBUG
dgomes 9:329af8cdc923 86 relay = 1;
dgomes 9:329af8cdc923 87 #endif
dgomes 9:329af8cdc923 88 DBG("ABRE-TE SESAMO!\r\n");
dgomes 9:329af8cdc923 89
dgomes 9:329af8cdc923 90 //please cleanup afterwards
dgomes 9:329af8cdc923 91 offRelay.attach(&switchOffRelay, 1.0);
dgomes 9:329af8cdc923 92
dgomes 9:329af8cdc923 93 } else {
dgomes 9:329af8cdc923 94 DBG("NO SUCH LUCK...\r\n");
dgomes 9:329af8cdc923 95 }
rgrover1 0:ed5c53845de7 96 }
rgrover1 0:ed5c53845de7 97 }
rgrover1 0:ed5c53845de7 98
rgrover1 0:ed5c53845de7 99 int main(void)
rgrover1 0:ed5c53845de7 100 {
dgomes 9:329af8cdc923 101 DBG("Garagem v0\r\n");
rgrover1 0:ed5c53845de7 102
dgomes 9:329af8cdc923 103 //Compute myKey from SHARED_KEY
dgomes 9:329af8cdc923 104 MD5::computeHash(myKey, (uint8_t*) SHARED_KEY, strlen(SHARED_KEY));
dgomes 9:329af8cdc923 105
dgomes 9:329af8cdc923 106 actuatedLED = true;
dgomes 9:329af8cdc923 107 #ifndef DEBUG
dgomes 9:329af8cdc923 108 relay = 0;
dgomes 9:329af8cdc923 109 #endif
rgrover1 0:ed5c53845de7 110
rgrover1 0:ed5c53845de7 111 ble.init();
dgomes 9:329af8cdc923 112 ble.onDisconnection(disconnectionCallback);
rgrover1 7:c9271599ec5f 113 ble.gattServer().onDataWritten(onDataWrittenCallback);
rgrover1 0:ed5c53845de7 114
dgomes 9:329af8cdc923 115 /**
dgomes 9:329af8cdc923 116 * The Beacon payload has the following composition:
dgomes 9:329af8cdc923 117 * 128-Bit / 16byte UUID = E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61
dgomes 9:329af8cdc923 118 * Major/Minor = 0x1122 / 0x3344
dgomes 9:329af8cdc923 119 * Tx Power = 0xC8 = 200, 2's compliment is 256-200 = (-56dB)
dgomes 9:329af8cdc923 120 *
dgomes 9:329af8cdc923 121 * Note: please remember to calibrate your beacons TX Power for more accurate results.
dgomes 9:329af8cdc923 122 */
dgomes 9:329af8cdc923 123 const uint8_t uuid[] = {0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4,
dgomes 9:329af8cdc923 124 0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61};
dgomes 9:329af8cdc923 125 uint16_t majorNumber = 3800;
dgomes 9:329af8cdc923 126 uint16_t minorNumber = 1423;
dgomes 9:329af8cdc923 127 uint16_t txPower = 0xBE;
dgomes 9:329af8cdc923 128 iBeacon ibeacon(ble, uuid, majorNumber, minorNumber, txPower);
dgomes 9:329af8cdc923 129
dgomes 9:329af8cdc923 130 GaragemService garagemService(ble);
dgomes 9:329af8cdc923 131 garagemServicePtr = &garagemService;
dgomes 9:329af8cdc923 132
dgomes 9:329af8cdc923 133 DeviceInformationService deviceInfo(ble, "diogogomes.com", DEVICE_NAME, "SN1", "hw-rev1", "fw-rev1", "soft-rev1");
rgrover1 0:ed5c53845de7 134
rgrover1 0:ed5c53845de7 135 /* setup advertising */
rgrover1 7:c9271599ec5f 136 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
rgrover1 7:c9271599ec5f 137 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
rgrover1 7:c9271599ec5f 138 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
rgrover1 7:c9271599ec5f 139 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
dgomes 9:329af8cdc923 140
dgomes 9:329af8cdc923 141
rgrover1 7:c9271599ec5f 142 ble.gap().setAdvertisingInterval(1000); /* 1000ms. */
rgrover1 7:c9271599ec5f 143 ble.gap().startAdvertising();
rgrover1 0:ed5c53845de7 144
rgrover1 0:ed5c53845de7 145 while (true) {
rgrover1 0:ed5c53845de7 146 ble.waitForEvent();
rgrover1 0:ed5c53845de7 147 }
rgrover1 0:ed5c53845de7 148 }