fork to force BLE id to have prefix that is assumed by the app
Dependencies: BLE_API Crypto RNG mbed nRF51822
Fork of Garagem by
main.cpp@9:329af8cdc923, 2015-08-25 (annotated)
- 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?
User | Revision | Line number | New 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 | } |