Earlier this year Apple added the concept of beacon region monitoring into Core Location. This is more widely known as iBeacon. Right now there isn’t a large amount of information on how to take advantage of it outside of iOS and Macs but it is actually pretty easy to implement. The following instructions will get you to a point where a Raspberry Pi can function as an iBeacon (any Linux box should actually work).
Before diving into the technical details I think it is worth noting a few things. There are a few hardware based iBeacons already available in various “beta” states, to name a few: KST’s iBeacon, coin for arduino and ReadBearLab’s iBeacon. These dedicated devices are going to have a power and most likely a price advantage over the Raspberry Pi so that is something to keep in mind. The setup I used cost around $70 for example and that is around the cost of the KST device but more than the others and the more that are made the more the price will probably decrease. The main advantage of the Raspberry Pi is flexibility and included in that $70 is a wifi dongle that the other devices don’t have.
My configuration for this post:
- Raspberry Pi Model B. The Model A would work as well but currently you wouldn’t be able to run both wifi and bluetooth at the same time. You also need power, storage and maybe a case.
- I’ve used both the IOGEAR Bluetooth 4.0 USB Micro Adapter (GBU521) and the Cirago Bluetooth 4.0 USB Mini Adapter (BTA8000) adapters successfully.
- For wifi I’ve been using the Edimax device.
Assuming you have your Pi hardware ready the first step is to install the Raspbian distro. I tested on the 2013-09-25-wheezy-raspbian version. Make sure it boots and then run the following commands as root to get the dependancies ready:
[code language=”shell”]
apt-get update
apt-get install libglib2.0-dev libdbus-1-dev libudev-dev libical-dev libreadline6-dev
[/code]
Next you will need to download and compile a more recent version of Bluez than what is available for the Raspbain distro. I’ve been able to use a number of versions in the Bluez 5.X family but for this I’ll assume Bluez 5.9. Use the following to get it installed and compiled (make sure to do the install part here as root):
[code language=”shell”]
wget https://www.kernel.org/pub/linux/bluetooth/bluez-5.9.tar.xz
tar xvJf bluez-5.9.tar.xz
cd bluez-5.9
./configure –disable-systemd –enable-library
make
make install
[/code]
Now you have Bluez installed with bluetooth library support. There are also a number of tools available at this point. The first one you want to run is hciconfig to configure your bluetooth device. It works a lot like ifconfig if you are familiar with setting up network interface. If you run it without any command line arguments you will get a list of bluetooth devices:
[code language=”shell”]
hciconfig
# hci0: Type: BR/EDR Bus: USB
# BD Address: 00:02:72:32:CA:23 ACL MTU: 1021:8 SCO MTU: 64:1
# DOWN
# RX bytes:340 acl:0 sco:0 events:7 errors:0
# TX bytes:54 acl:0 sco:0 commands:12 errors:0
[/code]
You want to bring the bluetooth device up so it is available:
[code language=”shell”]
hciconfig hci0 up
hciconfig
# hci0: Type: BR/EDR Bus: USB
# BD Address: 00:02:72:32:CA:23 ACL MTU: 1021:8 SCO MTU: 64:1
# UP RUNNING
# RX bytes:813 acl:0 sco:0 events:26 errors:0
# TX bytes:374 acl:0 sco:0 commands:31 errors:0
[/code]
Make sure you see “UP RUNNING” before proceeding. You will probably want to add the command to bring the bluetooth device up to the startup script. Next you will want to grab my bluez-ibeacon repo from github and build it:
[code language=”shell”]
git clone https://github.com/carsonmcdonald/bluez-ibeacon.git
bluez-ibeacon/bluez-beacon/
make
[/code]
Now you have a binary named ibeacon that you can run and that will turn the Pi into an iBeacon:
[code language=”shell”]
./ibeacon 200 e2c56db5dffb48d2b060d0f5a71096e0 1 1 -29
[/code]
You can read more about what the above means in the README for the bluez-ibeacon project.
There is a demo iOS app in the same bluez-ibeacon project that you can use to then detect the beacon now that it is running.