BLE HID簡介


http://www.usb.org/developers/hidpage/

https://www.bluetooth.com/specifications/gatt/characteristics


簡述

HID設備,即人機交互設備,常見的有鼠標,鍵盤,遊戲手柄,等等。一般有線方式都是通過USB連線連接到機器設備,作爲用戶輸入設備。在藍牙技術中,HID設備的接入就是無線的了。但 BLE HID 規範是以 USB HID 規範爲基礎的 ,不然設備驅動,兼容等問題都會有很多麻煩了。藍牙中有HID, HOGP profile,但是只是在藍牙數據通信上做的規範,HID具體含義相關,還是需要看USB相關的HID文檔。


下面說的 host 和 device, 是 USB 中的角色概念。 
HOST 就相當於 PC 主機, 而 device就相當於鼠標,鍵盤這些 USB 外設。
ble hid 中,可以看做藍牙設備就是 device,而手機就是 host。

爲什麼藍牙設備發送數據卻稱爲輸入報告,這是因爲在 USB 規範中,Input output 都是相對與 host 來說的,輸入到 host 的數據稱爲 input,host 輸出的數據稱爲 output。


一、HID Reports Bluetooth HID devices支持三種Report:Input, Output, Feature。
Input Reports,輸入報告
Ble 中,表示 Bluetooth HID device 發送數據給 Bluetooth HID Host.
USB 中輸入報告通常通過 中斷輸入端點來傳輸。當然也可以通過 控制端點由 HOST 使用 GET REPORT 控制傳輸請求來獲取數據,即host 先發送 get report 命令,device 隨後回覆 input report,之後 host 會回覆一個狀態(0 字節數據表示成功)。
Output Reports,輸出報告
Ble 中表示 Bluetooth HID Host.發送數據給 Bluetooth HID device.
USB 中輸出報告通常通過 中斷輸出端點來傳輸。當然也可以通過 控制端點由 HOST 使用 SET REPORT 控制傳輸請求來發出數據,即HOST 先發送 set report 命令,隨後 HOST 發送待發送的數據,最後 DEVICE 回覆一個狀態(0 字節表示成功)。
Feature Reports,特徵報告
Ble 中雙向數據通道
USB 中只能通過控制端點來傳輸雙向數據, HOST 使用 GET REPORT 來從 DEVICE 獲取數據,或者 HOST 使用 SET REPORT 發送數據給 DEVICE。


二、HID channel 
Control Channel和Interrupt Channel兩個通道。report可以在這兩條channel上傳輸,在Control channel上傳輸的report稱爲synchronous reports ;在Interrupt channel上傳輸的report稱爲asynchronous reports。
Feature reports are always transferred synchronously using GET_REPORT or SET_REPORT requests。


三、HID Report Modes
對於接受和發送的report有兩種協議, 一種爲boot protocol另一種爲report protocol。注意 不要將這兩種協議和 Bluetooth HID Protocol 相混淆。
Bluetooth HID Protocol 是描述 report 如何在 BT hid host 和 BT hid device 之間傳輸的協議。而 boot protocol 和 report protocol 描述的是發送 report 時如何組織,接收 report 時如何解析的協議。
Boot protocol 和 report protocol 的區別:
不明白的可以簡單把 boot protocol 看做 report protocol 的子集。
BT hid 協議是基於 USB HID 協議的。 USB HID 協議中存在 兩種特殊設備 鼠標和鍵盤。
如果你的 HID 設備是鼠標或者鍵盤,那麼可以設置支持 boot protocol 協議,這樣在PC BIOS 運行過程中就可以 識別 你的鼠標和鍵盤,而不必等到系統完全系統後,因爲 boot protocol 不解析 report descriptor(報告描述符) ,他的數據格式是固定的,按照它的格式發送數據就可以被解析鼠標的移動或者鍵盤的按鍵。當系統完全啓動後,PC 會復位 USB 設備,並且設置爲 report protocol。因爲完全啓動後 USB 的枚舉會解析你的 報告描述符,所以這個時候你就可以按照你定義的方式來 傳輸 鼠標鍵盤數據,而不是 boot protocol 固定的數據格式。
如果你的是非鍵盤/鼠標 的 HID 設備,比如就是用來傳輸自定義數據的,那麼就不要設置 boot protocol 協議,那麼只有系統完全啓動後才能識別你的 HID 設備,並根據枚舉階段的報告描述符 理解你發送的數據。
所以綜上 boot / report protocol 的區別在於 boot 是數據格式和長度是固定的,數據表示什麼意思也是固定的,所以不需要 報告描述符,而 report 需要根據 報告描述符才能 ,因爲他需要根據報告描述符才能理解之後接收的報告數據的具體含義。
另外對於鍵盤 report protocol 相對於 boot protocol 支持更多的按鍵值。比如一些特殊的按鍵 F13-F22 等。


四、Bluetooth HID Protocol Messages
這些message不能超過L2CAP的MTU,大小超過MTU的message將被忽略。


五、BLE HID  服務 :手冊 HIDS-V1.0.0-(HID-Service).pdf
HID 服務 UUID 爲標準規範,爲 0x1812
數據的發送都是放在”報告中”,USB 中通過各個”端點”來收發數據。
ble 中即通過 HID 服務下面的各個 characteristic 來傳輸和接收 HID 的報告數據。

例如 boot protocol 模式下,鍵盤和鼠標在 USB HID 和 ble HID service 中的特性的對應關係:
USB 中的鍵盤 input report,即鍵盤向 PC 發送按鍵值,而 ble hid 中對應則有一個 特性,這裏可以稱之爲 input report 特性。 具有發送數據的功能,以通過 ble 來發送鍵盤數據。
USB 中的鍵盤 output report, 即 PC 向鍵盤發送 指示燈亮滅狀態。 BLE 中也有一個對應的 特性,其具有接收功能,則可以通過 ble 來接收數據。

同理, USB 鼠標中的 input report, 在 ble 中也對應一個 特性, 具有發送功能以便發送鼠標數據。如下圖所示:


HID 服務下包含完整特性如下表所示,有些特性是可選擇的,有些是必須的。



下面一一解釋這些特性有什麼用:
更多特徵查看 : https://www.bluetooth.com/specifications/gatt/characteristics
1、Protocol Mode Characteristic :

該特性的特性值用來指示當前 hid 服務 是 boot protocol 模式還是 reportprotocol 模式。

2、Report Characteristic :

該特性可以看做 用來傳輸上面所說的 input report,output report,和 feature report.
所以一般 BLE HID 服務下面會存在多個 report characteristic。
比如鍵盤通常會傳輸 鍵盤按鍵的 input report,和 LED 燈的指示 out report,那麼在 BLE HID 服務下面就可以有 2 個該特性,一個用來傳輸 input report,另一個用來傳輸 output report。
上面說過,input report 是 ble device 發送數據給手機(ble host),Output report 是 手機發送數據給設備。
所以用來傳輸 input report 數據的 那個Report Characteristic就至少需要有notify功能,傳輸 output report 數據的 那個 Report Characteristic 就至少需要有 write功能。 同理如果有 用來傳輸 feature report 的 Report Characteristic,那麼至少要支持 read 和 write,因爲 feature report 是雙向的。

PS: 這 裏 的 read/write/Write Without Response/notify 與 USB HID 中 的 getreport/set report/output data/input data存在一個映射關係,這裏就不介紹了。說多了反而容易混亂, 只需要按BLE 的來理解就行了。
既然一個BLE HID服務下面存在多個Report Characteristic,並且其UUID均是0x2A4D,那怎麼區分哪一個是用來傳輸 input report,哪一個是用來傳輸outputreport? 通過其是否具有讀,寫,notify功能?這樣顯得不是那麼”正規”所 以 爲 了 區 分 各 個characteristic 是 用 來 傳 輸 什 麼 類 型 的 report, 每 個characteristic都有一個相關的描述符,稱爲Report Reference Characteristic Descriptor,該描述符就是用來指示,這個characteristic是用來傳輸什麼類型的report的。
該描述符值爲2字節,分別表示 report ID和report type,如下圖



3、Report Map Characteristic

在 USB HID 中,除了鍵盤/鼠標,可以支持 boot protocol 模式外,其他 HID 設備是不支持的。
非 boot protocol 模式下的 input report, output report 傳輸的數據格式和長度都是可變的, 那麼比如 USB host 收到了 USB device 的 input report 數據後他如何理解數據?這就需要 報告描述符。
報告描述本身就是一串有一些格式規則的數據,其內容數據的作用就是描述report protocol 模式下傳輸的 report 的數據的格式和作用。
所以同理 BLE HID 下也是需要這個 報告描述符。 其就是存在 Report mapcharacteristic 中的。
該 characteristic 中也可以存在一個特殊的描述符, 稱爲 External Report Reference Characteristic Descriptor。
該描述符的作用是 指示另一個服務中的 characteristic,其下傳輸的數據也可以用 map characteristic 中的報告描述符來解析數據。 一般都不會用到。

4、Boot Keyboard Input Report Characteristic

當 BLE HID 設備是鍵盤時,並且工作在 boot protocol 模式下時,可以用該characteristic 來傳輸鍵盤按鍵值,其格式和長度是固定的,前面有描述。


5、Boot Keyboard Output Report Characteristic

當 BLE HID 設備是鍵盤時,並且工作在 boot protocol 模式下時,可以用該characteristic 來傳輸鍵盤指示燈狀態,其格式和長度是固定的,前面有描述。


6、Boot Mouse Input Report Characteristic

當 BLE HID 設備是鼠標時,並且工作在 boot protocol 模式下時,可以用該characteristic 來傳輸鼠標數據,其格式和長度是固定的,前面有描述。


7、HID Information Characteristic


 
用來放置一些 HID 信息:分別爲版本號,設備目的國家的識別碼,特性標誌。
Flags:
remoteWake--指示 HID device 是否可以發送喚醒信號給 HID HOST。USB 中,比如鍵盤和電腦連接,電腦進入睡眠後,USB 就被掛起了,可以通過鍵盤發送喚醒信號,來喚醒電腦。Ble 中睡眠概念沒弄清,實際測試無論設置 false 還是 true。將手機鎖屏後,設備發送按鍵值時手機都會亮屏。沒明白其作用。
normallyConnectable—指示 HID device 已綁定但是沒連接的情況下是否可以廣播,這個也沒搞清具體用途,廣播不是固件自己控制麼。


8、HID Control Point Characteristic

該特性用來指示 HID HOST 的狀態。
0x00 通知 HID device,HID host 進入 掛起狀態或退出掛起狀態。PC USB中點擊電腦的睡眠, USB就進入掛起狀態了, 喚醒後就是退出掛起狀態。BLE 中實際測試 鎖屏時,手機並未發送 suspend 信息給 設備,亮屏時也沒發送退出掛起信息。所以鎖屏並不是進入掛起。沒搞清什麼情況下進入掛起狀態。



9、HID與L2CAP的交互:













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章