終於我升上最後一個年級了,準備畢業,就在上個月時,我在學校資管系的物聯網中心主任拜託我協助他們研究雜牌運動手環在擷取資料上面更簡化,使得他們的研發人員能簡單、快速地得到運動手環的資料,並可以讓他們做 Health Care 的應用。

我也順便放進了 Repo,如果你想直接拿來用,可以在這個 repo 找到: https://github.com/hpcslag/V07S-hband-decompile-for-arduino

這裡面有兩個專案,Control 是只有一個裝置的連接,async_control 是可以針對多個裝置連接的版本。

準備

自從答應主任要協助研究時,基本上只有兩個可行的思路:

  • 用寫手機程式來存取這個手環的資料,但是他們的研發中心不太希望我採用這種做法。
  • 利用電路設計的方式完成,但是會遇到許多未知的麻煩。

再怎麼想其實最後只能選擇用電路完成,並且整理出整個研究的架構:

  • 低功耗協議 (動物書): Getting Started with Bluetooth Low Energy: Tools and Techniques for Low-Power Networking
  • 找到能支持 Bluetooth 4.0 - GAPP 協議, 支援 Central Device (中央設備連接) 和 Peripherals (周圍設備連接) 模式轉換的模組
  • 找到這個手環通信方式
  • 連接通信測試

在硬體方面,我的心裡總是告訴我自己,不要總是依賴用 Arduino 去實現什麼研究或產品之類的東西,可惜這個理念在這時候還是被打消了,我嘗試過尋找 nRF8001,nRF51x 之類,是 Nordicsemi 公司的產品,還有 BL620 之類的模組,如果你對這類模組不太清楚,可以看看這篇文章

總而言之,這類產品的文獻實在太少了,幾乎很難在短時間研究完成,於是只好投靠 Arduino ,這是因為 Arduino 101 這項產品中,有包含 BLE ,而且 Intel 還特別為這個 BLE 寫一個量身打造的 Intel Curie Library ,可以很快速的使用這個 Library 做中央或外圍設備連接,最後只能妥協這個方案,我花了 1 千多台幣買回來測試,在那之前,我購買了 HC-09 模組,後來我才發現只能支持同樣的模組,不能向外連接,有夠浪費錢。

Bluetooth 4.0 LE 協議與連接

老實說,Bluetooth 4.0 的協議方面困擾我很久,這裡的 Low Energy 是 Bluetooth 4.0 協議的一部分,要看晶片是否是支持 LE 協議在裡頭。

如果你想了解 GATT 比較深入一點,可以看看這篇幾篇:

這裡用簡單的說明描述,GATT 在 Bluetooth.org 有標準格式 (請參考: 這篇),只要大家都按照標準做,就會讓開發者輕鬆一點。

低功耗藍芽使用 GATT 協議的連接方式,需要周邊裝置(本身是GATT Server)提供 Service (服務分類),所以中心裝置(就是 Client 端)才能從 Service 找到 Characteristic(功能特徵碼),這個特徵碼裡頭會有 Descriptor(內容描述器) 可以取得資料 (value)。

Service(服務分類)

官方標準: https://www.bluetooth.com/specifications/gatt/services 服務分類是分類主題類別,像是: 血壓、運動、健走、心跳、睡眠...etc 這些類別不一樣的東西。

Characteristic(功能特徵碼)

當我們定義或找到分類的時候,底下就會有這個類別擁有的功能,舉些例子 (隨便掰的):

  • 所有血壓服務 (Service)
    • 血壓上限 (Characteristic)
    • 血壓下限 (Characteristic)
    • 平均血壓 (Characteristic)
    • 血壓紀錄 (Characteristic)
    • 心跳 (Characteristic)

或是

  • 所有睡眠服務 (Service)
    • 深層睡眠 (Characteristic)
    • 淺層睡眠 (Characteristic)
    • 睡眠時間 (Characteristic)
    • 呼吸停止時間 (Characteristic)
    • 睡眠心跳 (Characteristic)

這些特徵碼 (Characteristic) 可以定義三種讀寫模式:

  • READ (單一次讀取)
  • WRITE (單一次寫入)
  • NOTIFY (主動且持續接收)

不一定每個 Characteristic 都可以 Write 或 Read 或 Notify,所以要用一些工具來看有沒有提供,像是我使用 BleTerm Scanner & Terminal

Bluetooth 4.0 連接模式可以包含對連(peer-2-peer)模式,或是廣播模式(broadcast),若 GATT Server 採用廣播模式廣播感測器或產品中的值,包在 Characteristic 裡面傳出來,這樣其實 Client 端也不需要對連接,直接從廣播裡面找到值就可以了。

對連裝置可能會有數量理論上限的問題,可是廣播模式就沒有這種問題。

關於 Arduino 101

Arduino 101 的無線配備是 BLE4.0 晶片,然後底層的 Library 是由 Intel 提供叫 Intel Curie 的 Library,主要內建還有速度計和陀螺儀的 Library,可以參考這裡:

CurieIMU: https://www.arduino.cc/en/Reference/CurieIMU

CurieBLE: https://www.arduino.cc/en/Reference/CurieBLE

關於 V07S 手環

可以在 Amazon 商店找到: https://www.amazon.com/Activity-Upgraded-Wristband-Wireless-Bluetooth/dp/B06XY14V1G

V07S 手環官方有提供手機 APP,叫做 HBand 2,基本上,手環要用這個 APP 來更新韌體版本,才能確保研究是可以通用的。

不過手環更新的時候,會很常失敗,所以要多點耐心一直重複更新。

在我研究手環連接的藍芽 Characteristic 之後,發現它似乎沒有按照規範來走,所以我直接拆了官方的 HBand 2.0 apk 來看,結果,你猜怎麼著?

這開發者也太人性化啦! log 直接打中文,輕而易舉的就理解程式在幹嘛,順勢找到了整個 Characteristic 的 Table 了:

這個 Profile 檔案,包含了 Characteristic 定義外,也包含如何開啟服務的 Byte Array 定義,幸好變數寫的特別易懂,整頁印下來對了一遍,就直接拿來測試,找到了功能。

心跳和血壓是在同一個 Service (服務) 裡面,這個服務是: f0080001-0451-4000-b000-000000000000 ,所以我只要探索找到這個服務,就可以利用特徵碼操作。

在這個服務中,通用寫入值來操作功能的特徵碼是: f0080003-0451-4000-b000-000000000000

也就是說只要把這些表中的功能找出來依序寫入,就可以觸發服務,像是(掰的):

  • BloodPressure = (byte)-117
  • BloodPressure_Start = (byte)0 (byte)1
  • BloodPressure_Stop = (byte)0 (byte)0

這些 byte 要轉成 16 進位的 Hex 表示,所以以上的服務,假設要開啟量測血壓,只要寫入:

[0x90, 0x00, 0x01]

就可以打開量測血壓服務,如果輸入:

[0x90, 0x00, 0x00]

就會關閉量測血壓服務。

以上是寫入的特徵碼,換成讀取功能的 Characteristic 特徵碼是: f0080002-0451-4000-b000-000000000000

只要你寫入那些開啟功能的特徵碼進去,就像剛才的血壓開始的 byte 寫入後,你可以採用兩種方式來讀取值:

  • 被動: 狂讀取這個特徵馬碼的內容,要手動撈資料
  • 主動: 用 Notify 模式來撈資料

我這裡就直接用手動的方式,每次迴圈撈一次資料,也就是我一直呼叫 .read() 的方法。

延伸 - 對兩個手環連接

原本只能對單一裝置連接,是因為 Arduino 是只有單一行程,沒辦法開執行緒,所以我採用非同步的方式來連接多個設備。

可以採用 Time 的方式,先讓前 2 分鐘連接第一個 V07S 設備做搜集資料,再換第二個 V07S 設備做搜集資料,不斷輪流執行。

目前我的專案則是設計成可以利用指令 SET 來設定要改用連接哪一個裝置。

但是正在進行量測時,是不能更換裝置的。

後記

我從來沒想過此生會碰到 Bluetooth 4.0 / BLE 之類的東西,以前看到的時候還是抱著關我屁事的感覺,沒想到就真的給他撞上了,我在研究 BLE 時真的碰了還蠻多雷的,這大概也說明研究 BLE 的人或廠商,在包案上為什麼那麼值錢的原因,就連自己到現在也只是懂個協議的皮毛而已。

事實上,這篇文章的順序是整理好的,正確的研究順序,實際上我研究則是倒過來進行的,我則是先:

  1. 拆 Hband 2.0 的 APK 出來看
  2. 讀一下 BLE 協定 (花了 4 天)
  3. 用手機對 V07S 連接 Services,找出對應 Services ,並且發送看看能不能抓到值
  4. 找看看哪些感測器的硬體能連接 (花了 3 天)
  5. 買了 Arduino 101 ,花了 2 天來研究
  6. 成功對 Hband 連接,並且寫程式能夠撈資料

補充

2017-11-5
我到高雄展覽館參展亞洲樂齡智慧生活展,和對面的參展公司 EzTransducer 技術長小聊了一下得知德州儀器的 Sensor Tag 解決方案也可以進行中央對周圍的連接。

而且 TI 德州儀器公司也提供一個 Android APP: Simplelink SensorTag 可以做 BLE 功能調試。

之後,我們買了四片 SensorTag 回來,目前 Sensor Tag 使用的晶片已經到 CC2640R2 是 Bluetooth 5.0 的版本,坑其實越來越大,不過我也不想管了。