Ricevere messaggi beacon

La tua app può abbonarsi agli allegati di beacon BLE (Bluetooth Low Energy) utilizzando lo stesso meccanismo utilizzato per abbonarsi ai messaggi pubblicati da altri dispositivi nelle vicinanze. Quando ti abboni, l'app riceverà automaticamente messaggi dai beacon e dai dispositivi nelle vicinanze.

Sottoscrivere messaggi di beaconing BLE

La tua app può abbonarsi ai messaggi dei beacon BLE in due modi:

  • In primo piano, in risposta a un'azione o a un evento dell'utente.
  • In background, quando l'app non è in esecuzione.

Iscriviti in primo piano

Quando la tua app si iscrive ai messaggi di beacon in primo piano, le scansioni vengono eseguite continuamente finché l'app non annulla l'iscrizione. Avvia un abbonamento in primo piano solo quando l'app è attiva, generalmente in risposta a un'azione dell'utente.

La tua app può avviare un abbonamento in primo piano chiamando Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions) e impostando l'opzione Strategy su BLE_ONLY.

Il seguente snippet di codice dimostra l'avvio di un abbonamento in primo piano 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);
}

Quando l'abbonamento non è più richiesto, l'app dovrebbe annullare l'iscrizione chiamando Nearby.getMessagesClient(Activity).unsubscribe(MessageListener).

Abbonamento in background

Quando la tua app si iscrive ai messaggi di beacon in background, vengono eseguite scansioni a basso consumo negli eventi screen-on, anche quando l'app non è attiva al momento. Puoi utilizzare queste notifiche di scansione per riattivare l'app in risposta a un messaggio specifico. Gli abbonamenti in background consumano meno energia rispetto agli abbonamenti in primo piano, ma hanno una latenza più elevata e una minore affidabilità.

La tua app può attivare un abbonamento in background chiamando Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions) e impostando l'opzione Strategy su BLE_ONLY.

Il seguente snippet di codice dimostra l'avvio di un abbonamento in background chiamando 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);
}

Il seguente snippet di codice dimostra la gestione dell'intent nella classe 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);
        }
    });
}

Quando l'abbonamento non è più richiesto, l'app dovrebbe annullare l'iscrizione chiamando Nearby.getMessagesClient(Activity).unsubscribe(PendingIntent).

Analizza i messaggi di beaconing

Gli allegati dei beacon sono blob di dati arbitrari che puoi aggiungere ai beacon. Ogni allegato è costituito dalle seguenti parti:

  • Spazio dei nomi: un identificatore dello spazio dei nomi.
  • Tipo: il tipo di dati.
  • Dati: il valore dei dati per l'allegato.

Il seguente snippet di codice dimostra l'uso di un listener di messaggi per analizzare i messaggi ricevuti da un beacon 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());
    }

    ...
};

L'analisi dei contenuti dipende dal formato dei byte. In questo esempio si presume che i byte di contenuto codifichino una stringa UTF-8, ma il messaggio di beacon può codificare altri formati di byte (ad esempio un buffer di protocollo serializzato). Per ulteriori informazioni, vedi Aggiungere allegati ai beacon.

Per scoprire quali spazi dei nomi sono associati al tuo progetto, chiama namespaces.list.

Note: