Ihre App kann Bluetooth Low Energy (BLE)-Beacon-Anhänge abonnieren. mit demselben Mechanismus, wie beim Abonnieren von Nachrichten, andere Geräte in der Nähe. Wenn du ein Abo abschließt, erhält deine App automatisch Nachrichten von Beacons und Geräten in der Nähe
BLE-Beacon-Mitteilungen abonnieren
Es gibt zwei Möglichkeiten, wie Ihre App BLE-Beacon-Nachrichten abonnieren kann:
- Im Vordergrund als Reaktion auf eine Nutzeraktion oder einem Ereignis.
- Im Hintergrund, wenn deine App nicht ausgeführt wird.
Im Vordergrund abonnieren
Wenn Ihre App Beacon-Nachrichten im Vordergrund abonniert, werden Scans bis die App das Abo beendet. Nur Vordergrund starten , wenn Ihre App aktiv ist. Dies geschieht in der Regel als Reaktion auf eine Nutzeraktion.
Deine App kann ein Abo im Vordergrund initiieren, indem sie Folgendes aufruft:
Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions)
und Festlegen der Option Strategy
auf BLE_ONLY
.
Das folgende Code-Snippet zeigt, wie ein Abo im Vordergrund initiiert wird
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);
}
Wenn das Abo nicht mehr erforderlich ist, sollte Ihre App keine Benachrichtigungen mehr erhalten
durch einen Anruf
Nearby.getMessagesClient(Activity).unsubscribe(MessageListener)
Inhalte im Hintergrund abonnieren
Wenn Ihre App im Hintergrund Beacon-Nachrichten abonniert, werden Scans mit geringem Energieverbrauch werden bei Bildschirm-on-Ereignissen ausgelöst, auch wenn Ihre App derzeit nicht aktiv ist. Du kannst diese Scan-Benachrichtigungen zum „Aufwachen“ verwenden Ihre App als Reaktion auf eine Nachricht zu senden. Abos im Hintergrund verbrauchen weniger Strom als Abos im Vordergrund, haben aber eine höhere Latenz und eine geringere Zuverlässigkeit.
Deine App kann ein Hintergrundabo initiieren, indem sie Folgendes aufruft:
Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions)
und Festlegen der Option Strategy
auf BLE_ONLY
.
Das folgende Code-Snippet zeigt das Initiieren eines Hintergrundabos durch
Anrufen
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);
}
Das folgende Code-Snippet zeigt, wie der Intent in der
Klasse 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);
}
});
}
Wenn das Abo nicht mehr erforderlich ist, sollte Ihre App keine Benachrichtigungen mehr erhalten
durch einen Anruf
Nearby.getMessagesClient(Activity).unsubscribe(PendingIntent)
Beacon-Nachrichten parsen
Beacon-Anhänge sind Blobs mit beliebigen Daten, die Sie Beacons hinzufügen können. Jeder Anhang besteht aus den folgenden Teilen:
- Namespace: Eine Namespace-ID.
- Type: Der Datentyp.
- Daten: Der Datenwert für den Anhang.
Im folgenden Code-Snippet wird die Verwendung eines Nachrichten-Listeners zum Parsen dargestellt. von einem BLE-Beacon empfangene Nachrichten:
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());
}
...
};
Das Parsen des Inhalts hängt vom Format der Bytes ab. In diesem Beispiel wird vorausgesetzt, dass die Contentbytes einen UTF-8-String codieren. Ihre Beacon-Nachricht kann jedoch andere Byteformate zu codieren (z. B. einen serialisierten Protokollpuffer). Weitere Informationen finden Sie unter Anhänge zu Beacons hinzufügen.
Um herauszufinden, welche Namespaces Ihrem Projekt zugeordnet sind, rufen Sie namespaces.list
Hinweise:
-
Rufen Sie
Nearby.getMessagesClient(Activity).unsubscribe()
auf, um die Akkulaufzeit zu verlängern in deronStop()
-Funktion deiner Aktivität. Dies gilt nur, wenn Abos im Vordergrund. -
Verwenden Sie zum Reduzieren der Latenz die Option
Strategy.BLE_ONLY
beim Aufrufen vonNearby.getMessagesClient(Activity).subscribe()
. Wenn diese Option festgelegt ist, löst die Nearby Messages API kein klassisches Bluetooth aus Scans. Dadurch wird die Latenz bei der Beacon-Erkennung verbessert, da das System nicht alle möglichen Scantypen durchläuft. - Um eine Nachrichtennutzlast an ein Beacon anzuhängen, verwenden Sie die Methode Proximity Beacon API