一.概述

   在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忽略掉了。

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  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部分

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
奇怪的是在这个名称后面有几个无法识别的字符:

猜测可能是指明名称的结束,收到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。

在HCI层看从inquiry的整个过程的更多相关文章

  1. 在HCI层ACL Connection的建立

    一.概述     上一篇博文介绍的是inquiry的整个过程中HCI层的command和event.在寻找到有效的远端蓝牙设备后,开始建立ACL连接,这里仅仅反应HCI层的数据包,对于LM层和Base ...

  2. BLUETOOTH:HCI层编程

    1. HCI层协议概述: Host Controller Interface(HCI)  就是用来沟通Host和Module.Host通常就是PC,Module则是以各种物理连接形式(USB,seri ...

  3. FTS抓包看蓝牙的SDP整个过程

    1.概述   SDP是蓝牙的Service Discovery Protocol,用来发现远程设备能够提供的Service.它只负责发现对方支持的Service,不负责Service的具体实现.   ...

  4. 【转】FTS抓包看蓝牙的SDP整个过程

    原文网址:http://blog.sina.com.cn/s/blog_69b5d2a50101f23c.html 1.概述   SDP是蓝牙的Service Discovery Protocol,用 ...

  5. 第11节-BLE协议HCI层的硬件接口

    本篇博客由韦东山视频整理所得 如何控制链路层让其发出广播包.数据包?通过HCI层向它发出命令,也可以通过ATT层.L2CAP层向LL层发出数据. 学习资料: 蓝牙协议core_v5.0.pdf < ...

  6. NGUI发布后UI层看不见的解决办法

    NGUI发布后UI层看不见的解决办法 提示信息:You can'tplace widgets on a layer different than the UIPanel that manages th ...

  7. 第12节-BLE协议HCI层的数据格式

    学习资料: 1. 蓝牙协议core_v5.0.pdf <Vol 2: Core System Package [BR/EDR Controller volume]>的“Part E: Ho ...

  8. FTS抓包看L2CAP Connection的建立(一)

    一.概述     在前面的文章中介绍了inquiry和ACL connection的建立过程.这个连接建立后,L2CAP signaling channel(CID = 0x0001)就已经存在,可以 ...

  9. 第13节-BLE协议L2CAP层

    学习资料:官方手册 Vol 3: Core System Package [Host volume] Part A: Logical Link Control and Adaptation Proto ...

随机推荐

  1. 【HTML5】表单属性

    * autocomplete autocomplete 属性规定 form 或 input 域应该拥有自动完成功能. 注释:autocomplete 适用于 <form> 标签,以及以下类 ...

  2. .NET中异常处理的最佳实践(转)

    原文出处: CodeProject   译文出处:周见智的博客   欢迎分享原创到伯乐头条 介绍 “我的软件程序从来都不会出错”.你们相信吗?我几乎可以肯定所有人都会大喊我是个骗子.“软件程序几乎不可 ...

  3. Maven中多模块的编译顺序

    在多模块的工程中,如果模块之间存在依赖关系,那模块的编译必须要有顺序的要求.例如:P(parent)中包含A模块和B模块,且A模块依赖于B模块,那么在P中的pom,xml中需申明为: <modu ...

  4. Open Xml SDK 引文

    什么是Open Xml SDK? 什么是Open Xml? 首先,我们得知道,Open Xml为何物? 我们还是给她起个名字——就叫 “开放Xml”,以方便我们中文的阅读习惯.之所以起开放这个名字,因 ...

  5. 算法教程(3)zz

    First off, we can use our Line-Point Distance code to test for the "BOUNDARY" case. If the ...

  6. BZOJ3118 : Orz the MST

    对于树边显然只需要减少权值,对于非树边显然只需要增加权值 设i不为树边,j为树边 X[i]:i增加量 X[j]:j减少量 C[i]:修改1单位i的代价 对于每条非树边i(u,v),在树上u到v路径上的 ...

  7. JBPM4.4学习API

    一.流程引擎API org.jbpm.api.ProcessEngine是jbpm4所有的Service API 之源. 既所有的Service API(服务接口)都从ProcessEngine中获取 ...

  8. OpenCV IplImage FlyCapture2 Image Conversion 两种图像类的相互转化

    OpenCV的IplImag和 FlyCapture2 的 Image是两种常见的图片格式,在实际的应用中,我们通常要混合使用OpenCV和FlyCapture2这两个SDK,所以这两种图片格式之间的 ...

  9. 8.按要求编写Java应用程序。 (1)建立一个名叫Cat的类: 属性:姓名、毛色、年龄 行为:显示姓名、喊叫 (2)编写主类: 创建一个对象猫,姓名为“妮妮”,毛色为“灰色”,年龄为2岁,在屏幕上输 出该对象的毛色和年龄,让该对象调用显示姓名和喊叫两个方法。

    package liu0917; public class Cat { String name="妮妮"; int age=2; String maose="灰色&quo ...

  10. Css3 - 动画旋转

    旋转1: <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="U ...