POSTS
制霸 IoT 30Day! Day 17 藍芽偵測使用
藍芽 Bluetooth
今天介紹一下藍芽 Bluetooth 目前大多的裝置採用的藍牙標準(Bluetooth 4.0 以上)所有標準由藍牙技術聯盟(Bluetooth SIG),特色就是省電。分別有 BLE「低功耗藍牙」、「傳統藍牙」和 HS「高速藍牙」三種模式。
藍芽 Bluetooth 規格
傳輸協定表格此表可以很快看清楚: | 傳輸協定 | 規格 | 適用藍芽版本 | 狀態 | Adoption Date | | ——– | ———– | —– | ——– | ——– | | AVCTP | A/V Control Transport | 1.4 | Active | 24 July 2012 | | AVDTP | A/V Distribution Transport | 1.3 | Active | 24 July 2012 | | BNEP | Bluetooth Network Encapsulation Protocol | 1.0 | Active | 20 February 2003 | | IrDA | IrDA Interoperability | 2.0 | Active | 26 August 2010 | | MCAP | Multi-Channel Adaptation Protocol | 1.0 | Active | 26 June 2008 | | RFCOMM | RFCOMM | 1.2 | Active | 06 November 2012 |
藍芽 GATT
通用屬性配置文件(GATT)建立在屬性協議(ATT)的基礎上,並為屬性協議所傳輸和存儲的數據建立了通用操作和框架。定義了很多服務。
健康護理規範:「藍牙低功耗」裝置在醫療領域中有許多規範。康體佳健康聯盟促進了他們與藍牙技術聯盟的合作。
- BLP(Blood Pressure Profile)— 用於血壓測量。
- HTP(Health Thermometer Profile)— 用於醫療溫度測量裝置。
- GLP(Glucose Profile)— 用於血糖監測。
- CGMP(Continuous Glucose Monitor Profile)
運動和健身規範包括:
- BCS(Body Composition Service)
- CSCP(Cycling Speed and Cadence Profile)— 用於連接到自行車或健身單車感測器,測量節奏和輪速
- CPP(Cycling Power Profile)
- HRP(心率規範)
- LNP(位置和導航規範)
- RSCP(Running Speed and Cadence Profile)
- WSP(Weight Scale Profile)
網際網路連接:
- IPSP(網際網路協定支援規範)
通用感測器:
- ESP(環境感應規範)
- UDS(用戶資料服務)
HID 連接:
- HOGP(HID 通過 GATT 規範)使藍牙低功耗的無線滑鼠、鍵盤或其他裝置可獲得持久的電池續航時間。
接近感應: 「Electronic leash」非常適合為「始終開啟」的裝置儘可能延長電池壽命。iBeacon 裝置的製造商為其裝置實現了相應規範,確保與蘋果公司裝置的接近感應功能相容。
有關的應用程式規範包括:
- FMP — 「尋找我」規範 — 允許使用另一個裝置讓一個裝置發出提醒。
- PXP — 接近度規範 — 允許接近感應器檢測接近報告器是否在附近。物理接近度可以使用無線電接收器的 RSSI 值估算,儘管這不是經過絕對校準的距離。一種典型設計是,裝置之間的距離超過設定閾值時發出提醒。
提醒和時間規範: 手機提醒狀態規範和提醒通知規範允許用戶端裝置接收通知,例如另一台裝置發來的來電通知。 時間規範允許用戶端裝置設定採用伺服器裝置的目前時間和時區資訊,例如手錶與手機之間的網路時間。
電池: 電池服務(Battery Service)報告「電池狀態」和裝置中單個電池或電池組的電量級別。
藍芽 GATT 操作
GATT 協定提供了大量用於用戶端的命令以發現有關伺服器的資訊。這包括:
- 發現所有主要服務的 UUID
- 使用指定 UUID 尋找一個服務
- 尋找指定主服務的輔助服務
- 發現指定服務的所有特徵
- 尋找匹配指定 UUID 的特徵
- 讀取特定特徵的所有描述符
除此之外,也提供讀(從伺服器傳輸到用戶端)和寫(用戶端傳給伺服器)特徵值的命令:
可以指定特徵的 UUID 或控制代碼(handle)值(由上面的發現命令返回)來讀取值。
寫操作始終需要以控制代碼來標識特徵,但可選是否需要伺服器返迴響應。
長讀(Long read)和長取(Long write)可以在特徵的資料長度超過無線鏈路的最大傳輸單元(MTU)時使用。
最後,GATT 有提供通知(notifications)和指示(indications)。用戶端可以請求伺服器通知一項特徵。伺服器可以在其變為可用時將該值傳送給用戶端。例如,溫度感測器的伺服器可以在每次測量時通知其用戶端。這得以避免用戶端輪詢伺服器,造成伺服器的無線電路保持執行。
指示(indication)與通知類似,不同之處是它需要用戶端回應已收到該訊息。
那我們實繼操作:
pi@ras2:~ $ sudo hcitool lescan
LE Scan ...
3F:5B:7D:80:B0:D1 LYWSD02
88:0F:10:8F:76:7E MI_SCALE
pi@ras2:~ $ gatttool -I -b 88:0F:10:8F:76:7E
[88:0F:10:8F:76:7E][LE]> connect
Attempting to connect to 88:0F:10:8F:76:7E
Connection successful
試試 blescan:
pi@ras2:~ $ sudo apt-get install python-pip libglib2.0-dev
pi@ras2:~ $ sudo pip3 install bluepy
pi@ras2:~ $ sudo pip3 install paho-mqtt
pi@ras2:~ $ sudo blescan
Scanning for devices...
Device (new): 3f:5b:7d:80:b0:d1 (public), -42 dBm
Flags: <06>
Incomplete 16b Services: <0000181a-0000-1000-8000-00805f9b34fb>
Complete 16b Services: <0000fef5-0000-1000-8000-00805f9b34fb>
16b Service Data: <95fe70205b04d3d1b0807d5b3f090610023002>
Complete Local Name: 'LYWSD02'
Device (update): 4a:86:e0:30:a8:e0 (random), -51 dBm (not connectable)
Complete 16b Services: <0000fe9f-0000-1000-8000-00805f9b34fb>
16b Service Data: <9ffe0000000000000000000000000000000000000000>
Manufacturer: <e000003eca708bb7>
Device (new): 88:0f:10:8f:76:7e (public), -63 dBm
Flags: <06>
Incomplete 16b Services: <0000181d-0000-1000-8000-00805f9b34fb>
Complete Local Name: 'MI_SCALE'
16b Service Data: <1d18820000e0070a0f031d30>
Manufacturer: <5701880f108f767e>
pi@ras2:~ $
再來試試 bluetoothctl 這工具
pi@ras2:~ $ sudo bluetoothctl
[NEW] Controller B8:27:EB:C9:C4:A8 ras2 [default]
[NEW] Device 4C:65:A8:DA:1F:CC MJ_HT_V1
[bluetooth]# scan on
Discovery started
[CHG] Controller B8:27:EB:C9:C4:A8 Discovering: yes
[NEW] Device 3F:5B:7D:80:B0:D1 LYWSD02
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Key: 0000fe95-0000-1000-8000-00805f9b34fb
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x50
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x20
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0xaa
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x01
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0xc3
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0xcc
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x1f
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0xda
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0xa8
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x65
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x4c
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x0d
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x10
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x04
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x15
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x01
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x18
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x02
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Key: 0000ffff-0000-1000-8000-00805f9b34fb
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0xe7
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x9f
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x80
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x0e
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0xa2
[CHG] Device 4C:65:A8:DA:1F:CC ServiceData Value: 0x1e
[NEW] Device 4F:95:B6:D2:87:29 4F-95-B6-D2-87-29
[NEW] Device 88:0F:10:8F:76:7E MI_SCALE
[bluetooth]# quit
[DEL] Controller B8:27:EB:C9:C4:A8 ras2 [default]
pi@ras2:~ $
結語
今天介紹 藍芽 Bluetooth 基本架構與簡單的偵測使用。