This document discusses an Android Wear and iBeacon development presentation given by Kseniia Shumelchyk on November 20-21, 2015 in Milan. The presentation covered iBeacon protocols, implementing iBeacon detection on Android 4.3+, improvements in Android 5+, creating an Android iBeacon emitter, and example Android Wear apps using iBeacons for running tracking, indoor navigation, and retail applications.
3. MILAN 20/21.11.2015 - Kseniia Shumelchyk
iBeacon
- iBeacon is a protocol standardised by Apple and introduced at the WWDC in 2013
- Based on top of BLE
- BLE works starting from 4S on Apple
- BLE works starting from 4.3 on Android
6. MILAN 20/21.11.2015 - Kseniia Shumelchyk
What is BLE?
Bluetooth low energy (Bluetooth Smart) is a
wireless personal area network technology aimed
for novel applications in the healthcare, fitness,
beacons, security, and home entertainment
industries
7. MILAN 20/21.11.2015 - Kseniia Shumelchyk
What is BLE?
- Not backward-compatible (with classic Bluetooth protocol)
- Uses same radio frequencies - 2.4 GGZ
- 1 Mbps (1-3 Mbps with regular bluetooth)
- Embedded devices & wearables
8. MILAN 20/21.11.2015 - Kseniia Shumelchyk
Specification
Technical Specification
Classic Bluetooth
technology
Bluetooth Smart
technology
Distance/Range
(theoretical max.)
100 m (330 ft) >100 m (>330 ft)
Over the air data rate 1–3 Mbit/s 1 Mbit/s
Active slaves 7
Not defined;
implementation
dependent
Minimum total time to
send data
100 ms 3 ms
Power consumption 1 W as the reference
0.01 to 0.5 W
(depending on use case)
9. MILAN 20/21.11.2015 - Kseniia Shumelchyk
Generic Attribute Profile (GATT)
- Client - A device that initiates GATT commands and requests, and accepts
responses, for example a computer or smartphone
- Server - A device that receives GATT commands and requests, and returns
responses, for example a temperature sensor.
- Characteristic - A data value transferred between client and server, for
example the current battery voltage.
10. MILAN 20/21.11.2015 - Kseniia Shumelchyk
Generic Attribute Profile (GATT)
- Service - A collection of related characteristics, which operate together to
perform a particular function. For instance, the Health Thermometer service
includes characteristics for a temperature measurement value, and a time
interval between measurements.
- Descriptor - A descriptor provides additional information about a characteristic.
For instance, a temperature value characteristic may have an indication of its
units (e.g. Celsius), and the maximum and minimum values which the sensor
can measure.
11. MILAN 20/21.11.2015 - Kseniia Shumelchyk
GATT Operations
- Discover UUIDs for all primary services
- Find a service with a given UUID
- Find secondary services for a given primary service
- Discover all characteristics for a given service
- Find characteristics matching a given UUID
- Read all descriptors for a particular characteristic
13. MILAN 20/21.11.2015 - Kseniia Shumelchyk
Beacon’s Advertisement
- Beacon advertises a data package called the Scan Response Data
- This Data can be up to 31 bytes.
- The scan response is divided into AD structures
14. MILAN 20/21.11.2015 - Kseniia Shumelchyk
Packet structure (1)
Ad Structure 1
0x02 0x01 0x1A
Remaining length AD Type Data
2 Flags Flag
15. MILAN 20/21.11.2015 - Kseniia Shumelchyk
Packet structure (2)
Ad Structure 2
0x1B 0xFF 0xE0 0x00 0xBE 0xAC
Remaining length AD Type Manufacturer ID Beacon prefix
27
Manufacturer
specific
224 (Google)
16. MILAN 20/21.11.2015 - Kseniia Shumelchyk
Packet structure (2)
Ad Structure 2
0x0C […] 0xBB 0x00 0x09 0x00 0x06 0xBA
UUID (16 bytes) Major Minor TX Power
9 6 -70
17. MILAN 20/21.11.2015 - Kseniia Shumelchyk
Internals
02 01 06 1A FF 4C 00 02 15: prefix (fixed except for 3rd byte - flags)
B9 40 7F 30 F5 F8 46 6E AF F9 25 55 6B 57 FE 6D: UUID
00 49: major
00 0A: minor
C5: measured TX power!
19. MILAN 20/21.11.2015 - Kseniia Shumelchyk
Android
- Built in support for Android 4.3+
- Central & peripheral roles
- GATT server & GATT client
- android.hardware.bluetooth_le feature
25. MILAN 20/21.11.2015 - Kseniia Shumelchyk
Android 5.0+ for Beacons detection
- New api to work with BLE devices
- Background scanning
- Filtering possibility
- SCAN_MODE_LOW_POWER mode
- SCAN_MODE_LOW_LATENCY mode
26. MILAN 20/21.11.2015 - Kseniia Shumelchyk
LOW_POWER LOW_LATENCY
Test duration 134 minutes 152 minutes
Battery Level Change -13% -25%
Battery Drain Rate 268mA 454mA
Relative Battery Savings 41% --
Typical time between
detections
4400 ms 100 ms
http://developer.radiusnetworks.com/2014/10/28/android-5.0-scanning.html
32. MILAN 20/21.11.2015 - Kseniia Shumelchyk
Android Beacon emitter
- Works starting from 5.0
- Currently only Nexus 6, Nexus 9 and later models supported
- BluetoothLeAdvertiser & AdvertiseData & AdvertiseSettings support classes
- Different levels of transmitter power
33. MILAN 20/21.11.2015 - Kseniia Shumelchyk
• Android iBeacon emitter (1)
• ENTER
FILENAM
E/LANG
protected void setAdvertiseData() {
AdvertiseData.Builder mBuilder = new AdvertiseData.Builder()
ByteBuffer mManufacturerData = ByteBuffer.allocate(24);
byte[] uuid = getIdAsByte(UUID.fromString("0CF052C297CA407C84F8B62AAC4E9020"));
mManufacturerData.put(0, (byte)0xBE); // Beacon Identifier
mManufacturerData.put(1, (byte)0xAC); // Beacon Identifier
for (int i=2; i<=17; i++) {
mManufacturerData.put(i, uuid[i-2]); // adding the UUID
}
mManufacturerData.put(18, (byte)0x00); // first byte of Major
mManufacturerData.put(19, (byte)0x09); // second byte of Major
mManufacturerData.put(20, (byte)0x00); // first minor
mManufacturerData.put(21, (byte)0x06); // second minor
mManufacturerData.put(22, (byte)0xB5); // txPower
mBuilder.addManufacturerData(224, mManufacturerData.array());
mAdvertiseData = mBuilder.build();
}!
Setting emitter
34. MILAN 20/21.11.2015 - Kseniia Shumelchyk
• Android iBeacon emitter (2)
• ENTER
FILENAM
E/LANG
protected void setAdvertiseSettings() {
AdvertiseSettings.Builder mBuilder = new AdvertiseSettings.Builder();
mBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_POWER);
mBuilder.setConnectable(false);
mBuilder.setTimeout(0);
mBuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM);
mAdvertiseSettings = mBuilder.build();
}!
Setting up setting
35. MILAN 20/21.11.2015 - Kseniia Shumelchyk
Good to go, we can start advertising :)
Good to go, we can start advertising :-D
ENTER FILENAME/LANG
mBluetoothLeAdvertiser.startAdvertising(mAdvertiseSettings, mAdvertiseData,
mAdvertiseCallback);!
Start advertising