一.概述

   在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. HDFS机架感知功能原理(rack awareness)

    转自:http://www.jianshu.com/p/372d25352d3a HDFS NameNode对文件块复制相关所有事物负责,它周期性接受来自于DataNode的HeartBeat和Blo ...

  2. wpf 客户端【JDAgent桌面助手】开发详解(四) popup控件的win8.0的bug

    目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...

  3. easyui的validatebox重写自定义验证规则的几个实例

    validatebox已经实现的几个规则: 验证规则是根据使用需求和验证类型属性来定义的,这些规则已经实现(easyui API): email:匹配E-Mail的正则表达式规则. url:匹配URL ...

  4. LIS(nlogn) POJ 3903 Stock Exchange

    题目传送门 题意:LIS最长递增子序列 O(nlogn) 分析:设当前最长递增子序列为len,考虑元素a[i]; 若d[len]<a[i],则len++,并使d[len]=a[i]; 否则,在d ...

  5. BZOJ4340 : BJOI2015 隐身术

    枚举$B$串的每个后缀,统计出该后缀所有满足条件的前缀. 考虑暴力搜索,设状态$(x,y,z)$表示当前需要考虑$A$从$x$开始的后缀,$B$从$y$开始的后缀,之前部分编辑距离为$z$. 那么首先 ...

  6. BZOJ4296 : [PA2015]Mistrzostwa

    先不断将度数小于D的点都删去,再找到剩下的图里最大的连通块即可. #include<cstdio> #include<algorithm> #define N 200010 i ...

  7. BZOJ3679 : 数字之积

    设f[i][p2][p3][p5][p7][j][k]表示前i位,2,3,5,7的次数,前i位是否等于x,是否有数字的方案数 然后数位DP即可,ans=cal(r)-cal(l) #include&l ...

  8. Distributed RPC —— 分布式RPC

    This tutorial showed how to do basic stream processing on top of Storm. There's lots more things you ...

  9. 编写爬虫程序的神器 - Groovy + Jsoup + Sublime

    写过很多个爬虫小程序了,之前几次主要用C# + Html Agility Pack来完成工作.由于.NET BCL只提供了"底层"的HttpWebRequest和"中层& ...

  10. java获取获得Timestamp类型的当前系统时间

    java获取取得Timestamp类型的当前系统时间java获取取得Timestamp类型的当前系统时间 格式:2010-11-04 16:19:42 方法1: Timestamp d = new T ...