AndroidとIOSでBluetooth通信するためには、BluetoothLeを使う必要があります。
ここでは、Bluetoothのサービスを使う側であるCentralと呼ばれる側の実装方法を見ていきます。

Leを使うためには、LOLLIPOP API以上である必要があります。
なので、Versionで処理を分ける必要があります。
ここでは、@TargetAPIを使ってファイルを分けます。

Bluetoothを使うために以下をメンバー変数として定義する

 

初期化する

Peripheral端末の検索を開始する

端末のBluetoothが無効になっている場合、BluetoothAdapterクラスが有効になりませんので、
チェックをしないといけません。

startScan関数にコールバックを渡しています。
このコールバックで状態の制御をしています。

検索が終わると
onScanResultが呼ばれます。そこで見つかったDeviceに対し接続を試みる関数が、
connectGat()関数で、ここにも接続の状態が返却されるcallbackを指定します。
また、第二引数には接続が切れた際に再度接続を試みるかどうかのフラグを設定することができます。

connectGat関数

connectGatt

added in API level 18

BluetoothGatt connectGatt (Context context,
boolean autoConnect,
BluetoothGattCallback callback)

Connect to GATT Server hosted by this device. Caller acts as GATT client. The callback is used to deliver results to Caller, such as connection status as well as any further GATT client operations. The method returns a BluetoothGatt instance. You can use BluetoothGatt to conduct GATT client operations.

Parameters
context Context
autoConnect boolean: Whether to directly connect to the remote device (false) or to automatically connect as soon as the remote device becomes available (true).
callback BluetoothGattCallback: GATT callback handler that will receive asynchronous callbacks.
Returns
BluetoothGatt
Throws
IllegalArgumentException if callback is null

BluetoothGattCallback

 

対象のサービスを探す

Bluetoothのサービスが見つかった時に呼ばれるのが、onServiceDiscovered関数です。
その関数内で、接続したい対象のサービスを探すために、各々のUUIDを指定する必要があります。
UUIDはそのサービスが固有にもつIDのことです。

サービスを発信する側つまりPeripheral端末側で、このUUID設定し、
各々のUUIDが一致した場合のみ接続を試みればいいわけです。

Peripheral端末にデータを送信する

では、Peripheral端末側にデータを送信します。
Button要素をタップした際にデータを送信するようにしました。