La app puede suscribirse a los adjuntos de la baliza de Bluetooth de bajo consumo (BLE) con el mismo mecanismo que se usa para suscribirse a los mensajes publicados por otros dispositivos cercanos. Cuando te suscribas, tu app recibirá automáticamente de balizas y de dispositivos cercanos.
Suscribirse a mensajes de baliza BLE
您的应用可以通过两种方式订阅 BLE 信标消息:
- 在前台,响应用户操作 或事件
- 在后台运行时, 未运行。
在前台订阅
当您的应用在前台订阅信标消息时,扫描将 直到您的应用退订为止仅启动前台 订阅(通常是为了响应用户操作)。
您的应用可以通过调用
Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions)
并将 Strategy
选项设置为 BLE_ONLY
。
以下代码段演示了如何启动前台订阅
Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions)
:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
mMessageListener = new MessageListener() {
@Override
public void onFound(Message message) {
Log.d(TAG, "Found message: " + new String(message.getContent()));
}
@Override
public void onLost(Message message) {
Log.d(TAG, "Lost sight of message: " + new String(message.getContent()));
}
}
}
// Subscribe to receive messages.
private void subscribe() {
Log.i(TAG, "Subscribing.");
SubscribeOptions options = new SubscribeOptions.Builder()
.setStrategy(Strategy.BLE_ONLY)
.build();
Nearby.getMessagesClient(this).subscribe(mMessageListener, options);
}
当不再需要订阅时,您的应用应退订
通过调用
Nearby.getMessagesClient(Activity).unsubscribe(MessageListener)
。
在后台订阅
当您的应用在后台订阅信标消息时,低功耗扫描 会在屏幕事件时触发,即使您的应用当前未处于活动状态也是如此。 您可以使用这些扫描通知来“唤醒”响应 特定消息。后台订阅的功耗低于 前台订阅,但延迟时间较长,可靠性较低。
您的应用可以通过调用
Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions)
并将 Strategy
选项设置为 BLE_ONLY
。
以下代码段展示了如何通过以下方法启动后台订阅:
呼叫
Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions)
。
// Subscribe to messages in the background.
private void backgroundSubscribe() {
Log.i(TAG, "Subscribing for background updates.");
SubscribeOptions options = new SubscribeOptions.Builder()
.setStrategy(Strategy.BLE_ONLY)
.build();
Nearby.getMessagesClient(this).subscribe(getPendingIntent(), options);
}
private PendingIntent getPendingIntent() {
return PendingIntent.getBroadcast(this, 0, new Intent(this, BeaconMessageReceiver.class),
PendingIntent.FLAG_UPDATE_CURRENT);
}
以下代码段展示了如何在
BeaconMessageReceiver
类。
@Override
public void onReceive(Context context, Intent intent) {
Nearby.getMessagesClient(context).handleIntent(intent, new MessageListener() {
@Override
public void onFound(Message message) {
Log.i(TAG, "Found message via PendingIntent: " + message);
}
@Override
public void onLost(Message message) {
Log.i(TAG, "Lost message via PendingIntent: " + message);
}
});
}
当不再需要订阅时,您的应用应退订
通过调用
Nearby.getMessagesClient(Activity).unsubscribe(PendingIntent)
。
解析信标消息
信标附件 是可以添加到信标的任意数据 blob。 每个连接都由以下部分组成:
- 命名空间:命名空间标识符。
- 类型:数据类型。
- 数据:附件的数据值。
以下代码段演示了如何使用消息监听器来解析 从 BLE 信标收到的消息:
mMessageListener = new MessageListener() {
@Override
public void onFound(Message message) {
// Do something with the message here.
Log.i(TAG, "Message found: " + message);
Log.i(TAG, "Message string: " + new String(message.getContent()));
Log.i(TAG, "Message namespaced type: " + message.getNamespace() +
"/" + message.getType());
}
...
};
内容的解析取决于字节的格式。本示例假设 内容字节对 UTF-8 字符串进行编码,但信标消息 对其他字节格式(例如序列化协议缓冲区)进行编码。 如需了解详情,请参阅向信标添加附件。
Para saber qué espacios de nombres se asocian con tu proyecto, llama namespaces.list.
Notas:
-
Para conservar la duración de batería, llama a
Nearby.getMessagesClient(Activity).unsubscribe()
. en la funciónonStop()
de tu actividad. Ten en cuenta que esto solo se aplica que se suscriban en primer plano. -
Para reducir la latencia, usa la opción
Strategy.BLE_ONLY
cuando llames aNearby.getMessagesClient(Activity).subscribe()
. Cuando se configura esta opción, la API de Nearby Messages no activará el Bluetooth clásico análisis. Esto mejora la latencia para la detección de balizas, ya que el sistema no pasa por todos los tipos de análisis posibles. - Para adjuntar la carga útil de un mensaje a una baliza, utilice el API de Proximity Beacon.