Advanced Features

  • By default, subscriptions encompass messages published within the app's Google Cloud project, including those from other devices and beacon-attached messages.

  • Utilize MessageFilter to subscribe to specific nearby message types like public beacon attachments and raw BLE beacon IDs, including Eddystone UIDs and iBeacon IDs.

  • Public beacon attachments, marked with the PUBLIC namespace, are accessible to all apps for retrieval.

  • Foreground subscriptions provide RSSI and distance callbacks for BLE beacon messages, offering insights into signal strength and proximity.

Message types

By default, a subscription finds all messages associated with the app's Google Cloud Console project. This includes:

  • Messages published by the same app on another device.
  • Messages owned by that project, attached to beacons. See Add Attachments to Beacons .

Your app can use a MessageFilter to subscribe for more types of nearby messages, including public beacon attachments, and raw Bluetooth Low Energy (BLE) beacon IDs.

Public beacon attachments

A developer can mark their beacon attachment namespace as PUBLIC . This allows all apps to retrieve them, regardless of their Cloud Console Project. For information on how to make attachment namespaces public, see Attachment visibility .

Example:

  // Subscribe for two different public beacon attachment types. 
 MessageFilter 
  
 messageFilter 
  
 = 
  
 new 
  
 MessageFilter 
 . 
 Builder 
 () 
  
 . 
 includeNamespacedType 
 ( 
 EXAMPLE_PUBLIC_NAMESPACE_A 
 , 
  
 EXAMPLE_PUBLIC_TYPE_A 
 ) 
  
 . 
 includeNamespacedType 
 ( 
 EXAMPLE_PUBLIC_NAMESPACE_B 
 , 
  
 EXAMPLE_PUBLIC_TYPE_B 
 ) 
  
 . 
 build 
 (); 
 SubscribeOptions 
  
 options 
  
 = 
  
 new 
  
 SubscribeOptions 
 . 
 Builder 
 () 
  
 . 
 setStrategy 
 ( 
 Strategy 
 . 
 BLE_ONLY 
 ) 
  
 . 
 setFilter 
 ( 
 messageFilter 
 ) 
  
 . 
 build 
 (); 
 MessageListener 
  
 messageListener 
  
 = 
  
 new 
  
 MessageListener 
 () 
  
 { 
  
 @ 
 Override 
  
 public 
  
 void 
  
 onFound 
 ( 
 final 
  
 Message 
  
 message 
 ) 
  
 { 
  
 // We may want to handle the two types of message differently. 
  
 if 
  
 ( 
 EXAMPLE_PUBLIC_NAMESPACE_A 
 . 
 equals 
 ( 
 message 
 . 
 getNamespace 
 ()) 
 && 
 EXAMPLE_PUBLIC_TYPE_A 
 . 
 equals 
 ( 
 message 
 . 
 getType 
 ())) 
  
 { 
  
 // Handle a "type A" message. 
  
 } 
  
 else 
  
 if 
  
 ( 
 EXAMPLE_PUBLIC_NAMESPACE_B 
 . 
 equals 
 ( 
 message 
 . 
 getNamespace 
 ()) 
 && 
 EXAMPLE_PUBLIC_TYPE_B 
 . 
 equals 
 ( 
 message 
 . 
 getType 
 ())) 
  
 { 
  
 // Handle a "type B" message. 
  
 } 
  
 } 
 }; 
 Nearby 
 . 
 getMessagesClient 
 ( 
 this 
 ). 
 subscribe 
 ( 
 messageListener 
 , 
  
 options 
 ); 
 

BLE beacon IDs

You can use Google's beacon platform to attach arbitrary data in the cloud to your beacons, abstracting away the actual beacon IDs that are advertised in BLE packets. These attachments are discovered by default (see Message types ).

However, if you do need to discover raw beacon IDs (to use your own beacon registry, for example), you can. There are currently two supported formats:

Example:

  // Subscribe for all Eddystone UIDs whose first 10 bytes (the "namespace") 
 // match MY_EDDYSTONE_UID_NAMESPACE. 
 // 
 // Note that the Eddystone UID namespace is separate from the namespace 
 // field of a Nearby Message. 
 MessageFilter 
  
 messageFilter 
  
 = 
  
 new 
  
 MessageFilter 
 . 
 Builder 
 () 
  
 . 
 includeEddystoneUids 
 ( 
 MY_EDDYSTONE_UID_NAMESPACE 
 , 
  
 null 
  
 /* any instance */ 
 ) 
  
 . 
 build 
 (); 
 SubscribeOptions 
  
 options 
  
 = 
  
 new 
  
 SubscribeOptions 
 . 
 Builder 
 () 
  
 . 
 setStrategy 
 ( 
 Strategy 
 . 
 BLE_ONLY 
 ) 
  
 . 
 setFilter 
 ( 
 messageFilter 
 ) 
  
 . 
 build 
 (); 
 MessageListener 
  
 messageListener 
  
 = 
  
 new 
  
 MessageListener 
 () 
  
 { 
  
 @ 
 Override 
  
 public 
  
 void 
  
 onFound 
 ( 
 final 
  
 Message 
  
 message 
 ) 
  
 { 
  
 // Note: Checking the type shown for completeness, but is unnecessary 
  
 // if your message filter only includes a single type. 
  
 if 
  
 ( 
 Message 
 . 
 MESSAGE_NAMESPACE_RESERVED 
 . 
 equals 
 ( 
 message 
 . 
 getNamespace 
 ()) 
 && 
 Message 
 . 
 MESSAGE_TYPE_EDDYSTONE_UID 
 . 
 equals 
 ( 
 message 
 . 
 getType 
 ())) 
  
 { 
  
 // Nearby provides the EddystoneUid class to parse Eddystone UIDs 
  
 // that have been found nearby. 
  
 EddystoneUid 
  
 eddystoneUid 
  
 = 
  
 EddystoneUid 
 . 
 from 
 ( 
 message 
 ); 
  
 Log 
 . 
 i 
 ( 
 TAG 
 , 
  
 "Found Eddystone UID: " 
  
 + 
  
 eddystoneUid 
 ); 
  
 } 
  
 } 
 }; 
 Nearby 
 . 
 getMessagesClient 
 ( 
 this 
 ). 
 subscribe 
 ( 
 messageListener 
 , 
  
 options 
 ); 
 

RSSI and distance callbacks

In addition to found and lost callbacks, a foreground subscription can update your MessageListener when Nearby has new information about the BLE signal associated with a message.

  • These extra callbacks are currently only delivered for BLE beacon messages (both attachments and beacon IDs ).
  • These extra callbacks are not delivered to background ( PendingIntent ) subscriptions.

Example:

  MessageListener 
  
 messageListener 
  
 = 
  
 new 
  
 MessageListener 
 () 
  
 { 
  
 /** 
  
 * 
  
 Called 
  
 when 
  
 a 
  
 message 
  
 is 
  
 discovered 
  
 nearby 
 . 
  
 */ 
  
 @ 
 Override 
  
 public 
  
 void 
  
 onFound 
 ( 
 final 
  
 Message 
  
 message 
 ) 
  
 { 
  
 Log 
 . 
 i 
 ( 
 TAG 
 , 
  
 "Found message: " 
  
 + 
  
 message 
 ); 
  
 } 
  
 /** 
  
 * 
  
 Called 
  
 when 
  
 the 
  
 Bluetooth 
  
 Low 
  
 Energy 
  
 ( 
 BLE 
 ) 
  
 signal 
  
 associated 
  
 with 
  
 a 
  
 message 
  
 changes 
 . 
  
 * 
  
 * 
  
 This 
  
 is 
  
 currently 
  
 only 
  
 called 
  
 for 
  
 BLE 
  
 beacon 
  
 messages 
 . 
  
 * 
  
 * 
  
 For 
  
 example 
 , 
  
 this 
  
 is 
  
 called 
  
 when 
  
 we 
  
 see 
  
 the 
  
 first 
  
 BLE 
  
 advertisement 
  
 * 
  
 frame 
  
 associated 
  
 with 
  
 a 
  
 message 
 ; 
  
 or 
  
 when 
  
 we 
  
 see 
  
 subsequent 
  
 frames 
  
 with 
  
 * 
  
 significantly 
  
 different 
  
 received 
  
 signal 
  
 strength 
  
 indicator 
  
 ( 
 RSSI 
 ) 
  
 * 
  
 readings 
 . 
  
 * 
  
 * 
  
 For 
  
 more 
  
 information 
 , 
  
 see 
  
 the 
  
 MessageListener 
  
 Javadocs 
 . 
  
 */ 
  
 @ 
 Override 
  
 public 
  
 void 
  
 onBleSignalChanged 
 ( 
 final 
  
 Message 
  
 message 
 , 
  
 final 
  
 BleSignal 
  
 bleSignal 
 ) 
  
 { 
  
 Log 
 . 
 i 
 ( 
 TAG 
 , 
  
 "Message: " 
  
 + 
  
 message 
  
 + 
  
 " has new BLE signal information: " 
  
 + 
  
 bleSignal 
 ); 
  
 } 
  
 /** 
  
 * 
  
 Called 
  
 when 
  
 Nearby 
 's estimate of the distance to a message changes. 
  
 * 
  
 * 
  
 This 
  
 is 
  
 currently 
  
 only 
  
 called 
  
 for 
  
 BLE 
  
 beacon 
  
 messages 
 . 
  
 * 
  
 * 
  
 For 
  
 more 
  
 information 
 , 
  
 see 
  
 the 
  
 MessageListener 
  
 Javadocs 
 . 
  
 */ 
  
 @ 
 Override 
  
 public 
  
 void 
  
 onDistanceChanged 
 ( 
 final 
  
 Message 
  
 message 
 , 
  
 final 
  
 Distance 
  
 distance 
 ) 
  
 { 
  
 Log 
 . 
 i 
 ( 
 TAG 
 , 
  
 "Distance changed, message: " 
  
 + 
  
 message 
  
 + 
  
 ", new distance: " 
  
 + 
  
 distance 
 ); 
  
 } 
  
 /** 
  
 * 
  
 Called 
  
 when 
  
 a 
  
 message 
  
 is 
  
 no 
  
 longer 
  
 detectable 
  
 nearby 
 . 
  
 */ 
  
 @ 
 Override 
  
 public 
  
 void 
  
 onLost 
 ( 
 final 
  
 Message 
  
 message 
 ) 
  
 { 
  
 Log 
 . 
 i 
 ( 
 TAG 
 , 
  
 "Lost message: " 
  
 + 
  
 message 
 ); 
  
 } 
 }; 
 
Create a Mobile Website
View Site in Mobile | Classic
Share by: