Obtener mensajes de las balizas

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: