Microsoft定義的藍牙 HCI 擴充功能
藍牙主機控制器介面 (HCI) 會指定主機與藍牙無線電控制器之間的所有互動。 藍牙規格可讓廠商定義的 HCI 命令和事件在主機和控制器之間啟用非標準互動。 Microsoft定義 Windows 取用的廠商特定 HCI 命令和事件。 藍牙控制器實作者可以使用這些擴充功能來實作特殊功能。
需求
藍牙 HCI 命令是由 16 位命令程式代碼所識別。 藍牙組織會定義範圍中的值,0x0000到 0xFBFF。 廠商定義範圍中的值0xFC00到0xFFFF,允許1024個不同的廠商指派命令碼。
廠商必須選擇Microsoft定義命令程式代碼的值。 Microsoft無法選擇命令程式代碼,並假設沒有其他廠商將程式代碼用於衝突的目的。 發出廠商特定的命令並不安全,如果控制器不瞭解命令,則視控制器拒絕命令。 控制器可以將命令解譯為破壞性作業,例如更新控制器的韌體。
廠商必須透過控制器以外的方法來傳達所選的值。 Microsoft未指定如何取得選擇的程序代碼。
通知 Windows 藍牙堆疊廠商特定的命令程式代碼
Windows 藍牙堆疊會從登入機碼讀取廠商特定的命令程式代碼。 VsMsftOpCode
登錄 VsMsftOpCode
機碼的類型為 REG_DWORD,而機碼數據是廠商特定的 opcode。
若要指定廠商特定的 opcode,請使用AddReg
驅動程式 INF 中 DDInstall.HW 區段下的 指示詞。 [新增登錄] 區段應該包含:
HKR,,"VsMsftOpCode",0x00010001,<Vendor Specific Opcode>
範例:
[radio.NTamd64.HW]
AddReg=radio.NTamd64.HW.AddReg
[radio.NTamd64.HW.AddReg]
HKR,,"VsMsftOpCode",0x00010001,<Vendor Specific Opcode>
Microsoft定義的 HCI 命令
HCI 命令 | 描述 |
---|---|
HCI_VS_MSFT_Read_Supported_Features | 提供位圖,描述控制器支援的Microsoft定義功能,並指定控制器所傳回Microsoft定義事件的前置詞。 |
HCI_VS_MSFT_Monitor_Rssi | 要求控制器開始監視指定連線的測量連結 RSSI,並在連線的測量連結 RSSI 超出指定界限時產生事件。 |
HCI_VS_MSFT_Cancel_Monitor_Rssi | 取消先前發出的 HCI_VS_MSFT_Monitor_Rssi 命令。 |
HCI_VS_MSFT_LE_Monitor_Advertisement | 要求控制器開始監視落在指定 RSSI 範圍內的公告,也滿足其他需求。 |
HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement | 取消先前發出的 HCI_VS_MSFT_LE_Monitor_Advertisement 命令。 |
HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable | 設定廣告篩選的狀態。 |
HCI_VS_MSFT_Read_Absolute_RSSI | 從控制器讀取 BR/EDR 連線的絕對接收訊號強度指示 (RSSI) 值。 |
Microsoft定義的 HCI 命令和子命令
控制器瞭解只有一個Microsoft特定的 HCI 命令。 使用 opcode 擴充Microsoft特定命令集。 Microsoft定義 HCI 命令的第一個命令參數是指定子命令的 opcode。
控制器必須支援HCI_VS_MSFT_Read_Supported_Features,才能支援任何其他Microsoft HCI 子命令。 其他命令的支持是選擇性的,視HCI_VS_MSFT_Read_Supported_Features所傳回的值而定。 Windows 不會傳送任何Microsoft定義的子命令,除非控制器指出透過回應HCI_VS_MSFT_Read_Supported_Features支援子命令。
HCI_VS_MSFT_Read_Supported_Features
HCI_VS_MSFT_Read_Supported_Features提供位陣圖,描述控制器支援的Microsoft定義功能,並指定控制器所傳回Microsoft定義事件的前置詞。
控制器應一律使用 Command Completed 事件,立即完成此命令。
Command | 代碼 | 命令參數 | 傳回參數 |
---|---|---|---|
HCI_VS_MSFT_Read_Supported_Features | 選擇的基底程序代碼 | Subcommand_opcode | 地位 Subcommand_opcode, Supported_features, Microsoft_event_prefix_length, Microsoft_event_prefix |
Command_parameters
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x00 | HCI_VS_MSFT_Read_Supported_Features的子命令 opcode。 |
Return_parameters
狀態 (1 八位):
值 | 參數描述 |
---|---|
0x00 | 命令成功。 |
要0xFF的0x01 | 命令失敗。 如需詳細資訊,請參閱 藍牙核心規格中的錯誤碼 。 |
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x00 | HCI_VS_MSFT_Read_Supported_Features的子命令 opcode。 |
Supported_features (8 八位):
值 | 參數描述 |
---|---|
0x00000000 00000001 | 控制器支援 BR/EDR 連線的 RSSI 監視功能。 此外,控制器支援 HCI_VS_MSFT_Read_Absolute_RSSI 來讀取 BR/EDR 連線的絕對 RSSI 計量。 |
0x00000000 00000002 | 控制器支援 LE 連線的 RSSI 監視功能。 |
0x00000000 00000004 | 控制器支援LE舊版公告的RSSI監視。 |
0x00000000 00000008 | Controller 支援 LE 舊版廣告的廣告監視。 |
0x00000000 00000010 | 控制器支援在 P-192 和 P-256 的安全簡單配對程式期間,在曲線上驗證公用 X 和 Y 座標的有效性。 如需詳細資訊,請參閱 藍牙核心規格 Erratum 10734。 |
0x00000000 00000020 | 控制器支援使用 HCI_VS_MSFT_LE_Monitor_Advertisement [v1] 同時執行之 LE 廣告的持續廣告監視。 |
0x00000000 00000040 | 已保留。 |
0x00000000 00000080 | 控制器支援 AVDTP 卸除,以及本檔所述的HCI_VS_MSFT_Avdtp_* 命令。 |
0x00000000 00000100 | 已保留。 |
0x00000000 00000200 | 已保留。 |
0x00000000 00000400 | 控制器支援 HCI_VS_MSFT_LE_Monitor_Advertisement [v2]。 此外,控制器支援使用 HCI_VS_MSFT_LE_Monitor_Advertisement [v2] 同時執行之 LE 廣告的持續廣告監視。 |
0xFFFFFFFF FFFFFF00 | 保留給未來定義的位。 必須是零。 |
Microsoft_event_prefix_length (1 octet):
值 | 參數描述 |
---|---|
要0x00 0x20 | 傳回 Microsoft_event_prefix 中所指定Microsoft事件前置詞欄位中的位元元組數目。 這是每個Microsoft指定 HCI 事件開頭常數資訊的位元元組數目。 |
Microsoft_event_prefix (可變長度):
值 | 參數描述 |
---|---|
事件前置詞值 | 每個Microsoft定義事件開頭所預期的常數資訊。 這項資訊可用來區分Microsoft定義的事件與其他自定義事件。 |
HCI_VS_MSFT_Monitor_Rssi
HCI_VS_MSFT_Monitor_Rssi要求控制器開始監視指定連線的測量連結 RSSI,並在連線的測量連結 RSSI 超出指定界限時產生事件。
Command | 代碼 | 命令參數 | 傳回參數 |
---|---|---|---|
HCI_VS_MSFT_Monitor_Rssi | 選擇的基底程序代碼 | Subcommand_opcode, Connection_Handle, RSSI_threshold_high, RSSI_threshold_low, RSSI_threshold_low_time_interval, RSSI_sampling_period |
地位 Subcommand_opcode |
控制器應以定期產生的事件通知 RSSI 值的主機(根據 RSSI_sampling_period)。 測量的連結 RSSI 應為 BR/EDR 連接之 dBm 中的絕對 接收者訊號強度值。
為了回應HCI_VS_MSFT_Monitor_Rssi命令,如果控制器可以開始監視或非零狀態,控制器應該會產生狀態等於零的 Command Complete 事件。 如果狀態值不是零值,控制器將不會產生 HCI_VS_MSFT_Rssi_Event 以回應此命令。
如果具有相同Connection_Handle的另一個HCI_VS_MSFT_Monitor_Rssi命令未完成,或指定的連接句柄無效,控制器應拒絕命令。 控制器也可能因為其他原因而拒絕命令,例如資源耗盡。
此狀態圖顯示監視連線 RSSI 時控制器上的轉換狀態。
當收到的 RSSI 大於或等於指定的RSSI_threshold_high時,控制器應該會產生HCI_VS_MSFT_Rssi_Event。 產生此事件之後,控制器不應產生新的HCI_VS_MSFT_Rssi_Event,以指定已超過RSSI_threshold_high,直到產生指定 RSSI 低於RSSI_threshold_low的HCI_VS_MSFT_Rssi_Event為止。
當接收的 RSSI 等於或低於指定RSSI_threshold_low_time_interval的指定RSSI_threshold_low時,控制器應該會產生HCI_VS_MSFT_Rssi_Event。 產生此事件之後,控制器不應產生新的 HCI_VS_MSFT_Rssi_Event ,以指定 RSSI 已低於 RSSI_threshold_low ,直到 產生HCI_VS_MSFT_Rssi_Event 事件,以指定 已達到或超過RSSI_threshold_high 。
如果RSSI_sampling_period介於 0x01 和 0xFE 之間,控制器應定期產生每個RSSI_sampling_period HCI_VS_MSFT_Rssi_Event。 此事件應包含透過RSSI_sampling_period計算的RSSI平均值。 如果RSSI_sampling_period是0x00或0xFF,控制器不得定期通知主機HCI_VS_MSFT_Rssi_Event。
Command_parameters
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x01 | HCI_VS_MSFT_Monitor_Rssi的子命令 opcode。 |
Connection_Handle (2 個八位):
值 | 參數描述 |
---|---|
0xXXXX | 必須監視其 RSSI 之連線的句柄。 |
RSSI_threshold_high (1 八進位):
值 | 參數描述 |
---|---|
0xXX | 預期的 RSSI 值上限。 如果觀察到的 RSSI 大於或等於這個值,控制器就會產生事件。 單位:dBm BR/EDR 範圍: -128 到 127 (帶正負號整數) LE 範圍: -127 到 20 (帶正負號整數) |
RSSI_threshold_low (1 八進位):
值 | 參數描述 |
---|---|
0xXX | 預期的 RSSI 值下限。 如果觀察到的 RSSI 小於或等於這個值,控制器就會產生事件。 單位:dBm BR/EDR 強制範圍:-128 到 127 (帶正負號整數) LE 強制範圍: -127 到 20 (帶正負號整數) |
RSSI_threshold_low_time_interval (1 八進位):
值 | 參數描述 |
---|---|
0x00 | 保留的值。 |
N = 0xXX | RSSI 值在產生HCI_VS_MSFT_Rssi_Event之前,應該低於RSSI_threshold_low秒的時間。 時間週期 = N * 1 秒 強制範圍:0x01至0x3C |
RSSI_sampling_period (1 八進位):
值 | 參數描述 |
---|---|
0x00 | 保留的值。 |
N = 0xXX | 取樣間隔以毫秒為單位。 時間週期 = N * 100 毫秒 強制範圍:0x01至0xFE |
0xFF | 保留的值。 |
Return_parameters
狀態 (1 八位):
值 | 參數描述 |
---|---|
0x00 | 命令成功。 |
要0xFF的0x01 | 命令失敗。 如需詳細資訊,請參閱 藍牙核心規格中的錯誤碼 。 |
0x07 | 如果控制器沒有足夠的記憶體來處理命令,控制器應傳回 超過 記憶體容量。 |
錯誤碼 | 命令失敗。 如需詳細資訊,請參閱 藍牙核心規格中的錯誤碼 。 |
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x01 | HCI_VS_MSFT_Monitor_Rssi的子命令 opcode。 |
除非遮罩離開,否則產生的事件
收到HCI_VS_MSFT_Monitor_Rssi命令時,控制器應該會立即產生 Command Complete 事件。 如果 Command Complete 事件傳回狀態為 0,當發生下列其中一個 狀況時,控制器應該會產生HCI_VS_MSFT_Rssi_Event 。
- 裝置在RSSI_threshold_low_time_interval上觀察到的RSSI會變成等於或小於指定的RSSI_threshold_low值。
- 裝置觀察到的 RSSI 會大於或等於指定的 RSSI_threshold_high 值。
- RSSI_sampling_period有效且取樣期間到期。
如果與指定的裝置連線中斷,控制器應該執行所有必要的清除。 在此情況下, 不會將HCI_VS_MSFT_Cancel_Monitor_Rssi 命令傳送至控制器。
HCI_VS_MSFT_Cancel_Monitor_Rssi
HCI_VS_MSFT_Cancel_Monitor_Rssi取消先前發出的 HCI_VS_MSFT_Monitor_Rssi 命令。 控制器應立即產生 Command Completed 事件,以回應此命令。
Command | 代碼 | 命令參數 | 傳回參數 |
---|---|---|---|
HCI_VS_MSFT_Cancel_Monitor_Rssi | 選擇的基底程序代碼 | Subcommand_opcode, Connection_Handle |
地位 Subcommand_opcode |
Command_parameters
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x02 | HCI_VS_MSFT_Cancel_Monitor_Rssi的子命令 opcode。 |
Connection_Handle (2 個八位):
值 | 參數描述 |
---|---|
0xXXXX | 必須取消其 RSSI 之連線的句柄。 |
Return_parameters
狀態 (1 八位):
值 | 參數描述 |
---|---|
0x00 | 命令成功。 |
要0xFF的0x01 | 命令失敗。 如需詳細資訊,請參閱 藍牙核心規格中的錯誤碼 。 |
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x02 | HCI_VS_MSFT_Cancel_Monitor_Rssi的子命令 opcode。 |
除非遮罩離開,否則產生的事件
當收到命令HCI_VS_MSFT_Cancel_Monitor_RSSI時,控制器應該會產生 Command Complete 事件。
HCI_VS_MSFT_LE_Monitor_Advertisement
HCI_VS_MSFT_LE_Monitor_Advertisement要求控制器開始監視落在指定 RSSI 範圍內的公告,也滿足下列其中一個條件:
- 指定的模式可以比對收到的公告封包。
- 指定的 UUID 可以比對收到的公告封包。
- 指定的身分識別解析密鑰 (IRK) 可用來解析來自公告封包的來源裝置私人位址。
- 指定的藍牙位址可以比對收到的公告封包。
v2 命令允許主機結合上述一些條件,以及管理廣告來源和已導向廣告目標的選項,進一步精簡監視哪些廣告。 v2 命令也允許主機篩選哪些受監視公告導致控制器產生公告報告。
Command | 代碼 | 命令參數 | 傳回參數 |
---|---|---|---|
HCI_VS_MSFT_LE_Monitor_Advertisement [v2] | 選擇的基底程序代碼 | Subcommand_opcode_v2, RSSI_threshold_high, RSSI_threshold_low, RSSI_threshold_low_time_interval, RSSI_sampling_period, Monitor_options, Advertisement_report_filtering_options, Peer_device_address, Peer_device_address_type, Peer_device_IRK, Condition_type, <條件參數> |
地位 Subcommand_opcode, Monitor_Handle |
HCI_VS_MSFT_LE_Monitor_Advertisement [v1] | 選擇的基底程序代碼 | Subcommand_opcode_v1, RSSI_threshold_high, RSSI_threshold_low, RSSI_threshold_low_time_interval, RSSI_sampling_period, Condition_type, <條件參數> |
地位 Subcommand_opcode, Monitor_Handle |
控制器應產生 Command Complete 事件,以回應此命令。 如果控制器可以開始監視,或非零狀態,狀態值應該設定為零。 如果控制器不支援 LE 廣告的 RSSI 監視,它應該忽略 RSSI_threshold_high、 RSSI_threshold_low、 RSSI_threshold_low_time_interval和 RSSI_sampling_period 參數值。
此狀態圖顯示監視廣告 RSSI 時控制器上的轉換狀態。
只有在接收的 RSSI 大於或等於特定裝置 RSSI_threshold_high和Monitor_options相符專案時,控制器才會開始監視廣告。 控制器應產生HCI_VS_MSFT_LE_Monitor_Device_Event,並將Monitor_state設為 1,並將 Monitor_handle設為此條件的句柄,以通知主機控制器正在監視此特定裝置的條件。 此外,只有在Advertisement_report_filter_options相符專案時,控制器才會將受監視廣告的第一個廣告報告傳播到主機(請參閱下方)。
篩選 條件的Monitor_options 會根據下列邏輯來視為相符專案(在虛擬程式碼中):
MatchesCondition = (PDU Matches Condition Parameters)
IsAdvAMatch = ((Monitor_options bit 0 is set) && ((AdvA == Peer_device_address) && (TxAdd == Peer_device_address_type))) ||
((Monitor_options bit 1 is set) && (AdvA resolvable with Peer_device_IRK))
IsDirectedAdvAMatch = (TargetA is permitted based on the Scanning Filter Policy) &&
(((Monitor_options bit 2 is set) && ((AdvA == Peer_device_address) && (TxAdd == Peer_device_address_type))) ||
((Monitor_options bit 3 is set) && (AdvA resolvable with Peer_device_IRK)))
IsDirectedTargetAMatch = (Monitor_options bit 4 is set) &&
(TargetA is permitted based on the Scanning Filter Policy)
MonitorOptionsMatch = (MatchesCondition && IsAdvAMatch) ||
IsDirectedAdvAMatch ||
IsDirectedTargetAMatch ||
((Monitor_options bit 5 is set) && MatchesCondition)
針對受監視的廣告, Advertisement_report_filter_options 會根據下列邏輯來視為相符專案(在虛擬程式碼中):
IsDuplicateFilterSatisfied = (Advertisement_report_filter_options bit 0 is NOT set || PDU is not a duplicate)
ShouldGenerateLegacyReport = (Advertisement_report_filter_options bit 1 is set) &&
(PDU is Legacy) &&
MonitorOptionsMatch
ShouldGenerateExtendedReport = (Advertisement_report_filter_options bit 2 is set) &&
(PDU is Extended) &&
MonitorOptionsMatch
ShouldGenerateDirectedReport = (Advertisement_report_filter_options bit 3 is set) &&
(PDU is Directed) &&
MonitorOptionsMatch
AdvertisementReportFilterOptionsMatch = IsDuplicateFilterSatisfied &&
(ShouldGenerateLegacyReport || ShouldGenerateExtendedReport || ShouldGenerateDirectedReport)
如果所接收廣告的 RSSI 等於或低於特定裝置的RSSI_threshold_low_interval RSSI_threshold_low,控制器應停止監視條件。 控制器應產生設定為 0 的Monitor_state HCI_VS_MSFT_LE_Monitor_Device_Event,以通知主機控制器已停止監視條件的特定裝置。 在控制器指定設定為 0 Monitor_state的HCI_VS_MSFT_LE_Monitor_Device_Event之後,控制器不得允許進一步的公告封包流向裝置的主機,直到控制器通知主機特定裝置的 RSSI 已升至或高於條件的特定裝置RSSI_threshold_high。
此外,如果指定的RSSI_threshold_low_time_interval到期,則控制器應該產生 Monitor_state設定為 0 的HCI_VS_MSFT_LE_Monitor_Device_Event,以通知主機,如果指定的RSSI_threshold_low_time_interval過期,而未收到來自裝置的任何廣告封包,控制器已停止監視裝置。 如果控制器正在監視特定條件的裝置,下列語句為 true。
如果控制器支援 LE 擴充公告的 RSSI 監視而不取樣,如果封包的 RSSI 值大於或等於 RSSI_threshold_high,控制器應該將匿名公告封包傳播至主機。 不得追蹤匿名廣告, 不得產生HCI_VS_MSFT_LE_Monitor_Device_Event 事件。
如果控制器在沒有取樣的情況下支援 LE 廣告的 RSSI 監視,控制器應在收到廣告片段相符的情況下產生截斷的廣告報告,但未成功收到整個廣告的情況。
控制器應至少支援 30 個同時Monitor_handles、至少 30 個同時追蹤的裝置,以及至少 20 個同時追蹤的重複廣告。 控制器也應該能夠在 10% 的負荷週期執行連續 LE 掃描。
如果在控制器中啟用位址解析,且主機想要監視遠端裝置,且其 IRK 已成功儲存在控制器的解析清單中,則主機應提供遠端裝置解析清單專案的Peer_Identity_Address和Peer_Identity_Address_Type參數作為Peer_device_address和Peer_device_address_type參數, 分別。
RSSI_sampling_period | 舊版廣告 | 延伸廣告 (非匿名) | 延伸廣告 (匿名) |
---|---|---|---|
0x00 | 除非控制器先前收到 [啟用] 設定為 0x00 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令,否則控制器應將此條件的所有已接收公告封包傳播至裝置的主機。 即使接收的 RSSI 小於或等於RSSI_threshold_low,只要RSSI_threshold_low_time_interval未針對此條件的特定裝置過期,控制器仍會將公告封包傳播至主機。 此公告封包的 RSSI 值應該是所接收公告的 RSSI 值。 | 如果控制器支援對 LE 擴充廣告的 RSSI 監視而不進行取樣,則與舊版廣告數據行的行為相同,但廣告封包定義為廣告鏈結中的所有 PDU。 | 如果控制器在沒有取樣的情況下支援 LE 擴充公告的 RSSI 監視,除非控制器先前收到已啟用 設定為 0x00 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令,否則控制器應將所有接收的公告封包傳播至裝置的主機。 |
要0xFE 0x01 | 除非控制器先前收到 enable 設定為 0x00 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令,否則控制器應將舊版公告封包傳播至每一個指定的RSSI_sampling_period主機。 針對廣告指定的 RSSI 值應該是在此取樣間隔期間收到的 RSSI 值平均值。 如果控制器在取樣期間未收到公告封包,則不會將公告傳播至主機。 RSSI_sampling_period可能小於RSSI_threshold_low_time_interval,而且在RSSI_sampling_period期間收到的所有廣告都有低於RSSI_threshold_low的 RSSI。 控制器仍應傳播此取樣間隔期間所收到的RSSI值平均值的廣告。 | 如果控制器在沒有取樣的情況下支援 LE 擴充廣告的 RSSI 監視,控制器的行為就如同RSSI_sampling_period 0x00一樣。 | 如果控制器在沒有取樣的情況下支援 LE 擴充廣告的 RSSI 監視,控制器的行為就如同RSSI_sampling_period 0x00一樣。 |
0xFF | 控制器不得允許進一步的公告封包流向條件裝置的主機,直到控制器通知主機特定裝置的 RSSI 已低於此條件之RSSI_threshold_low_time_interval RSSI_threshold_low。 此通知是藉由產生Monitor_state設定為 0 的HCI_VS_MSFT_LE_Monitor_Device_Event來完成。 | 如果控制器支援 LE 擴充公告的 RSSI 監視,而不需要取樣,則行為與 舊版廣告 數據行相同。 | 如果控制器在沒有取樣的情況下支援 LE 擴充廣告的 RSSI 監視,控制器的行為就如同RSSI_sampling_period 0x00一樣。 |
如果控制器先前收到 [啟用] 設定為 0x00 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令,則不得停止取樣期間定時器。 如需詳細資訊,請參閱範例:使用取樣期間HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable篩選。 如果控制器收到來自相同裝置的非重複數據刪除公告封包,它應符合控制器上所儲存條件的每個公告封包。
如果控制器從符合多個條件的裝置收到公告封包,則控制器應該為每個符合的條件產生HCI_VS_MSFT_LE_Monitor_Device_Event,並將Monitor_handle設定為符合的條件。
如果控制器無法監視符合 條件之範圍內所有裝置的 RSSI 值,它會盡可能監視多個裝置。 應監視哪些裝置的決定將取決於所接收公告的 RSSI 值。 控制器應監視接收訊號強度較大的裝置。
如果控制器已通知主機特定裝置 (A) 且其監視裝置的硬體容量上限,如果另一部裝置 (B) 進入具有較高 RSSI 值的範圍,則控制器應透過產生Monitor_state設為 0 的HCI_VS_MSFT_LE_Monitor_Device_Event,通知主機已停止監視裝置 (A)。 控制器也應該產生一個 HCI_VS_MSFT_LE_Monitor_Device_Event,並將Monitor_state 設定為 1,以通知主機裝置(B)目前正在監視中。
條件類型和條件參數
Condition_type參數會指定 Condition 參數是否指定模式、UUID、IRK 或BD_ADDR。
如果Condition_type參數指定模式,Condition 會包含兩個區段,其中包含 Condition 中存在的模式數目,以及模式數據。
模式 數目會指定需要比對的模式數目。
模式數據 具有下列格式。
- Length 指定此模式的長度,包括模式的數據類型和起始位元組。
- AD 類型 會指定 [AD 類型] 欄位。
- Pattern 的開頭會指定緊接在AD類型之後之模式的起始位元組位置。
- 模式 的大小為 (Length - 0x2),而且是從指定的起始位元組,在公告封包內要比對的指定 AD 類型。
如果指定了多個模式,控制器應確保至少有一個模式符合已接收的廣告。
如果控制器支援 LE 擴充公告的 RSSI 監視,而不需要取樣:
控制器應尋找主機廣告數據前 251 個八位的模式,並可能查看主機廣告數據的任何剩餘八位。 如果 AD 區段超出主機廣告數據的前 251 個八位,控制器應尋找位於主機廣告數據前 251 個八位的 AD 區段中的模式,而且可能會查看主機廣告數據的任何剩餘八位。 注意:根據廣告商的片段,主機廣告數據的前 251 個八位可能會延伸到多個廣告 PDU 的 AdvData。 掃描器應小心限制其追蹤的 AuxPtrs 數目,以避免追蹤過長的 PDU 鏈結。
控制器應根據每個廣告集的每個裝置位址來追蹤。 控制器應該針對符合模式的每個廣告集傳播 HCI_VS_MSFT_LE_Monitor_Device_Event ,即使廣告來自相同的裝置位址也一樣。
如果Condition_type參數指定 UUID,Condition 參數會包含 UUID 類型和 UUID。 UUID 類型會指定 UUID 是 16 位、32 位還是 128 位。 控制器應剖析公告封包的服務 UUID,以檢查指定的 UUID。 如果 UUID 類型定義為0x01,控制器應剖析 16 位服務 UUID 的不完整清單,以及服務 UUID AD 類型中指定的 16 位服務 UUID 完整清單。 如果 UUID 類型定義為0x02,控制器應該剖析 32 位服務 UUID 的不完整清單,並完成服務 UUID AD 類型中指定的 32 位 UUID 清單。 如果指定的 UUID 類型是0x03,控制器應該剖析 128 位服務 UUID 的不完整清單,以及服務 UUID AD 類型中指定的 128 位服務 UUID 完整清單。
如果控制器支援 LE 擴充公告的 RSSI 監視,而不需要取樣:
控制者應該在主機廣告數據的前 251 個八位中尋找服務 UUID,並查看主機廣告數據的任何剩餘八位。 如果 AD 區段超出主機廣告數據的前 251 個八位,控制器應該在主機廣告數據前 251 個八位的 AD 區段內尋找服務 UUID,而且可能會查看主機廣告數據的任何剩餘八位。 注意:根據廣告商的片段,主機廣告數據的前 251 個八位可能會跨越多個廣告 PDU 的 AdvData。 掃描器應小心限制其追蹤的 AuxPtrs 數目,以避免追蹤過長的 PDU 鏈結。
控制器應根據每個廣告集的每個裝置位址來追蹤。 控制器應該針對符合服務 UUID 的每個廣告集傳播 HCI_VS_MSFT_LE_Monitor_Device_Event ,即使廣告來自相同的裝置也一樣。
如果Condition_type參數指定 IRK,Condition 參數會包含 IRK。
如果Condition_type參數指定藍牙位址,Condition 參數會包含位址類型和BD_ADDR。
即使啟用掃描(主動或被動),控制器仍應根據條件持續監視。 啟用使用中掃描時,符合篩選條件之廣告的掃描回應應傳播至主機。
如果控制器在停用篩選時收到HCI_VS_MSFT_LE_Monitor_Advertisement命令(由於先前收到的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令,並將 Enable 設定為 0x00),控制器應接受命令,但將它設定為停用狀態。 控制器也可能因為資源耗盡等其他原因而拒絕命令。
如果所有Monitor_options位都清楚,控制器應該會傳回錯誤碼 無效的 HCI 命令參數 (0x12)。
如果已設定Monitor_options位 1 或位 3,且Peer_device_IRK設為無效的 IRK,或未設定任何Monitor_options位,控制器應該會傳回錯誤碼 無效的 HCI 命令參數 (0x12)。
如果已設定位 0 或位 1 或位 2 或位 2 或位 Monitor_options 3,且Condition_type設定為 0x03 或 0x04,控制器應該會傳回錯誤碼 無效的 HCI 命令參數 (0x12)。
如果已設定Advertisement_report_filter_options位 0,且RSSI_sampling_period是0x00以外的任何值,控制器應該會傳回錯誤碼 無效的 HCI 命令參數 (0x12)。
遺漏參數
發出不包含所有參數的此命令版本時,應使用下列命令:
參數 | 值 |
---|---|
Monitor_options | 位 5 設定;清除所有其他位 |
Advertisement_report_filter_options | 位 1 和 2 設定;清除所有其他位 |
Peer_device_IRK | 0x0000000000000000 0000000000000000 |
Peer_device_address | 0x000000000000 |
Peer_device_address_type | 0x00 |
Command_parameters
Subcommand_opcode_v1 (1 八進位):
值 | 參數描述 |
---|---|
0x03 | HCI_VS_MSFT_LE_Monitor_Advertisement [v1] 的子命令 opcode。 |
Subcommand_opcode_v2 (1 八進位):
值 | 參數描述 |
---|---|
0x0F | HCI_VS_MSFT_LE_Monitor_Advertisement [v2] 的子命令 opcode。 |
RSSI_threshold_high (1 八進位):
值 | 參數描述 |
---|---|
0xXX | 預期的 RSSI 值上限。 如果觀察到的 RSSI 大於或等於這個值,控制器就會產生事件。 單位:dBm 強制範圍:-127 到 20(帶正負號的整數) |
RSSI_threshold_low (1 八進位):
值 | 參數描述 |
---|---|
0xXX | 預期的 RSSI 值下限。 如果觀察到的 RSSI 小於或等於這個值,控制器就會產生事件。 單位:dBm 強制範圍:-127 到 20(帶正負號的整數) |
RSSI_threshold_low_time_interval (1 八進位):
值 | 參數描述 |
---|---|
0x00 | 保留的值。 |
N = 0xXX | 產生HCI_VS_MSFT_Rssi_Event之前,RSSI 值應該低於RSSI_threshold_low秒的時間 時間週期 = N * 1 秒 強制範圍:0x01 0x3C。 |
RSSI_sampling_period (1 八進位):
值 | 參數描述 |
---|---|
0x00 | 控制器應將所有接收的廣告傳播至主機。 |
N = 0xXX | 取樣間隔以毫秒為單位。 時間週期 = N * 100 毫秒。 強制範圍:0x01至0xFE |
0xFF | 控制器不得將任何已接收的廣告傳播至主機。 |
Monitor_options (1 八進位):
位編號 | 參數描述 |
---|---|
0 | 控制器應監視 AdvA 或其已解析的身分識別位址符合Peer_device_address和Peer_device_address_type且 TargetA 不存在的廣告 PDU,或者,如果 TargetA 存在,則會根據掃描篩選原則允許 TargetA,如果這些 PDU 符合Condition_Type中指定的條件。 |
1 | 如果ADU符合Condition_Type中指定的條件,控制器應監視AdvA可透過 Peer_device_IRK解析的廣告 PDU,如果 TargetA 不存在,或者如果 TargetA 存在,則會根據掃描篩選原則允許 TargetA。 如果控制器中使用連結層隱私權,則不應設定此位。 |
2 | 控制器應根據掃描篩選原則監視允許 TargetA 的導向廣告 PDU,以及 AdvA 或其解析的身分識別位址符合Peer_device_address和Peer_device_address_type。 不論 PDU 是否符合Condition_Type中指定的條件,都是如此。 |
3 | 控制器應根據掃描篩選原則監視允許 TargetA 的導向廣告 PDU,以及使用 Peer_device_IRK 解析 AdvA 的位置。 不論 PDU 是否符合Condition_Type中指定的條件,都是如此。 如果控制器中使用連結層隱私權,則不應設定此位。 |
4 | 控制者應根據掃描篩選原則來監視允許 TargetA 的導向廣告 PDU,不論Peer_device_address和Peer_device_address_type或Peer_device_IRK的值為何,以及不論 PDU 是否符合Condition_Type中指定的條件。 |
5 | 如果 PDU 符合Condition_Type中指定的條件,控制器應從 TargetA 不存在的任何 AdvA 監視廣告 PDU,或者,如果 TargetA 存在,則會根據掃描篩選原則允許 TargetA。 |
所有其他位 | 保留供未來使用 |
Advertisement_report_filtering_options (1 八進位):
位編號 | 參數描述 |
---|---|
0 | 篩選重複的廣告 PDU。 只有當RSSI_sampling_period為0x00時,才應設定此位。 |
1 | 如果 PDU 符合指定的Monitor_options,控制器應產生HCI_LE_Advertising_Report事件或HCI_LE_Directed_Advertising_Report事件或舊版廣告 PDU 的HCI_LE_Extended_Advertising_Report事件。 |
2 | 如果 PDU 符合指定的Monitor_options,控制器應為擴充廣告 PDU 產生HCI_LE_Extended_Advertising_Report事件。 |
3 | 如果 PDU 符合指定的Monitor_options,控制器應產生HCI_LE_Advertising_Report事件或HCI_LE_Directed_Advertising_Report事件或HCI_LE_Extended_Advertising_Report事件來導向廣告 PDU。 |
所有其他位 | 保留供未來使用 |
Peer_device_address (6 八位):
值 | 參數描述 |
---|---|
0xXXXXXXXXXXXX | 要比對的公用裝置位址或隨機裝置位址。 |
Peer_device_address_type (1 八進位):
值 | 參數描述 |
---|---|
0x00 | 公用裝置位址 |
0x01 | 隨機裝置位址 |
所有其他的值 | 保留供未來使用 |
Peer_device_IRK (16 八進位):
值 | 參數描述 |
---|---|
0x0000000000000000 0000000000000000 | 無效的 IRK。 設定 Monitor_options位 1 或設定Monitor_options位 3 時,不得為值。 |
0xXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX | 要比對之裝置的 IRK。 Peer_device_address和Peer_device_address_type應填入。 |
Condition_type (1 八進位):
值 | 參數描述 |
---|---|
0x01 | 條件是必須在廣告上比對的模式。 |
0x02 | 條件是 UUID 類型和 UUID。 |
0x03 | 條件是 IRK 的解析。 如果已設定任何Monitor_options位 0、1、2 或 3,則排除。 |
0x04 | 條件是藍牙地址類型和藍牙位址。 如果已設定任何Monitor_options位 0、1、2 或 3,則排除。 |
條件:Condition 適用的字段取決於Condition_type的值。 如需詳細資訊,請參閱Condition_type和條件參數一節。
Number_of_patterns (1 八進位):
值 | 參數描述 |
---|---|
0xXX | Pattern_data 參數中指定的模式數目。 |
Pattern_data (>3 個八位):
值 | 參數描述 |
---|---|
長度 | 此模式的長度。 |
資料類型 | 公告區段的數據類型。 這些值會列在藍牙指派的數位檔中。 |
起始位元組 | 要比對指定數據類型之模式的起始位置。 |
模式 | 要比對的模式(長度大小 – 0x2個字節)。 |
UUID_type (1 八進位):
值 | 參數描述 |
---|---|
0x01 | UUID 是16位服務。 |
0x02 | UUID 是 32 位服務。 |
0x03 | UUID 是128位服務。 |
UUID (2、4 或 16 八位):
值 | 參數描述 |
---|---|
0xXXXX | 如果UUID_type為 0x01,則為 2 個字節。 如果UUID_type為 0x02,則為 4 個字節。 如果UUID_type為 0x03,則為 16 個字節。 |
IRK (16 八位):
值 | 參數描述 |
---|---|
0xXXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX | 要用來解析私人位址的 IRK。 |
Address_type (1 八進位):
值 | 參數描述 |
---|---|
0x00 | 公用裝置位址。 |
0x01 | 隨機裝置位址。 |
要0xFF 0x02 | 保留值以供日後使用。 |
BD_ADDR (6 個八位):
值 | 參數描述 |
---|---|
0xXXXXXXXXXXXX | 要監視之裝置的藍牙位址。 |
Return_parameters
狀態 (1 八位):
值 | 參數描述 |
---|---|
0x00 | 命令成功。 |
0x07 | 如果控制器沒有足夠的記憶體來處理命令,控制器應傳回超過記憶體容量。 |
錯誤碼 | 命令失敗。 如需詳細資訊,請參閱 藍牙核心規格中的錯誤碼 。 |
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x03或0x0F | HCI_VS_MSFT_LE_Monitor_Advertisement [v1] 或 HCI_VS_MSFT_LE_Monitor_Advertisement [v2] 的子命令 opcode,視提交的命令而定。 |
Monitor_handle (1 八進位):
值 | 參數描述 |
---|---|
要0xFF 0x00 | 此規則的句柄。 此句柄會作為參數,HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement來取消監視廣告。 只有當 Status 為0x00時,此參數才有效。 |
除非遮罩離開,否則產生的事件
收到HCI_VS_MSFT_LE_Monitor_Advertisement命令時,控制器應該會產生 Command Complete 事件。
HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement
HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement會取消先前發出的 HCI_VS_MSFT_LE_Monitor_Advertisement 命令。
Command | 代碼 | 命令參數 | 傳回參數 |
---|---|---|---|
HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement | 選擇的基底程序代碼 | Subcommand_opcode, Monitor_handle |
地位 Subcommand_opcode |
控制器應立即產生 Command Completed 事件,以回應此命令。
Command_parameters
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x04 | HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement的子命令 opcode。 |
Connection_Handle (1 八進位):
值 | 參數描述 |
---|---|
0xXX | 正在取消之篩選的句柄。 |
Return_parameters
狀態 (1 八位):
值 | 參數描述 |
---|---|
0x00 | 命令成功。 |
0x07 | 如果控制器沒有足夠的記憶體來處理命令,控制器應傳回超過記憶體容量。 |
錯誤碼 | 命令失敗。 如需詳細資訊,請參閱 藍牙核心規格中的錯誤碼 。 |
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x04 | HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement的子命令 opcode。 |
除非遮罩離開,否則產生的事件
當收到HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement命令時,控制器應該會產生 Command Complete 事件。
HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable
HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable設定廣告篩選的狀態。
Command | 代碼 | 命令參數 | 傳回參數 |
---|---|---|---|
HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable | 選擇的基底程序代碼 | Subcommand_opcode, 啟用 |
地位 Subcommand_opcode |
如果 Enable 設定為0x00,控制器應根據現有的篩選接受清單設定,將接收的廣告傳播至主機。 如果裝置不再受到監視,控制器應繼續監視目前正在監視的裝置,併產生Monitor_state設為0的HCI_VS_MSFT_LE_Monitor_Device_Event。 如果正在監視新裝置,控制器應產生Monitor_state設定為1的HCI_VS_MSFT_LE_Monitor_Device_Event。 主機可能會發出HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable,並將 [啟用 ] 設定為 [0x01],以重新啟用所有篩選條件。
如果 Enable 設定為 0x01,此命令會啟用以先前發行 HCI_VS_MSFT_LE_Monitor_Advertisement 命令所設定的所有篩選。 如果控制器未切換篩選狀態,控制器應拒絕HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable命令:
- 如果控制器先前收到 enable 設定為 0x01 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令,則控制器應拒絕 enable 設定為 0x01 的HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable命令。
- 如果控制器先前收到 enable 設定為 0x00 0x00 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令,控制器應拒絕 enable 設為 0x00 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令。
廣告篩選的默認狀態應為關閉。 此狀態相當於控制器先前收到 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令,且 Enable 設定為 0x00。 控制器應立即產生 Command Completed 事件,以回應此命令。
Command_parameters
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x05 | HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable的子命令 opcode。 |
開啟 (1 個八位):
值 | 參數描述 |
---|---|
0x00 | 還原為目前的篩選接受清單行為,但會根據來自 HCI_VS_MSFT_LE_Monitor_Advertisement 命令的條件繼續監視裝置。 |
0x01 | 在控制器上啟用所有發出的 HCI_VS_MSFT_LE_Monitor_Advertisement 命令。 |
Return_parameter
狀態 (1 八位):
值 | 參數描述 |
---|---|
0x00 | 命令成功。 |
0x0C | 如果控制器拒絕命令,控制器應該會傳回不允許的命令,因為它先前看到 [啟用] 設定為與此命令相同的值HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable命令。 |
錯誤碼 | 命令失敗。 如需詳細資訊,請參閱 藍牙核心規格中的錯誤碼 。 |
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x05 | HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable的子命令 opcode。 |
除非遮罩離開,否則產生的事件
當收到HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable命令時,控制器應該會產生 Command Complete 事件。
HCI_VS_MSFT_Read_Absolute_RSSI
HCI_VS_MSFT_Read_Absolute_RSSI會從控制器讀取 BR/EDR 連線的絕對 接收訊號強度指示 (RSSI) 值。
Command | 代碼 | 命令參數 | 傳回參數 |
---|---|---|---|
HCI_VS_MSFT_Read_Absolute_RSSI | 選擇的基底程序代碼 | Subcommand_opcode, Connection_Handle |
地位 Subcommand_opcode, Connection_Handle, RSSI |
連接句柄會以命令和傳回參數的形式提供,以識別正在讀取 RSSI 的 ACL 連線。 RSSI 計量是 dBm 中絕對 接收者訊號強度,可± 6 dB 精確度。 如果無法讀取 RSSI,RSSI 計量應設定為 127。 控制器應一律使用 Command Completed 事件,立即完成此命令。
Command_parameters
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x06 | HCI_VS_MSFT_Read_Absolute_RSSI的子命令 opcode。 |
Connection_Handle (2 個八位):
值 | 參數描述 |
---|---|
0xXXXX | 必須讀取 RSSI 之 BR/EDR 連線的句柄。 |
Return_parameters
狀態 (1 八位):
值 | 參數描述 |
---|---|
0x00 | 命令成功。 |
要0xFF的0x01 | 命令失敗。 如需詳細資訊,請參閱 藍牙核心規格中的錯誤碼 。 |
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x06 | HCI_VS_MSFT_Read_Absolute_RSSI的子命令 opcode。 |
Connection_Handle (2 個八位):
值 | 參數描述 |
---|---|
0xXXXX | 讀取 RSSI 之 BR/EDR 連線的句柄。 |
RSSI (1 八位):
值 | 參數描述 |
---|---|
N = 0xXX | BR/EDR 連線的RSSI值。 單位:dBm 強制範圍: -128 到 127 (帶正負號整數) |
除非遮罩離開,否則產生的事件
當HCI_VS_MSFT_Read_Absolute_RSSI命令完成時,控制器應該會產生 Command Complete 事件。
Microsoft定義的藍牙 HCI 事件
所有Microsoft定義的藍牙 HCI 事件都是廠商定義的事件,並使用事件程式代碼0xFF。 Microsoft事件的事件數據一律會以常數位節字串開頭,以區分Microsoft定義的事件與其他廠商定義事件。 常數位符串的長度和值是由控制器實作者定義,並傳回以 回應HCI_VS_MSFT_Read_Supported_Features。
HCI 事件 | 描述 |
---|---|
HCI_VS_MSFT_Rssi_Event | HCI_VS_MSFT_RSSI_Event表示 HCI_VS_MSFT_Monitor_Rssi 命令已完成。 |
HCI_VS_MSFT_LE_Monitor_Device_Event | HCI_VS_MSFT_LE_Monitor_Device_Event表示控制器已啟動或停止監視藍牙 LE 裝置。 |
HCI_VS_MSFT_RSSI_Event
HCI_VS_MSFT_RSSI_Event表示 HCI_VS_MSFT_Monitor_Rssi 命令已完成。 如果 Status 參數為零,則命令已完成,因為遠端裝置的 RSSI 值已變更為超出指定範圍的值。 如果 Status 參數為非零,則命令已完成,因為無法再監視連線的 RSSI 值。
活動 | 事件代碼 | Microsoft事件程序代碼 | 事件參數 |
---|---|---|---|
HCI_VS_MSFT_RSSI_Event | 0xFF | 0x01 | Event_prefix, Microsoft_event_code, 地位 Connection_Handle, RSSI |
Event_parameters
Event_prefix (可變大小):
值 | 參數描述 |
---|---|
事件前置詞 | 將這個事件標示為Microsoft定義的事件前置詞。 大小和值如 HCI_VS_MSFT_Read_Supported_Features 命令所傳回。 |
Microsoft_event_code (1 octet):
值 | 參數描述 |
---|---|
0x01 | HCI_VS_MSFT_RSSI_Event的事件碼。 |
狀態 (1 八位):
值 | 參數描述 |
---|---|
0x00 | 成功。 線上的 RSSI 值符合下列其中一個條件。 RSSI 達到或超過 RSSI_threshold_high。 RSSI 在RSSI_threshold_low_time_interval秒內達到或低於RSSI_threshold_low。 RSSI_sampling_period已過期,併產生此事件以通知主機 RSSI 值。 |
要0xFF的0x01 | 失敗。 無法再監視連線的RSSI值。 錯誤碼通常是其中一個程式代碼,描述基礎 ACL 連線遺失的原因。 |
Connection_Handle (2 個八位):
值 | 參數描述 |
---|---|
0xXXXX | 要監視其 RSSI 之連線的句柄。 |
RSSI (1 八位):
值 | 參數描述 |
---|---|
0xXX | 連接的測量連結 RSSI 值。 單位:dBm BR/EDR 範圍: -128 到 127 (帶正負號整數) LE 範圍: -127 到 20 (帶正負號整數) |
HCI_VS_MSFT_LE_Monitor_Device_Event
HCI_VS_MSFT_LE_Monitor_Device_Event表示控制器已啟動或停止監視藍牙 LE 裝置。
如果Monitor_state參數值為1,控制器會開始使用指定的 BD_ADDR監視藍牙裝置。 如果Monitor_state參數值為0,控制器會停止監視具有指定BD_ADDR的藍牙裝置。
活動 | 事件代碼 | Microsoft事件程序代碼 | 事件參數 |
---|---|---|---|
HCI_VS_MSFT_LE_Monitor_Device_Event | 0xFF | 0x02 | Event_prefix, Microsoft_event_code, Address_type, BD_ADDR, Monitor_handle, Monitor_state |
如果控制器尚未產生Monitor_state設定為1的HCI_VS_MSFT_LE_Monitor_Device_Event,則控制器不會產生Monitor_state參數設定為0的HCI_VS_MSFT_LE_Monitor_Device_Event。
Event_parameters
Event_prefix (可變大小):
值 | 參數描述 |
---|---|
事件前置詞 | 將這個事件標示為Microsoft定義的事件前置詞。 大小和值如 HCI_VS_MSFT_Read_Supported_Features 命令所傳回。 |
Microsoft_event_code (1 octet):
值 | 參數描述 |
---|---|
0x02 | HCI_VS_MSFT_LE_Monitor_Device_Event的事件碼。 |
Address_type (1 八進位):
值 | 參數描述 |
---|---|
0x00 | 公用裝置位址。 |
0x01 | 隨機裝置位址。 |
要0xFF 0x02 | 保留值以供日後使用。 |
BD_ADDR (6 個八位):
值 | 參數描述 |
---|---|
0xXXXXXXXXXXXX | 裝置的藍牙位址。 |
Monitor_handle (1 八進位):
值 | 參數描述 |
---|---|
0xXX | 針對 HCI_VS_MSFT_LE_Monitor_Advertisement 命令指定的篩選句柄。 |
Monitor_state (1 八進位):
值 | 參數描述 |
---|---|
0x00 | 控制器停止監視BD_ADDR和Monitor_handle指定的裝置。 |
0x01 | 控制器已開始監視BD_ADDR和Monitor_handle指定的裝置。 |
Microsoft定義的 AVDTP HCI 命令
下列 AVDTP HCI 命令支援音訊側帶 A2DP 卸除。 如需詳細資訊,請參閱 音訊側帶 A2DP 卸除。
HCI AVDTP 命令 | 描述 |
---|---|
HCI_VS_MSFT_Avdtp_Capabilities_Configuration | 設定音訊傳輸介面,並傳回藍牙控制器的編解碼器功能,這是編解碼器資訊區塊的清單。 |
HCI_VS_MSFT_Avdtp_Open | 配置及設定控制器內的AVDTP卸除資源。 |
HCI_VS_MSFT_Avdtp_Start | 從音訊傳輸到傳輸的 AVDTP 媒體封包開始音訊串流。 |
HCI_VS_MSFT_Avdtp_Suspend | 停止由 HCI_VS_MSFT_Avdtp_Start 起始的串流活動。 |
HCI_VS_MSFT_Avdtp_Close | 釋放由 HCI_VS_MSFT_Avdtp_Open 配置的AVDTP卸除資源。 |
HCI_VS_MSFT_Avdtp_Capabilities_Configuration
HCI_VS_MSFT_Avdtp_Capabilities_Configuration設定音訊傳輸介面,並傳回藍牙控制器的編解碼器功能,這是編解碼器資訊區塊的清單。 每個編解碼器資訊區塊都會描述一個支持的編解碼器。
下列某些參數是具有可變長度的結構陣列,因此假設所有這些參數仍會放入一個 HCI 命令,並放入一個對應的 HCI 事件中。
Command_parameters
External_codec_count (1 八進位):
值 | 參數描述 |
---|---|
0x00-0xFF | 後續Codec_capability區塊的計數。 |
External_codec_capability (可變長度):
值 | 參數描述 |
---|---|
編解碼器功能區塊 | 編解碼器功能資訊區塊,如編解碼器功能資訊中所述。 這描述連結至音訊介面的裝置所支援的單一編解碼器。 |
此數據結構會 重複External_codec_count 次。
Audio_interface_parameter_count (1 八進位):
值 | 參數描述 |
---|---|
0x00-0xFF | 下列Audio_interface_parameters計數。 |
Audio_interface_parameter (可變長度)
值 | 參數描述 |
---|---|
音訊介面參數 | 如上所述,由連線到音訊介面的裝置所設定的音訊介面參數。 |
此數據結構會 重複Audio_interface_parameter_count 次。
Return_parameters
狀態 (1 八位):
值 | 參數描述 |
---|---|
0x00 | 命令成功。 |
0x01-0xFF | 命令失敗。 如需詳細資訊,請參閱藍牙核心規格中的錯誤碼。 |
Subcommand_opcode _ (1 八進位):
值 | 參數描述 |
---|---|
0x07 | HCI_VS_MSFT_Avdtp_Capabilities_Configuration的子命令 opcode。 |
Internal_codec_count (1 八進位):
值 | 參數描述 |
---|---|
0x00-0xFF | 後續Internal_codec_capability區塊的計數。 |
Internal_codec_capability (可變長度):
值 | 參數描述 |
---|---|
編解碼器功能區塊 | 編解碼器功能資訊區塊,如音頻側帶 A2DP 卸除中所述。 這描述藍牙控制器所支援的單一編解碼器。 |
此數據結構會重複Internal_codec_count次。
Audio_interface_parameter_count (1 八進位):
值 | 參數描述 |
---|---|
0x00-0xFF | 下列Audio_interface_parameters計數。 |
Audio_interface_parameter (可變長度)
值 | 參數描述 |
---|---|
音訊介面參數 | 如上所述的音訊介面參數。 主機軟體會將此參數傳遞至連線至音訊介面的裝置。 |
此數據結構會重複Audio_interface_parameter_count次。
HCI_VS_MSFT_Avdtp_Open
配置及設定控制器內的AVDTP卸除資源。
下列某些參數是具有可變長度的結構陣列,因此假設所有這些參數仍會放入一個 HCI 命令,並放入一個對應的 HCI 事件中。
Command_parameters
Connection_handle (2 八進位)
值 | 參數描述 |
---|---|
0xXXXX | IIdentifs 已連線到遠端裝置的 AVDTP 媒體 L2CAP 通道。 |
L2cap_destination_cid (2 八位)
值 | 參數描述 |
---|---|
0xXXXX | AVDTP 媒體通道的 L2CAP 目的地 CID |
L2cap_mtu (2 八位)
值 | 參數描述 |
---|---|
0xXXXX | L2CAP AVDTP 媒體通道 MTU |
Configured_codec_capability (可變長度):
值 | 參數描述 |
---|---|
編解碼器功能區塊 | 編解碼器功能資訊區塊,如音頻側帶 A2DP 卸除中所述。 這描述針對AVDTP媒體設定的編解碼器。 |
Audio_interface_parameter_count (1 八進位):
值 | 參數描述 |
---|---|
0x00-0xFF | 下列Audio_interface_parameters計數。 |
Audio_interface_parameter (可變長度)
值 | 參數描述 |
---|---|
音訊介面參數 | 如上所述的音訊介面參數。 連接到音訊介面的裝置會指定特定數據流實例的這些參數。 |
此數據結構會重複Audio_interface_parameter_count次。
Return_parameters
狀態 (1 八位):
值 | 參數描述 |
---|---|
0x00 | 命令成功。 |
0x01-0xFF | 命令失敗。 如需詳細資訊,請參閱藍牙核心規格中的錯誤碼。 |
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x08 | HCI_VS_MSFT_Avdtp_Open的子命令 opcode。 |
Avdtp_offload_handle (2 八位):
值 | 參數描述 |
---|---|
0xXXXX | 識別配置給卸除數據流的資源。 |
Audio_interface_parameter_count (1 八進位):
值 | 參數描述 |
---|---|
0x00-0xFF | 下列Audio_interface_parameters計數。 |
Audio_interface_parameter (可變長度)
值 | 參數描述 |
---|---|
音訊介面參數 | 如上所述的音訊介面參數。 主機軟體會將此參數傳遞至連線到數據流實例音訊介面的裝置。 |
此數據結構會重複Audio_interface_parameter_count次。
HCI_VS_MSFT_Avdtp_Start
此命令會從音訊傳輸開始音訊串流至傳輸的 AVDTP 媒體封包。 執行此命令時,藍牙控制器會開始下列活動。
- 從音訊傳輸接收音訊數據
- 如果編碼器位於藍牙控制器中,請將從音訊傳輸接收的數據編碼,以產生編碼的畫面格
- 如果編碼器位於音訊 DSP 中,請從音訊傳輸擷取編碼的畫面格
- 將編碼的畫面組合成AVDTP媒體承載
- 建構及傳輸包含媒體承載的AVDTP媒體封包
Command_parameters
Avdtp_offload_handle (2 八位):
值 | 參數描述 |
---|---|
0xXXXX | 識別配置給卸除數據流的資源。 |
Return_parameters
狀態 (1 八位):
值 | 參數描述 |
---|---|
0x00 | 命令成功。 |
0x01-0xFF | 命令失敗。 如需詳細資訊,請參閱藍牙核心規格中的錯誤碼。 |
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x09 | HCI_VS_MSFT_Avdtp_Start的子命令 opcode。 |
HCI_VS_MSFT_Avdtp_Suspend
停止由 HCI_VS_MSFT_Avdtp_Start 起始的串流活動。
Command_parameters
Avdtp_offload_handle (2 八位):
值 | 參數描述 |
---|---|
0xXXXX | 識別配置給卸除數據流的資源 |
Return_parameters
狀態 (1 八位):
值 | 參數描述 |
---|---|
0x00 | 命令成功。 |
0x01-0xFF | 命令失敗。 如需詳細資訊,請參閱藍牙核心規格中的錯誤碼。 |
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x0A | HCI_VS_MSFT_Avdtp_Suspend的子命令 opcode。 |
HCI_VS_MSFT_Avdtp_Close
釋放由 HCI_VS_MSFT_Avdtp_Open 配置的AVDTP卸除資源。
Command_parameters
Avdtp_offload_handle (2 八位):
值 | 參數描述 |
---|---|
0xXXXX | 注意:這個值在此命令完成之後不再有效。 |
Return_parameters
狀態 (1 八位):
值 | 參數描述 |
---|---|
0x00 | 命令成功。 |
0x01-0xFF | 命令失敗。 如需詳細資訊,請參閱藍牙核心規格中的錯誤碼。 |
Subcommand_opcode (1 八進位):
值 | 參數描述 |
---|---|
0x0B | HCI_VS_MSFT_Avdtp_Close的子命令 opcode。 |
值 | 參數描述 |
---|---|
0x00 | |
0x01 | 控制器已開始監視BD_ADDR和Monitor_handle指定的裝置。 |
附錄
本節包含Microsoft定義的藍牙 HCI 延伸模組範例和圖表。
範例:HCI_VS_MSFT_LE_Monitor_Advertisement的比對模式
此範例顯示已 接收的 HCI_VS_MSFT_LE_Monitor_Advertisement 命令,以及針對命令參數評估三個不同的公告封包。
收到 HCI_VS_MSFT_LE_Monitor_Advertisement 命令 控制器會收到HCI_VS_MSFT_LE_Monitor_Advertisement 命令,並包含下列參數。
參數 | 值 | 備註 |
---|---|---|
Subcommand_opcode | 0x03 | HCI_VS_MSFT_LE_Monitor_Advertisement的 子命令 opcode |
RSSI_threshold_high | 0x01 | 1dB |
RSSI_threshold_low | 0xCE | -50dB |
RSSI_threshold_low_time_interval | 0x05 | 5 秒鐘 |
RSSI_sampling_period | 0xFF | 無取樣 |
Condition_type | 0x01 | Condition |
Condition | 0x02 | 應比對兩個模式 |
0x03 | 第一個模式的長度,包括AD類型和起始位置 | |
0x01 | AD 類型 | |
0x00 | AD 類型之後的起始位置 | |
0x01 | 要比對的第一個模式 | |
0x06 | 第二個模式的長度,包括AD類型和起始位置 | |
0xFF | AD 型態 (製造商特定資料) | |
0x00 | AD 類型之後的起始位置 | |
0x00 | 要比對的第二個模式 | |
0x06 | ||
0xFF | ||
0xFF |
控制器接著會收到下列公告封包。
公告封包 [A]
0x02 0x01 0x01 0x07 0x09 0x54 0x61 0x62 0x6C 0x65 0x74 0x05 0xFF 0x00 0x06 0xFF 0xFF
公告封包 [B]
0x02 0x01 0x01 0x07 0x09 0x54 0x61 0x62 0x6C 0x65 0x74 0x04 0xFF 0x00 0x06 0xFF
公告封包 [C]
0x07 0x09 0x54 0x61 0x62 0x6C 0x65 0x74 0x05 0xFF 0x00 0x06 0xFF 0xFF
公告封包 [D]
0x02 0x01 0x02 0x05 0xFF 0x00 0x06 0xFF 0x01
評估廣告封包的相符專案 [A]
描述 | 值 |
---|---|
要比對之第一個模式的 AD 類型 | 0x01 |
要比對的第一個模式長度 | 0x03 - 0x02 = 0x01 位元組 |
要比對 AD 類型0x01位置0x00的模式 | 0x01 |
AD 類型0x01位置的位元組0x00 | 0x01 (MATCH!) |
要比對的第二個模式的 AD 類型 | 0xFF (製造商特定資料) |
要比對的第二個模式長度 | 0x06 - 0x02 = 0x04 個字節 |
要與AD類型0xFF位置0x00相符的模式 | 0x00 0x06 0xFF 0xFF |
AD 類型0xFF位置的位元組0x00 | 0x00 0x06 0xFF 0xFF (MATCH!) |
判決: PASS (兩種模式相符)
評估廣告封包的相符專案 [B]
描述 | 值 |
---|---|
要比對之第一個模式的 AD 類型 | 0x01 |
要比對的第一個模式長度 | 0x03 - 0x02 = 0x01 位元組 |
要比對 AD 類型0x01位置0x00的模式 | 0x01 |
AD 類型0x01位置的位元組0x00 | 0x01 (MATCH!) |
要比對的第二個模式的 AD 類型 | 0xFF (製造商特定資料) |
要比對的第二個模式長度 | 0x06 - 0x02 = 0x04 個字節 |
要與AD類型0xFF位置0x00相符的模式 | 0x00 0x06 0xFF 0xFF |
AD 類型0xFF位置的位元組0x00 | 0x00 0x06 0xFF (不相符) |
判決: PASS (只有第一個模式相符)
評估廣告封包的相符專案 [C]
描述 | 值 |
---|---|
要比對之第一個模式的 AD 類型 | 0x01 |
要比對的第一個模式長度 | 0x03 - 0x02 = 0x01 位元組 |
要比對 AD 類型0x01位置0x00的模式 | 0x01 |
AD 類型0x01位置的位元組0x00 | Undefined。 廣告沒有AD類型0x01的數據。 |
要比對的第二個模式的 AD 類型 | 0xFF (製造商特定資料) |
要比對的第二個模式長度 | 0x06 - 0x02 = 0x04 個字節 |
要與AD類型0xFF位置0x00相符的模式 | 0x00 0x06 0xFF 0xFF |
AD 類型0xFF位置的位元組0x00 | 0x00 0x06 0xFF 0xFF (MATCH!) |
判決: PASS (只有第二個模式相符)
評估廣告封包的相符專案 [D]
描述 | 值 |
---|---|
要比對之第一個模式的 AD 類型 | 0x01 |
要比對的第一個模式長度 | 0x03 - 0x02 = 0x01 位元組 |
要比對 AD 類型0x01位置0x00的模式 | 0x01 |
AD 類型0x01位置的位元組0x00 | 0x02 (不相符) |
要比對的第二個模式的 AD 類型 | 0xFF (製造商特定資料) |
要比對的第二個模式長度 | 0x06 - 0x02 = 0x04 個字節 |
要與AD類型0xFF位置0x00相符的模式 | 0x00 0x06 0xFF 0xFF |
AD 類型0xFF位置的位元組0x00 | 0x00 0x06 0xFF 0x01 (不相符) |
判決: FAIL (模式都不符合)
範例:公告監視
此範例說明 RSSI 公告監視。 符合指定條件之已接收公告的 RSSI 值如下所示。
次數 | RSSI (dB) |
---|---|
1 | -100 |
2 | -90 |
3 | 5- |
4 | -15 |
5 | -30 |
6 | -15 |
7 | -45 |
8 | 20- |
9 | 35- |
10 | -45 |
11 | 70- |
12 | -85 |
13 | -85 |
14 | -85 |
15 | -90 |
16 | -90 |
17 | 70- |
參數 | 值 |
---|---|
RSSI_threshold_high | -10dB |
RSSI_threshold_low | -80dB |
RSSI_threshold_low_time_interval | 3 秒 |
RSSI_sampling_period | 2 秒 |
廣告 RSSI 在 3 時大於 RSSI_threshold_high 。 取樣的定期定時器會從時間 3 開始。 每隔 2 秒,定期定時器就會過期,而所接收公告的平均 RSSI 值會傳播至堆疊。
當定期定時器在時間 5 到期時,在此時間 (-23dB) 期間收到的廣告 RSSIs 平均會傳播至堆疊。
當定期定時器在時間 13 到期時,在此時間範圍內收到的廣告 RSSIs 平均低於 RSSI_threshold_low (-80dB)。 廣告 RSSI (-85 dB) 的平均值應該傳播至主機。
當 RSSI_threshold_low_time_interval 在瞬間 15 到期時,會將廣告傳播到具有 -85dB RSSI 的主機。 在此範例中,不會再傳送任何廣告給主機。
範例:從裝置監視 BAP 公告
雖然與 CAP 接受器系結,但未連線,但主機可以監視來自該裝置的 BAP 公告。
參數 | 值 |
---|---|
Subcommand_opcode_v2 | 0x0F |
RSSI_threshold_high | -127 |
RSSI_threshold_low | -127 |
RSSI_threshold_low_time_interval | 0x05 |
RSSI_sampling_period | 0x00 |
Monitor_options | 位 0 設定;如果裝置散發 IRK,則設定位 1 |
Advertisement_report_filtering_options | 位 0、1 和 2 設定 |
Peer_device_address | <address> |
Peer_device_address_type | <地址類型> |
Peer_device_IRK | <IRK,如果已設定位 1> |
Condition_type | 0x01 |
Number_of_patterns | 0x01 |
Pattern_data | 0x04 (長度) 0x16 (服務數據 – 16 位 UUID) 0x00 (起始位元組) 0x4E (ASCS UUID 的低位元元組) 0x18 (ASCS UUID 的高位元元組) |
範例:從裝置監視 CAP 公告
雖然與 CAP 指揮官結合,但未連線,但主機可以監視來自該裝置的 CAP 公告。
參數 | 值 |
---|---|
Subcommand_opcode_v2 | 0x0F |
RSSI_threshold_high | -127 |
RSSI_threshold_low | -127 |
RSSI_threshold_low_time_interval | 0x05 |
RSSI_sampling_period | 0x00 |
Monitor_options | 位 0 設定;如果裝置散發 IRK,則設定位 1 |
Advertisement_report_filtering_options | 位 0、1 和 2 設定 |
Peer_device_address | <address> |
Peer_device_address_type | <地址類型> |
Peer_device_IRK | <IRK,如果已設定位 1> |
Condition_type | 0x01 |
Number_of_patterns | 0x01 |
Pattern_data | 0x04 (長度) 0x16 (服務數據 – 16 位 UUID) 0x00 (起始位元組) 0x53 (CAS UUID 的低位元元組) 0x18 (CAS UUID 的高位元組) |
流程圖:公告和篩選接受清單篩選
此流程圖提供廣告篩選的範例控制器實作,並在收到廣告時篩選接受清單篩選。
只要主機收到公告通知或 流程圖所指定的HCI_VS_MSFT_LE_Monitor_Device_Event ,控制器就可以以不同的方式實作此邏輯。
順序圖:傳播與公告相關聯的掃描回應
順序圖:傳播與公告相關聯的掃描回應
此順序圖顯示傳播掃描回應,該回應與啟用使用中掃描時滿足廣告篩選條件的廣告相關聯。 此圖表只會顯示控制器與主機之間預期的事件順序,而且不會顯示控制器與特定裝置之間的事件。 假設有廣告 A 符合廣告篩選條件,而廣告 B 不符合廣告篩選條件。