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:
Wed Aug 26 00:13:10 2015 +0000
Revision:
11:3de9b542eeac
Parent:
10:80850cd6c29e
Child:
12:eaee29bfa1c7
Not working (no Bluetooth)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dgomes 9:329af8cdc923 1 #define DEBUG
dgomes 9:329af8cdc923 2
dgomes 9:329af8cdc923 3 #ifndef DEBUG
dgomes 9:329af8cdc923 4 #define DEVICE_SERIAL 0 //disable SERIAL so me can use P0_8 (shared with serial)
dgomes 9:329af8cdc923 5 #define DBG(...)
dgomes 9:329af8cdc923 6 #else
dgomes 9:329af8cdc923 7 #define DBG printf
dgomes 9:329af8cdc923 8 #endif
rgrover1 0:ed5c53845de7 9
rgrover1 0:ed5c53845de7 10 #include "mbed.h"
rgrover1 6:fca54d71d10e 11 #include "BLE.h"
dgomes 9:329af8cdc923 12 #include "GaragemService.h"
dgomes 11:3de9b542eeac 13 #include "SecurityService.h"
dgomes 9:329af8cdc923 14 #include "ble/services/iBeacon.h"
dgomes 9:329af8cdc923 15 #include "DeviceInformationService.h"
dgomes 9:329af8cdc923 16
dgomes 9:329af8cdc923 17
dgomes 11:3de9b542eeac 18 // HOW-TO TEST:
dgomes 11:3de9b542eeac 19 //create a string to write to the characteristic 2000:2001
dgomes 10:80850cd6c29e 20 //openssl enc -aes-128-cbc -K 9734062BA852A049CF5D40593B769014 -iv A2685636521871D02306E2EB8F7027B3 -out /dev/stdout -in inputfile
dgomes 10:80850cd6c29e 21 // TTTTIIIISSSSSSSS
dgomes 10:80850cd6c29e 22 // T -> 4 bytes Timestamp uint32_t
dgomes 10:80850cd6c29e 23 // I -> 4 bytes ID (chars)
dgomes 10:80850cd6c29e 24 // S -> 8 bytes SHARED_SECRET (chars)
dgomes 10:80850cd6c29e 25
dgomes 9:329af8cdc923 26 #define SHARED_KEY "figueiredo"
dgomes 9:329af8cdc923 27 #define DEVICE_NAME "Garagem"
rgrover1 0:ed5c53845de7 28
rgrover1 7:c9271599ec5f 29 BLE ble;
dgomes 9:329af8cdc923 30 DigitalOut actuatedLED(P0_19);
dgomes 9:329af8cdc923 31 Timeout offRelay;
dgomes 9:329af8cdc923 32
dgomes 9:329af8cdc923 33 #ifndef DEBUG
dgomes 9:329af8cdc923 34 DigitalOut relay(P0_8);
dgomes 9:329af8cdc923 35 #endif
dgomes 9:329af8cdc923 36
dgomes 11:3de9b542eeac 37 static const uint16_t uuid16_list[] = {GaragemService::GARAGEM_SERVICE_UUID, SecurityService::SECURITY_SERVICE_UUID};
rgrover1 0:ed5c53845de7 38
dgomes 9:329af8cdc923 39 GaragemService *garagemServicePtr;
dgomes 11:3de9b542eeac 40 SecurityService *securityServicePtr;
rgrover1 0:ed5c53845de7 41
dgomes 9:329af8cdc923 42 void switchOffRelay()
dgomes 9:329af8cdc923 43 {
dgomes 9:329af8cdc923 44 actuatedLED = !actuatedLED;
dgomes 9:329af8cdc923 45 DBG("JA CHEGA...\r\n");
dgomes 9:329af8cdc923 46 #ifndef DEBUG
dgomes 9:329af8cdc923 47 relay = 0;
dgomes 9:329af8cdc923 48 #endif
dgomes 9:329af8cdc923 49 }
dgomes 9:329af8cdc923 50
rgrover1 0:ed5c53845de7 51 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
dgomes 9:329af8cdc923 52 {
dgomes 9:329af8cdc923 53 ble.startAdvertising();
rgrover1 0:ed5c53845de7 54 }
dgomes 11:3de9b542eeac 55
rgrover1 7:c9271599ec5f 56 void onDataWrittenCallback(const GattWriteCallbackParams *params) {
dgomes 9:329af8cdc923 57 DBG("onDataWrittenCallback: handle = %d len = %d\r\n", params->handle, params->len);
dgomes 10:80850cd6c29e 58 garagemServicePtr->nextLastOpen(params->data, params->len);
dgomes 10:80850cd6c29e 59
dgomes 9:329af8cdc923 60 if ((params->handle == garagemServicePtr->getChallengeHandle()) && (params->len ==16)) {
dgomes 10:80850cd6c29e 61 DBG("We have Challenge: data = %s\r\n", (char *) (params->data));
dgomes 9:329af8cdc923 62
dgomes 9:329af8cdc923 63 uint8_t msg[16];
dgomes 11:3de9b542eeac 64 securityServicePtr->decode(msg, (uint8_t *) params->data, 16);
dgomes 9:329af8cdc923 65
dgomes 9:329af8cdc923 66 if(garagemServicePtr->checkMessage(msg) == GARAGEM_OK) {
dgomes 10:80850cd6c29e 67 DBG("ABRE-TE SESAMO!\r\n");
dgomes 10:80850cd6c29e 68
dgomes 9:329af8cdc923 69 #ifndef DEBUG
dgomes 9:329af8cdc923 70 relay = 1;
dgomes 9:329af8cdc923 71 #endif
dgomes 10:80850cd6c29e 72 actuatedLED = !actuatedLED;
dgomes 9:329af8cdc923 73 //please cleanup afterwards
dgomes 9:329af8cdc923 74 offRelay.attach(&switchOffRelay, 1.0);
dgomes 9:329af8cdc923 75
dgomes 9:329af8cdc923 76 } else {
dgomes 9:329af8cdc923 77 DBG("NO SUCH LUCK...\r\n");
dgomes 9:329af8cdc923 78 }
dgomes 11:3de9b542eeac 79 } if((params->handle == securityServicePtr->getKeyHandle()) && (params->len > 0)) {
dgomes 11:3de9b542eeac 80 securityServicePtr->setKey((char *) params->data);
dgomes 11:3de9b542eeac 81 }
dgomes 11:3de9b542eeac 82 securityServicePtr->bootComplete();
rgrover1 0:ed5c53845de7 83 }
rgrover1 0:ed5c53845de7 84
rgrover1 0:ed5c53845de7 85 int main(void)
rgrover1 0:ed5c53845de7 86 {
dgomes 9:329af8cdc923 87 DBG("Garagem v0\r\n");
rgrover1 0:ed5c53845de7 88
dgomes 9:329af8cdc923 89 actuatedLED = true;
dgomes 9:329af8cdc923 90 #ifndef DEBUG
dgomes 9:329af8cdc923 91 relay = 0;
dgomes 9:329af8cdc923 92 #endif
rgrover1 0:ed5c53845de7 93
rgrover1 0:ed5c53845de7 94 ble.init();
dgomes 9:329af8cdc923 95 ble.onDisconnection(disconnectionCallback);
rgrover1 7:c9271599ec5f 96 ble.gattServer().onDataWritten(onDataWrittenCallback);
rgrover1 0:ed5c53845de7 97
dgomes 9:329af8cdc923 98 /**
dgomes 9:329af8cdc923 99 * The Beacon payload has the following composition:
dgomes 9:329af8cdc923 100 * 128-Bit / 16byte UUID = E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61
dgomes 9:329af8cdc923 101 * Major/Minor = 0x1122 / 0x3344
dgomes 9:329af8cdc923 102 * Tx Power = 0xC8 = 200, 2's compliment is 256-200 = (-56dB)
dgomes 9:329af8cdc923 103 *
dgomes 9:329af8cdc923 104 * Note: please remember to calibrate your beacons TX Power for more accurate results.
dgomes 9:329af8cdc923 105 */
dgomes 9:329af8cdc923 106 const uint8_t uuid[] = {0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4,
dgomes 9:329af8cdc923 107 0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61};
dgomes 9:329af8cdc923 108 uint16_t majorNumber = 3800;
dgomes 9:329af8cdc923 109 uint16_t minorNumber = 1423;
dgomes 9:329af8cdc923 110 uint16_t txPower = 0xBE;
dgomes 9:329af8cdc923 111 iBeacon ibeacon(ble, uuid, majorNumber, minorNumber, txPower);
dgomes 9:329af8cdc923 112
dgomes 9:329af8cdc923 113 GaragemService garagemService(ble);
dgomes 9:329af8cdc923 114 garagemServicePtr = &garagemService;
dgomes 11:3de9b542eeac 115
dgomes 11:3de9b542eeac 116 SecurityService securityService(ble, SHARED_KEY);
dgomes 11:3de9b542eeac 117 securityServicePtr = &securityService;
dgomes 9:329af8cdc923 118
dgomes 9:329af8cdc923 119 DeviceInformationService deviceInfo(ble, "diogogomes.com", DEVICE_NAME, "SN1", "hw-rev1", "fw-rev1", "soft-rev1");
rgrover1 0:ed5c53845de7 120
rgrover1 0:ed5c53845de7 121 /* setup advertising */
rgrover1 7:c9271599ec5f 122 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
rgrover1 7:c9271599ec5f 123 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
rgrover1 7:c9271599ec5f 124 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
rgrover1 7:c9271599ec5f 125 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
dgomes 9:329af8cdc923 126
dgomes 9:329af8cdc923 127
rgrover1 7:c9271599ec5f 128 ble.gap().setAdvertisingInterval(1000); /* 1000ms. */
rgrover1 7:c9271599ec5f 129 ble.gap().startAdvertising();
rgrover1 0:ed5c53845de7 130
rgrover1 0:ed5c53845de7 131 while (true) {
rgrover1 0:ed5c53845de7 132 ble.waitForEvent();
rgrover1 0:ed5c53845de7 133 }
rgrover1 0:ed5c53845de7 134 }