This post shows steps to create an AltBeaconwith Raspberry Pi, by modifying BlueZ BLE Advertisement example code (i.e. “example-advertisement“).
*If you want to create Apple’s iBeacon, please see this post.
Prerequisites (parentheses indicate my environment)
- Raspberry Pi (Raspberry Pi4 B with Raspbian Buster 2019-06-20)
- Internet accessTo download BlueZ example code. Here is a Wi-Fi Setup steps. If you downloaded already, you can work offline.
Steps1. Downloading BlueZ1-1. Download BlueZ source code archive.
wget www.kernel.org/pub/linux/bluetooth/bluez-5.50.tar.xz
1-2. Extract the archive file.
tar xvf bluez-5.50.tar.xz
1-3. Make sure that the sample code works. [Optional]
./bluez-5.50/test/example-advertisement
Output should be like this:
$ ./bluez-5.50/test/example-advertisement
GetAll
returning props
Advertisement registered
2. Modify BLE Advertisement Example Code2-1. Copy the example code.
cp ./bluez-5.50/test/example-advertisement ./example-altbeacon
2-2. Open the file and look for TestAdvertisement class.
2-3. Replace ‘__init__’ method:
def __init__(self, bus, index):
Advertisement.__init__(self, bus, index, 'peripheral')
self.add_service_uuid('180D')
self.add_service_uuid('180F')
self.add_manufacturer_data(0xffff, [0x00, 0x01, 0x02, 0x03, 0x04])
self.add_service_data('9999', [0x00, 0x01, 0x02, 0x03, 0x04])
self.add_local_name('TestAdvertisement')
self.include_tx_power = True
self.add_data(0x26, [0x01, 0x01, 0x00])
with:
def __init__(self, bus, index):
company_id = 0x0118
type = [0xBE, 0xAC]
id1 = [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16]
id2 = [0x11, 0x22]
id3 = [0x33, 0x44]
rssi_at_1m = [0xB3]
feature = [0x00]
Advertisement.__init__(self, bus, index, 'peripheral')
self.add_manufacturer_data(company_id, type + id1 + id2 + id3 + rssi_at_1m + feature)
3. Test3-1. Run the code. The console output should be same as Step 1-3.
./example-altbeacon
3-2. Find your AltBeacon running on Raspberry Pi using a beacon scanner app. I used nRF Connect on an Android phone.
SummaryIf everything goes well, the Raspberry Pi should be broadcasting AltBeacon message and you can find it with a scanner app. Some of the AltBeacon data can be configured on Step 2-3 for your application. Here is a brief explanation of those data.
- ‘company_id’Company Identifiers are defined by Bluetooth SIG.
- ‘beacon_type’It must be ‘0xBEAC’ for AltBeacon.
- ‘id1’Application unique UUID.
- ‘id2‘ and ‘id3‘Additional unique IDs which correspond iBeacon’s Major Number and Minor Number respectively.
- ‘rssi_at_1m’Value of received signal strength at 1 meter from the device. It must be calibrated for each device when it’s deployed.
AltBeacon is an open source version of Apple’s iBeacon. It has the same functionality as iBeacon, and the two have similar data structure as below.
*1 : https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile
*2 : Bluetooth 4.0 Core Specification, Volume 3, Part C, Appendix C, 18.1 Flags
*3 : https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers
*4 : Manufacture dependent value
*5 : Application dependent value
*6 : Device dependent value
References[1] AltBeacon[2] iBeacon – Apple Developer[3] Company Identifiers – Bluetooth SIG[4] BlueZ Release Notes
Comments
Please log in or sign up to comment.