在HCI層看從inquiry的整個過程

一.概述
   在windows下尋找遠端藍牙設備,從最開始的inquiry尋找設備,到連接設備,到最後配對完成,整個HCI層所發的command和event以及Data包可以反應整個藍牙的inquiry,pair等原理和過程。這篇筆記就是分析這個過程,結合Spec的具體描述,以此熟悉藍牙的配對流程。

二.Inquiry流程
   這個流程主要是inquiry遠端的藍牙設備,不進行連接,只進行發現。

1.Write_Inquiry_Transmit_Power_Level command
01011001 00001100 00000001 00000000
可以看出首先是設置inquiry的發射功率。
OpCode爲0x0c59
total_lenrth爲0x01
發射功率爲0x00db
command completed event:
00001110 00000100 00000010 01011001 00001100 00000000
這個event有三個parameters:Num_HCI_Command_Packets,Command_Opcode和Return_Parameters
EventCode爲0x0e,
total_length爲0x04
Number HCI Command Packets: 2
OpCode爲0x0c59
status爲0,表示設置成成功。

2.Inquiry command event
    設置完inquiry的Tx Power後,就可以進行inquiry了。Inquiry的三個參數爲LAP, Inquiry_Length和
Num_Responses
00000001 00000100 00000101 00110011 10001011 10011110 00000011 00000000
OpCode:0x0401 
Total_length:0x05
LAP:00110011 10001011 10011110(GIAC)  //這是通用的呼叫的LAP爲0x9e8b33
Inquiry Length (sec): 0x03 //3 * 1.28 sec 總的inquiry時間
Num_Responses:0x00  //0x00表示在inquiry時間結束前不限制response的數量
command status event: 
//注意這裏沒有返回command completed events,表示inquiry的過程正在進行,結束應該用Inquiry Complete event
00001111 00000100 00000000 00000010 00000001 00000100
這個event有三個parameters:Status, Num_HCI_Command_Packets, Command_Opcode
EventCode:0x0F
totalLength:0x04
status:0x00
Num_HCI_Command_Packets:0x02
Command_Opcode:0x0401
表示inquiry的command執行成功

3.奇怪的command completed event
   Spec上指出在inquiry的過程中不會有command completed event產生,但FTS抓到兩個command completed event,但是這連兩個event的OpCode無效,這裏不知道爲什麼,猜測被Host忽略掉了。
在HCI層看從inquiry的整個過程

4.Inquiry Result with RSSI event  
   之後就是所有接收到inquiry的設備返回inquiry的結果,event爲Inquiry Result with RSSI。以下是其中的一個:
該Event的參數爲:
Num_responses,
BD_ADDR[i],
Page_Scan_Repetition_Mode[i],
Reserved[i],
Class_of_Device[i],
Clock_Offset[i],
RSSI[i]
00100010 00001111 00000001 01100100 01110110 01011000 00001101 10110111 10011100 00000001 00000010 00000100 00000001 00000010 11010010 01010000 10110010
EventCode:0x0F:0x22
totalLength:0x0F = 15
Num_responses:0x01
BD_ADDR[i] = 01100100 01110110 01011000 00001101 10110111 10011100 = 0x9c-b7-0d-58-76-64
Page_Scan_Repetition_Mode[i] = 00000001 = 0x01(R1)
Reserved[i] = 00000010 = 0x02  //保留
Class_of_Device[i] = 00000100 00000001 00000010 = 0x020104  //Computer,Handheld PC
Clock_Offset[i]:11010010 01010000 = 0x50d2
RSSI[i] = 10110010 = 0xb2(-78db)
以上反應了這個搜索到的設備的相關信息

5.Extended Inquiry Result event
   緊跟在Inquiry Result with RSSI event後,可能有多個。這個event反應的設備的額外信息,例如設備名稱。相比於Inquiry Result with RSSI event多了一個Extended_Inquiry_Response部分。如:
00101111 11111111 00000001 01110000 01010001 01000110 10000011 00010101 00000000 00000001 00000000 00000100 00000001 10111110 00101000 01110110 10110110 00001011 00001001 01010100 01010010 01001001 01010011 01010100 01000001 01001110 00101101 01010000 01000011 00000010 00001010 00000100 00000000 00000000 00000000 00000000 00000000 00000000 ........ 00000000
EventCode:0x0F:0x2F
totalLength:0xFF = 255  //減去15個字節剩下240個Extended Inquiry Response部分
在HCI層看從inquiry的整個過程
Num_responses:0x01
BD_ADDR[i] = 01110000 01010001 01000110 10000011 00010101 00000000 = 0x00-15-83-46-51-70
Page_Scan_Repetition_Mode[i] = 00000001 = 0x01(R1)
Reserved[i] = 00000000 = 0x00  //保留
Class_of_Device[i] 00000100 00000001 10111110 = 0xbe0104   //Computer,Handheld PC
Clock_Offset[i]:00101000 01110110 = 0x7628
RSSI[i] = 10110110 = 0xb6
以下是拓展部分:
Length:0x00001011 = 0x0b = 11
EIR Data Type:00001001 = 0x09(Complete Local Name)
EIR Data:01010100 01010010 01001001 01010011 01010100 01000001 01001110 00101101 01010000 01000011 00000010 00001010 00000100 00000000
轉換成ascii即爲:TRISTAN-PC
奇怪的是在這個名稱後面有幾個無法識別的字符:
在HCI層看從inquiry的整個過程
猜測可能是指明名稱的結束,收到event端的設備忽略即可吧,或者名稱很奇怪?
    可能有一系列的Extended Inquiry Result event,反映了不同的設備在響應主機的搜索。

6.inquiry completed event 
   這個event表示已經完成了整個的inquiry的過程。只有一個參數Status。如下:
00000001 00000001 00000000
event code:0x01
totalLength:0x01
status:0x00 成功
   奇怪的是在這條event之後又產生了command completed event,和3中的情況一樣,OpCode是不可識別的。。。

三.總結
  以上是整個inquiry過程產生的command和event。首先通過Write_Inquiry_Transmit_Power_Level command設置inquiry的發射功率,然後通過inquiry command尋找設備,Inquiry Result with RSSI event返回設備的相關信息,包括藍牙地址,class device等;Extended Inquiry Result event返回設別的額外信息,在這裏是設備的名稱;在inquiry length到達後,產生inquiry completed event表示inquiry整個過程的結束。
   需要注意的是,返回的inquiry result可能是多個的,至於command completed event的產生,很是奇怪,Spec上指出inquiry的過程不會產生command completed event的,而且這些event裏的OpCode部分是不可識別的,猜測Host會忽略這些沒有作用的command completed event。
發佈了71 篇原創文章 · 獲贊 30 · 訪問量 60萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章