2015.03.30

Android 5.0におけるBLE について – 送信編 –


こんにちは。次世代システム研究室のT.M. です。前回の記事に引き続き、Android 5.0 におけるBLE (Bluetooth Low Energy) の実装方法について紹介していきます。

はじめに

Android 5.0 からはBLE の受信のための実装方法が変わっただけでなく、BLE をAdvertise することによりデータの送信が可能になりました。そこで、今回はBLE をAdvertise する方法について説明していきます。

BLE のためのパーミッション

BLE をAdvertise するためには、前回のScan 同様以下のパーミッションの宣言が必要です。
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

BLE Advertise のコールバック

BLE をAdvertise するためには、Advertise 開始の成否が返ってくるコールバックの実装が必要です。コールバックには、android.bluetooth.le.AdvertiseCallback クラスが用意されています。AdvertiseCallback では、onStartSuccess とonStartFailure の2つのメソッドを実装する必要があります。メソッド名の通り、Advertise の開始が成功したか、否かにより呼ばれるメソッドが分かれます。以下では、Advertise の開始が成功した場合ログにsuccess が、失敗した場合ログにエラーメッセージが表示されます。
	private AdvertiseCallback mAdvertiseCallback = new AdvertiseCallback() {

		@Override
		public void onStartSuccess(AdvertiseSettings settingsInEffect) {
			Log.d("Advertise result", "success");
		}

		@Override
		public void onStartFailure(int errorCode) {
			super.onStartFailure(errorCode);
			// Advertise失敗時に呼び出されます
			String errorMessage = "";
			switch (errorCode) {
			case ADVERTISE_FAILED_ALREADY_STARTED:
				errorMessage = "ADVERTISE_FAILED_ALREADY_STARTED";
				break;
			case ADVERTISE_FAILED_DATA_TOO_LARGE:
				errorMessage = "ADVERTISE_FAILED_DATA_TOO_LARGE";
				break;
			case ADVERTISE_FAILED_FEATURE_UNSUPPORTED:
				errorMessage = "ADVERTISE_FAILED_FEATURE_UNSUPPORTED";
				break;
			case ADVERTISE_FAILED_INTERNAL_ERROR:
				errorMessage = "ADVERTISE_FAILED_INTERNAL_ERROR";
				break;
			case ADVERTISE_FAILED_TOO_MANY_ADVERTISERS:
				errorMessage = "ADVERTISE_FAILED_TOO_MANY_ADVERTISERS";
				break;
			}
			Log.d("Advertise result", errorMessage);
		}
	};

BLE Advertise 設定

BLE のAdvertise 設定が必要です。AdvertiseSettings.Builder によって、Advertise の送信頻度およびパワーレベル、タイムアウト時間等を設定することができます。
  • 頻度設定
    setAdvertiseMode メソッドを利用することで、低消費電力モード (ADVERTISE_MODE_LOW_POWER) または、低遅延モード (ADVERTISE_MODE_LOW_LATENCY)、バランスモード (ADVERTISE_MODE_BALANCED) と設定することができ、送信頻度を変更することができます。
  • 出力設定
    setTxPowerLevel メソッドを利用することで、BLE の電波を超低出力 (ADVERTISE_TX_POWER_ULTRA_LOW)から低出力 (ADVERTISE_TX_POWER_LOW)、中出力 (ADVERTISE_TX_POWER_MEDIUM)、高出力 (ADVERTISE_TX_POWER_HIGH) まで変化させることができます。
  • タイムアウト設定
    setTimeout メソッドを利用することでAdvertise のタイムアウト時間を設定することができます。引数の単位はms で、最大値は18,000 です。また、引数が0 の場合、タイムアウトなし、となります。
以下は、バランスモードで超低出力かつタイムアウトが500 ms の場合の設定です。
AdvertiseSettings.Builder mAdvertiseSettingsBuilder = new AdvertiseSettings.Builder();
mAdvertiseSettingsBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED);
mAdvertiseSettingsBuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_ULTRA_LOW);
mAdvertiseSettingsBuilder.setTimeout(500);

BLE データ作成

BLE のAdvertise では、任意のデータを送ることができます。ただし、BLE のパケットはサイズが小さいため、送信できるデータサイズの上限は24 バイトです。AdvertiseData.Builder におけるaddManufacturerData メソッドを利用することで、BLE のAdvertise によって送るデータを設定します。addManufacturerData メソッドの一つ目の引数は、Manufacture ID であり、Bluetooth SIG によって企業ごとに割り当てられています。ちなみに、iBeacon のManufacture ID は76 であり、これはApple の企業ID です。二つ目の引数は、Manufacture Data であり、ここに送信したいデータをセットします。以下では、Manufacture ID が1 で、Manufacture Data を”abcdefghijklmnopqrstuvwx” の24 文字をセットしています。
AdvertiseData.Builder mAdvertiseDataBuilder = new AdvertiseData.Builder();
int manufactureId = 1;
String manufactureData_str = "abcdefghijklmnopqrstuvwx";
byte[] manufactureData_bytes = manufactureData_str.getBytes();
mAdvertiseDataBuilder.addManufacturerData(manufactureId, manufactureData_bytes);

BLE Advertise 開始

ここまで行ってきた設定を基にBLE のAdvertise を開始します。BluetoothAdapter におけるgetBluetoothLeAdvertiser メソッドを利用して、BluetoothLeAdvertiser を用意し、startAdvertising メソッドに上記で用意した設定を引数に持たせることで、Advertise を開始することができます。
BluetoothLeAdvertiser mBluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();
mBluetoothLeAdvertiser.startAdvertising(mAdvertiseSettingsBuilder.build(), mAdvertiseDataBuilder.build(), mAdvertiseCallback);

さいごに

今回説明したように実装することで、BLE を利用してデータを送信することができました。24 バイトという制約がありますが、BLE のAdvertise の機能により物理的に近い端末へデータを容易に送ることができるようになりました。
今回の検証では、BLE Advertise 可能な端末が一台しか用意できなかったため、一台がBLE Advertise をして、BLE Advertise 非対応のAndroid 4.4 端末でBLE Scan を行いました。つまり、Advertise しながらScan をして、正常にデータを送受信するという検証ができませんでしたの。今後は二台の端末による送受信の検証を行いたいと思います。また、一部機能が理解できないオプションがありましたので、BLE について調査を含め理解をする必要があります。

参考




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

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