【iPhone・Androidアプリ】AndroidでiPhoneのiBeacon信号を受信してみたよ【Bluetooth Low Energy】


最近よく話題を聞くiBeaconというものがありますね。
(iBeaconって何?という人はこの辺りをご参照を)
お店などに設置してあるビーコン端末の信号を受信してアレコレやるって奴です。

今回はiPhoneをビーコン端末化にして、
その信号をAndroidで受信してみるということをやってみました。






iBeacon端末は
iBeacon端末
↑こういう感じのデバイスです。
(写真はestimote社のiBeaconデバイスです)

欲しい、と思っても個人では若干敷居が高いですね。

しかし調べてみるとiOSのCore Locationフレームワークを利用すれば、
iPhoneをiBeaconの受信側だけでなく受信側にもできるみたいです、iPhoneすごい。

さっそくビーコン信号の受信と送信をやってみよう、と思ったものの、
うちにはiPhoneが一台しか無いため不可能…(ヽ'ω`)

と思ったのですが、

iOS - AndroidでiBeacon信号を受信してみよう by @KazuyukiEguchi on @Qiita

Qiitaでこんな記事を発見。
AndroidでもiBeacon信号を受信できるみたいです。
(しかし、BLE対応端末のみです)

という訳で、
うちにあるiPhone5Sをビーコン端末にして
Nexus7でビーコン信号を受信してみました。

iPhoneをビーコン端末にするアプリを作成


参考にさせて頂いたサイト様
(http://www.gaprot.jp/pickup/ios7/vol2/)

・GitHub
github.com/ouka-tenshi/iBeaconSample

プロジェクトにCoreBluetoothCoreLocationのフレームワークの追加が必要です。

【iPhone・Androidアプリ】AndroidでiPhoneのiBeacon信号を受信してみたよ【Bluetooth Low Energy】 スクリーンショット

iBeaconを利用する際にはUUIDが必要となるため、
Macでコンソールを開き以下のコマンドで生成をします。
$ uuidgen



CoreBluetoothフレームワークのCBPeripheralManagerと
CoreLocationフレームワークのCLBeaconRegionを利用してアドバタイズを開始します。

アプリを実行させて、
以下のような通知が出ていればiPhoneのビーコン端末化は成功です。
【iPhone・Androidアプリ】AndroidでiPhoneのiBeacon信号を受信してみたよ【Bluetooth Low Energy】 iPhoneをビーコン端末化 スクリーンショット

Androidでビーコン信号を受信するアプリを作成


次はAndroidの方ですね、Eclipseを起動してアプリを作成します。

参考にさせて頂いたサイト様
(http://qiita.com/KazuyukiEguchi/items/2f6c439ae8faeb06d23f)

・GitHub
github.com/ouka-tenshi/iBeaconReceiveSample

プロジェクトを作成する際、
AndroidManifest.xmlにBluetoothを利用するための権限を追加が必要です。
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>



ビーコン端末のスキャンをする為の準備として
BluetoothManagerクラスとBluetoothAdapterクラスを利用します。

final BluetoothManager bluetoothManager =  (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();



あとは任意のタイミングでmBluetoothAdapterのstopLeScan関数を利用して
Bluetooth端末のスキャンをするだけです。

サンプルではボタンを押したタイミングでスキャンを開始するようにしています。
また、スキャンをずっとしたままだと電池を消費が激しいので、
10秒立ったらスキャンを停止するようにしています。

Button btn = (Button)findViewById(R.id.button1);
btn.setOnClickListener( new OnClickListener() {
	
	@Override
	public void onClick(View v) {
	    mHandler.postDelayed(new Runnable() {
	        @Override
	        public void run() {
	            // タイムアウト
	        	Log.d(TAG, "タイムアウト");
	            mBluetoothAdapter.stopLeScan(mLeScanCallback);
	        }
	    }, SCAN_PERIOD);
	 
	    // スキャン開始
	    mBluetoothAdapter.startLeScan(mLeScanCallback);
	}
} );



上記はiBeacon端末だけでなく、全てのBLE端末を検索を行う処理のようです。
端末が見つかるとコールバック関数が呼び出されます。
その関数内でビーコン端末のUUIDとmajor,minorの情報を調べます。

private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
    @Override
    public void onLeScan(final BluetoothDevice device, int rssi,byte[] scanRecord) {
         Log.d(TAG, "receive!!!");
         getScanData(scanRecord);
         Log.d(TAG, "device name:"+device.getName() );
         Log.d(TAG, "device address:"+device.getAddress() );
    }
    
};



private void getScanData( byte[] scanRecord ){
	if(scanRecord.length > 30)
	{
	    if((scanRecord[5] == (byte)0x4c) && (scanRecord[6] == (byte)0x00) &&
	       (scanRecord[7] == (byte)0x02) && (scanRecord[8] == (byte)0x15))
	    {
	            String uuid = Integer.toHexString(scanRecord[9] & 0xff) 
	            + Integer.toHexString(scanRecord[10] & 0xff)
	            + Integer.toHexString(scanRecord[11] & 0xff)
	            + Integer.toHexString(scanRecord[12] & 0xff)
	            + "-"
	            + Integer.toHexString(scanRecord[13] & 0xff)
	            + Integer.toHexString(scanRecord[14] & 0xff)
	            + "-"
	            + Integer.toHexString(scanRecord[15] & 0xff)
	            + Integer.toHexString(scanRecord[16] & 0xff)
	            + "-"
	            + Integer.toHexString(scanRecord[17] & 0xff)
	            + Integer.toHexString(scanRecord[18] & 0xff)
	            + "-"
	            + Integer.toHexString(scanRecord[19] & 0xff)
	            + Integer.toHexString(scanRecord[20] & 0xff)
	            + Integer.toHexString(scanRecord[21] & 0xff)
	            + Integer.toHexString(scanRecord[22] & 0xff)
	            + Integer.toHexString(scanRecord[23] & 0xff)
	            + Integer.toHexString(scanRecord[24] & 0xff);

	            String major = Integer.toHexString(scanRecord[25] & 0xff) + Integer.toHexString(scanRecord[26] & 0xff);
	            String minor = Integer.toHexString(scanRecord[27] & 0xff) + Integer.toHexString(scanRecord[28] & 0xff);
	            
	            Log.d(TAG, "UUID:"+uuid );
	            Log.d(TAG, "major:"+major );
	            Log.d(TAG, "minor:"+minor );
	        }
	}
}






【実行結果】
【iPhone・Androidアプリ】AndroidでiPhoneのiBeacon信号を受信してみたよ【Bluetooth Low Energy】 iBeacon信号受信結果 スクリーンショット

なんとか無事(?)にiPhone側で設定したUUIDが取得できました。
(majorとminorは未設定のため0になっています)

iBeaconは個人的に面白そうだなあと思っている技術なので、
日本でも、もっともっと注目されて流行って欲しいですね

流行ったら流行ったでNCFが駆逐されてしまいそうな予感がしますが…


       |
       |
 : : :::::::,. -─´、て
::: :: :::Σco===、!,_
: : :: :::::l´i(ノリハノリ)  まだBLEを使えるAndroid端末がほとんどないのでAndroid側も頑張って欲しい…
 : : :::::ルlリ⊃⊂ヽ    iPhoneは4Sから使えるのに…
 : : ::::(( //xxxxヽ、─────────────────
    /~~~
  ./


関連記事

コメントは受け付けていません。