Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Android iBeacon development and wearables integ...

Android iBeacon development and wearables integration @ Droidcon Berlin' 15

Slides from my talk at Droidcon Berlin 2015 about Android BLE development and iBeacon.

Kseniia Shumelchyk

June 05, 2015
Tweet

More Decks by Kseniia Shumelchyk

Other Decks in Programming

Transcript

  1. 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
  2. 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
  3. • 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
  4. 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)
  5. 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.
  6. • 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. Descriptors are optional - each characteristic can have any number of descriptors.
  7. 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
  8. 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
  9. Ad Structure 2 0x1B 0xFF 0xE0 0x00 0xBE 0xAC Remaining

    length AD Type Manufacturer ID Beacon prefix 27 Manufacturer specific 224 (Google) Ad Structure 2 0x0C […] 0xBB 0x00 0x09 0x00 0x06 0xBA UUID (16 bytes) Major Minor TX Power 9 6 -70
  10. 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
  11. Android • Built in support for Android 4.3+ • Central

    & peripheral roles • GATT server & GATT client • android.hardware.bluetooth_le feature
  12. Android 4.3 for Beacons detection <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-feature

    android:name="android.hardware.bluetooth_le" android:required="true"/> final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = bluetoothManager.getAdapter(); 1. Check for permission 2. Check for hardware 3. Get the BluetoothAdapter 4. Enable Bluetooth if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); }
  13. mBluetoothAdapter.startLeScan(mLeScanCallback); 5. Define callback 6. Start BLE scanning private LeScanCallback

    mLeScanCallback = new LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { … // Parsing beacon data }); } };
  14. 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
  15. 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
  16. 1.Set filter 6.Define callback private void setScanFilter() { ScanFilter.Builder mBuilder

    = new ScanFilter.Builder(); ByteBuffer mManufacturerData = ByteBuffer.allocate(23); ByteBuffer mManufacturerDataMask = ByteBuffer.allocate(24); byte[] uuid = getIdAsByte(UUID.fromString("0CF052C297CA407C84F8B62AAC4E9020"); mManufacturerData.put(0, (byte)0xBE); mManufacturerData.put(1, (byte)0xAC); for (int i=2; i<=17; i++) { mManufacturerData.put(i, uuid[i-2]); } for (int i=0; i<=17; i++) { mManufacturerDataMask.put((byte)0x01); } mBuilder.setManufacturerData(224, mManufacturerData.array(), mManufacturerDataMask.array()); mScanFilter = mBuilder.build(); } 2.Set scan settings private void setScanSettings() { ScanSettings.Builder mBuilder = new ScanSettings.Builder(); mBuilder.setReportDelay(0); mBuilder.setScanMode(ScanSettings.SCAN_MODE_LOW_POWER); mScanSettings = mBuilder.build(); }
  17. protected ScanCallback mScanCallback = new ScanCallback() { @Override public void

    onScanResult(int callbackType, ScanResult result) { ScanRecord mScanRecord = result.getScanRecord(); int[] manufacturerData = mScanRecord.getManufacturerSpecificData(224); int mRssi = result.getRssi(); } } 3.Setup callback 4.Start scanning mBluetoothLeScanner.startScan(Arrays.asList(mScanFilter), mScanSettings, mScanCallback);
  18. Android Beacon emitter • Works starting from 5.0 • Currently

    only Nexus 6 and Nexus 9 supported • BluetoothLeAdvertiser & AdvertiseData & AdvertiseSettings support classes • Different levels of transmitter power
  19. 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(); } 1. Set Advertise data
  20. mBluetoothLeAdvertiser.startAdvertising(mAdvertiseSettings, mAdvertiseData, mAdvertiseCallback); Good to go, we can start advertising

    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(); } 2. Set Advertise settings
  21. Use cases • For runners (to remove cheating) • Shopping

    molls • Indoor navigation • Museums • Clinics • Hotels (check in & check out) • Apps for disabled • Device location inside office
  22. Q/A