注意
本檔詳述通訊協定實作,以透過 Windows 11 上的畫筆數位板,啟用相容的藍牙配對。 此實作指導方針與手寫筆數位板之間所使用的畫筆通訊協定無關,不過,實作可以選擇使用任何具有上行連結功能的畫筆通訊協定,以協助交換此處所述的相關參數。
Device 類別
無縫藍牙配對支援是 Windows 上 Pen 裝置類別的延伸模組。 此實作指南會新增至現有的畫筆裝置實作指南,並著重于實作主機和手寫筆換器之間的必要參數交換。
裝置匯流排連線
請參閱這裡的先決條件指引:通訊協定實作 (pen-protocol-implementation) |Microsoft Docs
必須充分瞭解 HID 通訊協定,才能瞭解這裡提供的資訊。 如需 HID 通訊協定的相關資訊,請參閱下列資源:
Windows 包含 HID 類別驅動程式和對應的迷你埠驅動程式 HID I¹C、HID SPI、HID USB 和 HID BTH 迷你埠驅動程式,因此不需要任何協力廠商迷你埠驅動程式。
畫筆數位板韌體只需要報告本主題中所述的使用方式。 Windows 會利用相容的韌體及其自己的收件匣驅動程式來支援無縫配對體驗。
下面範例報表描述項一節提供範例描述項。
必要的最上層 HID 集合
能夠支援無縫配對的畫筆數位板,應提供最上層集合 (TLC) ,該集合會顯示為廠商特定 (Page 0xFFF4、Usage 0x01) 。 這應該是整合式 Windows 手寫筆集合的同層級 TLC。
數位板的 INF 裝飾加入無縫配對
由於使用此實作指南中的 Microsoft 廠商特定 HID 使用方式,因此畫筆數位板必須明確加入宣告,讓 OS 能夠與公開它們的對應 TLC 通訊。 下面應該會以對應至手寫筆數位板裝置的對等擴充 INF 來裝飾。 以下裝置屬性的存在會發出加入宣告的訊號。
[Digitizer_Device.NT.Interfaces]AddInterface = {4D1E55B2-F16F-11CF-88CB-001111000030},Digitizer_Device.AddInterface
[Digitizer_Device.AddInterface]AddProperty = Digitizer_Device.AddProperty
[Digitizer_Device.AddProperty] ;DEVPKEY_BluetoothOobCouplingChannel_OptInForUse {FE683ED0-DE80-4766-B422-4195993F4330}, 2, 0x11, , 1
裝置功能報告 (使用量0x16)
這是雙向功能報表,這表示主機應該在列舉時將其功能傳達給數位板,然後查詢數位板的功能。 下列使用方式應該出現在裝置功能報告中,以傳達數位板或主機能夠支援無縫配對的手寫筆換器。
這項功能報告將在列舉時傳送並後續擷取。
member | 描述 | 頁面 | 識別碼 | 強制/選用 |
---|---|---|---|---|
支援無縫配對 | 指出數位板是否能夠支援順暢配對的手寫筆換器 (位旗標,其中 1 表示功能) | 0xFFF4 | 0x10 | 強制性 |
裝置藍牙報告 (使用量0x13)
下列使用方式應該出現在裝置藍牙報告中,其會傳達與手寫筆感應器整合之藍牙無線電的相關參數。
此輸入報告只會在無縫配對支援換換器的範圍內傳送一次,並驗證是否已完成與主機的現有配對關聯性。
member | 描述 | 頁面 | 識別碼 | 強制/選用 |
---|---|---|---|---|
裝置藍牙位址 | 與換位器中無線電相關聯的 48 位藍牙 MAC 位址 | 0xFFF4 | 0x02 | 強制性 |
裝置藍牙網址類別型 | 指出裝置藍牙位址是否為公用 | 0xFFF4 | 0x08 | 強制性 |
主機配對存在 | 指出換位器是否已與此主機有現有的配對 | 0xFFF4 | 0x11 | 強制性 |
強制使用方式
裝置藍牙位址
此使用方式必須是 6 個位元組,其中包含與整合至手寫筆換能器之藍牙無線電相關聯的 48 位 MAC 位址。 也就是 11:22:33:44:55:66
裝置藍牙網址類別型
此使用方式應該是旗標,指出主機是否應該將裝置藍牙位址使用方式解譯為由旗標清除 = 0 或旗標 set = 1 所指出的隨機旗標。
無縫配對支援換In-Range
此使用方式應該是旗標,指出是否能夠順暢配對的換換器現在位於旗標集 = 1 所指出 TRUE 的畫筆數位板範圍內。 如果換位器超出範圍或範圍內換位器無法順暢地配對整個輸入報告,則不應該產生。
主機配對存在
此使用方式應該是旗標,指出範圍內是否已經與此主機有剖析關聯性的無縫式換行器。 旗標集 = 1 表示為 TRUE。 如果這個主機沒有配對關聯性,則此旗標應該清除 = 0。
主機藍牙報告 (使用量0x06)
下列使用方式應該出現在主機藍牙報告中,其會傳達主機藍牙無線電的相關參數。
member | 描述 | 頁面 | 識別碼 | 強制/選用 |
---|---|---|---|---|
主機藍牙位址 | 與主機無線電相關聯的 48 位藍牙 MAC 位址 | 0xFFF4 | 0x03 | 強制性 |
主機藍牙網址類別型 | 指出主機藍牙位址是否為公用 | 0xFFF4 | 0x09 | 強制性 |
強制使用方式
主機藍牙位址
此使用方式必須是 6 個位元組,其中包含與主機藍牙無線電相關聯的 48 位 MAC 位址。 亦即 11:22:33:44:55:66
主機藍牙網址類別型
此使用方式必須是旗標,指出主機藍牙位址使用方式是否應該由數位板解譯,並以旗標 clear = 0 表示的公用,或由旗標集 = 1 所指出的隨機表示。 注意:在 Windows 上,這一律為公用類型,且旗標 clear = 0。
將索引鍵報表 (使用量0x15)
member | 描述 | 頁面 | 識別碼 | 強制/選用 |
---|---|---|---|---|
主機配對金鑰 | 主機提供的 128 位配對金鑰 | 0xFFF4 | 0x14 | 強制性 |
裝置藍牙位址 | 與感應器中無線電相關聯的 48 位藍牙 MAC 位址 | 0xFFF4 | 0x02 | 強制性 |
裝置藍牙網址類別型 | 指出裝置藍牙位址是否不是公用 | 0xFFF4 | 0x08 | 強制性 |
強制使用方式
主機配對金鑰
此使用方式必須是 16 個位元組,其中包含主機所發出的 128 位暫存配對金鑰,以協助順暢配對先前回報的能換換器。 如果主機已鎖定/保護或無法順暢配對,則主機絕不會發出配對金鑰報告。
裝置藍牙位址
這是上述裝置藍牙報表的相同用法,不過主機會使用此報告來指出此報表中的主機配對金鑰與數位板同時支援多個藍牙手寫筆的案例中相關聯的藍牙裝置。
裝置藍牙網址類別型
這是上述裝置藍牙報告的相同使用量,並搭配裝置藍牙位址作為主機配對金鑰索引編制的一部分。
預期的序列
1. 列舉
在Windows 10或Windows 11作業系統上,Microsoft [廠商特定] 藍牙頻外集合將在列舉後由內建 OS 服務開啟。 主機接著會針對主機藍牙報告發出 SET FEATURE,其中包含主機藍牙位址和主機藍牙網址類別型。 然後主機也會針對裝置功能報告發出 GET FEATURE。 如果數位板未傳回此報表或傳回 0,則不會發生與無縫配對相關的進一步動作。
2.無縫式手寫筆In-Range
一旦無縫可用的手寫筆已進入數位板範圍,以及是否已確定任何與主機藍牙位址的現有配對關聯性,則裝置藍牙輸入報告應該一次發出一次,並具有所有必要用法。
注意
如果數位板範圍內的手寫筆無法順暢地啟用,則不會發出任何輸入報告。 如果無縫配對的手寫筆超出範圍,則不預期透過此報告提供超出範圍指示。 指定順暢裝置的狀態機器在每次收到輸入報表時,都應該重設其藍牙位址。
數位板韌體如何從感應器取得裝置藍牙位址相關的參數的機制是畫筆通訊協定特定且內部由個別規格所定義的 (,也就是 MPP 2.6、AES 2.1)
3.主機配對金鑰產生
如果裝置藍牙報告指出該筆範圍內沒有與此主機的現有配對關聯性,則前提是主機未鎖定/安全,則裝置藍牙位址應產生暫時配對金鑰。 主機接著應該發出包含主機配對金鑰的配對金鑰輸出報告。
注意
在Windows 10上,OS 服務不支援無縫配對,因此永遠不會提供主機配對金鑰,因此永遠不會發出此輸出報告。
數位板韌體如何為感應器的藍牙無線電提供暫存配對金鑰的機制是畫筆通訊協定特定且內部由個別規格所定義的 (,也就是 MPP 2.6、AES 2.1)
4.配對
當主機發出具有配對索引鍵的輸出報告之後,它最多會等待 30 秒的公告。 接著,手寫筆的藍牙連線應該會將可連線的「導向廣告」傳送給主機藍牙無線電,以形成連線,然後讓主機起始配對作業,以指定超出訊號範圍的 OOB () 方法。 此時,手寫筆的藍牙無線電會透過 SET FEATURE 報告) 確認主機位址與其 (收到的位址相同,然後提供適當的配對回應,包括暫存金鑰。 主機藍牙無線電會驗證暫存金鑰,並在成功時,手寫筆和主機會交換會話加密金鑰,並完成配對作業。
如果配對成功,下次畫筆回到範圍時,裝置藍牙輸入報告應該表示主機配對存在 = 1 (TRUE) 。
範例報表描述元
//Microsoft Bluetooth Out-of-Band TLC
0x06, 0xF4, 0xFF, // Usage Page (Vendor Defined 0xFFF4)
0x09, 0x01, // Usage (0x01)
0xA1, 0x01, // Collection (Application)
0x09, 0x16, // USAGE (Device Capability Report)
0xA1, 0x02, // COLLECTION (Logical)
0x85, 0x70, // REPORT_ID (0x70)
0x09, 0x10, // USAGE (Seamless Pair Capable)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x01, // REPORT_COUNT (1)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0xB1, 0x02, // FEATURE (Data,Var,Abs)
0x75, 0x07, // REPORT_SIZE (7)
0x95, 0x01, // REPORT_COUNT (1)
0xB1, 0x01, // FEATURE (Const,Var,Abs)
0xC0, // END_COLLECTION
0x09, 0x06, // USAGE (Host Bluetooth Report)
0xA1, 0x02, // COLLECTION (Logical)
0x85, 0x56, // REPORT_ID (0x56)
0x09, 0x03, // USAGE (Host Bluetooth Address)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0xFF, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x06, // REPORT_COUNT (6)
0xB2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf)
0x09, 0x09, // USAGE (Host Bluetooth Address Type)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x01, // REPORT_COUNT (1)
0xB1, 0x02, // FEATURE (Data,Var,Abs)
0x75, 0x07, // REPORT_SIZE (7)
0x95, 0x01, // REPORT_COUNT (1)
0xB1, 0x01, // FEATURE (Cnst,Ary,Abs)
0xC0, // END_COLLECTION
0x09, 0x13, // USAGE (Device Bluetooth Report)
0xA1, 0x02, // COLLECTION (Logical)
0x85, 0x6E, // REPORT_ID (0X6E)
0x09, 0x02, // USAGE (Device Bluetooth Address)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0xFF, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x06, // REPORT_COUNT (6)
0x82, 0x02, 0x01, // INPUT (Data,Var,Abs,Buf)
0x09, 0x08, // USAGE (Device Bluetooth Address Type)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x09, 0x11, // USAGE (Host Pairing Exists)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x75, 0x06, // REPORT_SIZE (6) [PADDING]
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x01 // INPUT (Cnst,Ary,Abs)
0xC0, // END_COLLECTION
0x09, 0x15, // USAGE (Pairing Key Report)
0xA1, 0x02, // COLLECTION (Logical)
0x85, 0x6f, // REPORT_ID (0X6F)
0x09, 0x02, // USAGE (Device Bluetooth Address)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x06, // REPORT_COUNT (6)
0x92, 0x02, 0x01, // OUTPUT (Data,Var,Abs,Buf)
0x09, 0x08, // USAGE (Device Bluetooth Address Type)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x01, // REPORT_COUNT (1)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0x75, 0x07, // REPORT_SIZE (7)
0x95, 0x01, // REPORT_COUNT (1)
0x91, 0x01, // OUTPUT (Cnst,Ary,Abs)
0x09, 0x14, // USAGE (Temporary Key)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0xFF, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x10, // REPORT_COUNT (16)
0x92, 0x02, 0x01, // OUTPUT (Data,Var,Abs,Buf)
0xC0, // END_COLLECTION