[Android 5.0] BLE ペリフェラル側のアドバタジング発信

こんにちは、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を実装しなければいけないのですが次回の記事でそのへんを記載します。

 

KID.A

KID.A の紹介

楽して生きることと一発逆転を夢見ている、ちゃきちゃきのAndroiderです。 いろいろアプリを出しているのですが、いつもリリース後にターゲットユーザ数を2桁見誤っていたことに気付くので、残念でなりません。下方修正で、ヒットがでません。おしいです。 明日から本気出します。 よろしくお願いします。
カテゴリー: Android タグ: , , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です