淺談 BLE 控制點屬性

一、概述

藍牙產品在開發過程中,常常會涉及到低功耗的處理,在沒有數據需要上報或者設備斷開藍牙的情況下,可能需要對設備進行功耗上的優化,那麼,有沒有一種情況是可以實現主機端對設備通知進入 Suspend 的呢? 當然有,那就是 HID Control Point。以下我們就來講控制點屬性這一概念,大多數人可能會覺得比較陌生,簡單來說,它可以應用在 HID 藍牙設備上,例如藍牙鍵盤或鼠標,僅當主機端支持掛起模式時,主機可以通過該特性通知設備去進入掛起模式。

二、應用場景

在 HID 鍵鼠產品開發中,我們所涉及到的控制點屬性主要有 Service Change 和 HID Control Point,前者主要是需要向連接設備指示服務已經更改(即添加、刪除或修改)。本文主要講的是 HID Control Point,該控制點屬性是不能讀取,但只能寫入、通知或指示,這些屬性可以被更改層使用來啟用設備特定的過程,例如命令的寫入或設備上給定過程完成時的指示。比如在藍牙鍵盤與 MAC 電腦連接時,MAC 電腦進入睡眠後,會通過該特性給鍵盤端發一個 Suspend 的通知,如果在特定時間內用 MAC 電腦鍵盤喚醒電腦,MAC 電腦也會給鍵盤端發送一個 Exit Suspend 的通知,告知設備現在主機已退出睡眠,在整個流程中,鍵盤是始終與 MAC 電腦保持藍牙連接的,也是與一般 Windows 電腦不同的一點。

三、規範要求說明

控制點特性是通過客戶端即主機端去向該服務寫入值的,服務會將這個立即使用寫入的值,在其被消耗之後不必存儲該值。簡單理解就是一個即時通知的屬性,設備並不用理會是哪個主機對控制點發號施令的,只需按照寫入控制點的指令進行操作即可。

HID Control Point 特性用來指示 HID Host 的狀態,由下圖可知,在被寫入 0x00 時通知 HID Device,此時 HID Host 進入了掛起狀態。在寫入 0x01 時通知 HID DEVICE,此時 HID Host 退出了掛起狀態。協議中規定了設備時不需要接收該狀態指示命令後對主機進行回復的,所以其特性權限需要設定為 gGattCharPropWriteWithoutRsp_c。


圖一

對於 WriteWithoutResponse 權限要求,當使用該權限 (ATT Write Command) 寫入屬性時觸發 gEvtAttributeWrittenWithoutResponse c。因為這個過程不需要響應,所以應用程序可以處理它,如果必要的話,還可以將它寫入資料庫。不管該值是否有效,應用程序都不需要響應。掛起操作允許藍牙 HID Host 明確地通知藍牙 HID Device不再需要正常的性能,並且它可以下電不需要喚醒系統的邏輯,這時 HID Device 可以進入休眠狀態或者選擇性地斷開與 HID Host 的連接,這取決於應用程序的設定。

查看《HID over GATT Profile Specification》文檔的 HID Host 要求和行為章節可知,如果 HID Host 支持掛起模式,那麼其 HID Device 也必須支持 HID Control Point特性。


圖二


四、代碼示例

在 NXP QN9080 BLE HID Device 例程中,它實現了藍牙鼠標的基本功能,可以通過查看 gatt_db.h 文件能夠發現設備端支持 HID Control Point 特性,如下所示:

    CHARACTERISTIC(char_hid_control_point, gBleSig_HidCtrlPoint_d, (gGattCharPropWriteWithoutRsp_c) )
VALUE(value_hid_control_point, gBleSig_HidCtrlPoint_d, (gPermissionFlagWritable_c), 1, 0x00)

在 BleApp_GattServerCallback 函數中我們可以找到該特性對應的回調函數事件,即 gEvtAttributeWrittenWithoutResponse_c,事件中會將從主機下發的特性值

傳到相應的處理函數中。

static void BleApp_GattServerCallback (deviceId_t deviceId, gattServerEvent_t* pServerEvent)

{
uint16_t handle;
uint8_t status;

switch (pServerEvent->eventType)
{
case gEvtAttributeWritten_c:
case gEvtAttributeWrittenWithoutResponse_c:
{
handle = pServerEvent->eventData.attributeWrittenEvent.handle;
status = (uint8_t)gAttErrCodeNoError_c;

if (handle == (uint16_t)value_hid_control_point)
{
status = Hid_ControlPointHandler((uint16_t)service_hid, pServerEvent->eventData.attributeWrittenEvent.aValue[0]);
}
(void)GattServer_SendAttributeWrittenStatus(deviceId, handle, status);
}
break;
default:
; /* For MISRA Compliance */
break;
}
}

通過該特性值可以指示設備進入 gHid_Suspend_c 或 gHid_ExitSuspend_c 事件,即主機處於掛起狀態或者主機退出掛起狀態的情況。

uint8_t Hid_ControlPointHandler(uint16_t serviceHandle, hidControlPointValues_t value)
{
uint8_t retStatus = (uint8_t)gAttErrCodeNoError_c;

switch (value)
{
case gHid_Suspend_c:
break;

case gHid_ExitSuspend_c:
break;

default:
retStatus = (uint8_t)gAttErrCodeRequestNotSupported_c;
break;
}

return retStatus;
}

我們可以在相應函數下添加列印事件去觀察結果,目前發現只有 MAC 電腦支持該掛起模式,所以用 MAC 電腦來測試該特性。以下為開發板和 MAC 電腦在測試中的列印結果:

[14:34:08.333]收一>ADV
[14:34:22.710]收<-Bas_RecordBatteryieasurement
[14:34:25.730]收<-gEytAttributeWrittenWithoutResponse_c: gHid Suspend_c
[14:36:05.543]收<-gvtAttributeWrittenWithoutResponse_c: gHid Suspend_c
[14:36:37.930]收<-gEytAttributeWrittenWithoutResponse_c: gHid Suspend c
[14:38:07.013]收<-PB2
[14:38:08.681]收<-Bas RecordBatterylleasurement
[14:38:16.828]收<-gEytAttributeWrittenWithoutResponse_c: gHid Suspend_c
[14:38:22.262]收<-gEvtAttributeWrittenWithoutResponse_c: gHid ExitSuspend_c
[14:38:26.806]收<-EvtAttributeWrittenWithoutResponse_c: gHid Suspend_c
[14:38:37.090]收<-gEvtAttributeWrittenWithoutResponse_c: gHid ExitSuspend c
[14:38:40.409]收<-Bas RecordBatteryleasurement
[14:38:42.782]收<-gEvtAttributeWrittenWithoutResponse_c: gHid Suspend_c
[14:38:55.258]收<-gEytAttributeWrittenWithoutResponse_c: gHid ExitSuspend c
[14:39:00.028]收<-gEytAttributeWrittenWithoutResponse_c: gHid Suspendc

由於該特性不能讀取,只能寫入,設備端是只能夠被動接收該值的,我們也可以看到每一次主機端進入掛起狀態或退出掛起狀態時都會觸發相應的事件。

五、總結

通過以上講解,相信大家對控制點屬性已經有了初步的理解,以後可能會有越來越多的設備支持這一掛起模式,所以我們的藍牙設備端也是需要去兼容這部分功能的。

六、參考資料

【1】HID_BLE_GATT.PDF

【2】HIDS_SPEC_V10.PDF

【3】低功耗藍牙開發權威指南(中文版).PDF

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論