続いてserver側となるPeripehralの実装を行いたいと思います。

基本概念はこちらをClient側となるCentralの実装はこちら
参照してください。

必要なクラスの定義と初期化

Advertiseをスタートする

Advertiseは広告とか宣伝などの意味がありますが、AdvertiseをスタートしてそのAdvertiseをcentralが
キャッチして通信を開始するという流れになります。

advertiseを開始するのに BluetoothLeAdvertiser classを使用しますが、
対応していない端末があるので、有効化されているかをチェックします。

次に、gattServerに設定するためのservice、characteristic、descriptorの設定をします。

gattの意味がよくわからんかったのでwikiから引用します。

GATT(Generic Attribute Profile 汎用属性(アトリビュート)プロファイル)に定義されているのは、あるデバイスが保持しているデータ要素の検索方法や、書き込み・読み出し・プッシュをおこなうための基本的なデータモデル[25]を定義している。

では、gattServerがserviceを追加するところまで見ていきます。

1.characteristicの設定

BluetoothGattServiceクラスを生成します。
第1引数にcharacteristicをcentral側が検索できるようにuuidを設定し、第2引数に権限の設定をします。

Descriptorにも同じように必要な権限を与えてください

続いて、advertiseを開始するまでを見ていきます。

startAdvertising関数を呼ぶためにAdvertiseDataAdvertiseSettingsの設定をする必要があります。

AdvertiseDataの設定

AdvertiseDataには、serviceのuuidをセットするaddServiceUuid関数
TxPowerLevelをパケットに含めるかを設定する
setIncludeTxPowerLevel関数を呼んでいます。
この関数説明は以下の通りです。

Whether the transmission power level should be included in the advertise packet. Tx power level field takes 3 bytes in advertise packet.

他にも有用的な関数としてパケット内にdeviceの名前を含めるかどうかの設定をする
setIncludeDeviceName関数などがあります。

AdvertiseSettingsの設定

AdvertiseSettingsには、Advertiseを出力するパワーを設定します。
検証してはいませんが、高ければ、消費電力が強くなり
広範囲に飛ぶ(実際に記述にある)ということだと思います。

Advertiseの開始

startAdvertise関数により、Advertiseを開始することができます。
AdvertiseCallbackクラスにより結果を受け取ることができます。

では、advertiseを開始する全体のコードです。

続いて、central端末からの接続状況などを受け取るBluetoothGattServerCallback内の関数を見ていきます。

central端末の接続・切断を受け取れるのがcallback関数onConnectionChangeです。

ここでは、一定の間隔でcentral側にデータを送信するために、timerを開始し
central側にデータを送信し続けています。

他はUIを更新しています。UIThreadと同期させる必要があります。

centralから書き込みリクエストを受けての対応

centralからの書き込みリクエストはonCharacteristicWriteRequest関数で受け取ることができます。

centralで書き込んだcharacteristicの値はBluetoothGattCharacter内で参照することができます。
byteデータで返却されるので、String型を受け取るためには、以下のように書く方法があります。

また、centralからperipheral側で受信したかどうかを返却する設定をした場合、
responseNeededにtrueが入ってくるので、sendResponse関数を呼んで、
central側に受信されたことを伝えます。

だいたいperipehral・centralの受信送信に必要な機能はこんなところだろうと思います。

全体のコードはgithubに上げているのでこちらを参照してください。

androidios

Pocket