
Beacon demo for the BLE API using the nRF51822 native mode drivers
Dependencies: BLE_API SDFileSystem mbed-rtos mbed nRF51822 X_NUCLEO_IDB0XA1
Fork of BLE_iBeacon by
Revision 53:f9ec2c7a47f5, committed 2015-02-12
- Comitter:
- mbedAustin
- Date:
- Thu Feb 12 22:36:55 2015 +0000
- Parent:
- 52:9e6dff2c4c70
- Child:
- 54:3a655a9fce9a
- Commit message:
- Updated BLE_API library and mbed library, added iBeaconService.h and altered main.cpp to reflect the use of iBeaconService.h accordingly
Changed in this revision
--- a/BLE_API.lib Wed Jan 21 10:05:06 2015 +0000 +++ b/BLE_API.lib Thu Feb 12 22:36:55 2015 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/teams/Bluetooth-Low-Energy/code/BLE_API/#4abc3126f1e1 +http://mbed.org/teams/Bluetooth-Low-Energy/code/BLE_API/#1407d2f1ce3c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iBeaconService.h Thu Feb 12 22:36:55 2015 +0000 @@ -0,0 +1,73 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2015 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef __BLE_IBEACON_SERVICE_H__ +#define __BLE_IBEACON_SERVICE_H__ + +#include "BLEDevice.h" + +/** +* @class iBeaconService +* @brief iBeacon Service. This service sets up a device to broadcast advertising packets to mimic an iBeacon<br> +*/ + +class iBeaconService +{ +public: + iBeaconService(BLEDevice &_ble, uint8_t proxUUID[16],uint16_t majNum,uint16_t minNum,uint8_t txP=0xC8, uint16_t compID=0x004C): + ble(_ble) + { + data.ID = 0x02; // Optional ID field + data.len = 0x15; // Len of remaining stuff (16B UUID, 2B Maj, 2B Min, 1B TxP) + data.majorNumber = ((majNum<<8) | (majNum >>8)); + data.minorNumber = ((minNum<<8) | (minNum >>8)); + data.txPower = txP; // The user should calibrate this to ~1meter fromt he device + data.companyID = compID; // Note: all iBeacons use the Apple ID of 0x004C + + // copy across proximity UUID + for(int x=0; x<sizeof(data.proximityUUID); x++) { + data.proximityUUID[x]=proxUUID[x]; + } + + // Set up iBeacon data + // Generate the 0x020106 part of the iBeacon Prefix + ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE ); + // Generate the 0x1AFF part of the iBeacon Prefix + ble.accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, data.raw, sizeof(data.raw)); + + // Set advertising type + ble.setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED); + } + +public: + union { + uint8_t raw[25]; + struct { + uint16_t companyID; + uint8_t ID; + uint8_t len; + uint8_t proximityUUID[16]; + uint16_t majorNumber; + uint16_t minorNumber; + uint8_t txPower; + }; + } data; + +private: + BLEDevice &ble; + +}; + +#endif //__BLE_IBEACON_SERVICE_H__
--- a/main.cpp Wed Jan 21 10:05:06 2015 +0000 +++ b/main.cpp Thu Feb 12 22:36:55 2015 +0000 @@ -15,7 +15,7 @@ */ #include "mbed.h" -#include "BLEDevice.h" +#include "iBeaconService.h" /** * For this demo application, populate the beacon advertisement payload @@ -27,39 +27,35 @@ BLEDevice ble; - /** - * The Beacon payload (encapsulated within the MSD advertising data structure) - * has the following composition: - * 128-Bit UUID = E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 - * Major/Minor = 0000 / 0000 - * Tx Power = C8 (-56dB) - */ - const static uint8_t iBeaconPayload[] = { - 0x4C, 0x00, // Company identifier code (0x004C == Apple) - 0x02, // ID - 0x15, // length of the remaining payload - 0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4, // location UUID - 0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61, - 0x00, 0x00, // the major value to differentiate a location - 0x00, 0x00, // the minor value to differentiate a location - 0xC8 // 2's complement of the Tx power (-56dB) - }; +/** + * The Beacon payload has the following composition: + * 128-Bit / 16byte UUID = E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 + * Major/Minor = 0x1122 / 0x3344 + * Tx Power = 0xC8 = 200, 2's compliment is 256-200 = (-56dB) + * + * Note: please remember to calibrate your beacons + * TX Power for more accurate results. + */ +uint8_t uuid[] = {0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4, + 0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61 + }; +uint16_t majorNumber = 0x1122; +uint16_t minorNumber = 0x3344; +uint16_t txPower = 0xC8; int main(void) { - /* Initialize BLE baselayer */ + // Initialize BLE baselayer ble.init(); - - /* Set up iBeacon data*/ - ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE ); - ble.accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, iBeaconPayload, sizeof(iBeaconPayload)); - - /* Set advertising interval. Longer interval = longer battery life */ - ble.setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED); + + // Initialize ibeacon + iBeaconService ibeacon(ble, uuid, majorNumber, minorNumber, txPower); + + // Set advertising time ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ ble.startAdvertising(); - for (;;) { - ble.waitForEvent(); + while(1) { + ble.waitForEvent(); // allows or low power operation } }
--- a/mbed.bld Wed Jan 21 10:05:06 2015 +0000 +++ b/mbed.bld Thu Feb 12 22:36:55 2015 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/4fc01daae5a5 \ No newline at end of file +http://mbed.org/users/mbed_official/code/mbed/builds/e188a91d3eaa \ No newline at end of file