Page Summary
-
By default, subscriptions encompass messages published within the app's Google Cloud project, including those from other devices and beacon-attached messages.
-
Utilize
MessageFilterto 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
PUBLICnamespace, 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:
- Eddystone UIDs
.
- Find these with
MessageFilter.Builder#includeEddystoneUids.
- Find these with
- iBeacon IDs.
- Find these with
MessageFilter.Builder#includeIBeaconIds.
- Find these with
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
);
}
};

