Obtener mensajes de las balizas

Tu app puede suscribirse a archivos adjuntos de baliza Bluetooth de bajo consumo (BLE) con el mismo mecanismo que se usa para suscribirse a mensajes publicados por otros dispositivos cercanos. Cuando te suscribas, tu app recibirá automáticamente mensajes de balizas y dispositivos cercanos.

Suscribirse a mensajes de baliza BLE

Tu app puede suscribirse a mensajes de baliza BLE de dos maneras:

  • En primer plano, en respuesta a una acción o un evento del usuario.
  • En segundo plano, cuando la app no está en ejecución

Suscribirse en primer plano

Cuando tu app se suscribe a mensajes de baliza en primer plano, los análisis se realizan de manera continua hasta que tu app anula la suscripción. Inicia una suscripción en primer plano solo cuando tu app esté activa, por lo general, en respuesta a una acción del usuario.

Tu app puede iniciar una suscripción en primer plano llamando a Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions) y configurando la opción Strategy como BLE_ONLY.

En el siguiente fragmento de código, se muestra cómo iniciar una suscripción en primer plano 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);
}

Cuando ya no se requiera la suscripción, tu app debe anular la suscripción llamando a Nearby.getMessagesClient(Activity).unsubscribe(MessageListener).

Suscribirse en segundo plano

Cuando tu app se suscribe a mensajes de baliza en segundo plano, los análisis de bajo consumo se activan en eventos de pantalla encendida, incluso cuando no está activa en ese momento. Puedes usar estas notificaciones de análisis para "activar" tu app en respuesta a un mensaje en particular. Las suscripciones en segundo plano consumen menos energía que las de primer plano, pero tienen mayor latencia y menor confiabilidad.

Para iniciar una suscripción en segundo plano, la app puede llamar a Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions) y configurar la opción Strategy en BLE_ONLY.

En el siguiente fragmento de código, se muestra cómo iniciar una suscripción en segundo plano llamando a 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);
}

En el siguiente fragmento de código, se muestra el manejo del intent en la clase 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);
        }
    });
}

Cuando ya no se requiera la suscripción, tu app debe anular la suscripción llamando a Nearby.getMessagesClient(Activity).unsubscribe(PendingIntent).

Analizar los mensajes de la baliza

Los adjuntos de balizas son BLOB de datos arbitrarios que puedes agregar a balizas. Cada adjunto consta de las siguientes partes:

  • Espacio de nombres: Un identificador de espacio de nombres.
  • Tipo: el tipo de datos.
  • Datos: El valor de datos del adjunto.

En el siguiente fragmento de código, se muestra cómo usar un objeto de escucha de mensajes para analizar los mensajes recibidos de una baliza 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());
    }

    ...
};

El análisis del contenido depende del formato de los bytes. En este ejemplo, se supone que los bytes de contenido codifican una string UTF-8, pero el mensaje de la baliza puede codificar otros formatos de bytes (por ejemplo, un búfer de protocolo serializado). Si deseas obtener más información, consulta Cómo agregar archivos adjuntos a las Beacons.

Para averiguar qué espacios de nombres están asociados con tu proyecto, llama a namespaces.list.

Notas: