Jak zbudować Android iBeacon 1/3
Published: 2024-01-18 14:35:50

[Sprzedawcy detaliczni](https://pubnub.com/blog/ecommerce-transformed-cognitive-services-and-the-future/) zawsze szukają innowacyjnych sposobów na zwiększenie sprzedaży. Beacony, a konkretnie beacony BLE (Bluetooth Low Energy), stały się jedną z technologii, która wciąż przyciąga uwagę. Nawet lata po ich wprowadzeniu, Beacony, znane również jako beacony Bluetooth, wciąż trafiają na pierwsze strony gazet, głównie pod nazwą "iBeacon" - protokół Apple wykorzystujący technologie Beacon.

Znaczenie iBeacon można w dużej mierze przypisać wczesnemu wdrożeniu tej technologii przez Apple. Apple integruje beacony w iPhone'ach od modelu 4S, czyniąc urządzenia iOS synonimem technologii BLE beacon! Byli również pionierami w opracowywaniu protokołów Beacon, ale o tym później.

W ekosystemie Androida tylko kilka urządzeń posiada niezbędny sprzęt do działania jako beacony. Na przykład, w testowej wersji Androida 5.0, Nexus 5 był wyposażony do działania jako beacon. Jednak ze względu na ograniczenia w chipie, które nie pozwalały na wiele jednoczesnych emisji beaconów, ostateczna wersja Androida Lollipop sprawiła, że Nexus 5 nie był w stanie korzystać z tej technologii. Szybko do przodu, Android 12.0 wprowadził nowy model uprawnień do lokalizacji, wymagając od aplikacji beacon wprowadzenia zmian w docelowej wersji SDK 29+. W wersjach Androida 6.0 i nowszych, aplikacje muszą żądać uprawnień do lokalizacji od użytkowników w czasie wykonywania, aby wykrywać sygnały nawigacyjne. Ten rozwój jest stosunkowo nowy w telefonach z Androidem, więc spodziewaj się, że urządzenia BLE i zjawisko Beacon zyskają większą popularność w najbliższej przyszłości, zwłaszcza wraz z pojawieniem się [kontroli urządzeń IoT](https://www.pubnub.com/solutions/iot-device-control/)!

Rodzaje sygnałów nawigacyjnych i różnice między nimi
----------------------------------------------------

### iBeacon

iBeacon firmy Apple był pierwszym wprowadzonym protokołem beacon. Jest przyjazny dla użytkownika i cieszy się szerokim wsparciem.

### Eddystone

Eddystone to odpowiedź Google na iBeacon firmy Apple. Początkowo nazwany UriBeacon, oferuje elastyczność i będąc produktem Google, płynnie integruje się ze wszystkimi produktami i urządzeniami Google, w tym tymi korzystającymi z łączności WIFI.

### AltBeacon

AltBeacon, będący pomysłem Radius Networks, nie wykazuje żadnych preferencji co do dostawcy. Jego otwarty charakter pozwala na dostosowanie kodu źródłowego, co czyni go wszechstronnym wyborem do tworzenia aplikacji.

### **GeoBeacon**

GeoBeacon to protokół beacon o otwartym kodzie źródłowym opracowany przez Tecno-World. Oferuje on 8 rodzajów danych użytkownika, a jego charakter open-source zapewnia kompatybilność z różnymi platformami mobilnymi. To czyni go potężnym narzędziem w scenariuszach [geolokalizacyjnych](https://www.pubnub.com/solutions/geolocation/), wykorzystujących beacony BLE i technologię Bluetooth.

Ale najpierw - klucze API do wykorzystania w projekcie aplikacji Beacon
-----------------------------------------------------------------------

Zanim zaczniesz korzystać z aplikacji, musisz [założyć konto PubNub](https://dashboard.pubnub.com/signup). Oferujemy niezwykle hojną, bezpłatną warstwę sandbox dla deweloperów! Klucze API będą potrzebne na początku tego samouczka. Więcej informacji na ten temat można znaleźć w naszym [dokumencie Pub](https://www.pubnub.com/docs/general/basics/set-up-your-account)Nub.

Przegląd projektu Android iBeacon
---------------------------------

W tym samouczku zagłębimy się w sygnał emitowany przez beacony, a następnie wykorzystamy tę wiedzę do wykorzystania pakietu Android BLE. Ten wpis na blogu jest punktem wyjścia naszej serii. Następnie zapoznaj się z naszymi szczegółowymi samouczkami na temat tworzenia [nadajnika be](https://pubnub.com/blog/build-android-ibeacon-beacon-emitter/)aconów [Android (](https://pubnub.com/blog/build-android-beacon-ibeacon-detector/) [wydawcy)](https://pubnub.com/blog/build-android-ibeacon-beacon-emitter/) i [detektora beaconów Android (słuchacza)](https://pubnub.com/blog/build-android-beacon-ibeacon-detector/).

Ten samouczek jest częścią naszej kompleksowej serii na temat budowania inteligentniejszych beaconów, którą można poznać poprzez [przegląd serii beaconów](https://pubnub.com/blog/building-smarter-beacons-bidirectional-beacon-communication/) tutaj. Poprowadzimy Cię przez inicjowanie dwukierunkowej komunikacji z beaconem - to znaczący skok w porównaniu z oryginalnymi beaconami, które mogły tylko nadawać informacje!

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

Jak wygląda reklama beacona?
----------------------------

Zgodnie z [podstawową specyfikacją Bluetooth](https://www.bluetooth.com/specifications/bluetooth-core-specification/), beacon nadaje pakiet danych określany jako Scan Response Data.

Dane te mogą zawierać do 31 bajtów. Jeśli wygenerujemy mniejszą odpowiedź skanowania, pozostałe bajty zostaną wypełnione zerami.

Odpowiedź na skanowanie jest podzielona na tak zwane struktury AD. Są to sekwencje bajtów o różnej wielkości, z predefiniowaną strukturą, która wygląda następująco:

-   Pierwszy bajt reprezentuje liczbę bajtów pozostałych do końca struktury AD. Pozwala to odbiorcy tej struktury wiedzieć, kiedy się kończy i kiedy zaczyna się nowa struktura AD.
    
-   Drugi bajt to identyfikator typu struktury AD.
    
-   Reszta bajtów to dane zorganizowane w predefiniowany sposób, w zależności od tego, jaki typ AD zdefiniował poprzedni typ.
    

To wszystko - po prostu ciąg struktur AD.

Większość protokołów beacon, jeśli nie wszystkie, ma tylko 2 struktury AD, które są następujące.

Pierwsza struktura AD
---------------------

Pierwsza struktura składa się z 3 bajtów:

-   Pierwszy bajt: `**0x02**`, ponieważ liczymy tylko kolejne bajty.
    
-   Drugi bajt: `**0x01**`, który wskazuje, że mamy typ AD "Flag".
    
-   Ostatni bajt reprezentuje te flagi. Flagi te wyrażają, czy urządzenie emitujące jest w "Li
    
    mited Discoverable Mode", "General Discoverable Mode" itd... Bajt oblicza się w następujący sposób:
    

5 flag jest reprezentowanych przez 5 pierwszych bitów bajtu. Wartość tych bitów określa, czy flaga jest włączona, czy wyłączona. Liczba binarna jest następnie zapisywana jako wartość szesnastkowa, która będzie reklamowana. Przykład może rozjaśnić sytuację:

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

Wynikowa wartość binarna to: `**b00011010**`. Po przekonwertowaniu na szesnastkowy otrzymujemy: `**0x1A**`. Patrz poniższy log.

To tyle, jeśli chodzi o pierwszą strukturę AD! Przyjrzyjmy się teraz drugiej strukturze, która zawiera większość potrzebnych nam informacji.

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

Druga struktura AD
------------------

Druga struktura może mieć różne rozmiary w zależności od protokołu. Weźmiemy przykład [AltBeacon](https://altbeacon.org/), który jest prawie identyczny z innymi.

-   Pierwszy bajt to `**0x1B**` (27 w systemie szesnastkowym), co oznacza, że zajmujemy cały ostatni dostępny bajt naszej 31-bajtowej odpowiedzi na skanowanie. Może się to różnić w zależności od protokołu.
    
-   Następny bajt to zawsze `**0xFF**`, co oznacza, że mamy strukturę AD typu "Manufacturer Specific".
    
-   W rezultacie 2 kolejne bajty reprezentują identyfikator firmy zdefiniowany na stronie
    
    [bluetooth.org](https://www.bluetooth.com/specifications/assigned-numbers/company-Identifiers/)
    
    . W przypadku naszego urządzenia Nexus 9 producent układu bluetooth nie jest zbyt jasny, więc uprościmy to, używając identyfikatora producenta Google, który wynosi 224. W zapisie szesnastkowym jest to 0x00E0. Identyfikator, zapisany jako little endian, zajmuje 2 bajty. Tutaj będzie to `**0x0E0 0x00**` w tej kolejności.
    
-   Reszta to dane specyficzne dla producenta! To jest to, co najbardziej zmienia się między protokołami.
    

W przypadku protokołu AltBeacon 2 pierwsze bajty danych specyficznych dla producenta to `**0xBE 0xAC**` i identyfikują altbeacon AD. Osobiście bardzo podoba mi się, że zdecydowali się użyć pierwszych 4 liter beacon! Łatwe do zapamiętania. Następne 16 bajtów to UUID reprezentujący jednostkę organizacyjną reklamodawcy, a 4 kolejne bajty można podzielić w dowolny sposób. My podzielimy je na 2. Będziemy mieli 2-bajtowe numery, podobne do major i minor w iBeacon. Następny bajt musi być ustawiony zgodnie z posiadanym sprzętem, a ostatni bajt można pozostawić na 0, można również zdecydować się na nadanie mu dowolnego znaczenia.

Bajt, który zależy od sprzętu, reprezentuje intensywność sygnału w odległości metra od urządzenia. Jest to dopełnienie dwójkowe wartości w dB. Wartość natężenia zależy od wielu czynników, często nie jest zbyt precyzyjna. Dla mojego Nexusa 9, -75dB wydaje się być prawidłowym oszacowaniem. Oznacza to, że dopełnienie dwójkowe będzie wynosić `**-75 + 256 = 181**`, więc w wartości szesnastkowej nasz bajt staje się `**0xB5**`.

Obliczanie odległości do radiolatarni
-------------------------------------

Jedną z największych zalet protokołów beacon jest to, że podają one przybliżoną wartość odległości, która dzieli nas od urządzenia emitującego sygnał.

Osiąga się to poprzez porównanie referencyjnego RSSI, który jest przesyłany wraz z odpowiedzią na skanowanie sygnału nawigacyjnego, z RSSI wykrytym przez telefon. Algorytm obliczania tej wartości jest często własnością właścicieli protokołu beacon (Estimote lub iBeacon). Ponieważ jednak [AltBeacon](https://altbeacon.org/) jest projektem open-source, użyjemy ich algorytmu, dostępnego [tutaj](https://github.com/AltBeacon/android-beacon-library) i [tutaj](https://stackoverflow.com/questions/20416218/understanding-ibeacon-distancing).

Wykorzystamy ten algorytm w naszym przykładowym kodzie do obliczania odległości. Należy pamiętać, że niezależnie od używanego protokołu, obliczona wartość odległości nie jest wiarygodna i nie może być wykorzystana do wykrycia dokładnej lokalizacji użytkownika. Więcej informacji na temat ograniczeń beaconów można znaleźć w [dokumencie Apple](https://developer.apple.com/ibeacon/Getting-Started-with-iBeacon.pdf).

Korzystanie z pakietu Android BLE dla beaconów
----------------------------------------------

Aby korzystać z Bluetooth na urządzeniu z Androidem, należy najpierw dodać uprawnienia do Manifestu Androida:

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

Sedno pakietu leży w Adapterze Bluetooth, narzędziu umożliwiającym dostęp do sprzętu. Na przykład w metodzie onCreate, jak widać w Androidzie 12.0:

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

To wszystko, czego potrzebujesz, aby rozpocząć. Zagłębmy się w bardziej szczegółowe przypadki skanowania i emisji beaconów. Należy pamiętać, że podczas korzystania z pakietu Android BLE pierwsza struktura AD jest odczytywana lub tworzona automatycznie. Skupimy się na drugiej strukturze AD. Warto zauważyć, że SDK automatycznie identyfikuje lub tworzy struktury danych specyficzne dla producenta, omijając potrzebę edycji pierwszych 2 bajtów definiujących rozmiar i typ danych. Identyfikator firmy jest również edytowany automatycznie, wymagając jedynie wartości dziesiętnej identyfikatora. To znacznie upraszcza proces.

### Skanowanie Beaconów w systemie Android

Zainicjowanie tego procesu wymaga instancjonowania skanera Bluetooth LE:

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

Pakiet Androida pozwala użytkownikom na tworzenie filtrów, umożliwiając wykrywanie beaconów pasujących do naszego filtra. Aby wykryć altBeacon, musisz najpierw zbudować filtr skanowania. Utwórz tablicę bajtów o rozmiarze 24. Pierwsze 2 bajty będą prefiksem identyfikatora altbeacon: \`\*\*0xBE 0xAC\*\*\`. Wstaw 16 bajtów dla UUID beaconów, które chcesz wykryć, zazwyczaj będzie to UUID Twojej organizacji. Pozostałe bajty można pozostawić jako zera.

Skonstruuj kolejną tablicę o rozmiarze 24, zawierającą jedynki od indeksu 0 do 17 i pozostałe zera. Oznacza to, że tylko pierwsze 18 bajtów jest obowiązkowe i że skaner powinien generować wyniki dla rekordów skanowania, które pasują tylko do początku danych naszego producenta.

### Przekształcenie Androida w emitujący (wydający) Beacon

Zacznij od utworzenia instancji reklamodawcy Bluetooth LE:

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

Aby utworzyć dane, użyj kreatora danych reklam. Podobnie, utwórz tablicę bajtów zawierającą prefiks AltBeacon, identyfikator UUID, major, minor i moc tx. Gdy to zrobisz, pomyślnie utworzyłeś beacon!

### Podsumowanie

Przeanalizowaliśmy sygnał emitowany przez beacony, obliczanie odległości do beaconów i sposób skanowania beaconów na urządzeniach z Androidem. Dzięki tej wiedzy można utworzyć nowy pakiet Android BLE przy użyciu Androida 12.0.

Następnie przyjrzymy się bliżej temu, [jak zbudować detektor be](https://www.pubnub.com/blog/tessel-ibeacon-tutorial-building-the-detector-data-beacon-subscriber/)aconów. Następnie pokażemy, jak [zbudować em](https://www.pubnub.com/blog/build-android-ibeacon-beacon-emitter/)iter.

Jak PubNub może ci pomóc?
=========================

Ten artykuł został pierwotnie opublikowany na [PubNub.com](https://www.pubnub.com/blog/building-android-beacon-android-ibeacon-tutorial-overview/)

Nasza platforma pomaga programistom tworzyć, dostarczać i zarządzać interaktywnością w czasie rzeczywistym dla aplikacji internetowych, aplikacji mobilnych i urządzeń IoT.

Fundamentem naszej platformy jest największa w branży i najbardziej skalowalna sieć przesyłania wiadomości w czasie rzeczywistym. Dzięki ponad 15 punktom obecności na całym świecie obsługującym 800 milionów aktywnych użytkowników miesięcznie i niezawodności na poziomie 99,999%, nigdy nie będziesz musiał martwić się o przestoje, limity współbieżności lub jakiekolwiek opóźnienia spowodowane skokami ruchu.

Poznaj PubNub
-------------

Sprawdź [Live Tour](https://www.pubnub.com/tour/introduction/), aby zrozumieć podstawowe koncepcje każdej aplikacji opartej na PubNub w mniej niż 5 minut.

Rozpocznij konfigurację
-----------------------

Załóż [konto](https://admin.pubnub.com/signup/) PubNub, aby uzyskać natychmiastowy i bezpłatny dostęp do kluczy PubNub.

Rozpocznij
----------

[Dokumenty](https://www.pubnub.com/docs) PubNub pozwolą Ci rozpocząć pracę, niezależnie od przypadku użycia lub [zestawu SDK](https://www.pubnub.com/docs).