技術ドキュメント - 機能説明 - BLE(Bluetooth Low Enegy)
目次
1. 概説
BLE モジュール群は、Bluetooth Low Enegy(BLE)の通信機能をインタフェースを介して抽象的に提供するモジュール群です。 全ての BLE クラスをインタフェースを介して実装する事で、通信アーキテクチャとは独立した形で toio™ プログラミングが可能になります。 そのため新たに継承クラスを独自開発する事で BLE 以外の通信モジュールに差し替える事も可能です
ディレクトリ構成は下図のようになります。
BLE +---------------------------------+ BLEルートディレクトリ
├── interfaces +----------------------+ インタフェースディレクトリ
│ ├── BLECharacteristicInterface.cs + Characteristic(機能単位)インタフェース
│ ├── BLEDeviceInterface.cs +-------+ 端末のBLE機能を提供するインタフェース
│ ├── BLEPeripheralInterface.cs +---+ Peripheral(接続端末)インタフェース
│ └── BLEServiceInterface.cs +------+ BLE処理の最初の窓口となるインタフェース
├── mobile +--------------------------+ モバイル実装ディレクトリ
│ ├── BLEMobileCharacteristic.cs +--+ Characteristic(機能単位)モバイル実装クラス
│ ├── BLEMobileDevice.cs +----------+ モバイルのBLE機能を提供するクラス
│ ├── BLEMobilePeripheral.cs +------+ Peripheral(接続端末)モバイル実装クラス
│ └── BLEMobileService.cs +---------+ BLE処理の最初の窓口となるモバイル実装クラス
├── unity +---------------------------+ Unity実装ディレクトリ
│ └── UnityPeripheral.cs +----------+ Peripheral(GameObject)Unity実装クラス
├── WebGL +---------------------------+ WebGL実装ディレクトリ
│ ├── Plugins +---------------------+ WebGL用プラグインディレクトリ
│ │ ├── WebGL +-------------------+ WebGL用プラグインディレクトリ
│ │ │ └── WebBluetooth.jslib +--+ WebGLTemplates/webble/webble.jsとやり取りをするスクリプト
│ │ └── WebBluetoothScript.cs +---+ プラグイン機能を提供するクラス(WebBluetooth.jslibとやり取りをする)
│ ├── BLEWebCharacteristic.cs +-----+ Characteristic(機能単位)WebGL実装クラス
│ ├── BLEWebDevice.cs +-------------+ WebGLのBLE機能を提供するクラス
│ ├── BLEWebPeripheral.cs +---------+ Peripheral(接続端末)WebGL実装クラス
│ ├── BLEWebService.cs +------------+ BLE処理の最初の窓口となるWebGL実装クラス
└── BLEService.cs +-------------------+ BLE全体の最初の窓口となるシングルトンクラス
2. BLE クラスの構造
BLEService
BLE 機能の最初の窓口となるシングルトンクラス
BLEService.Instance.SetImplement()関数で実装インタンスを入れる事で
内部実装クラスを設定する
実装コード
public class BLEService : GenericSingleton<BLEService>
{
public bool hasImplement { get; private set; }
public BLEService()
{
this.hasImplement = false;
}
private BLEServiceInterface impl;
public void SetImplement(BLEServiceInterface impl)
{
this.impl = impl;
this.hasImplement = true;
}
public void RequestDevice(Action<BLEDeviceInterface> action)
{
this.impl.RequestDevice(action);
}
public async UniTask Enable(bool enable, Action action)
{
await this.impl.Enable(enable, action);
}
public void DisconnectAll()
{
this.impl.DisconnectAll();
}
}
BLEServiceInterface
BLE 処理の最初の窓口となるインタフェース
動作端末の BLE 機能を提供する Device インタフェースを取得する機能を提供する
インタフェースコード
public interface BLEServiceInterface
{
void RequestDevice(Action<BLEDeviceInterface> action);
void DisconnectAll();
UniTask Enable(bool enable, Action action);
}
BLEDeviceInterface
動作端末の BLE 機能インタフェース
主な役目は BLE 機能にアクセスしてスキャン処理を実行すること
インタフェースコード
public interface BLEDeviceInterface
{
void Scan(String[] serviceUUIDs, bool rssiOnly, Action<BLEPeripheralInterface> action);
void StopScan();
UniTask Disconnect(Action action);
UniTask Enable(bool enable, Action action);
}
BLEPeripheralInterface
スキャンされた BLE デバイスのインタフェース
主な役目はスキャンされた BLE デバイスへの接続処理を実行すること
インタフェースコード
public interface BLEPeripheralInterface
{
string[] serviceUUIDs { get; }
string device_address { get; }
string device_name { get; }
float rssi { get; }
bool isConnected { get; }
void Connect(Action<BLECharacteristicInterface> characteristicAction);
void AddConnectionListener(string key, Action<BLEPeripheralInterface> action);
void RemoveConnectionListener(string key);
void ConnectionNotify(BLEPeripheralInterface peri);
}
BLECharacteristicInterface
スキャンされた BLE デバイスの機能ごとのインタフェース
主な役目は BLE デバイスそれぞれの機能に対して書き込み/読み込み処理を実行すること
インタフェースコード
public interface BLECharacteristicInterface
{
string deviceAddress { get; }
string serviceUUID { get; }
string characteristicUUID { get; }
void ReadValue(Action<string, byte[]> action);
void WriteValue(byte[] data, bool withResponse);
void StartNotifications(Action<byte[]> action);
void StopNotifications();
}
3. 通信の仕組み
3.1. 検索と接続
検索
検索には Scanner クラスを使用します。Scanner クラスの概要は【コチラ】を参照して下さい。
この節では Scanner クラスの BLE 処理について解説します。
スキャンは大まかに以下の手順で実行します。
- RequestDevice 関数を呼び、BLEDeviceInterface 変数を取得します。
- CoreCube 識別 IDを対象にスキャンを開始
- スキャン終了条件(接続数、待機時間)を満たしたらスキャンを終了
- スキャンにより取得した BLEPeripheralInterface 変数をリターン
接続
接続には Connecter クラスを使用します。cube ドキュメントに殆ど書かれています、ご参照下さい。
BLE 処理として追記するべき点は以下です。
- Cube 変数の生成直後に自動通知の購読(cube.StartNotifications)を呼び、座標やボタン等の自動通知の購読を開始します。
3.2. 送信と受信
送信
送信呼び出し自体は CubeReal の派生クラスから行われます、cube ドキュメントをご参照下さい。
受信
接続処理直後に行った自動通知の購読(cube.StartNotifications)により、購読している情報が自動通知されます。