The Uniform Resource Identifier Beacon (UriBeacon) defines Bluetooth 4.0 Advertisement Data that contain Web URIs. URIBeacon provides a way for Bluetooth Low Energy devices to discover nearby URIs, for example, provides a way for a user to discover a short URL and then download it on their smartphone.

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_PhysicalWeb by Bluetooth Low Energy

This example demonstrates how to set up and initialize a basic URI Beacon. For a more advanced example of using a URI beacon please see the BLE_PhysicalWeb project. The Google Github Page also gives a great description of what UriBeacons are and how to use them.

Basic Details

URI Beacons are a standard way of providing a URI link in a BLE advertising packet. Website URL's are the most popular URI's. The goal of URI Beacons are to act as a bridge between the physical and digital worlds. Since the URI can be any web capable link the possibilities for use are really endless. The UriBeacons can be thought of as a natural extension of and more useful version of QR codes.

Smartphone App Links

iPhone Physical Web app

Android App

Walkthrough of Physical Web application

Size of URI

The UriBeacon has one purpose, to advertise a web link. Because of the nature of BLE these web links have to be small. In order to provide a nice balance of small and useful the UriBeacon specification has abstracted out the representation of the URI prefix('http://www.', 'https://www.' , ...etc) and suffix ('.com','.org','.edu','.gov' ...etc) to a single byte each. Of the 27 bytes available for a usual BLE payload the UriBeacon has 19 bytes available for the URI. Of these 19bytes one byte must be given to the prefix. That leaves 18 bytes to fit the address and the suffix into. If the suffix used is not one of the standard ones in the UriBeacon specification then each letter will take up 1 byte instead of the entire suffix being abbreviated into a single byte.

Here are the acceptable abbreviations currently available

PreFixSuffix
http://www..com/
https://www..org/
http://.edu/
https://.net/
urn:uuid:.info/
.biz/
.gov/
.com
.org
.edu
.net
.info
.biz
.gov

So for example the address "http://www.google.com" would take up 8 bytes. Both "http://www." and ".com" are supported abbreviations so each will be shortened to 1 byte.

Number of BytesData
1"http://www." abbreviated
6"google", 1 byte for each letter
1".com/" abbreviated

An address like "http://www.bit.ly/xyz" would take up 11 bytes. Notice that ".ly" is not a supported suffix, so each letter takes up 1 byte.

Number of BytesData
1"http://www." abbreviated
10"bit.ly/xyz"

Even addresses with the suffix in the middle are abbreviated, ie "http://www.youtube.com/XYZ". Notice here that the '.com' is in the middle of an address, it is still shortened to just 1 byte.

Number of BytesData
1"http://www." abbreviated
7"youtube"
1".com/" abbreviated
4"XYZ"

Using UriBeacons with mbed BLE API

Using the UriBeacon with the mbed API is rather simple. Just like any other BLE project you must first initialize the BLE baselayer by creating a ble object.

Initialize_bl_object

BLEDevice ble;

Then you pass the BLE object to a UriBeacon config service.

Configure_UriBeacon_Service

URIBeaconConfigService *uriBeaconConfig;
uriBeaconConfig = new URIBeaconConfigService(ble, "http://www.mbed.org");

Optionally you can then adjust settings of the UriBeacon such as transmission power levels, grabbing verbose debug information and other handy dandy services.

Optional_UriBeacon_configuration

/* Adjust the TX Power Level */
    const int8_t powerLevels[] = {-20, -4, 0, 10};
    uriBeaconConfig->setTxPowerLevels(powerLevels); // Set TX power levels, Lowest(-20), Low(-4), Medium(0), High(10)
    uriBeaconConfig->setTxPowerMode(URIBeaconConfigService::TX_POWER_MODE_LOW); // Set transmission in Low power mode

/* Adjust Beacon Period*/
setBeaconPeriod(1000); // Set beacon to advertise every 1000ms

Other UriBeacon Services

This is just the bare basics of how URI beacons work. There is also a configuration service that allows URI beacons to be updated, locked, and provides other management feature. That is beyond the scope of this example but details can be found in the Technical Details section below.

Technical Details

For more details on how URI beacons work please see these websites:
UriBeacon Github Project : the github home for all things UriBeacon (maintained by google)
UriBeacon Specification : lots of good technical details
UriBeacon configuration service - This is a service that pairs with the UriBeacon that allows changing the URI's, locking them, and some other cool features. This service is not detailed in this example application.
Android App : smartphone application to view nearby UriBeacons.
iOS App : Sample code for using UriBeacons with iOS.
The PhysicalWeb Project : a project that the UriBeacon is central to.

In case you're really interested here is a diagram that nicely sums up how the 27bytes of advertising data payload are used. https://github.com/google/uribeacon/raw/master/specification/uribeacon-figure.png

Committer:
mbedAustin
Date:
Thu Dec 04 18:18:46 2014 +0000
Revision:
9:e7f47bec97b8
Parent:
8:b816829fb712
Child:
11:c77cc2b74101
Initial Commit of the URI Beacon example. A simplified version of PhysicalWeb .

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 0:790a27ffc99b 1 /* mbed Microcontroller Library
rgrover1 0:790a27ffc99b 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 0:790a27ffc99b 3 *
rgrover1 0:790a27ffc99b 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 0:790a27ffc99b 5 * you may not use this file except in compliance with the License.
rgrover1 0:790a27ffc99b 6 * You may obtain a copy of the License at
rgrover1 0:790a27ffc99b 7 *
rgrover1 0:790a27ffc99b 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 0:790a27ffc99b 9 *
rgrover1 0:790a27ffc99b 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 0:790a27ffc99b 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 0:790a27ffc99b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 0:790a27ffc99b 13 * See the License for the specific language governing permissions and
rgrover1 0:790a27ffc99b 14 * limitations under the License.
rgrover1 0:790a27ffc99b 15 */
rgrover1 0:790a27ffc99b 16
rgrover1 0:790a27ffc99b 17 #include "mbed.h"
rgrover1 0:790a27ffc99b 18 #include "BLEDevice.h"
rgrover1 7:6faec5978fb4 19 #include "URIBeaconConfigService.h"
rgrover1 0:790a27ffc99b 20
rgrover1 0:790a27ffc99b 21 BLEDevice ble;
rgrover1 8:b816829fb712 22 URIBeaconConfigService *uriBeaconConfig;
rgrover1 0:790a27ffc99b 23
mbedAustin 9:e7f47bec97b8 24 /*If beacon gets disconnected start advertising again */
rgrover1 6:31b65d4ea67d 25 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
rgrover1 6:31b65d4ea67d 26 {
rgrover1 6:31b65d4ea67d 27 ble.startAdvertising();
rgrover1 6:31b65d4ea67d 28 }
rgrover1 0:790a27ffc99b 29
mbedAustin 9:e7f47bec97b8 30 /*
mbedAustin 9:e7f47bec97b8 31 * The main loop.
mbedAustin 9:e7f47bec97b8 32 * Here we will configure the URI Beacon and start advertising
mbedAustin 9:e7f47bec97b8 33 */
rgrover1 0:790a27ffc99b 34 int main(void)
rgrover1 0:790a27ffc99b 35 {
mbedAustin 9:e7f47bec97b8 36 /* Initialize BLE base layer*/
rgrover1 0:790a27ffc99b 37 ble.init();
rgrover1 6:31b65d4ea67d 38 ble.onDisconnection(disconnectionCallback);
rgrover1 0:790a27ffc99b 39
mbedAustin 9:e7f47bec97b8 40 /* Set the BLE device to be a URI Beacon, set advertising payload
mbedAustin 9:e7f47bec97b8 41 the address after the preamble (www.) can be 17bytes at most.*/
mbedAustin 9:e7f47bec97b8 42 uriBeaconConfig = new URIBeaconConfigService(ble, "http://www.developer.mbed.org");
mbedAustin 9:e7f47bec97b8 43
mbedAustin 9:e7f47bec97b8 44 /*Check that the URI Beacon started successfully.*/
rgrover1 8:b816829fb712 45 if (!uriBeaconConfig->configuredSuccessfully()) {
rgrover1 6:31b65d4ea67d 46 error("failed to accommodate URI");
rgrover1 6:31b65d4ea67d 47 }
mbedAustin 9:e7f47bec97b8 48
rgrover1 7:6faec5978fb4 49 /* optional use of the API offered by URIBeaconConfigService */
rgrover1 7:6faec5978fb4 50 const int8_t powerLevels[] = {-20, -4, 0, 10};
mbedAustin 9:e7f47bec97b8 51 uriBeaconConfig->setTxPowerLevels(powerLevels); // Set TX power levels, Lowest(-20), Low(-4), Medium(0), High(10)
mbedAustin 9:e7f47bec97b8 52 uriBeaconConfig->setTxPowerMode(URIBeaconConfigService::TX_POWER_MODE_LOW); // Initialize tranmition in Low power mode
rgrover1 0:790a27ffc99b 53
mbedAustin 9:e7f47bec97b8 54 /*Start advertising the URI Beacon*/
rgrover1 0:790a27ffc99b 55 ble.startAdvertising();
rgrover1 0:790a27ffc99b 56
rgrover1 0:790a27ffc99b 57 while (true) {
rgrover1 0:790a27ffc99b 58 ble.waitForEvent();
rgrover1 0:790a27ffc99b 59 }
rgrover1 0:790a27ffc99b 60 }