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

Google Beacons and the Physical Web

Google Beacons and the Physical Web

An introduction to Google's Eddystone beacon format, their Proximity Beacon API features, and the Physical Web project.

Dave Smith

July 30, 2015
Tweet

More Decks by Dave Smith

Other Decks in Programming

Transcript

  1. Google Beacons and The Physical Web Dave Smith, PE •

    NewCircle, Inc. @devunwired +DaveSmithDev
  2. 1A FF … … UUID (16 bytes) Major Minor TX

    <<Manufacturer Specific Data>> 100ms
  3. … 16 FEAA 00 TX Namespace ID (10 bytes) Instance

    ID (6 bytes) <<Service UUID>> <<Service Data>> 03 03 FEAA ~1-2s UID … 16 FEAA 10 TX Encoded URL (up to 18 bytes) URL
  4. Eddystone-UID 44 25 60 DA 34 BD 20 4A 9E

    D7 00 00 00 00 00 01 Eddystone #1 44 25 60 DA 34 BD 20 4A 9E D7 00 00 00 00 00 02 Eddystone #2 44 25 60 DA 34 BD 20 4A 9E D7 00 00 00 00 00 03 Eddystone #3 44 25 60 DA 34 BD 20 4A 9E D7 00 00 00 00 00 04 Eddystone #4 Namespace ID Instance ID sha1(newcircle.com)X=X442560da34bd204a9ed745628876485ee446d908
  5. Eddystone Scanner // Eddystone service uuid (0xfeaa)
 private static final

    ParcelUuid UID_SERVICE =
 ParcelUuid.fromString("0000feaa-0000-1000-8000-00805f9b34fb");
 
 // Include the namespace id to filter
 private static final byte[] NAMESPACE_FILTER = { /* 0x0000d89bed6e130ee5cf1ba1000000000000 */ };
 
 // Bitmask to apply filter just to namespace id
 private static final byte[] NAMESPACE_FILTER_MASK = { /* 0xff00ffffffffffffffffffff000000000000 */ }; ScanFilter beaconFilter = new ScanFilter.Builder()
 .setServiceUuid(UID_SERVICE)
 .setServiceData(UID_SERVICE, NAMESPACE_FILTER, NAMESPACE_FILTER_MASK)
 .build();X
 List<ScanFilter> filters = Collections.singletonList(beaconFilter);
 
 ScanSettings settings = new ScanSettings.Builder()
 .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
 .build();
  6. Eddystone Scanner // Eddystone service uuid (0xfeaa)
 private static final

    ParcelUuid UID_SERVICE =
 ParcelUuid.fromString("0000feaa-0000-1000-8000-00805f9b34fb");
 
 // Include the namespace id to filter
 private static final byte[] NAMESPACE_FILTER = { /* 0x0000d89bed6e130ee5cf1ba1000000000000 */ };
 
 // Bitmask to apply filter just to namespace id
 private static final byte[] NAMESPACE_FILTER_MASK = { /* 0xff00ffffffffffffffffffff000000000000 */ }; ScanFilter beaconFilter = new ScanFilter.Builder()
 .setServiceUuid(UID_SERVICE)
 .setServiceData(UID_SERVICE, NAMESPACE_FILTER, NAMESPACE_FILTER_MASK)
 .build();X
 List<ScanFilter> filters = Collections.singletonList(beaconFilter);
 
 ScanSettings settings = new ScanSettings.Builder()
 .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
 .build();
  7. Eddystone Scanner Nearby Messages API BluetoothManager manager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);


    BluetoothLeScanner scanner = manager.getAdapter().getBluetoothLeScanner();
 scanner.startScan(filters, settings, mScanCallback); private ScanCallback mScanCallback = new ScanCallback() {
 @Override
 public void onScanResult(int callbackType, ScanResult result) {
 byte[] data = result.getScanRecord().getServiceData(UID_SERVICE); //…parse UID namespace + instance…
 }
 …
 };
  8. Eddystone-TLM … 16 FEAA 20 … BATT TEMP ADV_CNT ELAPSED

    <<Service UUID>> <<Service Data>> 03 03 FEAA Battery Voltage Beacon Temperature Advertisement Count Elapsed Seconds Since Power-On
  9. Eddystone-URL http:// n e w c i r c l

    e .com/ a n d r o i d 02 6E 65 77 63 69 72 63 6C 65 00 61 6E 64 72 6F 69 64 http://newcircle.com/android → http://goo.gl/BhqDJb
  10. Physical Web Architecture PW Client (Scanner) PW Service (Optional) WWW

    Eddystone Advertiser mDNS Advertiser UPnP Advertiser SSDP Advertiser
  11. Physical Web Architecture PW Client (Scanner) PW Service (Optional) WWW

    Eddystone Advertiser mDNS Advertiser UPnP Advertiser SSDP Advertiser
  12. Physical Web Architecture PW Client (Scanner) PW Service (Optional) WWW

    Eddystone Advertiser mDNS Advertiser UPnP Advertiser SSDP Advertiser
  13. Deep Linking <intent-filter>
 <action android:name="android.intent.action.VIEW" />
 <category android:name="android.intent.category.DEFAULT" />
 <category

    android:name="android.intent.category.BROWSABLE" /> 
 <!-- Accepts URIs that begin with "gizmos://example" -->
 <data android:scheme="gizmos"
 android:host="example" />
 </intent-filter>
  14. App Indexing <html>
 <head>
 …
 <link rel="alternate" href="android-app://com.gizmos.android/gizmos/example" />
 <link

    rel="alternate" href="ios-app://123456/gizmos/example" />
 …
 </head>
 <body> … </body> http://goo.gl → Provides automatic follows of indexed URLs
  15. App Invites (Beta) • Shareable direct links to download/install application

    • G+ link that redirects to the appropriate app store • Acts as a deep link if already installed
  16. Learn More • Physical Web demo apps + documentation: https://github.com/google/physical-web

    • Google beacon specifications: https://github.com/google/eddystone • Additional Samples: http://milehighandroid.com • Videos/Tutorials: • NewCircle BLE Android Tutorial: https://goo.gl/IFzQ3Y • NewCircle BLe Lollipop Tutorial: https://goo.gl/Md9ZkA • Google Using Nearby with Beacons: https://www.youtube.com/watch?v=7InjJGqP15E • Google Developing with Beacons: https://www.youtube.com/watch?v=s-4J7cijPAo