Test for central Device A iBeacon
Dependencies: BLE_API mbed nRF51822
main.cpp@0:c9040e9dbeac, 2015-07-20 (annotated)
- Committer:
- jslater8
- Date:
- Mon Jul 20 13:46:24 2015 +0000
- Revision:
- 0:c9040e9dbeac
almost finished
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jslater8 | 0:c9040e9dbeac | 1 | /* mbed Microcontroller Library |
jslater8 | 0:c9040e9dbeac | 2 | * Copyright (c) 2006-2013 ARM Limited |
jslater8 | 0:c9040e9dbeac | 3 | * |
jslater8 | 0:c9040e9dbeac | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
jslater8 | 0:c9040e9dbeac | 5 | * you may not use this file except in compliance with the License. |
jslater8 | 0:c9040e9dbeac | 6 | * You may obtain a copy of the License at |
jslater8 | 0:c9040e9dbeac | 7 | * |
jslater8 | 0:c9040e9dbeac | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
jslater8 | 0:c9040e9dbeac | 9 | * |
jslater8 | 0:c9040e9dbeac | 10 | * Unless required by applicable law or agreed to in writing, software |
jslater8 | 0:c9040e9dbeac | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
jslater8 | 0:c9040e9dbeac | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
jslater8 | 0:c9040e9dbeac | 13 | * See the License for the specific language governing permissions and |
jslater8 | 0:c9040e9dbeac | 14 | * limitations under the License. |
jslater8 | 0:c9040e9dbeac | 15 | */ |
jslater8 | 0:c9040e9dbeac | 16 | |
jslater8 | 0:c9040e9dbeac | 17 | #include "mbed.h" |
jslater8 | 0:c9040e9dbeac | 18 | #include "iBeaconService.h" |
jslater8 | 0:c9040e9dbeac | 19 | |
jslater8 | 0:c9040e9dbeac | 20 | #define BLE_CHECK(X) (X == BLE_ERROR_NONE) ? (printf("{{success}}\r\n")) : printf("{{failure}} %s at line %u ERROR CODE: %u\r\n", #X, __LINE__, (X)); |
jslater8 | 0:c9040e9dbeac | 21 | #define BLE_EQUAL(X,Y) ((X)==(Y)) ? (printf("{{sucess}}\n")) : printf("{{failure}}\n"); |
jslater8 | 0:c9040e9dbeac | 22 | |
jslater8 | 0:c9040e9dbeac | 23 | /** |
jslater8 | 0:c9040e9dbeac | 24 | * For this demo application, populate the beacon advertisement payload |
jslater8 | 0:c9040e9dbeac | 25 | * with 2 AD structures: FLAG and MSD (manufacturer specific data). |
jslater8 | 0:c9040e9dbeac | 26 | * |
jslater8 | 0:c9040e9dbeac | 27 | * Reference: |
jslater8 | 0:c9040e9dbeac | 28 | * Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 11, 18 |
jslater8 | 0:c9040e9dbeac | 29 | */ |
jslater8 | 0:c9040e9dbeac | 30 | |
jslater8 | 0:c9040e9dbeac | 31 | BLE ble; |
jslater8 | 0:c9040e9dbeac | 32 | Ticker tick; |
jslater8 | 0:c9040e9dbeac | 33 | DigitalOut myled(LED1); |
jslater8 | 0:c9040e9dbeac | 34 | /** |
jslater8 | 0:c9040e9dbeac | 35 | * The Beacon payload has the following composition: |
jslater8 | 0:c9040e9dbeac | 36 | * 128-Bit / 16byte UUID = E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 |
jslater8 | 0:c9040e9dbeac | 37 | * Major/Minor = 0x1122 / 0x3344 |
jslater8 | 0:c9040e9dbeac | 38 | * Tx Power = 0xC8 = 200, 2's compliment is 256-200 = (-56dB) |
jslater8 | 0:c9040e9dbeac | 39 | * |
jslater8 | 0:c9040e9dbeac | 40 | * Note: please remember to calibrate your beacons |
jslater8 | 0:c9040e9dbeac | 41 | * TX Power for more accurate results. |
jslater8 | 0:c9040e9dbeac | 42 | */ |
jslater8 | 0:c9040e9dbeac | 43 | const uint8_t uuid[] = {0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4, |
jslater8 | 0:c9040e9dbeac | 44 | 0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61 |
jslater8 | 0:c9040e9dbeac | 45 | }; |
jslater8 | 0:c9040e9dbeac | 46 | uint16_t majorNumber = 1122; |
jslater8 | 0:c9040e9dbeac | 47 | uint16_t minorNumber = 3344; |
jslater8 | 0:c9040e9dbeac | 48 | uint16_t txPower = 0xC8; |
jslater8 | 0:c9040e9dbeac | 49 | |
jslater8 | 0:c9040e9dbeac | 50 | Gap::AddressType_t addressType; |
jslater8 | 0:c9040e9dbeac | 51 | Gap::Address_t address; |
jslater8 | 0:c9040e9dbeac | 52 | Gap::Address_t addrTest = {110,100,100,100,100,100}; |
jslater8 | 0:c9040e9dbeac | 53 | const static char DEVICE_NAME[] = "IBEACONTEST"; |
jslater8 | 0:c9040e9dbeac | 54 | Gap::GapState_t state; |
jslater8 | 0:c9040e9dbeac | 55 | |
jslater8 | 0:c9040e9dbeac | 56 | void changeAdvPay(void); |
jslater8 | 0:c9040e9dbeac | 57 | void changeScanRes(void); |
jslater8 | 0:c9040e9dbeac | 58 | /** |
jslater8 | 0:c9040e9dbeac | 59 | * Test to change advertisement interval |
jslater8 | 0:c9040e9dbeac | 60 | */ |
jslater8 | 0:c9040e9dbeac | 61 | void changeAdvTime(void){ |
jslater8 | 0:c9040e9dbeac | 62 | tick.detach(); |
jslater8 | 0:c9040e9dbeac | 63 | BLE_CHECK(ble.gap().stopAdvertising()); |
jslater8 | 0:c9040e9dbeac | 64 | ble.gap().setAdvertisingTimeout(0); |
jslater8 | 0:c9040e9dbeac | 65 | ble.gap().setAdvertisingInterval(500); |
jslater8 | 0:c9040e9dbeac | 66 | BLE_CHECK(ble.gap().startAdvertising()); |
jslater8 | 0:c9040e9dbeac | 67 | } |
jslater8 | 0:c9040e9dbeac | 68 | /** |
jslater8 | 0:c9040e9dbeac | 69 | * Test to change advertisement payload |
jslater8 | 0:c9040e9dbeac | 70 | */ |
jslater8 | 0:c9040e9dbeac | 71 | void changeAdvPay(void){ |
jslater8 | 0:c9040e9dbeac | 72 | tick.detach(); |
jslater8 | 0:c9040e9dbeac | 73 | BLE_CHECK(ble.gap().stopAdvertising()); |
jslater8 | 0:c9040e9dbeac | 74 | ble.gap().clearAdvertisingPayload(); |
jslater8 | 0:c9040e9dbeac | 75 | ble.gap().setAdvertisingTimeout(0); |
jslater8 | 0:c9040e9dbeac | 76 | BLE_CHECK(ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::LE_GENERAL_DISCOVERABLE | GapAdvertisingData::BREDR_NOT_SUPPORTED)); |
jslater8 | 0:c9040e9dbeac | 77 | BLE_CHECK(ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::OUTDOOR_GENERIC)); |
jslater8 | 0:c9040e9dbeac | 78 | BLE_CHECK(ble.gap().accumulateAdvertisingPayloadTxPower(10)); |
jslater8 | 0:c9040e9dbeac | 79 | uint8_t data[5] = {123,123,123,123,123}; |
jslater8 | 0:c9040e9dbeac | 80 | BLE_CHECK(ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, data, 5)); |
jslater8 | 0:c9040e9dbeac | 81 | //BLE_CHECK(ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME))); |
jslater8 | 0:c9040e9dbeac | 82 | ble.gap().setAdvertisingInterval(500); |
jslater8 | 0:c9040e9dbeac | 83 | BLE_CHECK(ble.gap().startAdvertising()); |
jslater8 | 0:c9040e9dbeac | 84 | } |
jslater8 | 0:c9040e9dbeac | 85 | /** |
jslater8 | 0:c9040e9dbeac | 86 | * Test to change add a scan response |
jslater8 | 0:c9040e9dbeac | 87 | */ |
jslater8 | 0:c9040e9dbeac | 88 | void changeScanRes(void){ |
jslater8 | 0:c9040e9dbeac | 89 | tick.detach(); |
jslater8 | 0:c9040e9dbeac | 90 | BLE_CHECK(ble.gap().stopAdvertising()); |
jslater8 | 0:c9040e9dbeac | 91 | ble.gap().clearAdvertisingPayload(); |
jslater8 | 0:c9040e9dbeac | 92 | ble.gap().clearScanResponse(); |
jslater8 | 0:c9040e9dbeac | 93 | ble.gap().setAdvertisingTimeout(0); |
jslater8 | 0:c9040e9dbeac | 94 | ble.setAdvertisingType(GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED); |
jslater8 | 0:c9040e9dbeac | 95 | uint8_t data2[5] = {50,50,50,50,50}; |
jslater8 | 0:c9040e9dbeac | 96 | BLE_CHECK(ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, data2, sizeof(data2))); |
jslater8 | 0:c9040e9dbeac | 97 | uint8_t data[5] = {50,50,50,50,50}; |
jslater8 | 0:c9040e9dbeac | 98 | BLE_CHECK(ble.gap().accumulateScanResponse(GapAdvertisingData::SERVICE_DATA, data, sizeof(data))); |
jslater8 | 0:c9040e9dbeac | 99 | ble.gap().setAdvertisingInterval(500); |
jslater8 | 0:c9040e9dbeac | 100 | BLE_CHECK(ble.gap().startAdvertising()); |
jslater8 | 0:c9040e9dbeac | 101 | } |
jslater8 | 0:c9040e9dbeac | 102 | /** |
jslater8 | 0:c9040e9dbeac | 103 | * Test to change advertisement timeout |
jslater8 | 0:c9040e9dbeac | 104 | */ |
jslater8 | 0:c9040e9dbeac | 105 | void timeoutTest(void){ |
jslater8 | 0:c9040e9dbeac | 106 | BLE_CHECK(ble.gap().stopAdvertising()); |
jslater8 | 0:c9040e9dbeac | 107 | ble.gap().clearAdvertisingPayload(); |
jslater8 | 0:c9040e9dbeac | 108 | ble.gap().clearScanResponse(); |
jslater8 | 0:c9040e9dbeac | 109 | ble.gap().setAdvertisingTimeout(5); |
jslater8 | 0:c9040e9dbeac | 110 | BLE_CHECK(ble.gap().startAdvertising()); |
jslater8 | 0:c9040e9dbeac | 111 | } |
jslater8 | 0:c9040e9dbeac | 112 | /** |
jslater8 | 0:c9040e9dbeac | 113 | * Reset function run after every test |
jslater8 | 0:c9040e9dbeac | 114 | */ |
jslater8 | 0:c9040e9dbeac | 115 | void reset(void){ |
jslater8 | 0:c9040e9dbeac | 116 | tick.detach(); |
jslater8 | 0:c9040e9dbeac | 117 | ble.gap().stopAdvertising(); |
jslater8 | 0:c9040e9dbeac | 118 | ble.gap().clearAdvertisingPayload(); |
jslater8 | 0:c9040e9dbeac | 119 | ble.gap().clearScanResponse(); |
jslater8 | 0:c9040e9dbeac | 120 | ble.gap().setAdvertisingTimeout(0); |
jslater8 | 0:c9040e9dbeac | 121 | ble.gap().setAdvertisingInterval(1000); |
jslater8 | 0:c9040e9dbeac | 122 | uint8_t data2[5] = {0,0,0,0,0}; |
jslater8 | 0:c9040e9dbeac | 123 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, data2, sizeof(data2)); |
jslater8 | 0:c9040e9dbeac | 124 | BLE_CHECK(ble.gap().startAdvertising()); |
jslater8 | 0:c9040e9dbeac | 125 | } |
jslater8 | 0:c9040e9dbeac | 126 | /** |
jslater8 | 0:c9040e9dbeac | 127 | * Controls which tests are run from input from PC |
jslater8 | 0:c9040e9dbeac | 128 | */ |
jslater8 | 0:c9040e9dbeac | 129 | void testCentre(void){ |
jslater8 | 0:c9040e9dbeac | 130 | int x; |
jslater8 | 0:c9040e9dbeac | 131 | scanf("%d" , &x); |
jslater8 | 0:c9040e9dbeac | 132 | printf("%d:%d:%d:%d:%d:%d\n", address[0], address[1], address[2], address[3], address[4], address[5]); |
jslater8 | 0:c9040e9dbeac | 133 | GapAdvertisingData testData = ble.gap().getAdvertisingPayload(); |
jslater8 | 0:c9040e9dbeac | 134 | state = ble.gap().getState(); |
jslater8 | 0:c9040e9dbeac | 135 | !(testData.getPayload()) ? printf("{{failure}} ble.gap().getAdvertisingPayload() at line %u\r\n", __LINE__) : printf("{{success}}\r\n"); |
jslater8 | 0:c9040e9dbeac | 136 | (state.connected == 1 || state.advertising == 0) ? printf("{{failure}} ble.gap().getState() at line %u\r\n", __LINE__) : printf("{{success}}\r\n"); |
jslater8 | 0:c9040e9dbeac | 137 | while(true){ |
jslater8 | 0:c9040e9dbeac | 138 | scanf("%d", &x); |
jslater8 | 0:c9040e9dbeac | 139 | switch (x){ |
jslater8 | 0:c9040e9dbeac | 140 | case 0: |
jslater8 | 0:c9040e9dbeac | 141 | changeAdvTime(); |
jslater8 | 0:c9040e9dbeac | 142 | break; |
jslater8 | 0:c9040e9dbeac | 143 | case 1: |
jslater8 | 0:c9040e9dbeac | 144 | changeAdvPay(); |
jslater8 | 0:c9040e9dbeac | 145 | break; |
jslater8 | 0:c9040e9dbeac | 146 | case 2: |
jslater8 | 0:c9040e9dbeac | 147 | timeoutTest(); |
jslater8 | 0:c9040e9dbeac | 148 | break; |
jslater8 | 0:c9040e9dbeac | 149 | case 3: |
jslater8 | 0:c9040e9dbeac | 150 | changeScanRes(); |
jslater8 | 0:c9040e9dbeac | 151 | break; |
jslater8 | 0:c9040e9dbeac | 152 | default: |
jslater8 | 0:c9040e9dbeac | 153 | return; |
jslater8 | 0:c9040e9dbeac | 154 | } |
jslater8 | 0:c9040e9dbeac | 155 | scanf("%d", &x); |
jslater8 | 0:c9040e9dbeac | 156 | reset(); |
jslater8 | 0:c9040e9dbeac | 157 | } |
jslater8 | 0:c9040e9dbeac | 158 | } |
jslater8 | 0:c9040e9dbeac | 159 | |
jslater8 | 0:c9040e9dbeac | 160 | int main(void) |
jslater8 | 0:c9040e9dbeac | 161 | { |
jslater8 | 0:c9040e9dbeac | 162 | myled = 0; |
jslater8 | 0:c9040e9dbeac | 163 | |
jslater8 | 0:c9040e9dbeac | 164 | BLE_CHECK(ble.init()); |
jslater8 | 0:c9040e9dbeac | 165 | |
jslater8 | 0:c9040e9dbeac | 166 | iBeaconService ibeacon(ble, uuid, majorNumber, minorNumber, txPower); |
jslater8 | 0:c9040e9dbeac | 167 | |
jslater8 | 0:c9040e9dbeac | 168 | ble.gap().setAdvertisingInterval(1000); /* 1000ms. */ |
jslater8 | 0:c9040e9dbeac | 169 | ble.gap().setAdvertisingTimeout(0); |
jslater8 | 0:c9040e9dbeac | 170 | |
jslater8 | 0:c9040e9dbeac | 171 | BLE_CHECK(ble.gap().setAddress(Gap::ADDR_TYPE_PUBLIC, addrTest)); |
jslater8 | 0:c9040e9dbeac | 172 | BLE_CHECK(ble.gap().getAddress(&addressType, address)); |
jslater8 | 0:c9040e9dbeac | 173 | BLE_CHECK(ble.gap().startAdvertising()); |
jslater8 | 0:c9040e9dbeac | 174 | |
jslater8 | 0:c9040e9dbeac | 175 | GapAdvertisingData testData = ble.gap().getAdvertisingPayload(); |
jslater8 | 0:c9040e9dbeac | 176 | |
jslater8 | 0:c9040e9dbeac | 177 | printf("{{success}}" "\n" "{{end}}" "\n"); //tells mbedhtrun to finish |
jslater8 | 0:c9040e9dbeac | 178 | testCentre(); |
jslater8 | 0:c9040e9dbeac | 179 | } |