蓝牙开发那些事儿(3)——看看空中包

  • Post author:
  • Post category:其他

在initial阶段我们看到了大量的hci command和hci event的交互,controller在init结束后完成了初始化,状态也变成了HCI_INIT_DONE。

接下来就要进入一个叫做GAP的profile,GAP这个profile和其他profile的明显区别是,其他profile都是基于l2cap的,而gap不是。

我们先看一下gap的定义:

GAP,Generic Access Profile,该Profile保证不同的Bluetooth产品可以互相发现对方并建立连接

GAP定义了蓝牙设备如何发现和建立与其他设备的安全/不安全连接
它处理一些一般模式的业务(如询问、命名和搜索)和一些安全性问题(如担保)
同时还处理一些有关连接的业务(如链路建立、信道和连接建立)

GAP规定的是一些一般性的运行任务;因此,它具有强制性,并作为所有其它蓝牙应用规范的基础

Gap之所以会叫做profile,因为他其实也是一种应用。

举个实例,我们手机上的蓝牙,都是需要进入蓝牙设置菜单,打开可配对,然后 进入可以被其他蓝牙设备发现的状态的。这个时候,其实就是调用了gap的接口。

 

我们这次的抓包,也就是从initial完成后,这一条命令开始正式进入gap阶段。

基本上一个屏幕已经放不下了,因为GAP层涉及到的东西包括发现、连接、鉴权、加密等内容,展开讲还是非常多的。

作为controller来讲,这个时候和initial的第一阶段相比,最大的不同,是开始和外界交互了。

我们可以看一下空中包的情况。

如图所示,空中出现了大量的LMP包,所谓LMP包,其实就是红线标识的ACL-C包。这些LMP包的内容其实都是controller的行为,上层是不清楚的,上层在这一阶段的参与,主要是向controller发送命令,让controller进入某种状态,可配对、可连接、读取远程设备信息、加密…等等。

而这个阶段之后,其他profile开始工作的时候,host的参与感就更强了,可以看到红框下面的那些包,都是l2cap层以上的包,这些包都是从host层通过hci acl data接口下发给controller,由controller通过 ACL –U包这种格式发给远端的。

说到ACL-C\ACL-U, 这个阶段,我们有必要讲一下蓝牙数据包的格式了。

看一下下图,我记得有次面试的时候,有个面试官专门问了我蓝牙数据包的格式,这个虽然说协议规范中都有,但是搞蓝牙的人,如果背不出来,也是要被鄙视的。

首先是access code,其中包含了PA,preamble,基本上无线通信不可或缺的东西,含包括了SYNC WORD,SYNC WORD中间就隐含了蓝牙地址在里面,我们知道现在无线环境复杂,空中包那么多,我们怎么知道哪些包是我们需要的呢,就是根据蓝牙地址,很多垃圾信息,在access code就可以过滤掉了。

下图是access code的格式:

然后是Packet header,packet header主要包括Lt_addr, 这个地址用来区分slave设备的,然后包的格式,包括DM1、2DH3、2EV3等各种格式的,不同格式的编码效率、抗干扰性都不相同,基带会根据环境自动选取合适的格式去发送数据包

然后流控,ARQ(问答机制),序列号等内容,最后是一个HEC校验码

在packet header后面有一个guard同步,因为如果是edr的话,前后的调制方式是不一样的,需要重新同步一下。

然后是payload header,我们这里只讨论acl包,(sco包不讨论)上文提到了包格式就在这里面的LLID包含了,其实LLID也无外乎两种包格式,一种是LMP-C,一种是LMP-U,只不过这里的LMP-U涉及到分包的内容,我们也知道l2cap层支持分包,主要的实现就是在LLID中去标识是start包还是continous包。注意这个payload header和header都有一个流控位,很容易搞混,具体的内容我们下文讲。

再后面就是payload body了,这个就完完全全是我们上层协议发下去的东西了。

controller在接收数据包的时候,首先是在预定的接收slot上,按照预定的调频序列打开RF,假如收到access code的话,判断蓝牙地址,如果不是发给我们的,直接过滤,接着接收packet header,其中有HEC校验,如果校验不通过,又直接过滤,然后调整RF,接收payload,payload最后是有crc校验的,如果crc不通过的话,又会被过滤掉,所以最后controller上传给host的数据包是经过了千山万水辛苦达到的,是可靠的。


版权声明:本文为qq_34667436原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。