Wie man ein Android iBeacon 1/3 erstellt
Published: 2024-01-18 14:56:58

Es geht um Folgendes: [Einzelhändler](https://pubnub.com/blog/ecommerce-transformed-cognitive-services-and-the-future/) sind immer auf der Suche nach innovativen Möglichkeiten zur Steigerung ihrer Umsätze. Beacons, insbesondere BLE (Bluetooth Low Energy) Beacons, sind eine Technologie, die immer mehr Aufmerksamkeit auf sich zieht. Selbst Jahre nach ihrer Einführung machen Beacons, auch bekannt als Bluetooth-Beacons, immer noch Schlagzeilen, vor allem unter dem Namen "iBeacon" - Apples Protokoll, das Beacon-Technologien nutzt.

Die Bekanntheit von iBeacon ist vor allem darauf zurückzuführen, dass Apple diese Technologie schon früh übernommen hat. Das Unternehmen hat seit dem Modell 4S Beacons in iPhones integriert, und damit iOS-Geräte zum Synonym für die BLE-Beacon-Technologie gemacht! Sie waren auch die Pioniere bei der Entwicklung von Beacon-Protokollen, aber dazu später mehr.

Im Android-Ökosystem verfügen nur eine Handvoll Geräte über die notwendige Hardware, um als Beacons zu funktionieren. So war beispielsweise das Nexus 5 in der Testversion von Android 5.0 so ausgestattet, dass es als Beacon fungieren konnte. Aufgrund von Beschränkungen im Chip, die mehrere gleichzeitige Beacon-Emissionen nicht zuließen, konnte das Nexus 5 in der endgültigen Version von Android Lollipop diese Technologie nicht nutzen. Mit Android 12.0 wurde nun ein neues Modell für Standortberechtigungen eingeführt, das Beacon-Apps dazu zwingt, Änderungen an der SDK-Version 29+ vorzunehmen. In den Android-Versionen 6.0 und höher ist es für Apps unabdingbar, zur Laufzeit Standortberechtigungen vom Nutzer anzufordern, um Beacons zu erkennen. Diese Entwicklung ist relativ neu für Android-Telefone. Erwarten Sie also, dass BLE-Geräte und das Beacon-Phänomen in naher Zukunft an Bedeutung gewinnen werden, insbesondere mit dem Aufkommen der [IoT-Gerätekontrolle](https://www.pubnub.com/solutions/iot-device-control/)!

Arten von Beacons und ihre Unterschiede
---------------------------------------

### iBeacon

Apples iBeacon war das erste Beacon-Protokoll, das eingeführt wurde. Es ist benutzerfreundlich und genießt eine breite Unterstützung.

### Eddystone

Eddystone ist die Antwort von Google auf Apples iBeacon. Ursprünglich UriBeacon genannt, bietet es Flexibilität und lässt sich als Google-Produkt nahtlos in alle Google-Produkte und -Geräte integrieren, auch in solche mit WIFI-Verbindung.

### AltBeacon

AltBeacon wurde von Radius Networks entwickelt und ist unabhängig vom Hersteller. Sein Open-Source-Charakter ermöglicht die Anpassung des Quellcodes, was es zu einer vielseitigen Wahl für die App-Entwicklung macht.

### **GeoBeacon**

GeoBeacon ist ein Open-Source-Beacon-Protokoll, das von Tecno-World entwickelt wurde. Es bietet 8 Arten von Benutzerdaten, und seine Open-Source-Natur gewährleistet die Kompatibilität mit verschiedenen mobilen Plattformen. Dies macht es zu einem leistungsstarken Werkzeug in [Geolocation-Szenarien](https://www.pubnub.com/solutions/geolocation/), , das BLE-Beacons und Bluetooth-Technologie nutzt.

Aber zuerst - API-Schlüssel zur Verwendung mit einem Beacon-App-Projekt
-----------------------------------------------------------------------

Bevor Sie loslegen können, müssen Sie [sich für ein PubNub-Konto anmelden](https://dashboard.pubnub.com/signup). Wir bieten eine unglaublich großzügige kostenlose Sandbox-Ebene für die Entwicklung! Sie benötigen die API-Schlüssel zu Beginn dieses Tutorials. Mehr dazu finden Sie in unserem [PubNub Dokument](https://www.pubnub.com/docs/general/basics/set-up-your-account).

Android iBeacon Projekt Übersicht
---------------------------------

In diesem Tutorial beschäftigen wir uns mit dem Signal, das von Beacons ausgesendet wird, und nutzen dieses Wissen, um das Android BLE-Paket zu verwenden. Dieser Blogbeitrag ist der Startpunkt unserer Serie. Im Anschluss daran finden Sie unsere ausführlichen Tutorials zur Erstellung eines [Android Beacon-Senders (Publisher)](https://pubnub.com/blog/build-android-ibeacon-beacon-emitter/) und eines [Android Beacon-Detektors (Listener)](https://pubnub.com/blog/build-android-beacon-ibeacon-detector/).

Dieses Tutorial ist Teil unserer umfassenden Serie zur Erstellung intelligenter Beacons, die Sie hier im [Überblick über die Beacon-Serie](https://pubnub.com/blog/building-smarter-beacons-bidirectional-beacon-communication/) finden können. Wir zeigen Ihnen, wie Sie eine Zwei-Wege-Kommunikation mit einem Beacon initiieren - ein bedeutender Schritt gegenüber den ursprünglichen Beacons, die nur Informationen senden konnten!

![](/cdn/3prze68gbwl1/asset-17suaysk1qa1ht1/390c225f5a3d712a449ad6df71d656a9/nexus9-framed.gif?w=700&h=550)

Wie sieht die Anzeige eines Beacons aus?
----------------------------------------

Gemäß der [Bluetooth-Kernspezifikation](https://www.bluetooth.com/specifications/bluetooth-core-specification/) sendet ein Beacon ein Datenpaket, die so genannten Scan Response Data.

Diese Daten können bis zu 31 Bytes enthalten. Wenn wir eine kleinere Scan-Antwort erzeugen, werden die restlichen Bytes mit Nullen aufgefüllt.

Die Scan-Response ist in so genannte AD-Strukturen unterteilt. Dabei handelt es sich um Sequenzen von Bytes unterschiedlicher Größe mit einer vordefinierten Struktur, die wie folgt aussieht:

-   Das erste Byte gibt die Anzahl der Bytes an, die bis zum Ende der AD-Struktur verbleiben. So kann ein Empfänger dieser Struktur wissen, wann sie endet und wann eine neue AD-Struktur beginnt.
    
-   Das zweite Byte ist die Kennung eines AD-Strukturtyps.
    
-   Die restlichen Bytes sind Daten, die auf eine vordefinierte Weise strukturiert sind, je nachdem, welcher AD-Typ der vorherige Typ definiert hat.
    

Das ist alles - nur eine Abfolge von AD-Strukturen.

Die meisten Bakenprotokolle, wenn nicht alle, haben nur 2 AD-Strukturen, die wie folgt aussehen.

Erste AD-Struktur
-----------------

Die erste Struktur hat 3 Bytes:

-   Das erste Byte: `**0x02**`, weil wir nur die folgenden Bytes zählen.
    
-   Das zweite Byte: `**0x01**`, das anzeigt, dass wir einen AD-Typ "Flag" haben.
    
-   Das letzte Byte steht für diese Flags. Diese Flags drücken aus, ob sich das sendende Gerät im "Li
    
    mited Discoverable Mode", "General Discoverable Mode", usw... Das Byte berechnet sich folgendermaßen:
    

Die 5 Flags werden durch die ersten 5 Bits eines Bytes dargestellt. Der Wert dieser Bits bestimmt, ob das Flag EIN oder AUS ist. Die binäre Zahl wird dann als hexadezimaler Wert geschrieben, der angezeigt werden soll. Ein Beispiel mag die Sache verdeutlichen:

![](/cdn/3prze68gbwl1/41MNctRGxlM3f2cVZKjm3o/6a5cce32f5e53ae616c848f3ddf130c8/Screen-Shot-2015-04-13-at-9.49.01-AM.png)

Der resultierende Binärwert ist also: `**b00011010**`. Umgewandelt in einen Hexadezimalwert erhalten wir: `**0x1A**`. Sehen Sie sich das Protokoll unten an.

Das war's mit der ersten AD-Struktur! Schauen wir uns nun die zweite Struktur an, die die meisten Informationen enthält, die wir brauchen.

![](/cdn/3prze68gbwl1/asset-17suaysk1qa1hss/e66e14a10c6786db9b16531a146979d8/scan-response-structure.png)

Zweite AD-Struktur
------------------

Die zweite Struktur kann je nach Protokoll unterschiedlich groß sein. Wir nehmen das Beispiel von [AltBeacon](https://altbeacon.org/), das fast identisch mit anderen ist.

-   Das erste Byte ist `**0x1B**` (27 in hexadezimal), was bedeutet, dass wir das gesamte letzte verfügbare Byte unserer 31-Byte-Scan-Antwort verwenden. Dies kann je nach Protokoll variieren.
    
-   Das nächste Byte ist immer `**0xFF**`, was bedeutet, dass es sich um eine "herstellerspezifische" AD-Struktur handelt.
    
-   Infolgedessen stellen die 2 folgenden Bytes die Unternehmenskennung dar, wie sie auf
    
    [bluetooth.org](https://www.bluetooth.com/specifications/assigned-numbers/company-Identifiers/)
    
    . Für unser Nexus 9-Gerät ist der Hersteller des Bluetooth-Chips nicht ganz klar, daher vereinfachen wir dies, indem wir die Hersteller-ID von Google verwenden, die 224 lautet. In Hexadezimalwerten entspricht dies 0x00E0. Die ID, geschrieben als Little Endian, nimmt 2 Bytes ein. Hier ist es `**0x0E0 0x00**` in dieser Reihenfolge.
    
-   Der Rest sind herstellerspezifische Daten! Dies ist das, was sich am meisten zwischen den Protokollen ändert.
    

Für das AltBeacon-Protokoll sind die ersten 2 Bytes der herstellerspezifischen Daten `**0xBE 0xAC**` und identifizieren die AltBeacon-ADs. Ich persönlich finde es sehr gut, dass die ersten 4 Buchstaben von beacon verwendet wurden! Leicht zu merken. Die nächsten 16 Bytes sind eine UUID, die die Organisationseinheit des Advertisers repräsentiert, und die nächsten 4 Bytes können beliebig unterteilt werden. Wir werden sie in 2 unterteilen. Wir werden 2 Bytes lange Nummern haben, ähnlich wie die Major und Minor in iBeacon. Das folgende Byte muss entsprechend der Hardware gesetzt werden, und das letzte Byte kann auf 0 belassen werden, man kann aber auch entscheiden, ihm eine beliebige Bedeutung zu geben.

Das Byte, das von der Hardware abhängt, repräsentiert die Intensität des Signals in einem Meter Entfernung von Ihrem Gerät. Es ist das Zweierkomplement des Wertes in dB. Der Wert der Intensität hängt von vielen Faktoren ab, er ist oft nicht sehr genau. Für mein Nexus 9 scheint -75 dB eine korrekte Schätzung zu sein. Das bedeutet, dass das Zweierkomplement `**-75 + 256 = 181**` ist, so dass unser Byte im Hexadezimalwert `**0xB5**` ist.

Berechnen der Entfernung zu einer Bake
--------------------------------------

Eine der großen Stärken von Bakenprotokollen ist, dass sie einen ungefähren Wert für die Entfernung zwischen Ihnen und dem sendenden Gerät liefern.

Dies geschieht durch den Vergleich des Referenz-RSSI, das mit der Beacon-Scan-Antwort übertragen wird, mit dem RSSI, das Ihr Telefon erkennt. Der Algorithmus zur Berechnung dieses Wertes ist oft Eigentum der Eigentümer des Beacon-Protokolls (Estimote oder iBeacon). Da es sich bei [AltBeacon](https://altbeacon.org/) jedoch um ein Open-Source-Projekt handelt, werden wir ihren Algorithmus verwenden, der [hier](https://github.com/AltBeacon/android-beacon-library) und [hier](https://stackoverflow.com/questions/20416218/understanding-ibeacon-distancing) verfügbar ist.

Wir werden diesen Algorithmus in unserem Beispielcode verwenden, um die Entfernung zu berechnen. Beachten Sie, dass unabhängig vom verwendeten Protokoll der berechnete Entfernungswert nicht zuverlässig ist und nicht dazu verwendet werden kann, den genauen Standort des Benutzers zu ermitteln. Weitere Informationen zu den Einschränkungen von Beacons finden Sie in [Apples Dokument](https://developer.apple.com/ibeacon/Getting-Started-with-iBeacon.pdf).

Verwendung des Android BLE-Pakets für Beacons
---------------------------------------------

Um Bluetooth auf einem Android-Gerät zu verwenden, müssen Sie zunächst Berechtigungen zu Ihrem Android-Manifest hinzufügen:

```js
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
```

Der Kern des Pakets ist der Bluetooth-Adapter, ein Tool, das den Zugriff auf Ihre Hardware ermöglicht. Zum Beispiel in Ihrer onCreate-Methode, wie in Android 12.0 zu sehen:

```js
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity\_your\_activity);
  mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
```

Das ist alles, was Sie brauchen, um loszulegen. Betrachten wir nun spezifischere Beispiele für das Scannen und Senden von Baken. Beachten Sie, dass bei Verwendung des Android BLE-Pakets die erste AD-Struktur automatisch gelesen oder erstellt wird. Wir werden uns auf die zweite AD-Struktur konzentrieren. Bemerkenswert ist, dass das SDK automatisch herstellerspezifische Datenstrukturen identifiziert oder erstellt, so dass die ersten 2 Bytes, die die Größe und den Datentyp definieren, nicht bearbeitet werden müssen. Die Unternehmens-ID wird ebenfalls automatisch bearbeitet, wobei nur der Dezimalwert der ID benötigt wird. Dies vereinfacht den Prozess erheblich.

### Scannen von Beacons unter Android

Um diesen Prozess zu starten, muss ein Bluetooth LE Scanner instanziiert werden:

```js
mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
```

Das Android-Paket ermöglicht die Erstellung von Filtern, die die Erkennung von Beacons ermöglichen, die unserem Filter entsprechen. Um ein altBeacon zu erkennen, müssen Sie zunächst einen Scan-Filter erstellen. Erstellen Sie ein Array mit Bytes der Größe 24. Die ersten 2 Bytes sind das Präfix für den altbeacon identifier: \`\*\*0xBE 0xAC\*\*\`. Fügen Sie die 16 Bytes für die UUID der Beacons ein, die Sie erkennen wollen, typischerweise ist dies die UUID Ihrer Organisation. Die restlichen Bytes können als Nullen belassen werden.

Konstruieren Sie ein weiteres Array der Größe 24, das eine Zahl von Index 0 bis 17 und die restlichen Zahlen mit Nullen enthält. Dies zeigt an, dass nur die ersten 18 Bytes obligatorisch sind und dass der Scanner Ergebnisse für Scan-Datensätze liefern soll, die nur mit dem Anfang unserer Herstellerdaten übereinstimmen.

### Verwandeln Sie Ihr Android-Gerät in einen sendenden (Herausgeber) Beacon

Beginnen Sie mit der Instanziierung eines Bluetooth LE Advertisers:

```js
mBluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();
```

Um Ihre Daten zu erstellen, verwenden Sie den Advertise Data Builder. Erstellen Sie auf ähnliche Weise ein Array von Bytes, das das AltBeacon-Präfix, Ihre UUID, Major, Minor und die Sendeleistung enthält. Sobald dies geschehen ist, haben Sie den Beacon erfolgreich erstellt!

### Zusammenfassung

Wir haben das von Baken ausgesendete Signal, die Berechnung von Entfernungen zu Baken und das Scannen von Baken auf Android-Geräten untersucht. Mit diesem Wissen können Sie ein neues Android BLE-Paket mit Android 12.0 erstellen.

Als Nächstes werden wir uns mit dem [Aufbau des Beacon-Detektors](https://www.pubnub.com/blog/tessel-ibeacon-tutorial-building-the-detector-data-beacon-subscriber/) befassen. Dann führen wir Sie durch den [Aufbau des Senders](https://www.pubnub.com/blog/build-android-ibeacon-beacon-emitter/).

Wie kann PubNub Ihnen helfen?
=============================

Dieser Artikel wurde ursprünglich auf [PubNub.com](https://www.pubnub.com/blog/building-android-beacon-android-ibeacon-tutorial-overview/) veröffentlicht.

Unsere Plattform hilft Entwicklern bei der Erstellung, Bereitstellung und Verwaltung von Echtzeit-Interaktivität für Webanwendungen, mobile Anwendungen und IoT-Geräte.

Die Grundlage unserer Plattform ist das größte und am besten skalierbare Echtzeit-Edge-Messaging-Netzwerk der Branche. Mit über 15 Points-of-Presence weltweit, die 800 Millionen monatlich aktive Nutzer unterstützen, und einer Zuverlässigkeit von 99,999 % müssen Sie sich keine Sorgen über Ausfälle, Gleichzeitigkeitsgrenzen oder Latenzprobleme aufgrund von Verkehrsspitzen machen.

PubNub erleben
--------------

Sehen Sie sich die [Live Tour](https://www.pubnub.com/tour/introduction/) an, um in weniger als 5 Minuten die grundlegenden Konzepte hinter jeder PubNub-gestützten App zu verstehen

Einrichten
----------

Melden Sie sich für einen [PubNub-Account](https://admin.pubnub.com/signup/) an und erhalten Sie sofort kostenlosen Zugang zu den PubNub-Schlüsseln

Beginnen Sie
------------

Mit den [PubNub-Dokumenten](https://www.pubnub.com/docs) können Sie sofort loslegen, unabhängig von Ihrem Anwendungsfall oder [SDK](https://www.pubnub.com/docs)