こんにちは、KID.Aです。
今更ながらですが、5.0からの追加されたBLEのペリフェラル側の実装を記載します。
BLEのペリフェラルはアドバタイジングパケットを発信できます。
今回はアドバタイジグパケットの発信までを実装します。
ちなみにAndroidのセントラル側の実装は過去の記事に記載しています。
アドバタイジングパケットを発信するためにはBluetoothLeAdvertiserが必要です。
・開発サイトのURL
http://developer.android.com/intl/ja/reference/android/bluetooth/le/BluetoothLeAdvertiser.html
では実装の手順、説明をしていきます。
1.AndroidManifest.xmlに以下を追加します
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
2.アドバタイジングの実装を行います
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothManager; import android.bluetooth.le.AdvertiseCallback; import android.bluetooth.le.AdvertiseData; import android.bluetooth.le.AdvertiseSettings; import android.bluetooth.le.BluetoothLeAdvertiser; import android.content.Context; import android.os.Bundle; import android.os.ParcelUuid; import android.support.v7.app.AppCompatActivity; import java.util.UUID; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); BluetoothManager manager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); BluetoothAdapter adapter = manager.getAdapter(); BluetoothLeAdvertiser advertiser = adapter.getBluetoothLeAdvertiser(); // 設定 AdvertiseSettings.Builder settingBuilder = new AdvertiseSettings.Builder(); settingBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_POWER); settingBuilder.setConnectable(false); settingBuilder.setTimeout(0); settingBuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_LOW); AdvertiseSettings settings = settingBuilder.build(); // アドバタイジングデータ AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder(); dataBuilder.addServiceUuid(new ParcelUuid(UUID.fromString("65432461-1EFE-4ADB-BC7E-9F7F8E27FDC1"))); AdvertiseData advertiseData = dataBuilder.build(); //アドバタイズを開始 advertiser.startAdvertising(settings, advertiseData, new AdvertiseCallback() { @Override public void onStartSuccess(AdvertiseSettings settingsInEffect) { super.onStartSuccess(settingsInEffect); } @Override public void onStartFailure(int errorCode) { super.onStartFailure(errorCode); } }); } }
説明のため構造をシンプルにしたかったので、MainActivityのonCreateに直接記載しています。
アプリを起動したらアドバタイジングパケットを発信するという作りになっています。
アドバタイジングを始める際にはBluetoothLeAdvertiser#startAdvertisingを呼ぶ必要があります。そのためにはまずはBluetoothManagerからBluetoothAdapterを取得して、さらにBluetoothAdapterからBluetoothLeAdvertiserを取得します。
次にBluetoothLeAdvertiser#startAdvertisingする際のデータを用意します。
BluetoothLeAdvertiser#startAdvertisingの引数は最小で3つあります。
1つめ
AdvertiseSettingsです。これはAdvertiseSettings.Builderを使って作ります。
AdvertiseSettings.Builderで設定できるものは以下の通りです。
メソッド名 | 説明 |
---|---|
setAdvertiseMode | アドバタイジングモードでコントロールする発信電力とレイテンシを設定できます |
setConnectable | アドバタイジングの種類を接続か非接続か選択できます。 |
setTimeout | アドバタイジングする時間を制限できます。0の場合は制限しません。 |
setConnectable | TX電力パワーレベルを設定できます |
※今回のソースではアドバタイジングパケットを発信するだけのため、setConnectableにfalseを設定しています。
2つめ
AdvertiseDataになります。これはアドバタイジングする際に送るデータになります。これはAdvertiseData.Builderを使って作成します。
メソッド名 | 説明 |
---|---|
addManufacturerData | manufacturer specific dataを追加できます。 割り当てはBluetooth SIGが提供しているドキュメントを参考にします。以下のサイトに記載があります。 https://www.bluetooth.org/en-us/specification/assigned-numbers/company-identifiers |
addServiceData | アドバタジングデータのためのServiceUUIDと送信データを追加します |
addServiceUuid | アドバタジングデータのためのServiceUUIDを追加します。 |
3つめ
AdvertiseCallbackです。BluetoothLeAdvertiser#startAdvertisingした結果、成功すればonStartSuccessが呼ばれて、失敗すればonStartFailureが呼ばれます。
上記の3つをBluetoothLeAdvertiser#startAdvertisingに設定してコールするとアドバタイジングが開始します。
確認方法は、こちらの記事でセントラルの実装があります。
・Androidのセントラルの実装方法
AndroidとiOS間のデータのやりとりをBluetooth LEで行う
・iOSのセントラルの実装方法
[iOS] Bluetooth LEでデータのやりとり
3.アドバタイジングを停止します
停止する場合は、BluetoothLeAdvertiser#stopAdvertisingを呼びます。
引数にはAdvertiseCallbackが必要なります。こちらも停止した結果、成功すればonStartSuccessが呼ばれて、失敗すればonStartFailureが呼ばれます。
上記の実装でアドバタイジングパケットが発信、停止できます。
今回はアドバタイジングパケットを発信するまでしか記載していません。
アドバタジングで見つけたペリフェラルとデータ通信する場合はペリフェラル側にGattServerを実装しなければいけないのですが次回の記事でそのへんを記載します。