低功耗蓝牙设备DA1458x芯片开发之更新连接参数

来源:互联网 发布:怎么用手机在知乎提问 编辑:程序博客网 时间:2024/06/03 18:21

今天将详细的讲解下低功耗蓝牙设备和手机连接时的抓包,以此帮助我这样的小白,并积累经验~

我用的外设芯片是DA14580芯片,协议栈是Dialog的IP蓝牙协议栈,和手机相连,利用sniffer packet抓包~欢迎指导交流

首先来了解下理论知识,更新参数即在蓝牙主从设备建立连接之后,主设备或从设备发起的对连接过程中参数的更改的行为,下面我们进行的是从设备发起连接参数更改请求,主设备接收请求并更改参数:


从上图可以很清楚的看出从机发起连接时,和主机的交互流程。

然后进行操作,将Dongle和低功耗蓝牙开发板连上电脑,开发板中的程序运行起来~走起
  


进入到sniffer packet中(sniffer packet不会的请自行百度啊),单击上图中的三角形,运行抓包工具,如下,可以看到很多广播数据包
 

出现如下图所示的InitA,即进行连接


上图不清楚,下面用表格将图中的关键参数列出来~

 



上图中的参数为:
Channel:0x25,广播信道,转化为十进制为37;低功耗蓝牙的广播地址为37/38/39中的任意一个;
InitA:连接发起者的蓝牙设备地址,长度为6字节;
AdvA:广播者的蓝牙设备地址,长度为6字节;
AcessAddr:接入地址,在两个低功耗设备建立连接之前,master设备负责生成接入地址,类似于一个四个字节的随机数,当连接建立之后,master和slave都使用该地址进行通信;连接断开后,接入地址自动失效。
CRCInit:CRC初始值,是master和slave用来验证数据包的完整性的。
WinSize:定义了设备每次开启收发机的窗口时间,无论是master还是slave,都遵循WinSize的定义。

WinOffset:定义了在CONNECT_REQ命令之后的一个通信窗口的偏移量,在slave设备接收到请求命令后,设备需要占用一些时间,根据LLData参数进行一些相关的配置。


在CONNECT_REQ之后,第一个由master发送到slave的数据帧,称为“锚点”,因为之后的所有的连接事件都以该时刻为基准。
ConnInterval的取值范围在7.5ms至4s之间,因此,确定锚点之后,master和slave将按照ConnInterval确定的时间间隔进行数据交互。
ConnInterval = Interval*1.25ms
对低功耗蓝牙技术,为了实现低功耗特性,不需要每次ConnInterval都产生连接事件,因此引入参数Latency,可以有效减少连接事件的产生,ConnSlaveLatency = Latency,这个参数定义了slave设备可以忽略多少个连续的连接事件,这表示slave不需要在每个连接事件产生的时刻都唤醒并打开射频接收机进行帧听,从而减少slave设备的功耗。
Timeout:定义了连接超时的长度,connSupervisionTimeout = Timeout*10ms,其值再100ms到32s之间。
注意:connSupervisionTimeout必须大于(1+ ConnSlaveLatency)*ConnInteral*2。否则,slave设备在Lantency状态,也会被认为是连接超时而导致连接断开。

ChM和Hop:跳频相关的,当连接建立以后,master和slave按照预先设定的信道图谱,和跳频跨度进行跳频工作。信道图谱来自ChM参数,每跳跨度来自Hop参数。Hop的取值范围在5—16之间。

我进行了外设发起连接参数更新的请求,手机端判断是否接受该请求并更新参数。下面是外设发起更新参数的过程


从上图可以看出,外设给出了最小Interval和最大Interval,SlaveLatency为0,Timeout时间延长。ATT将数据传输到LL层,粉色的LL层给出详细参数请求。

之后,土黄色的L2CAP层收到来自手机端的应答,其Result为0x0000,表示更新参数成功。

至此,低功耗蓝牙外设发起参数更新的过程结束啦~撒花~



1 0
原创粉丝点击