アンドロイドiBeaconの作り方 1/3
Published: 2024-01-18 14:46:56

[小売業者は](https://pubnub.com/blog/ecommerce-transformed-cognitive-services-and-the-future/)、売上を伸ばすための革新的な方法を常に模索している。ビーコン、特にBLE（Bluetooth Low Energy）ビーコンは、注目され続けている技術の一つとなっている。Bluetoothビーコンとしても知られるBeaconは、登場から数年経った今でも、主に「iBeacon」（Beacon技術を利用したアップルのプロトコル）という名称で、話題を呼んでいる。

iBeaconが注目されるようになったのは、アップルがこの技術をいち早く採用したことが大きい。彼らは4Sモデル以来、iPhoneにビーコンを統合しており、iOSデバイスをBLEビーコン技術の代名詞にしている ！彼らはまた、Beaconプロトコルを開発したパイオニアでもあるが、これについては後述する。

Androidのエコシステムでは、ビーコンとして機能するのに必要なハードウェアを持つデバイスはほんの一握りである。例えば、Android 5.0のテストバージョンでは、Nexus 5はビーコンとして機能するように装備されていた。しかし、複数のビーコンを同時に発信できないチップの制限のため、アンドロイド・ロリポップの最終リリースでは、ネクサス5はこの技術を使用できなくなった。現在では、Android 12.0が新しい位置情報許可モデルを導入したため、ビーコンアプリはターゲットSDKバージョン29以上に変更する必要がある。Androidバージョン6.0以上では、ビーコンを検出するために、アプリが実行時にユーザーに位置情報の許可を要求することが不可欠です。この開発はAndroid携帯では比較的新しいため、BLEデバイスとBeacon現象は、特に[IoTデバイス制御の](https://www.pubnub.com/solutions/iot-device-control/)出現に伴い、近い将来さらに牽引力を増すと予想される！

ビーコンの種類と違い
----------

### iBeacon（アイビーコン

アップルのiBeaconは、最初に導入されたビーコン・プロトコルである。ユーザーフレンドリーで、幅広いサポートを享受している。

### Eddystone

Eddystoneは、アップルのiBeaconに対するグーグルの回答である。当初はUriBeaconと名付けられたが、柔軟性があり、グーグル製品であるため、WIFI接続を使用するものも含め、すべてのグーグル製品やデバイスとシームレスに統合できる。

### AltBeacon

Radius Networksの発案によるAltBeaconは、ベンダーを選ばない。オープンソースであるため、ソースコードのカスタマイズが可能であり、アプリ開発のための汎用的な選択肢となっている。

### **GeoBeacon**

GeoBeaconはTecno-Worldによって開発されたオープンソースのビーコンプロトコルである。8種類のユーザーデータを提供し、オープンソースであるため様々なモバイルプラットフォームとの互換性が確保されている。そのため、[ジオロケーション・シナリオにおいて](https://www.pubnub.com/solutions/geolocation/)強力なツールとなる。BLEビーコンとBluetoothテクノロジーを活用する 。

その前に - Beaconアプリ・プロジェクトで使用するAPIキー
---------------------------------

その前に、[PubNubアカウントにサインアップ](https://dashboard.pubnub.com/signup)する必要があります。PubNubは開発用に非常に寛大な無料のサンドボックス階層を提供しています！このチュートリアルの最初にAPIキーが必要になります。これについては[PubNubのドキュメントを](https://www.pubnub.com/docs/general/basics/set-up-your-account)参照してください。

Android iBeaconプロジェクトの概要
------------------------

このチュートリアルではビーコンが発する信号について掘り下げ、その知識を活用してAndroid BLEパッケージを活用します。このブログ記事はシリーズの出発点です。このチュートリアルに続いて、[Androidビーコン発信機（発信者](https://pubnub.com/blog/build-android-ibeacon-beacon-emitter/)）と[Androidビーコン検出器（受信者](https://pubnub.com/blog/build-android-beacon-ibeacon-detector/)）の構築に関する詳細なチュートリアルをご覧ください。

このチュートリアルは、よりスマートなビーコンを構築するための包括的なシリーズの一部です。このチュートリアルでは、ビーコンとの双方向通信を開始する方法について説明します！

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

ビーコンの広告とは？
----------

[Bluetoothのコア仕様に従い](https://www.bluetooth.com/specifications/bluetooth-core-specification/)、ビーコンはスキャン・レスポンス・データと呼ばれるデータ・パッケージをブロードキャストします。

このデータには最大31バイトが含まれます。より小さなスキャン・レスポンスを生成する場合、残りのバイトはゼロで埋められます。

スキャン・レスポンスはAD構造と呼ばれるものに分割される。これは様々なサイズのバイト列で、以下のような定義済みの構造になっている：

-   最初のバイトは、AD構造の最後まで残っているバイト数を表す。これにより、この構造体の受信者は、この構造体がいつ終了し、いつ新しいAD構造体が始まるかを知ることができる。
    
-   2バイト目はAD構造タイプのIDである。
    
-   残りのバイトは、前のタイプが定義したADタイプに応じて、あらかじめ定義された方法で構造化されたデータである。
    

これだけで、AD構造の連続である。

すべてではないにしても、ほとんどのビーコン・プロトコルは、以下のような2つのAD構造しか持っていない。

最初のAD構造体
--------

最初の構造体は3バイトである：

-   最初のバイトは`**0x02**`である。
    
-   2バイト目：`**0x01**`。これは、ADタイプが "フラグ "であることを示す。
    
-   最後のバイトは、これらのフラグを表す。これらのフラグは、発信デバイスが「Li
    
    バイトは以下のように計算される：
    

5つのフラグはバイトの最初の5ビットで表される。これらのビットの値は、フラグがONかOFFかを定義する。この2進数は16進数として書かれ、広告に使われる。例で説明しよう：

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

結果として、2進数は`**b00011010と**`なる。16進数に変換すると`**0x1A**`。以下のログを参照のこと。

最初のAD構造は以上である！では、必要な情報のほとんどを含む2つ目のAD構造を見てみよう。

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

つ目のAD構造体
--------

つ目の構造体は、プロトコルによって異なるサイズになります。ここでは[AltBeaconを](https://altbeacon.org/)例にとりますが、他のプロトコルとほぼ同じです。

-   最初のバイトは`**0x1B**`（16進数で27）であり、これは31バイトのスキャン・レスポンスの最後の利用可能なバイトをすべて取っていることを意味する。これはプロトコルによって異なる場合がある。
    
-   次のバイトは常に`**0xFF**`であり、これは "Manufacturer Specific "タイプのAD構造を持っていることを意味する。
    
-   その結果、次の2バイトは、Bluetooth.orgで定義されている会社識別子を表します。
    
    [で定義されている会社識別子を表します。](https://www.bluetooth.com/specifications/assigned-numbers/company-Identifiers/)
    
    .私たちのNexus 9デバイスの場合、ブルートゥース・チップの製造元はあまり明確ではないので、Googleの製造元ID（224）を使って簡略化します。16進数では0x00E0に相当する。IDはリトルエンディアンで書かれ、2バイトを占める。ここでは、`**0x0E0 0x00の**`順になる。
    
-   残りはメーカー固有のデータである！これはプロトコルによって最も変わる部分です。
    

AltBeaconプロトコルの場合、メーカー固有データの最初の2バイトは`**0xBE 0xACで**`、altbeacon ADを識別します。個人的には、ビーコンの最初の4文字を使うことにしたのがとても気に入っている！覚えやすい。次の16バイトは広告主の組織単位を表すUUIDで、次の4バイトは好きなように細分化できる。iBeaconのメジャーとマイナーに似た、2バイトの長い数字を用意する。次のバイトはハードウェアに応じて設定する必要があり、最後のバイトは0のままでもいいし、好きな意味を持たせることもできる。

このバイトはハードウェアによって異なりますが、あなたのデバイスから1メートル離れたところでの信号の強さを表します。dB単位の値の2の補数です。強度の値は多くの要因に依存するため、あまり正確ではないことが多い。私のNexus 9の場合、-75dBが正しい推定値のようです。つまり、2の補数は`**-75 + 256 = 181と**`なり、16進数では`**0xB5と**`なる。

ビーコンまでの距離の計算
------------

ビーコン・プロトコルの大きな長所の1つは、発信しているデバイスとの距離の概算値を教えてくれることです。

これは、ビーコン・スキャン・レスポンスとともに送信される基準RSSIと、携帯電話が検出するRSSIを比較することで達成されます。この値を計算するアルゴリズムは、多くの場合、ビーコン・プロトコルの所有者（EstimoteまたはiBeacon）のプロパティです。しかし、[AltBeaconは](https://altbeacon.org/)オープンソースのプロジェクトであるため、[ここでは](https://github.com/AltBeacon/android-beacon-library)彼らのアルゴリズムを使用します。

サンプルコードでは、このアルゴリズムを使って距離を計算する。使用するプロトコルに関係なく、距離の計算値は信頼性が低く、ユーザーの正確な位置を検出するために使用できないことに注意してください。ビーコンの制限については、[Appleのドキュメントに](https://developer.apple.com/ibeacon/Getting-Started-with-iBeacon.pdf)詳しい情報がある。

ビーコン用Android BLEパッケージの使用
------------------------

AndroidデバイスでBluetoothを使用するには、まずAndroid Manifestにパーミッションを追加する必要があります：

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

このパッケージの核心は、ハードウェアへのアクセスを許可するツールであるBluetooth Adapterにあります。例えば、Android 12.0に見られるように、onCreateメソッドに追加します：

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

これだけです。ビーコンのスキャンと発信について、より具体的に説明しましょう。Android BLEパッケージを使用する場合、最初のAD構造体は自動的に読み込まれるか作成されることに注意してください。ここでは、2 番目の AD 構造に焦点を当てます。特筆すべきは、SDKが自動的にメーカー固有のデータ構造を識別または作成するため、サイズとデータタイプを定義する最初の2バイトを編集する必要がないことです。企業IDも自動的に編集され、IDの10進値のみが必要となります。これにより、プロセスが大幅に簡素化される。

### Androidでビーコンをスキャンする

このプロセスを開始するには、Bluetooth LEスキャナーをインスタンス化する必要があります：

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

Androidのパッケージは、ユーザーがフィルタを作成することを可能にし、我々のフィルタに一致するビーコンの検出を可能にします。altBeaconを検出するには、まずスキャン・フィルターを作成する必要があります。サイズ24のバイト配列を作成する。最初の2バイトがaltBeacon識別子のプレフィックスになる： \`\*\*0xBE 0xAC\*\*\`.検出したいビーコンのUUIDを16バイト入れる。残りのバイトはゼロのままでよい。

サイズ24の別の配列を構築し、インデックス0から17までの1つと、残りの1つにゼロを入れる。これは、最初の18バイトのみが必須であり、スキャナは、私たちのManufacturerデータの先頭のみに一致するスキャンレコードの結果を生成する必要があることを示しています。

### Androidを発信（パブリッシャー）ビーコンにする

Bluetooth LE Advertiser をインスタンス化することから始めます：

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

データを構築するには、アドバタイズ・データ・ビルダーを使用します。同様に、AltBeaconプレフィックス、UUID、メジャー、マイナー、およびTXパワーを含むバイトの配列を作成します。これが完了すれば、ビーコンの作成は成功です！

### まとめ

ビーコンが発する信号、ビーコンまでの距離の計算、Androidデバイスでビーコンをスキャンする方法を調べました。この知識があれば、Android 12.0を使って新しいAndroid BLEパッケージを作成できます。

次に、[ビーコン検出器を構築](https://www.pubnub.com/blog/tessel-ibeacon-tutorial-building-the-detector-data-beacon-subscriber/)する方法を詳しく説明します。次に[エミッターの](https://www.pubnub.com/blog/build-android-ibeacon-beacon-emitter/)作り方を説明します。

PubNubはどのようにあなたのお役に立てるでしょうか？
============================

この記事は[PubNub.comに](https://www.pubnub.com/blog/building-android-beacon-android-ibeacon-tutorial-overview/)掲載されたものです。

PubNubのプラットフォームは、開発者がWebアプリ、モバイルアプリ、IoTデバイス向けにリアルタイムのインタラクティブ機能を構築、提供、管理できるように支援します。

私たちのプラットフォームの基盤は、業界最大かつ最もスケーラブルなリアルタイムエッジメッセージングネットワークです。世界15か所以上で8億人の月間アクティブユーザーをサポートし、99.999%の信頼性を誇るため、停電や同時実行数の制限、トラフィックの急増による遅延の問題を心配する必要はありません。

PubNubを体験
---------

[ライブツアーを](https://www.pubnub.com/tour/introduction/)チェックして、5分以内にすべてのPubNub搭載アプリの背後にある本質的な概念を理解する

セットアップ
------

[PubNubアカウントに](https://admin.pubnub.com/signup/)サインアップすると、PubNubキーに無料ですぐにアクセスできます。

始める
---

[PubNubのドキュメントは](https://www.pubnub.com/docs)、ユースケースや[SDKに](https://www.pubnub.com/docs)関係なく、あなたを立ち上げ、実行することができます。