United Statesからアクセスのようです。言語設定をEnglishに切り替えますか?
Switch to English site
Skip to main content

格安スマートブレスレットをLoRaWANと繋ぎ IoTヘルスケア端末に (その2)

その1からの続き

スマートブレスレッドのお蔭で体調も良くなってしばらくたったころ、ちょうど今年5月ゴールデンウィーク前に中国深圳市にあるLoRaWAN関連ハードウェアメーカー Dragino社に出張する機会がありましたので、ついでに前途のスマートブレスレットを製造しているメーカー元へ訪ねてみました。

078_63b53019036bb97db2a86a7b0c410c0a171b4686.png

深圳市郊外スマートブレスレットメーカー会議室にて

スマートブレスレット工場に訪問した理由は、スマートブレスレットの専用スマホアプリWearfitのSDKキットと技術資料を入手することでした。

 

084_9f2b3591c4e7bb8d749051151c15bff04e013574.png

帰国後、さっそくSDKキットと中国語で書かれた技術資料をもとにスマートブレスレットをBluetooth経由で制御できないか? 社内で検討してみました。

*Wearfitプロトコルの基本仕様

ホスト(Android、iOS)とクライアント(ブレスレット)間プロトコルの基本仕様は、次のとおりです。

  • ホスト - >クライアント間プロトコル
  • クライアント - >ホスト間プロトコル
  • データパケット⻑は20バイト以内。20バイト超のデータは別パケットで送信各々のデータパケット形式は以下を参照してください。

・1.2 クライアント - >ホスト間プロトコル

8.5__4ee4708ed09c2a4e5223ae60ab2e003544eeb1d0.png

クライアント->ホスト間プロトコルは、表1-1に⽰すように、開始フレーム+ ID、データ⻑、データ0、データパケットヘッダ、データ1、および他の情報が含まれます。

093_de8d27d69bdacbf4b2af9b5a399d03529b561aa7.png

 表1-1 クライアント->ホスト間プロトコル解析

*Data Legth:データ⻑は、Data Legth以降のパケットヘッダを含まないデータサイズをバイト単位で⽰し、そのデータサイズは[Total length-1]となります。

*Status:ステータス表⽰(下記のプロトコルを参照のこと)

 

1.3 ホスト - >クライアント間プロトコル

1020_25310c672c5531859f7209db014bee0da626b23d.png
 
ホスト->クライアント間プロトコルには、表1-2に⽰すように、開始フレーム、データ⻑、デフォルトフィールド、制御フィールド、データタイプ、およびデータが含まれます。
 
1135_558907f457f71b87f7f943833064f1603de137cb.png

 

中国語で書かれた技術資料をGoogle翻訳で和訳し、ホスト(スマホ)とクライアント(スマートブレスレット)の相互通信の仕様は理解しました。しかし、転送される各サービスの定義に関しては、詳細資料がないために開発元であるはずのスマートブレスレット工場のマネージャーに質問しました。しかし、質問した内容を理解されず、自力で解析するしかなくなりました。

そこでスマートブレスレットに搭載されているBluetoothチップの情報をもとにWearfitを開発した会社(たぶんスマートブレスレットとは違う現地のソフト会社?)のBluetooth SIGの標準仕様とは別の独自GATT情報を解析しました。

*GATTとは?

GATT(Generic attribute profile)-汎用アトリビュートプロファイルは、ATT(アトリビュートプロトコル)を用いてデータを構造化する方法と、アプリケーション間でのやり取りの方法を定義します。Bluetooth low energyのアプリケーションは、すべてこのGATTを使用して構築されることから、GATTはBluetooth low energyのデータ転送の主軸となるものです。

GATTには、Bluetooth SIGが公式に提供しているプロファイルと、機器メーカなどの独自提供のものがあります。Bluetooth SIGが定義しているプロファイルには、Alert Notification(アラート通知)、Blood Pressure(血圧計)、Health Thermometer(体温計)、Heart Rate(心拍数)、Location and Navigation(位置とナビ)などがあります。これらはすべて、Bluetooth low energy用に定義されたもので、Bluetooth v3以前のプロファイルとは互換性がありません。

情報参照元:

http://micro.rohm.com/jp/techweb_iot/knowledge/iot02/s-iot02/04-s-iot02/3469

試行錯誤を何度も重ねてgatttoolというBluetoothライブラリでスマートブレスレットとRaspberry Piをつかいながら、プロトコルのサービス内容の定義ができるところまで辿りました。

*Raspberry Piとスマートブレスレットの連携

Raspberry Piからgatttoolコマンドを使用したスマートブレスレットの設定および情報取得の方法について説明します。

1.確認環境

以下の環境で確認しています。

 ・Raspberry Pi Zero W

 ・Raspbian(jessie)

2.スマートブレスレットのMACアドレス取得

(1)ラズベリーパイに以下のコマンドを入力し、スマートブレスレットのMACアドレス取得します。

$ sudo hcitool lescan
LE Scan ...
XX:XX:XX:XX:XX:XX B2

この場合、B2という名前のスマートブレスレットです。

3.スマートブレスレットのhandle取得

(1)gatttoolを対話モードで起動します。(XX:XX:XX:XX:XX:XXはスマートブレスレットのMACアドレス)

    $ sudo gatttool -b XX:XX:XX:XX:XX:XX -t random –I

(2)スマートブレスレットと接続します。(以下、gatttoolの対話モードでの入力です。)

    $ connect
    Attempting to connect to XX:XX:XX:XX:XX:XX
    Connection successful

(3)Notificationを有効にするhandleを取得します。

    > char-read-uuid 00002902-0000-1000-8000-00805f9b34fb
    handle: 0x000b       value: 00 00
    handle: 0x000f       value: 00 00
    handle: 0x0017       value: 00 00
    handle: 0x001d       value: 00 00
    handle: 0x0020       value: 00 00

複数のhandleが表示されます。

(4)Notificationを有効にするhandleを特定します。

上記(3)で取得したhandleに上から順に0100を設定します。

    > char-write-req 0x000f 0100

    Characteristic value was written successfully
    Notification handle = 0x000e value: ab 00 05 ff 91 80 00 50

    Notification handle = 0x000e value: ab 00 0d ff 92 c0 03 06 a3 00 00 00 00 00 00 04

上記の様に、設定後、「Notification handle = …」と表示されるhandleがNotificationを有効にするhandle(この場合は0x000e)です。

(5)制御データの書き込み先handleを取得します。

    > primary
    attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb
    attr handle: 0x0008, end grp handle: 0x000b uuid: 00001801-0000-1000-8000-00805f9b34fb
    attr handle: 0x000c, end grp handle: 0x0011 uuid: 6e400001-b5a3-f393-e0a9-e50e24dcca9e
    attr handle: 0x0012, end grp handle: 0x0019 uuid: 00001530-1212-efde-1523-785feabcd123
    attr handle: 0x001a, end grp handle: 0xffff uuid: 0000fee7-0000-1000-8000-00805f9b34fb

6e400001で始まるuuidのend grp handle: にある値(この場合は0x0011)が制御データの書き込み先handleです。

(6)スマートブレスレットの接続を解除します。

> disconnect

(7)gatttoolを終了します。

> exit

4.スマートブレスレットの設定および情報取得

各ハンドルの値は以下の通りとします。スマートブレスレットに合わせて3.で取得した値に読み替えてください。書き込みデータおよび出力データの詳細はWearfit仕様書を参照してください。

     Notificationを有効にするhandle : 0x000f
     制御データの書き込み先handle          : 0x0011

(1)gatttoolを対話モードで起動します。

    $ sudo gatttool -b XX:XX:XX:XX:XX:XX -t random –I

(2)スマートブレスレットと接続します。(以下、gatttoolの対話モードでの入力です。)

    > connect

(3)Notificationを有効にします。

    > char-write-req 0x000f 0100

(4)定時測定をONにします。(毎時0分に測定するように設定します。)

    > char-write-req 0x0011 ab0005FF78800101

(5)データ同期要求をします。

    > char-write-req 0x0011 ab0009ff5180001207010100

毎時0分に測定したデータが表示されます。

(6)心拍数一回測定をします。

    > char-write-req 0x0011 ab0004ff310901

1分程度待ちます。

    > char-write-req 0x0011 ab0004ff310900

測定データが表示されます。

(7)血圧一回測定をします。

    > char-write-req 0x0011 ab0004ff312101

1分程度待ちます。

    > char-write-req 0x0011 ab0004ff312100

測定データが表示されます。

(8)ブレスレット探索をします。

    > char-write-req 0x0011 ab0003ff7180

スマートブレスレットが振動します。

(9)スマートブレスレットの接続を解除します。

    > disconnect

(10)gatttoolを終了します。

    > exit

上述のLinuxのシェル上でホスト(Raspberry Pi)とクライアント(スマートブレスレット)との相方向通信と定義されたサービスが送信可能であることが検証できましたので、これを何らかのコンピュータ言語でプログラムにする必要があります。

そこで、The Things Network Niigata (新潟)イニシエータの田中さんに依頼し、まず最初にWiFi環境下でスマートブレスレットの血圧値と心拍数と血中酸素をRaspberry Piで取得して、遠隔地からでも見える化、つまりスマートヘルスケアシステムの構築をお願いしました。 --- その3へつづく

 

今回、この記事のデモキットの開発にご協力いただいたThe Things Network Niigataイニシエータ田中さんのサイト

*The Things Network Niigataサイト

新潟エスラボサイト

ダウンロード

The Things Network Japanアンバサダーをしております。 よろしくおねがいします。 www.crijapan.jp
DesignSpark Electrical Logolinkedin