前回nRF52840の開発環境を作りました。今回はAndroid端末間で Nordic UARTを試します。構想中のCANロガーのWANとの中継部になります。
弊方のBluetooh実績は以下の通りです。うまく組合せればスピーディに構築できるでしょうか?
- nRF5810 と nRF5832 間で、オリジナル基板にてNordic UART 通信。
- Android端末から、体温計(A&D製と日本精密計測製)、血圧系(A&D製)、血中酸素濃度系(A&D製)
実装手順
大抵最初はサンプルコードに肉付けするか、ある程度の部分をごっそり持ってるかです。弊方には体温計等用に 独立スレッドのインテントサービスライブラリを作ってあり、こちらを有効活用したい。まず通信仕様を確認します。
通信仕様書
前回Nordic マイコン同士の通信では、プロトコルがカプセル化されていて見えません。Android用専用ライブラリも無いようです。Nordicドキュメントをみても通信仕様書らしきものは見当たりません。サンプルコードを読解くしかないようです。サンプルコードあまりな無く、Android-nRF-Toolbox、Android-nRF-UART というのがありGitHubに置いてあります。(後者は有志の方のものかも)
通信条件
Nordic UART の通信条件は以下のとおりでした。e) は .h に明確な記載はなかったため BLE_NUS_MAX_DATA_LEN をデバッグターミナルに printしてみました。
a) Service UUID | 6e400001-b5a3-f393-e0a9-e50e24dcca9e |
b) 受信用特性UID | 6e400003-b5a3-f393-e0a9-e50e24dcca9e |
c) 送信用特性UID | 6e400002-b5a3-f393-e0a9-e50e24dcca9e |
d) GATT UUID (従来通り) | 00002902-0000-1000-8000-00805f9b34fb |
e) 一回の送信最大Byte Size (実験値) | 224 |
尚、マスターは Nordic 側、スレーブは Android 側としています。
実装結果
今のところ Nordic UART に固有に依存した通信は無く、体温計等と同じシーケンスで送受信できました。ポイントを列挙します。
- 受信だけなら受信用特性だけ使えばOK。BT接続後、相手BT機器からデータを投げてくる場合と同じです。
- 送信は送信用特性に対して書き込みを行います。相手BT機器に対して何か設定を行う場合と同じです。
- 時刻特性(00002A08-0000-1000-8000-00805f9b34fb) はBT共通ですが対応しいないようです。エラーになります。 Nordic 側で自分で作り込む必要があるのかもしれません。
以下テスト送信の様子です。



Nordic 側のコードは以下のような感じです。

Android側の送信トリガー部は以下のような感じです。

Android側の受信表層部は以下のような感じです。

Android側の送信深層部は以下のような感じです。ここに至るまでは、インテントサービスによるメッセージと、GATT のイベントハンドラを数段介します。

見解
取り急ぎ使えそうな印象です。本実装では特定時間内の複数CANフレーム一式をまとめて受信する予定です。以下が次課題です。
- 複数CANフレーム一式のパケット分割。(これはやればできるハナシ )
- 時間当たりの転送効率がどのくらいでるか?
- 転送効率が芳しくない場合、他のBT プロファイルが使えないか? ( BLE: lowenergy でないBluetoothだともっと早いとどこかで見た気がする)
- Bluetooth Long Range も気になる。(nRF52840 の機能マトリクスにはサポート有と記載があった)
nRF52840 と Android端末間で Nordic UARTを試すした結果です。何かしらベースがあれば割と簡単に通信できます。( 当方は扱い方を思出すのに一番時間を要しました)
手順とそのポイントは以上ですが、Nordic UART をAndriod端末から直ぐに動かしたい、工数がない、自身がない会社さん等はご依頼を受付けています。こちらまでご一報ください。