Windows Visual C#でtoio

toioは、BLEで制御できるのですが、Windows PCでBLEを使おうとすると、簡単では無いんですよね。JavaScriptを使うと出来るみたいですが、Visual C#を主に使っているので、ちょっと敷居高い・・・ 

そこで、SILICON LABSのBluegiga(BLEドングル)を使ってC#からtoioを制御する方法をお話ししたいと思います。

画像1

BLED112をパソコンのUSBポートに挿すとシリアルポートとして認識されます。従ってC#からは、Serialport関数で接続できます。ボーレートは、115200です。

・BLED112とのプロトコル

BLDD112とのシリアル通信は、バイナリとなります。以下に、基本的なパケットの構成を示します。

画像3

パケットは、Message部とpay loadで構成されています。Messag部は、4byteで構成されています。typeは、PCからBLED112へのパケットは、0x00で、BLED112からPCへのパケットは、0x80もしくは、0x00です。厳密には、typeの下3bitがLengthの上位3bitに割り当てられているため、0x8xの場合もあるのですが、toioとの通信では、1パケットが256bitを超えることは無いので0x80,0x00で処理しても今のところ大丈夫でした。

Lengthは、Messgae以降のpay loadのByte数を示しています。受信したパケットを処理するときは、0x80、0x00でパケット検知し、Length+4Byteのデータを取り込み処理すればよいことになります。

class、IDは、パケットの種類を示すものです。

・スキャン

toioが接続待ちになっている状態では、アドバタイズをしています。それを所得するために、スキャンを行います。下記は、パケットをPCからBLED112に送ると、アドバタイズを受信するスキャンモードになります。class:0x06、ID:0x02が、スキャンモードを示しています。pay loadは、1byteでスキャンモードを示していますす。

画像3

・アドバタイズ受信

スキャンモードにすると、下記のパケットがBLED112から送られてきます。アドバタイズしている機器によってパケットの長さ内容は、異なります。toioの場合、1パケットは、36Byteになっています。Byte 6~11に、BDアドレス、Byte 20~35にUUIDが入っています。toioと接続するためには、UUIDがtoio cubeのUUIDと一致するか確認した後、BDアドレスを用いて接続します。

Byte 4には、RSSI(Radio signal Stringth Indication)という電波の強度を表す値が入っていますので、機器とのおおよその距離が判ります。値は、0~-254になります。

画像4

・コネクション(接続)

スキャンでtoioが見つかったら、所得したBDアドレスで接続します。下記のパケットを、PCからBLDD112に送ります。BD Addressの部分に書かれている値は、例ですので、実際には、スキャンで取得したBDアドレスを入れてください。

画像5

・接続の確認/Handlerの取得

toio Cubeと接続が完了すると、toio Cube本体から確認音が鳴るとともに、下記のパケットがBLED112から送られてきます。BDアドレスが接続しようとしていたtoio Cubeかどうか確認します。Byte 4にconection handle値が入っています。conection handleは、接続後のtoio cubeとパケットをやり取りするための0から始まるhandlerの番号になります。

画像6

・Attribute Handlerの要求

toio Cube内の各デバイスは、個別のUUIDを持っていますが、BLED112では、UUIDでなく、1から始まるAttribute Handlerを使用します。そこで、各デバイスのUUIDとAttribute Handlerの対応を下記パケットでtoio Cubeに問い合わせします。Connには、対象のtoio Cubeに対応したconection Handler番号を入れます。

画像7

・Attribute Handlerの取得

Attribute Handlerを問い合わせると下記のパケットがデバイスUUID分だけBLED112から送られてきます。Byte7~22にUUIDが、そのUUIDに対応Attribute Handler値がByte 5,6に入っています。(Byte 5が下位8bit)

画像8

・Notifyの開始

ID、ボタン、センサー、バッテリーの値は、Notifyを設定すると、toio Cubeより定期的にもしくは、イベント発生時にtoio Cubeより送られてきます。Notifyの開始は、下記のパケットに、Notifyを行うtoio Cubeに対応したconection handle値をconnに、Notifyを開始するデバイスに対応したAttribute handle+1をchrに設定しBLED112に送ることにより行えます。(Attribute handle+1がポイント)

画像9

・Notifyの受信

Notifyを開始すると、下記にパケットのデータが送られてきます。どのtoio Cubeから送られてきたかは、Connに入っているconection Handler値で、どのデバイスかは、chrに入っているAttribute Handler値で判別します。データは、Byte7にデータの長さが、データ自体がByte 8以降に格納されています。

画像10

・Commandの送信

モータ、LED、ブザーを操作するためには、下記パケットにconnに操作するtoio Cubeのconection Handler値を、操作するデバイスのAttribute Handler値をchrに設定し、BLED112に送ります。

画像11

以上で、toio Cubeと接続し操作できるはずです。Visual C#のコードは、きれいに整理出来ていないので、後々整備して公開したいと思います。

・おまけ

BLEは、同時に複数の接続ができます。BLED112は、最大接続数が3台になっているようです。

BLUEGIGA BLUETOOTH SMART SOFTWARE の説明書

https://www.silabs.com/documents/public/reference-manuals/Bluetooth_Smart_Software-BLE-1.8-API-RM.pdf



いいなと思ったら応援しよう!