空包 深入了解 GAP:蓝牙设备如何建立安全/不安全连接的关键 Profile
2024-08-20
373浏览
空包 深入了解 GAP:蓝牙设备如何建立安全/不安全连接的关键 Profile我们可以看一下空中包的情况。这个阶段,我们有必要讲一下蓝牙数据包的格式了。看一下下图,我记得有次面试的时候,有个面试官专门问了我蓝牙数据包的格式,这个虽然说协议规范中都有,但是搞蓝牙的人,如果背不出来,也是要被鄙视的。body了,这个就完完全全是我们上层协议发下去的东西了。

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

我们先来看一下gap的定义:

GAP,Generic Access Profile,这个Profile确保不同的蓝牙产品能够互相发现并建立连接

GAP 定义了蓝牙设备如何发现其他设备并建立安全/不安全的连接。

它处理一些常见的业务模式(例如查询、命名和搜索)和一些安全问题(例如担保)

它还处理一些与连接相关的服务(例如链路建立、通道和连接建立)

GAP 指定了一些常规操作任务;因此,它是强制性的,并作为所有其他蓝牙应用规范的基础。

Gap之所以叫做profile,是因为它实际上是一个应用程序。

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

我们这次的抓包,也就是初始完成之后,这个命令就正式进入gap阶段了。

基本上,它已经无法放在一个屏幕上,因为 GAP 层涉及到发现、连接、身份验证、加密等内容,还有很多内容需要详细讨论。

对于控制器来说,这一次和初始第一阶段最大的区别就是开始与外界进行交互。

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

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

过了这个阶段,当其他profile开始起作用的时候,host的参与度就更强了,可以看到红框下面的packet都是l2cap层以上的packet,这些packet都是从host层通过hci acl数据接口发送到controller,再由controller以ACL-U的packet格式发送给remote端。

说到ACL-C\ACL-U,现阶段我们需要说一下蓝牙数据包的格式。

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

首先是Access Code,它包括PA和Preamble,这基本上是无线通信必不可少的元素。它还包括SYNC WORD空包,蓝牙地址隐含在SYNC WORD中。我们知道现在无线环境复杂,空中包那么多,我们怎么知道哪些包是我们需要的呢?答案就是根据蓝牙地址。Access Code中可以过滤掉很多垃圾信息。

下图显示了访问代码的格式:

接下来是Packet header,包头主要包括Lt_addr,用来区分从设备。然后是数据包格式,包括DM1、2DH3、2EV3等格式,不同格式的编码效率、抗干扰性都不一样空包,基带会根据环境自动选择合适的格式发送数据包。

然后是流量控制、ARQ(问答机制)、序列号等,最后是HEC校验码

包头后面有一个保护同步,因为如果是EDR,前后的调制方式不一样,需要重新同步。

然后就是payload header了,我们这里只讨论acl的包(sco的包就不讨论了)。上面说的封装格式是包含在LLID里面的,其实LLID也有两种封装格式,一种是LMP-C,一种是LMP-U。不过这里的LMP-U涉及到sub-packeting,我们也知道l2cap层是支持sub-packeting的,主要实现就是在LLID里面识别是start packet还是continous packet。注意payload header和header都有flow control bit,容易混淆,具体的内容我们下面再讨论。

接下来是payload body,这个完全是由我们的上层协议发送的。

当控制器收到一个数据包时,首先按照预定的调频序列在预定的接收槽上开启RF,如果收到访问码,就判断蓝牙地址,如果不是发给我们的,就直接过滤掉。然后接收包头,包头里有HEC校验,如果校验不通过,就直接再过滤掉,然后调整RF接收payload,payload最后有CRC校验,如果CRC不通过,就再过滤掉。所以,控制器上传给主机的数据包是历经千山万水,是可靠的。

以上内容均来自网络搜集,如有侵权联系客服删除

图文阅读
 
QQ在线咨询
客服热线
15370006169
客服微信号
stu006