Raspberry Pi 3 as an Eddystone URL beacon
Edit 2018-04-20: A version of this post was featured March 27, 2016 on hackaday.com at http://hackaday.com/2016/03/27/turn-your-rpi-3-into-a-ble-beacon/. Also visit https://hackaday.io/project/10314-raspberry-pi-3-as-an-eddystone-url-beacon if this article interests you.
This tutorial will show you how you can take your Raspberry Pi 3 and turn it into an Eddystone URL beacon.
What you will need:
- A Raspberry Pi 3
- Power supply for the Raspberry Pi
- SD card for the raspberry pi
What is an Eddystone beacon:
Eddystone is a protocol specification by Google that allows a Bluetooth low energy device to broadcast one way messages. See https://github.com/google/eddystone. Currently the specification defines three types of messages that can be broadcast: a UID, a URL, or telemetry.
The magic of the Eddystone beacon is on the app side where your phone listens for these broadcast messages and either displays an alert when it detects something or performs some kind of action.
In this tutorial I will show you how to setup your Raspberry Pi 3 to broadcast a URL.
Setting up the Pi
-
Download Raspbian from https://www.raspberrypi.org/downloads/
- Install the Raspbian Image
- Find the ip of the raspberry pi with from your laptop/desktop
-
You can try the Raspberry Pi Finder. See http://lifehacker.com/the-raspberry-pi-finder-easily-locates-your-pis-ip-addr-1702081021 or With nmap (you can install nmap with macports on OSX) $ sudo nmap -sP 192.168.2.0/24 or $ arp -a | grep "b8:27"
-
- Log into the Pi (password is raspberry)
-
$ ssh pi@<the_ip_of_your_pi>
-
- Look at the help of the hciconfig command
-
$hciconfig -h
-
- Enable the Bluetooth device
-
pi@raspberrypi:~ $ sudo hciconfig hci0 up
-
- Set the Bluetooth device to “advertise and not-connectable”
-
pi@raspberrypi:~ $ sudo hciconfig hci0 leadv 3
-
- Enter the Beacon Advertising Data
-
pi@raspberrypi:~ $ sudo hcitool -i hci0 cmd 0x08 0x0008 17 02 01 06 03 03 aa fe 0f 16 aa fe 10 00 02 77 65 62 67 61 7a 65 72 08 00 00 00 00 00 00 00 00
-
Here is a breakdown of the payload
Option | Description |
---|---|
0x08 | #OGF = Operation Group Field = Bluetooth Command Group = 0x08 |
0x0008 | #OCF = Operation Command Field = HCI_LE_Set_Advertising_Data = 0x0008 |
17 | Length. The hexadecimal 17 converts to 23 decimal which is the number of bytes that follow |
02 | Length |
01 | Flags data type value |
06 | Flags data |
03 | Length |
03 | Complete list of 16-bit Service UUIDs data type value |
aa | 16-bit Eddystone UUID |
fe | 16-bit Eddystone UUID |
0f | Length. The hexadecimal 0f converts to 15 decimal which is the number of bytes that follow |
16 | Service Data data type value |
aa | 16-bit Eddystone UUID |
fe | 16-bit Eddystone UUID |
10 | Frame Type = URL |
00 | TX Power (this should be calibrated) |
02 | URL Scheme (http:// = 0x02) |
77 | ‘w’ in hexadecimal |
65 | ‘e’ in hexadecimal |
62 | ‘b’ in hexadecimal |
67 | ‘g’ in hexadecimal |
61 | ‘a’ in hexadecimal |
7a | ‘z’ in hexadecimal |
65 | ‘e’ in hexadecimal |
72 | ‘r’ in hexadecimal |
08 | .org (.org = 0x08) |
00 | |
00 | |
00 | |
00 | |
00 | |
00 | |
00 | |
00 |
The command above broadcasts my blog’s URL http://webgazer.org.
If you want to advertize a different URL enter the URL of the link that
you want to advertize in the box below.
To detect the Raspberry Pi beacon with an iPhone follow the steps in the video below which outlines how to enable Chrome’s Physical Web extension on iOS https://www.youtube.com/watch?v=gxPcPXSE_O0
On Android, your phone should detect the URL if you have Android 4.3.2 or higher with bluetooth turned on, location turned on, and Chrome location runtime permission turned on. See https://support.google.com/chrome/answer/6239299?hl=en. However, I had to install the Physical Web App from https://play.google.com/store/apps/details?id=physical_web.org.physicalweb&hl=en to make it work.