Nearby Messages APIとEddystoneを連携する

過去の記事でEddystoneとNearby Messages APIについてそれぞれ触れてきました。今回はNearby Messages APIとEddystoneを連携して使うところに挑戦してみます。

【参考】

- [Google発のBeacon用オープンフォーマットEddystoneをAndroidで触ってみた - Qiita](http://qiita.com/chibatching/items/0cb0eaad42607a4f5754)
- [Android - Nearby Messages APIでチャットみたいなのを作ってみる - Qiita](http://qiita.com/chibatching/items/73d4234bb0ac742260c4)
 - [chibatching/NearbySample](https://github.com/chibatching/NearbySample)

## 連携の流れ

EddystoneとNearby Messages APIを連携させるとき、Eddystoneから直接データを渡すのではなくAPIを介して連携を行います。
流れとしてはざっくりと下記のようになります。

1. Proximity Beacon APIを有効にする
2. Proximity Beacon APIにBeacon (Eddystone)を登録する
3. Proximity Beacon APIでBeaconと情報を紐付ける
3. Nearby Messages APIでEddystoneのUIDを受信する
4. Nearby Messages APIがProximity Beacon APIで登録した情報を取得する


## Proximity Beacon APIを有効にする

Nearby Messages APIの時のように[Google Developers Console](https://console.developers.google.com/)から登録が必要です。

1. [Google Developers Console](https://console.developers.google.com/)にアクセス
2. 前回Nearby Messages APIを有効にしたプロジェクトを選択する
3. サイドメニューの`APIと認証 > API`をクリック
4. 検索窓に`Google Proximity Beacon API `と入力して出てきたものを選択、`APIを有効にする`ボタンをクリック
5. サイドメニューから`認証情報`をクリックして必要な認証情報を登録する。  
認証情報の登録については次で説明します。

### Beacon登録用アプリを設定する

Eddystoneとの連携にはProximity Beacon APIを使ってBeacon情報を登録する必要があります。今回はBeaconを登録するためにGoogleがサンプルとして用意しているAndroidアプリを使います。

#### Beacon登録用アプリの準備

GitHubからGoogleのサンプルアプリをクローンして使います。
AndroidとiOS両方ありますが今回はAndroidアプリを使います。

- GitHub: [google/beacon-platform](https://github.com/google/beacon-platform)

#### Beacon登録用アプリの認証情報設定

登録APIを使うために認証情報を設定します。
必要な情報は「パッケージ名」と「証明書のフィンガープリント(SHA-1)」の2つです。

パッケージ名はサンプルアプリをそのまま使うので`com.google.sample.beaconservice`です。
証明書のSHA-1はアプリの署名に使うkeystoreに対して下記のコマンドを実行して確認します。debug.keystoreでも構いません。

```
keytool -list -v -keystore mystore.keystore
```

確認したら早速登録します。

1. サイドメニューから`認証情報`をクリック
2. `認証情報を追加 > APIキー`をクリック
3. 必要な情報を入力して`保存`をクリック
4. `認証情報を追加 > OAuth 2.0 クライアントID`をクリック
5. 必要な情報を入力して`作成`をクリック

これでサンプルアプリからBeaconの情報を登録できるようになるはずです。

## Beaconを登録する

Beaconを登録する準備ができたので、実際の登録を行っていきます。
残念ながらEddystoneの実機を持っていないので[以前の記事](http://qiita.com/chibatching/items/0cb0eaad42607a4f5754)でも使用したGoogleの[Eddystoneサンプルアプリ](https://github.com/google/eddystone)（[TxEddystone-UI](https://github.com/google/eddystone/tree/master/eddystone-uid/tools/txeddystone-uid)）を使います。

1. TxEddystone-UIをビルドして起動した状態でブロードキャストを開始
2. Beacon登録アプリ（Beacon Service Demo App）を起動してAPIの認証情報を設定したアカウントを選択
3. Beacon Service Demo Appの`SCAN`ボタンをクリック
4. 表示されたBeaconのUIDを選択、情報を編集して`REGISTER`をクリックして登録

しかし、TxEddystone-UIを起動した直後の状態では`Not Authorized`と表示されてしまいます。

![tx1.png](https://qiita-image-store.s3.amazonaws.com/0/53706/7a642bc2-5384-8c09-8401-b81401f43750.png)![Screenshot_2015-08-30-06-50-00.png](https://qiita-image-store.s3.amazonaws.com/0/53706/2c43c743-a7a6-27b1-2a3a-e188e80bfd59.png)![Screenshot_2015-08-30-06-50-04.png](https://qiita-image-store.s3.amazonaws.com/0/53706/91f2c37c-060c-1e74-b06c-3f1263e444c7.png)


これは、このUIDがすでに他の人によって登録されており、自分に情報の編集権限が無いということです。
したがって、実際の登録を行うには`RND`ボタンを適当にクリックして他の人がまだ登録していないUIDを見つける必要があります。

未登録UIDの場合、一覧には鍵が開いたアイコンで表示されます。選択するとまだ登録されていないため404となりますが問題ありません。

![Screenshot_2015-08-30-07-13-05.png](https://qiita-image-store.s3.amazonaws.com/0/53706/62039d40-6f1c-05f0-a27f-ca5ed676aa73.png)![Screenshot_2015-08-30-07-14-06.png](https://qiita-image-store.s3.amazonaws.com/0/53706/f6f107e2-3427-a5d9-1b06-4fa952d6de4e.png)

いろいろと情報を入力して`REGISTER`をクリックして登録に成功するとStatusがACTIVEになります。

![Screenshot_2015-08-30-07-15-21.png](https://qiita-image-store.s3.amazonaws.com/0/53706/b57b8142-2ed4-b97c-b65b-eb21d9f41fe1.png)

Nearby Messages APIでメッセージとして受け取れるデータはAttachmentとして登録された情報になります。
今回は[前回の記事](http://qiita.com/chibatching/items/73d4234bb0ac742260c4)で作ったチャット風アプリでメッセージを受信するために、DataにチャットメッセージのJSONを入れておきます。

```
{
	"id":"00000000-aaaa-bbbb-cccc-dddddddddddd",
	"text":"Sample beacon is near you!",
	"timestamp":0,
	"type":"beacon-message"
}
```

長くなりましたがこれでBeacon（Eddystone）の準備が完了です。

## Nearby Messages APIでEddystoneをハンドリング

基本的に[前回の記事](http://qiita.com/chibatching/items/73d4234bb0ac742260c4)で作ったものそのまま、特別な処理を入れなくてもEddystoneに紐付けられたメッセージを受信することが出来てしまいます。
TxEddystone-UIでブロードキャストを開始、Eddystoneの信号を検知すると`MessageListener#onFound`が呼ばれてメッセージが表示されるはずです。

```
D/MainActivity﹕ onFound: Message{namespace='nearby-sample', type='beacon-message', content=[119 bytes]}
```

![Screenshot_2015-08-30-11-39-11.png](https://qiita-image-store.s3.amazonaws.com/0/53706/56b99e6b-ec5b-f8c4-ce77-996ff3016885.png)

## まとめ

EddystoneとNearby Messages APIを連携するためには、Proximity Beacon APIを使用してBeacon情報を登録する必要があります。しかし、Eddystoneに紐付くメッセージの受信自体はNearby Messages APIのみで非常に簡単に行えるため汎用性は高そうです。
ただ、Beacon登録時に付与した位置情報などの情報は別途Proximity Beacon APIで取得する必要があるのでその辺りの情報が必要な場合は手間がかかります。