2015.09.16

Eddystone ビーコンへのデータ登録・取得方法の紹介


こんにちは。次世代システム研究室のT.M. です。

先日、Google からEddystone という新しいBLE の規格が発表されました。Eddystone の機能のひとつに、ビーコンに紐付けたデータをそのビーコンの電波を受け取った端末が取得する、というものがあります。この記事では、Eddystone のクラウドへのビーコン情報登録およびそのビーコンに紐付いたデータの取得方法について説明します。


1. Eddystone の作成

Eddystone に情報を登録するためには、当然ながらEddystone が必要です。GitHub にEddystone の規格に応じたBLE の電波を発信するサンプルプログラムがありますので、それを用いることで容易にEddystone を試すことができます。

サンプルの実行方法は以下の通りです。
  1. ソースコードをclone する
    git clone git@github.com:google/eddystone.git
  2. Android Studio でeddystone\eddystone-uid\tools\txeddystone-uid\TxEddystone-UID のプロジェクトを開く
  3. 実行する

アプリを実行すると以下のように表示されるので、サービス固有のnamespace ID および端末を識別するinstance ID を設定しEddystone の電波を発信することができます。ただし、今回はサンプルであるため、RND をタップし、ランダムな値を設定します。

2. Eddystone の登録

Eddystone をクラウド上に登録するためには、Proximity Beacon API というものを利用します。これもまたGitHub にサンプルプログラムがありますので、それを用いることでEddystone を登録することができます。

サンプルの実行方法は以下の通りです。
  • Proximity Beacon API のactivate およびアプリの登録
    1. Google Developers Console へアクセス
    2. プロジェクトの作成
    3. APIs & auth → API でProximity Beacon API を検索
    4. Enable API
    5. APIs & auth -> Credentials で認証情報を追加
    6. OAuth 2.0 client ID を選択
    7. Android を選択し、Create をクリックする
    8. アプリのfingerprint を登録する
      keytool -exportcert -alias androiddebugkey -keystore debug.keystore -list -v
    9. Create をクリックする
  • サンプルの実行
    1. ソースコードをclone する
      git clone git@github.com:google/beacon-platform.git
    2. Android Studio でbeacon-platform\samples\android\BeaconServiceDemoApp のプロジェクトを開く
    3. 実行する

アプリを実行すると以下のように表示されるので、SCAN をタップすることで、周辺のEddystone を検索することができます。

ビーコンのステータスに応じたアイコンがついてリスト表示がされますので、登録したいビーコンをタップします。

ビーコン登録画面で、緯度経度などパラメータを登録します。

REGISTER をタップすることで、ビーコンを登録できます。

ビーコンを登録すると次はビーコンに紐付けるデータを登録することができます。Type とData に値を入れて、+ をタップします。

これでビーコンのデータを登録が完了することをできました。

3. Eddystone に紐付いたデータ取得

Eddystone に紐付いて登録された情報を取得するためには、Nearby Message API というものを利用します。これは、GitHub にサンプルがありませんので、サンプルを作成する必要があります。

サンプルの作成方法は以下の通りです。

  • Nearby Message API のactivate およびアプリの登録
    1. APIs & auth → API でNearby Message API を検索
    2. Enable API
    3. APIs & auth → Credentials で認証情報を追加
    4. API key を選択
    5. Android key を選択
    6. アプリのfingerprint を登録する
      keytool -exportcert -alias androiddebugkey -keystore debug.keystore -list -v
    7. Create をクリックする
  • サンプルプロジェクトの作成
    1. Android Studio でプロジェクトの作成
    2. Google Play Service の追加
      dependencies {
          compile 'com.google.android.gms:play-services:7.8.0'
      }
      
    3. Android Manifest にAPI key を記述
      <application ...>
          <meta-data
              android:name="com.google.android.nearby.messages.API_KEY"
              android:value="SPECIFY_APPLICATION_API_KEY_HERE" />
          <activity>
          ...
          </activity>
      </application>
      
  • ビーコンのデータ取得
    1. Google API への接続
      Google API Client を作成し、接続します。接続成功時のコールバックは次に記述します。
      protected void onCreate(Bundle savedInstanceState) {
              ....
              mGoogleApiClient = new GoogleApiClient.Builder(this)
                              .addApi(Nearby.MESSAGES_API)
                              .addConnectionCallbacks(mConnectionCallbacks)
                              .build();
              if (!mGoogleApiClient.isConnected()) {
                  mGoogleApiClient.connect();
              }
      }
      
    2. Google API のコールバック作成
      Google API の接続が成功した時に呼ばれるコールバックを作成します。接続成功時、Nearby Messages API のパーミッションを確認します。パーミッション確認のコールバックは次に記述します。
      GoogleApiClient.ConnectionCallbacks mConnectionCallbacks = new GoogleApiClient.ConnectionCallbacks() {
              @Override
              public void onConnected(Bundle bundle) {
                  Nearby.Messages.getPermissionStatus(mGoogleApiClient)
                          .setResultCallback(mResultCallback);
              }
      
              @Override
              public void onConnectionSuspended(int i) {
      
              }
          };
      
    3. Nearby Messages API のパーミッション確認コールバック作成
      パーミッションのステータスがsuccess の場合、Message をsubscribe します。Eddystone ビーコンのデータを取得するためには、Strategy.BLE_ONLY が必要です。Message のリスナは次に記述します。また、ステータスがsuccess でない場合、ユーザにパーミッションを求めます。
      ResultCallback<Status> mResultCallback = new ResultCallback<Status>() {
              @Override
              public void onResult(Status status) {
                  if (status.isSuccess()) {
                      Nearby.Messages.subscribe(mGoogleApiClient, mMessageListener, Strategy.BLE_ONLY);
                  } else {
                      try {
                          status.startResolutionForResult(MainActivity.this, 12345);
                      } catch (IntentSender.SendIntentException e) {
                          e.printStackTrace();
                      }
                  }
              }
          };
      
    4. Message のリスナ作成
      ビーコンから取得したデータをログに出力します。
          MessageListener mMessageListener = new MessageListener() {
              @Override
              public void onFound(Message message) {
                  try {
                      Log.d("Type=", message.getType());
                      Log.d("Data=", new String(message.getContent(), "UTF-8"));
                  } catch (UnsupportedEncodingException e) {
                      e.printStackTrace();
                  }
              }
          };
      
    5. ログの確認
      アプリケーションのログを見て、Eddystone に紐付けたデータを取得できているかを確認します。
      09-14 11:39:51.718    4989-5007/jp.gmo.itsolab.nearbysample D/Type=﹕ sTYPE
      09-14 11:39:51.718    4989-5007/jp.gmo.itsolab.nearbysample D/Data=﹕ sDATA
      

さいごに

Eddystone と同じくBLE の規格のひとつであるiBeacon でも、似たようなことを行うことができます。しかし、Eddystone はiBeacon とは異なり、Android/iOS の両方に対応しており、開発が容易になっている点が優れています。また、先日のGoogle のEddystone の発表では、これは特徴のひとつであり、他にURL を発信するビーコンやNearby Messages API を利用した端末間通信などもありました。これらの機能もまた、興味深いものであり、調査および利用法を考えていきたいと思います。



参考




次世代システム研究室では、アプリケーション開発や設計を行うアーキテクトを募集しています。アプリケーション開発者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。

皆さんのご応募をお待ちしています。