LINBLEドングルと通信できる機器・できない機器
こんにちは。ムセンコネクト三浦です。
我々のプロダクトにLINBLEドングルというものがあります。
LINBLEドングルはLINBLE-Z1を内蔵しており、パソコンに挿すと仮想COMポートして認識するため、TeraTermのようなCOMポート通信するアプリから簡単に制御することができる機器です。
LINBLEドングルがよく使われるシーン
Bluetooth Classic にはSPP(Serial Port Profile)という、WindowsアプリからCOMポートのように扱える標準的なプロファイルがありましたが、Bluetooth Low EnergyにはSPPがありません。
LINBLEドングルを使うと、TeraTermのようなCOMポート通信するWindowsアプリとLINBLE-Z1を搭載したペリフェラル機器間を簡単に通信させることができます。
つまりこのような構成になります。
未だにCOMポートを利用するアプリは多いので、LINBLEドングルはとても便利なのですが、どんなペリフェラル機器でも通信できるわけではありません。
BLEの通信仕様は各機器メーカーが独自に作っているものが多いため、汎用的にどのデバイスでもつながるドングルというのは現実的に難しいのです。
LINBLEドングルの場合は、LINBLE UART Serviceという通信仕様に対応したペリフェラル機器としか通信出来ません。実質、通信相手になるのはLINBLE-Z1を搭載したペリフェラル機器となるわけです。
LINBLE UART Serviceとは?
LINBLE UART Serviceは以下のServiceとCharacteristicから成り立っています。
【Service】
サービス名 | 内容 | UUID |
LINBLE UART Service | カスタムサービス | 27ADC9CA-35EB-465A-9154-B8FF9076F3E8 |
【Characteristic】
サービス名 | 内容 | UUID |
Data From Peripheral | Notify | 27ADC9CB-35EB-465A-9154-B8FF9076F3E8 |
Data To Peripheral | Write Without Response | 27ADC9CC-35EB-465A-9154-B8FF9076F3E8 |
イメージはこんな感じです。
ホストマイコンがLINBLE-Z1にUARTでデータを送信すると、Data From PeripheralというCharactaristicに書き込まれます。このとき、セントラル側にも書き込まれたことが通知されます。
セントラル側はペリフェラル側に送りたいデータをData To PeripheralというCharactaristicに書き込みます。このとき、書き込まれた内容をLINBLE-Z1がホストマイコンにUARTでデータを送信します。
※LINBLE-Z1ではこれ以外に、フロー制御のようなことをする場合に利用する「Too Busy Data To Peripheral Alert」と「Disable Data From Peripheral」というCharactaristicがあります。
LINBLE-Z1を使わずにLINBLEドングルと通信させてみる
電前述の通りLINBLEドングルは、LINBLE UART Serviceに対応したペリフェラル機器としか通信できません。
実質的にはLINBLE-Z1を搭載したペリフェラル機器としか通信できないということですが、
裏を返すと、LINBLE-Z1を搭載していなくてもLINBLE UART Serviceに対応していれば、LINBLEドングルと通信できるということになります。
今回は本当にLINBLE-Z1以外でもLINBLEドングルと通信可能なのか試してみました。実験では太陽誘電の評価キットEKSHCNZWZを利用しました。
ブランクモジュールを使ったファームウェア開発
EKSHCNZWZは以下の記事で利用したものと同じです。この記事ではブランクモジュールにファームウェアを書き込んで、スマートフォンアプリと通信するところまでを確認しました。
記事の中でも利用したble_app_uartというサンプルプログラムを変更してLINBLE-Z1と通信させてみます。
ble_app_uartはLINBLE UART Serviceに似たNordic UART Service(略語:NUS)という独自の通信仕様になっています。Characteristicの構成も似ています。
細かい部分は置いておいて、下記のように変更しました。CharacteristicのUUIDの値をNoridic UART Serviceのものから、LINBLE UART Serveiceに合わせました。
ble_nus.c
//#define BLE_UUID_NUS_TX_CHARACTERISTIC 0x0003 /**< The UUID of the TX Characteristic. */
//#define BLE_UUID_NUS_RX_CHARACTERISTIC 0x0002 /**< The UUID of the RX Characteristic. */
#define BLE_UUID_NUS_TX_CHARACTERISTIC 0xC9CB /**< The UUID of the TX Characteristic. */
#define BLE_UUID_NUS_RX_CHARACTERISTIC 0xC9CC /**< The UUID of the RX Characteristic. */
//#define NUS_BASE_UUID {{0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x00, 0x00, 0x40, 0x6E}} /**< Used vendor specific UUID. */
#define NUS_BASE_UUID {{0xE8, 0xF3, 0x76, 0x90, 0xFF, 0xB8, 0x54, 0x91, 0x5A, 0x46, 0xEB, 0x35, 0x00, 0x00, 0xAD, 0x27}} /**< Used vendor specific UUID. */
ble_nus.h
//#define BLE_UUID_NUS_SERVICE 0x0001 /**< The UUID of the Nordic UART Service. */
#define BLE_UUID_NUS_SERVICE 0xC9CA /**< The UUID of the Nordic UART Service. */
変更したプログラムをEBSHCNZWZに書き込みます。
まずはこれで準備完了です。EBSHCNZWZにはUSB-UARTブリッジICが内蔵されていますので、USBでパソコンと接続し、TeraTermで制御することができます。
下記のような構成になります。
これからBLE通信をしてみましょう。
EBSHCNZWZ側:プログラムが起動すると「UART Start!」が表示されます。
LINBLEドングル側:「BTLV0」を実行し、デバイス検索の際にデバイス名でフィルタリングする機能をOFFします。(デバイス名が「LINBLE-Z1」以外の機器もスキャンできるようになります)
LINBLEドングル側:「BTI」でデバイス検索を実行します。2番目に出てきた「D2760AE01485[Nordic_UART]」がEBSHCNZWZです。
LINBLEドングル側:「BTC2」でEBSHCNZWZとのBLE接続を実行します。「CONN」と表示されて無事にBLE接続が完了しました。
LINBLEドングル側:「HELLO↵」と入力します。
EBSHCNZWZ側: 「HELLO↵」が表示されます。(「Data To Peripheral」Charactaristicを通じてLINBLEドングルからEBSHCNZWZにデータが送信されます。)
EBSHCNZWZ側: 「THANK YOU↵」と入力します。
LINBLEドングル側:「THANK YOU↵」が表示されます。
(「Data From Peripheral」Charactaristicを通じてEBSHCNZWZからLINBLEドングルにデータが送信されます。)
※ble_app_uartでは改行コードを契機に通信相手にデータを送信していますのでLINBLE-Z1と操作感が若干異なります。
今回はLINBLEドングル側を通常モードで動作させましたが、予めBTLTコマンドで相手のペリフェラル機器の接続先アドレスを登録しておけば、自動モード(セントラル)で動作させることもできます。
※今回の例では「BTLTD2760AE01485」
注意事項
今回はble_app_uartのCharactaristicをLINBLE UART Serviceに合わせただけなので、簡単なデータ送受信はできましたが、少しデータ量が多くなるとデータ転送に失敗してしまうようでした。
製品レベルで利用するにはここからの合わせ込みがかなり大変になる印象です。
まとめ
今回の実験で『LINBLE UART Serviceに合わせればLINBLE-Z1じゃなくてもLINBLEドングルと通信できる』ということがわかりました。
「Windows側も仮想COMポートでBLEデータを受けたい」というニーズから、Windows側にLINBLEドングルをご検討いただけるケースが増えています。しかしながらLINBLEドングルは実質LINBLE-Z1としか接続・通信することができないため、LINBLEドングルを諦めるお客様もいらっしゃいます。
弊社としてはペリフェラル側にもLINBLE-Z1をご利用いただけるのがベストではありますが、様々なご事情でそうはいかないことも承知しております。
そこで本記事のように「ペリフェラル側をLINBLEドングルに合わせる方法」をご紹介させていただきます。実際にペリフェラル側で「LINBLE UART Service」を活用するのも容易ではないかもしれませんが、ムセンコネクトでは「ブランクモジュールのファームウェア開発」も承っておりますので、もしLINBLEドングルにご興味がございましたら、お気軽にムセンコネクトまでご相談ください。