SDT Inc.
/
SDT-example-ble-ibeacon
Example for SDT BLE-ibeacon
main.cpp@0:1bed737533ab, 2018-09-17 (annotated)
- Committer:
- group-Sigma-Delta-Technologies
- Date:
- Mon Sep 17 02:28:29 2018 +0000
- Revision:
- 0:1bed737533ab
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
group-Sigma-Delta-Technologies | 0:1bed737533ab | 1 | /* SDT-example-ble-ibeacon |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 2 | * |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 3 | * Copyright (c) 2018 Sigma Delta Technologies Inc. |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 4 | * |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 5 | * MIT License |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 6 | * |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 7 | * Permission is hereby granted, free of charge, to any person |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 8 | * obtaining a copy of this software and associated documentation |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 9 | * files (the "Software"), to deal in the Software without |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 10 | * restriction, including without limitation the rights to use, |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 12 | * copies of the Software, and to permit persons to whom the |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 13 | * Software is furnished to do so, subject to the following |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 14 | * conditions: |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 15 | * |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 16 | * The above copyright notice and this permission notice shall be |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 17 | * included in all copies or substantial portions of the Software. |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 18 | * |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 26 | * OTHER DEALINGS IN THE SOFTWARE. |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 27 | */ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 28 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 29 | #include "mbed.h" |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 30 | #include "features/FEATURE_BLE/ble/BLE.h" |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 31 | #include "features/FEATURE_BLE/ble/services/iBeacon.h" |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 32 | #include "events/mbed_events.h" |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 33 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 34 | /* Serial */ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 35 | #define BAUDRATE 9600 |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 36 | Serial g_Serial_pc(USBTX, USBRX, BAUDRATE); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 37 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 38 | /* DigitalOut */ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 39 | #define LED_ON 0 |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 40 | #define LED_OFF 1 |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 41 | DigitalOut g_DO_LedRed(LED_RED, LED_OFF); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 42 | DigitalOut g_DO_LedGreen(LED_GREEN, LED_OFF); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 43 | DigitalOut g_DO_LedBlue(LED_BLUE, LED_OFF); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 44 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 45 | /* Ticker */ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 46 | Ticker g_Ticker; |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 47 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 48 | /* EventQueue */ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 49 | EventQueue g_EventQueue(4 * EVENTS_EVENT_SIZE); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 50 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 51 | /* BLE */ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 52 | #define BLE_DEVICE_NAME "SDT Device" |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 53 | BLE& g_pBle = BLE::Instance(); // Default ID of instance is 'DEFAULT_INSTANCE' |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 54 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 55 | /* iBeacon */ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 56 | iBeacon* g_pIbeacon; |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 57 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 58 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 59 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 60 | void callbackTicker(void) { |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 61 | g_Serial_pc.printf("LED Toggle\n"); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 62 | g_DO_LedBlue = !g_DO_LedBlue; |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 63 | } |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 64 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 65 | void callbackEventsToProcess(BLE::OnEventsToProcessCallbackContext* context) { |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 66 | g_EventQueue.call(Callback<void()>(&g_pBle, &BLE::processEvents)); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 67 | } |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 68 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 69 | void initIBeacon(BLE& ble) { |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 70 | /** |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 71 | * The Beacon payload has the following composition: |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 72 | * 128-Bit / 16byte UUID = E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 73 | * Major/Minor = 0x1122 / 0x3344 |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 74 | * Tx Power = 0xC8 = 200, 2's compliment is 256-200 = (-56dB) |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 75 | * |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 76 | * Note: please remember to calibrate your beacons TX Power for more accurate results. |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 77 | */ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 78 | const uint8_t uuid[] = {0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4, |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 79 | 0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61}; |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 80 | uint16_t majorNumber = 1122; |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 81 | uint16_t minorNumber = 3344; |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 82 | uint16_t txPower = 0xC8; |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 83 | g_pIbeacon = new iBeacon(ble, uuid, majorNumber, minorNumber, txPower); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 84 | } |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 85 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 86 | void printMacAddress(BLE& ble) { |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 87 | /* Print out device MAC address to the console */ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 88 | Gap::AddressType_t addr_type; |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 89 | Gap::Address_t address; |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 90 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 91 | ble.gap().getAddress(&addr_type, address); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 92 | g_Serial_pc.printf("DEVICE MAC ADDRESS = "); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 93 | for (int i = 5; i >= 1; i--){ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 94 | g_Serial_pc.printf("%02x:", address[i]); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 95 | } |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 96 | g_Serial_pc.printf("%02x\n", address[0]); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 97 | } |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 98 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 99 | /** |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 100 | * Callback triggered when the ble initialization process has finished |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 101 | */ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 102 | void callbackBleInitComplete(BLE::InitializationCompleteCallbackContext* params) { |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 103 | BLE& ble = params->ble; // 'ble' equals g_pBle declared in global |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 104 | ble_error_t error = params->error; // 'error' has BLE_ERROR_NONE if the initialization procedure started successfully. |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 105 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 106 | if (error == BLE_ERROR_NONE) { |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 107 | g_Serial_pc.printf("Initialization completed successfully\n"); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 108 | } |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 109 | else { |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 110 | /* In case of error, forward the error handling to onBleInitError */ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 111 | g_Serial_pc.printf("Initialization failled\n"); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 112 | return; |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 113 | } |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 114 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 115 | /* Ensure that it is the default instance of BLE */ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 116 | if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 117 | g_Serial_pc.printf("ID of BLE instance is not DEFAULT_INSTANCE\n"); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 118 | return; |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 119 | } |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 120 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 121 | /* Setup iBeacon */ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 122 | initIBeacon(ble); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 123 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 124 | /* Setup and start advertising */ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 125 | printMacAddress(ble); // Optional function |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 126 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, (const uint8_t *)BLE_DEVICE_NAME, sizeof(BLE_DEVICE_NAME) - 1); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 127 | ble.gap().setAdvertisingInterval(1000); // Advertising interval in units of milliseconds |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 128 | ble.gap().startAdvertising(); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 129 | g_Serial_pc.printf("Start advertising\n"); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 130 | } |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 131 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 132 | int main(void) { |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 133 | g_Serial_pc.printf("< Sigma Delta Technologies Inc. >\n\r"); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 134 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 135 | /* Init BLE and iBeacon */ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 136 | g_pBle.onEventsToProcess(callbackEventsToProcess); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 137 | g_pBle.init(callbackBleInitComplete); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 138 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 139 | /* Check whether IC is running or not */ |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 140 | g_Ticker.attach(callbackTicker, 1); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 141 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 142 | g_EventQueue.dispatch_forever(); |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 143 | |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 144 | return 0; |
group-Sigma-Delta-Technologies | 0:1bed737533ab | 145 | } |