文章總列表

假日藍芽工程師, 先動起來再說

前言
在Internet上找了又找 ,用這幾個關鍵字"Raspberry Pi, BLE"或著"BLE Linux"之類的,最後我找到兩篇文章很好用。只要著做,我的心跳感應器就會動了。只是我完全不懂藍牙的協定, 這讓人有點不舒服。

身為一枚假日藍牙工程師,有時候我就是得在弄清楚一切之前,就先讓東西動起來。所以我決定先把發現的事寫下來,之後再找答案。


gatttool
這個tool是Bluez套件的其中一部份。在找資料的過程中,GATT/ATT這兩個關鍵字反覆出現。之後再搞清楚他們的意思吧。

在前一篇文章提到怎麼用"hcitool lescan"找出裝置的MAC address,然後就可以用gatttool和心跳帶建立連線:



在tool的視窗裡,打help就可以看它提供的功能。身為一個好奇的假日工程師,我每個都有試玩過。



Primary這道命令很有趣,他會列出裝置支援的所有服務。我檢查所有UUID之後,在藍牙開發者網站找到一份資料,解析每個服務的意思。底下標紅字的是心跳服務,證明我的裝置真的是藍牙心跳感應器。
  • 0x1800, Generic Access
  • 0x1801, Generic Attribute
  • 0x180D, Heart Rate
  • 0x180F, Battery Service
  • 0x180A, Device information
"attr handle"這個字串看起來很像是某個表格的index。


下一道command是"char-desc",他會產生一張表格, 列出所有的handles。交叉比對上下兩張圖,Primary指令裡列出的handle 0/8/9/11/15,在下面的表格裡,UUID正好都是0x2800。藍牙規格網站 裡面說0x2800是"Primary Service",好像這些東西互相有些關聯。

我找了一堆網頁,似乎有fu能搞清楚他們互相之間的關係。等搞清楚了再另外寫一篇文章。


最後的高潮來了,這篇文章指出要把UUID = 0x2902的項目設成 0100。上表滿足的handle是0x0C和0x14。經過實驗,最後設定handle[0x0C] = 0100就可以啟動心跳表的notification功能,週期性的回報資料。


Notification的方向是從心跳表送出資料到主機端(RPi),主機端會把收到的資料印出來。因為我很用功,所以也找到 網頁解釋怎麼解析資料。

底下的範例是上圖第一發notification,0x16 0x42 0xA1 0x03 的翻譯
  • 0x16
    [bit0] 0:heart rate value is UINT8, 1:heart rate value is UINT16
    [bit2:1] 3:Sensor contact feature is supported
    [bit3] 0: Energy expanded field is not present
    [bit4] 1: One or more RR-interval values are present. Unit = 1/1024 seconds
  • 0x42
    Heart rate measure value, 66 in decimal
  • 0xa1 0x03
    The heart rate interval is 0x3A1 = 929 / 1024 seconds
    60sec / (929/1024) = 66 (heart rate)
BLE的資料封包算是滿緊湊的, 第一個byte是一個header,記載後面跟著的資料格式(可變長度)。上面解析出來的心 跳數看起來滿合理的(66) 。終於把RPi和心跳表連起來,讀得到心跳表的數值了。

留言

這個網誌中的熱門文章

STM32 UART + DMA,使用HAL實作TX/RX,以及不定長度接收

幼犬書桌椅選擇心得 升降桌 兒童桌椅

CANON G3000 廢墨瓶改裝