西华县建设局网站,八点品牌设计公司招聘,个人网站建设方案模板,企业黄页软件1.概念 什么叫做广播#xff0c;顾名思义就像广场上的大喇叭一样#xff0c;不停的向外传输着信号。不同的是#xff0c;大喇叭传输的是音频信号#xff0c;而蓝牙传输的是射频信号。 BLE使用的是无线电波传递信息#xff0c;就是将数据编码#xff0c;调制到射频信号中发…1.概念 什么叫做广播顾名思义就像广场上的大喇叭一样不停的向外传输着信号。不同的是大喇叭传输的是音频信号而蓝牙传输的是射频信号。 BLE使用的是无线电波传递信息就是将数据编码调制到射频信号中发射。BLE使用的射频频率是2.4GHz。跟WIFI、Zigbee等协议使用的是同一频段。 那如何做到使用同一频段而有不相互干扰呢首先要知道的是2.4G指的不是某一个频率而指的是一个频段2400MHz-2483.5MHz。在这个频段内每隔2M为一个信道共40个信道。2.4G频段是一个用于短距离无须执照使用的开放频段。意思就是可以免费使用。为了不占用更多的资源从而造成相互干扰每个设备在使用时同一时刻只会在一个信道进行工作不会占用其他信道。一个BLE设备在任一时刻只能选择40个信道之中的一个进行发射或监听。 BLE将信道划分为广播信道和数据信道。广播信道只有3个37、38、39。剩下的37个信道全都是数据信道0-36。 在广播事件中每一个广播事件都会在3个广播信道中进行数据传输而且每一个事件都是从最小的信道编号开始传输。也就是说当广播事件来了数据包从广播信道37、38、39中依次进行传输。 2. 广播间隔 设备每次广播时会在3个广播信道发送相同的报文。这些发送报文的动作被称为一个广播事件。除了定向广播外其他广播事件均可以选择20ms-10.28s不等的间隔。通常一个广播中的设备会每一秒广播一次。两个相邻的广播事件之间的时间被称为“广播间隔”。 设备周期性的发送广播会有一个问题由于设备间的时钟会不同程度的漂移两个设备可能在很长一段时间同时广播而造成干扰。为了防止这一情况的发生除定向广播外的其他广播类型发送时间均会有些许波动。实现方式为在上一次广播事件后加入“0-10ms的随机延迟。这意味着即使两个设备广播间隔相同并在相同信道及时间点上发送造成了冲突但他们发送下一个广播事件时也很大概率不会冲突。 所以两个相邻的广播事件之间的时间间隔T_advEvent为 T_AdvEvent advInterval advDelay 其中advInterval必须是0.625ms的整数倍范围是20ms-10.24s之间。对于可扫描非定向广播和不可连接非定向广播者两种广播类型该值最好不小于100ms即160个0.625ms。advDelay是LL层分配的一个随机数范围为0-10ms。 在实际的设置中通过设置Advertising_Interval_Min最小广播间隔和Advertising_Interval_Max最大广播间隔这两个参数来调整广播间隔。都是以0.625ms为单位。如果要固定广播间隔为某一个值需要将这两个参数设置为同一个值即可。 3. 广播类型 3.1非定向可连接广播事件ADV_IND ADV_IND就是链路层通过广播信道发送广播的事件。发送的PDUProtocol Data Unit-协议数据单元是ADV_IND_PDU-通用广播报文。这个报文发送之后可以接收由扫描者发送的SCAN_REQ_PDU-扫描请求或者由发起者发送的CONNECT_REQ_PDU-连接请求。而接收后链路层需要在同一个信道上进行扫描或回复发起者的应答。当接收的数据报文不符合广播滤波协议要么就用下一个广播信道进行广播要么就停止广播事件。如果接收到的SCAN_REQ_PDU通过了滤波协议那么广播者需要在150±2us内在同一信道回复SCAN_RSP_PDU-扫描应答报文。如果接收到CONNECT_REQ_PDU则进入连接状态这个时候并不需要进行应答。 需要注意的是一个广播事件中相邻两个ADV_IND_PDU之间的时间需要不大10ms。 接下来分类一下此类广播事件中广播包的发送情况。
1仅仅有广播PDUS 2在广播事件中有SCAN_REQ_PDUS和SCAN_RSP_PDUS 注当有扫描请求包在广播事件中的中间信道上收到时T_IFS帧间隔为150us。
3在广播事件的结尾有SCAN_REQ和SCAN_RSP 4在广播事件的中间接收到CONNECT_REQ-连接请求包。没有应答 3.2 定向可连接广播事件ADV_DIRECT_IND 这个广播是为了快速建立链接。这种报文包含两个地址广播者地址和发起者地址。发起者收到发给自己的定向广播报文后可以立刻发送连接请求事件作为回应并立刻进入连接状态。 定向广播事件有特殊的时序要求。完整的广播事件必须每3.75ms之内重复一次即3.75ms内在37、38、39三个广播信道上全部发送一次报文。这样的方法使得扫描设备只需要扫描3.75ms即可收到定向广播设备的消息。
3.3 非定向不可连接事件ADV_NONCONN_IND 该广播的时间要求与通用广播事件相同。此外该事件只向外发射广播报文但是不可以被连接也不接收任何信息。是唯一一个只有发射而没有接收的广播类型。ibeacon发出的就是这种类型的广播。
3.4 非定向可发现不可连接事件ADV_DISCOVER_IND/ADV_SCAN_IND 该广播的时间要求与通用广播事件相同应答也是SCAN_REQ和SCAN_RSP。这个广播和通用广播的区别是它不能建立连接。 注所谓的定向和非定向针对的是广播对象如果是针对特定的对象进行广播在广播包PDU中包含目标对象的MAC则为定向广播。反之为非定向广播。可连接和不可连接指的是是否接受连接请求。如果是不可连接的广播类型它将不应答连接请求报文。可扫描广播类型会回应扫描请求。
不同的广播类型对应的扫描请求和连接请求如下图 4.广播响应包 广播包有两种广播包Advertising Data和响应包Scan Response。其中广播包是每个设备必须广播的而响应包是可选的。 广播包在蓝牙5.0协议栈核心中介绍如下 应答包介绍如下 每个包都是31字节数据包中分为有效数据significant和无效数据non-significant 有效数据部分包含若干个广播数据单元称为AD Structure。AD Structure的组成是第一个字节是长度值Len表示接下来的Len个字节是数据部分。数据部分的第一个自己表示数据的类型AD Type剩下的len-1个字节是真正的数据AD Data。 无效数据部分因为广播包的长度必须是31个字节如果有效数据部分不到31字节则剩余部分用0补全。 广播响应包是为了给广播一个额外的31字节数据用于主机在主动扫描情况下反馈数据使用。
5. 广播数据包分析
软件工具wireshark
硬件抓包工具nrf52840 dongle
使用wireshark抓到的数据包分为两个部分一部分是软件自己添加的内容另一部分才是广播出来的数据。
5.1 软件添加部分 软件添加的大部分内容可以不关注。这里需要关注的内容如下 这里主要关注信道和时间戳。
这里我们截取三个相邻的广播包来分析一下 上边截取了相邻的三个广播数据包。可以看到1号的信道为37开始到结束时间为296us。2号的信道为38开始到结束时间为296us。3号的信道为39开始到结束时间为296us。1号到2号的间隔为1000us左右2号到3号的间隔为1000us左右。 可以看到此时广播是从37信道开始依次为37、38、39信道。当在39信道广播数据后收到了SCAN_RSP。此时则停止广播。下次再进行广播的话又从37信道开始。 如果说在一次广播事件中没有广播到39信道就收到SCAN_RSP会如何呢就算收到了SCAN_RSP依旧会继续广播。见下图 从上图可以看到1号广播是37信道并且在37信道接收到了SCAN_RSP。而此时广播事件并没有停止而是继续在38、39信道进行广播。
6.广播数据内容 非定向可连接广播事件ADV_IND 蓝色数据部分就是真实广播的内容。这里进行拆分。总共分为6部分。 Access Address目标地址
4字节小端。上图的值为 0x8e89bed6。所以BLE设备的广播帧都是使用这个地址。
6.1 PDU HeaderPDU 包头
PDU Header 虽然只有2字节。但是包含了很多内容。
PDU Header拆分如下 PDU type为广播类型 ADV_IND非定向可连接广播即通用广播 ADV_DIRECT_IND定向可连接广播即快速广播。 ADV_NONCONN_IND非定向必可连接广播即不能建立连接的广播。 ADV_SCAN_IND扫描帧是由scanner手机、平板、PC发出的。主动扫描时使用。 SCAN_REQ扫描请求帧是由scanner手机、平板、PC发出的。只在scanner想从advertiser获取更多的广播数据的时候才由scanner发出。 SCAN_RSP当advertiser收到SCAN_REQ时的回应。 CONNECT_REQCONNECT_INDscanner手机、平板、PC向advertiser发送的连接请求。 本次抓的数据使用的就是ADV_IND。 6.2 PDU data payload
Advertising Address 广播设备MAC地址 Advertising Data 广播包数据 广播包数据都是以 长度内容来表示的。比如这里我们抓的数据。 02 01 06为一组11-00为一组。 长度为0201表示指令类型 表示当前设备不支持经典蓝牙是通用可发现模式。
6.3 扫描应答 数据结构与ADV_IND是相同 PUD type显示为0100即为SCAN_RSP 与ADV_IND不同的是SCAN_RSP中的advertising data变成了Scan Response Data。 因为SCAN_RSP是对SCAN_REQ的回应所以其中会包含一些其他的信息。这些信息是程序中自己设置的。此次抓的包中内容为外貌和设备名称。scanner也就是获得了这些内容才知道扫描到的设备是什么类型叫什么名字。 7.连接请求 通过wireshark抓取到的连接请求包如下图 Access Address固定广播地址。
Packet Header包含了PUD类型为连接请求包Connect_ind发送地址和接收地址类型。
Initiator Address初始地址也就是主机的地址
Advertising Address广播者地址也就是设备的MAC地址。
Link Layer Data负载信息可以展开介绍。 Access Address接入地址 CRC InitCRC校验 Window Size传输窗口大小2.5ms Window Offset传输窗口偏移2.5ms Interval连接间隔30ms Latency潜伏周期0 Timeout连接最大超时时间5000ms Channel Map信道映射可用的信道为1不可用的为0. Hop调频增加跳频算法使用
Sleep Clock Accuracy主机睡眠时间精度
Connect_IND数据包中的一些信息在Nrf connect中也是可以看到的。