2015年3月23日 星期一

BLE 裝置研究 - 小米手環 (1)

最近買了小米手環 (因為他很便宜), 所以 BLE 穿戴裝置研究就從他開始, 關於小米手環介紹可以參考官方網站: 小米手環台灣官網

(*) 我之前還有用過 Garmin Vivofit, 不過它的 BLE 功能有點少, 就只有單純用 BLE 把走路的資訊上傳到手機而已, 所以就不用這個做介紹, 他後來有一新款 Vivosmart, 這款就相對強很多, 用到很多 BLE 功能如 "簡訊/來電等各種 App 通知", "找手機", "提醒" 等等功能, 就強大很多, 有機會借到的話想拿來研究寫一篇研究報告

回到小米手環, 戴起來像這麼樣子, 顯而易見 "沒有螢幕", 所以所有資訊都得透過手機透過 BLE 讀取到才可以看到結果


























簡單列一下小米手環功能:

  1. 活動數據 (今天走了幾步啊), 另外還有其他運動的偵測如跑步, 仰臥起坐等等
  2. 睡眠數據 (幾點開始睡, 睡多久, 淺眠多久, 深眠多久)
  3. 智慧鬧鐘 (震動)
  4. 來電通知 (震動)
  5. 尋找手環 (震動)
  6. 改變 LED 顏色 (紅綠藍橘)
  7. 解鎖 (只能用在小米手機)
以上功能跟 BLE 比較相關的就只有"提醒"這個功能, 例如來電提醒, 尋找手環, 利用的是 IAS (Immediate Alert Service), 關於 IAS 非常簡單, 可以直接看相關的介紹 Bluetooth Immediate Alert Service

簡單貼重點講解, UUID 0x1802, 為 IAS, 這個 Service, 讓 control point (GATT Client) 可以讓 peer device (GATT Server, 有此 Service 的 Device), 發生 Alert, 而 Alert Level 會有三個:
  1. no alert: 不 alert, value 0
  2. mild alert: 就發出一般的 alert, value 1
  3. high alert: 比 mild alert 更強, value 2












下面就是在不用 App 綁定手環下, 我用 App 去連接手環並對 Alert Level 這個 Attribute 寫值的DEMO, 首先看到 Service Discovery 結果會看到 0x1802 UUID 的 Service 也就是 IAS, 他有一個 Alert Level 的 Characteristic, 然後我們就去對他寫值 (0 or 1 or 2 都可以, 不同的 Alert Level), 假如你有類似的穿戴裝置都可以試試看, 你的穿戴裝置就會發生 Alert (震動 or 鈴響等等都可能)


















































另外關於 Pairing / Bonding / Advertisement 的特性, 也想特別提出來跟大家討論, 就我觀察和實驗的狀況大致如下:
  1. Pairing & Bonding
    • 不需要做 Pairing 就可以使用
    • Characteristics Properties 都不用 Authentication
  2. App 綁定手環功能
    • 綁定手環是 App 功能, 他會搜尋附近手環後, 要求你敲手環完成綁定
    • 綁定的目的很重要, 一個是讓 App 記住你的穿戴裝置, 不用每次都盲目搜尋, 另外一個很重要功能是避免你的手還被別人給綁走了 (所以會要求你對穿戴裝置做一點事情, 證明他是你的)
    • 類似功能一般穿戴都會做, 例如 vivofit 是要你在手機上輸入他螢幕顯示的數字來完成綁定
    • 另外根據實驗, 他會說請把手環靠手機, 這算是一個加強的保護 (保護你的手還不被其他手機綁定), 所以 App 應該是會判斷量到手環 RSSI 要夠大 (所以必須很接近手機), 才會進入綁定動作
  3. 綁定前後手環行為比較
    • 小米手環綁定前, 會一直送 Advertisement
    • 綁定後, 則手機 App 會跟手環一值保持連線 (若連線一段時間都沒動作好像就會自己進到 Standby mode, 但不會自己進到 Advertisement Mode), 所以會發現 Scanner 掃不到小米手環
    • 關掉手機藍芽, 就會發現手環回到 Advertisement mode
    • 把小米手環用小米運動 App 解除綁定, 也會發現手環回到 Advertisement mode
    • 強制關閉小米 App (連在背景跑都不行), 也會發現手環回到 Advertisement mode
我原本以為小米手環的綁定會去改變手環行為 (例如改 advertisement interval) 或甚至是把 device address 記住後關閉 advertisement, 不給別人找到這樣, 之後直接用 address 存取, 但實驗後發現我錯了, 其實 Scanner 之所以在綁定後 scan 不到手環單純只是因為手環一值處在 LL connected state (或是跳到 LL standby state if connection lost), 但並不會到 LL Advertising state 所以不會發 advertisement 如下圖所示, 必須要 Android 關機, 藍芽關閉, 小米 App 強制關閉等情況下才會回到 LL Advertising state.

那另一個有趣的問題, 所以假如我用 A 手機綁定手環, 那有辦法用 B 手機也綁定同一個手環嗎, 由上面的討論是 "可以的", 只要讓跟 A 綁定的手環後, 讓手環回 Advertising state (關掉 A 的藍芽), 就可以跟另一台手機 B 綁定了

(Figure captured from Bluetooth SPEC)


















最後就補充一下想米手環綁定的步驟, 給大家參考


























註: 測試時的小米手環韌體版本: v1.0.9.12 (iOS), Android (v1.0.9.14), 我發現 iOS / Android 會搭配不同的韌體版本, 開 App 就會自動更新, 差異在哪邊就不確定

------------------------------------------------------
Copyright by Jackal Chen @ 2015
jackalchen737@gmail.com

相關系列文章:

2 則留言: