android(os 5.0以上)でcentral側の実装をして見たいと思います。

centralとはclientに該当し、peripheral(server)に接続して、
peripheralに接続された他の端末のデータをperipheralから受信したり、
peripheralに自信のデータを送信する役割を担います。

機能としては、ios・android側のperipheral端末に接続し、
データのやりとりをできるようにしたいと思います。

まずは、BluetoothLEを使うための部品をOnCreateでinstance化します。

続いて、advertiseと呼ばれるperipheralが発信している信号をcentral側が検索するコードです。

1.端末設定でbluetoothが有効になっているかどうかを確認してください。

2.BluetoothLeを使うためのScannerはos5.0以上でないと対応していません。

peripheral端末を探索する

探索端末のフィルタリング

peripehral端末はScanFilterクラスを使うことでフィルターをかけてscanをすることができます。
ここでは、ServiceUuidに対してフィルターをかけています。

ScanModeの設定

Scanする際に、処理にどれだけパワーを割り当てるのかをScanSettingsクラスを使用して設定する必要があります。
ここでは、一般的にSCAN_MODE_BALANCEDを割り当てれば問題ないようです。

deviceのscanを行う

探索を行うには、BluetoothLeScannerクラスのstartScan関数を呼びます。
引数として、接続結果を受け取るためのscanCallBack関数などをセットします。

os6.o以上の対応

以下にあるようにstartScan関数を使うためには、
ACCESS_COARSE_LOCATIONまたはACCESS_FINE_LOCATION
の許可が必要になります。

以上をふまえてのサンプルコードです。

scan結果を踏まえてperipheral deviceに接続する

scanCallBack関数のonScanResult関数に探索した結果が返却されます。
今回はフィルタをかけたので、引数callbackTypeにフィルタ結果が返ってきます。
定数は公式サイトを参照してください。

peripheral deviceに接続する

ScanResultクラス内で接続されたBluetoothDeviceクラスを参照することができるので、
connectGatt関数を使用してperiperalデバイスに接続を試みます。
返り値にBluetoothGattクラスが返却されるので、これを受け取り、
stopScan関数でscanを停止します。

BluetoothGattCallBack関数

BluetoothGattCallBack関数にpeiephralとの接続状況などが返ってきます。

接続状態を知らせるonConnectionStateChange関数内で、
データの送信量を増やすためにrequestMtu関数を呼びます。

requestMtuの結果もBluetoothGattCallBack関数として定義されています。

接続データ量の拡張に成功したら、discoverServices関数を呼び、
serviceを探索します。
この結果はonServicesDiscovered関数としてBluetoothGattCallBack内に定義されています。

onServiecesDiscovered関数内で、
peripheral側でサービスなどに指定したUnique Idがマッチしているのかチェックし、
peripehral側からのメッセージを受け取れるようにNotificationをリクエストします。

その際に、BluetoothGattDesciptorを使用します。

BluetoothGattDesciptorクラス

Desciptorという単語は知らなかったのですが、日本語でいうと記述子にあたり、
記述子はファイルの構造や内容の要約、ファイルの属性
を意味するようです。

公式サイトによると、GattCharacteristicの付加情報を管理するなどと書かれていました。

characteristicからBluetoothGattDesciptorを参照する

参照する際のidは固有値なので、注意してください。

これらを踏まえての全体ソースです。

peripheral側にデータを送る

onServicesDiscovered関数内でwriteDecriptor関数を呼んでいますが、
そのcallback関数でperipheral端末にデータを送信するコードを書いています。

こうすることで、初回に送るデータを区別することができます。

送信方法は、BluetoothGattCharacteristicのsetValue関数で値をセットし、
BluetoothGattクラスのwriteCharcteristic関数でデータを書き込むことで、
Peripheral側にCharacteristicの更新を伝えます。

Peripheral側からデータを受け取る

onCharacteristicChanged関数内でperipheral側のデータを受け取ることができます。

参考

ベースはこちらを参照させていただき、あとはdeveloperサイトやappleのCoreBluetoothのドキュメントを参考にしました。
概念を知るには、CoreBluetoothのドキュメントが参考になりました。

ソースコード

全体のソースはgitにあげました。
iosのperipheral側とでデータのやり取りをすることができます。
iosはこちら

androidのperipheral側の記事はこちら

Pocket