Creating AltBeacon with Raspberry Pi using BlueZ Example Code (updated)

This post shows steps to create an AltBeacon [1] with Raspberry Pi, by modifying BlueZ BLE Advertisement example code (i.e. “example-advertisement).

*If you want to create Apple’s iBeacon [2], please see this post.

 

Prerequisites (parentheses indicate my environment)

  • Raspberry Pi (Raspberry Pi4 B with Raspbian Buster 2019-06-20)
  • Internet access
    To download BlueZ example code. Here is a Wi-Fi Setup steps. If you downloaded already, you can work offline.

 

Steps
1. Downloading BlueZ
1-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 Code
2-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. Test
3-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.

 

Summary
If 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 [3].
  • ‘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.

*2 : Bluetooth 4.0 Core Specification, Volume 3, Part C, Appendix C, 18.1 Flags
*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