Skip to the content.

技術ドキュメント - 機能説明 - 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 処理について解説します。

スキャンは大まかに以下の手順で実行します。

  1. RequestDevice 関数を呼び、BLEDeviceInterface 変数を取得します。
  2. CoreCube 識別 IDを対象にスキャンを開始
  3. スキャン終了条件(接続数、待機時間)を満たしたらスキャンを終了
  4. スキャンにより取得した BLEPeripheralInterface 変数をリターン


接続

接続には Connecter クラスを使用します。cube ドキュメントに殆ど書かれています、ご参照下さい。

BLE 処理として追記するべき点は以下です。

  1. Cube 変数の生成直後に自動通知の購読(cube.StartNotifications)を呼び、座標やボタン等の自動通知の購読を開始します。


3.2. 送信と受信



送信

送信呼び出し自体は CubeReal の派生クラスから行われます、cube ドキュメントをご参照下さい。

受信

接続処理直後に行った自動通知の購読(cube.StartNotifications)により、購読している情報が自動通知されます。