首页 > 其他分享 >air interface packets --- 蓝牙广播包

air interface packets --- 蓝牙广播包

时间:2024-03-23 17:44:25浏览次数:25  
标签:LE 数据包 packets 地址 air --- 广播 前导 数据

LE 物理层类型

一共有三种,分别是LE Uncoded PHYs (LE 1M and LE 2M) 、LE Coded PHY,本文主要讲解LE 1M

报文格式

前导码

所有链路层数据包都有一组前导码,前导码被接收机用于执行频率同步、符号时序预估和自动增益控制(AGC)训练。前导码为固定的0和1交替二进制序列。对于在LE 1M物理层上发送的数据包前导码为8比特;对于在LE 2M物理层上发送的数据包前导码为16比特。LE 1M和LE 2M物理层数据包前导码的第一个比特(按发送顺序)应当与存取地址的最低有效位相同。LE Coded物理层数据包的前导码由10组二进制序列'00111100'构成,合计为80比特。 

接入地址

用于区分不同连接或者不同周期性广播的32位识别码,接收机可以通过接入地址的值确定为广播包。所有主广播物理信道数据包均统一使用蓝牙核心规范中指定的专用存取地址- 0x8E89BED6。

协议数据单元

用于装载需要传输的数据,广播PDU和数据PDU格式不同。

PDU Type

指示广播包的类型

Length

指的是 payload 的长度,

payload

对于广播包,长度是37字节,其中6字节是MAC,其他是数据

广播包中的数据域使用LTV的格式进行定义,即 length + type + value
length表示(type + value)的总长度

蓝牙协议已经规定了一部分type,比如0x09是设备名,如下

注:图片来自 Assigned_Numbers.pdf

0xFF 是用户自定义类型

循环冗余校验码

24位CRC,基于PDU计算产生,用于校验数据包PDU的正确性

抓取广播包验证

使用wireshark对广播包进行抓包分析,如下为所抓实际数据:

注意:

广播数据为小段模式,即低字节在前,如接入地址4byte为0X8E89BED6,在广播数据中的存在格式为 “d6 be 89 8e” 。
广播1byte前导是在接收时被底层处理掉,不会存在抓包后的广播数据中显示的。
wireshark抓到的广播数据除了蓝牙本身数据外,还会增加软件自己的头信息。另我们去掉wireshark软件自带的头信息。我们去掉wireshark自带的数据信息,实际广播数据是从4byte接入地址开始的,即 “d6 be 89 8e”。

根据广播包格式,在4byte接入地址后,为1byte的报头 + 1byte 的数据长度,这2byte组成了抓包数据中的Packet Header,如下:

Packet Header的数据解析格式如下:

根据解析格式,我们可以0x2520值解析如下:

RxAddr和TxAddr位均为0,表示使用的是Public address地址

PDU Type为0000,表示使用的广播模式为通用广播

Length为37,表示广播数据域长度为37byte

然后我们来看看37byte数据域的内容:
前面我们说过,广播包必须带6byte的MAC地址,这里的Advertising Address为 34:85:18:b8:35:82,即为广播设备的MAC地址。

还剩31byte的实际数据如下:

第1个LTV数据组合为L = 2,T = 0x01,V = ‘0000 0110’
L = 2, 表示T+V的数据长度为2bytre
T = 0x01, 表示数据类型为ESP_BLE_AD_TYPE_FLAG ,表示设置广播标志
在ESP32中是这么定义广播标志的:

#define ESP_BLE_ADV_FLAG_LIMIT_DISC         (0x01 << 0)
#define ESP_BLE_ADV_FLAG_GEN_DISC           (0x01 << 1)
#define ESP_BLE_ADV_FLAG_BREDR_NOT_SPT      (0x01 << 2)
#define ESP_BLE_ADV_FLAG_DMT_CONTROLLER_SPT (0x01 << 3)
#define ESP_BLE_ADV_FLAG_DMT_HOST_SPT       (0x01 << 4)
#define ESP_BLE_ADV_FLAG_NON_LIMIT_DISC     (0x00 )

 

V = ‘0000 0110’,表示使用ESP_BLE_ADV_FLAG_GEN_DISC 和 ESP_BLE_ADV_FLAG_BREDR_NOT_SPT ,即使用通用广播发现模式,不支持BR/EDR。

依次类推:
第2个TLV数据组合为L = 3,T = 0x19, V = 0x0040 ,设置蓝牙外观显示。可以设置为手表、手机等等外观形式,这里设置成手机外观。
第3个TLV数据组合为L = 13,T = 0x09, V = CcBle-123456,为蓝牙名称
第4个TLV数据组合为L = 3, T = 0x03, V = 0x00ee, 为2byte广播UUID
第5个LTV数据组合为L = 5, T = 0x12,V = 6和16, 表示表示从机连接最小间隔和最大间隔时间。实际时间为 值*1.25毫秒

到此,一共5个LTV数据组合全部解析完成。
一共为5byte + L总长度(2+3+13+3+5) = 31byte,刚好与我们前面解析出来的31byte实际数据长度对应。

最后是3byte的CRC值。

 

标签:LE,数据包,packets,地址,air,---,广播,前导,数据
From: https://www.cnblogs.com/god-of-death/p/18091390

相关文章

  • [ROS 系列学习教程] rqt可视化工具箱 - 日志工具
    ROS系列学习教程(总目录)本文目录零、rqt可视化工具箱一、rqt_console二、rqt_logger_level零、rqt可视化工具箱rqt是ROS的一个软件框架,以插件的形式实现各种GUI工具。可以在rqt中将所有现有的GUI工具作为子窗口运行,也可以以独立方法运行,但rqt可以更轻松地同......
  • Vue3 - Element Plus 下拉选择器 el-select 覆盖修改 placeholder样式,解决覆盖不生效
    前言如果需要Vue2版本,请访问这篇文章。本文实现了在vue3+element-plus网站开发中,完美覆盖el-select选择器样式,强力修改select下拉选择框placeholder样式,同时也支持修改文字、大小、边框、等,支持任意样式的覆盖修改!网上的教程几乎都不生效,使用本教程的方法......
  • 爬虫工作量由小到大的思维转变---<第四十九章 Scrapy 降维挖掘---中间件系列(1)>
    前言:        Scrapy是一个功能强大的网络爬虫框架,但在实际应用过程中,中间件问题可能会成为一个令人头痛的难题。为了彻底解决Scrapy中的各种疑难杂症,我决定进行第四次全面的学习和实践,并将中间件的问题一一拆解,以确保我对中间件的理解和掌握更加全面和深入。正文:爬......
  • OD C卷 - 快递员的烦恼
    快递员的烦恼(200)保证快递送到客户手中,不限制先后顺序;所有快递送完后,快递员还需要回到投递站(只有一个);投递站与客户之间都有路线,但客户与客户之间不一定有路线;投递站、客户位置均允许多次经过;输入描述:首行输入两个正整数n,m;下面n行,输入快递信息,格式为客户id投递站到该......
  • 前端报错 request to https://registry.npm.taobao.org/yorkie/download/yorkie-2.0.0
    前端npminstall报错:npmERR!requesttohttps://registry.npm.taobao.org/yorkie/download/yorkie-2.0.0.tgzfailed,reason:certificatehasexpired解决方式://1.清空缓存npmcacheclean--force//2.切换新源:npmconfigsetregistry镜像源npmconfig......
  • C++U6-09 - 数学专题(二)各种进制知识
    学习目标 进制  二进制转十进制 二进制 代码 十进制转二进制代码 十进制转二进制小数方式,转其他进制同理 二进制转八进制方法二 八进制转二进制方法二二进制转十六进制方法二 代码 代码 十六进制转换成二进制 n进制转十进制小数部分......
  • 视图渲染数据-iframe跨越问题
    控制器传入数据视图渲染#for循环{%foriteminoverviewof%}{{item.epg}}{%endfor%}#跳转链接{%url'look'%}path('look/',views.look,name='look'),iframe跨越问题X_FRAME_OPTIONS='SAMEORIGIN'#视图控制器引用fromdjango.......
  • 2024年3月23日-UE5-触发区域
    新建一个ACTOR叫触发区域  新建立方体,拼成一个类似球门的形状  创建一个点光源,实现子弹打入球门,就触发发光的效果  然后把可视的光默认改为不可见 给球门挂上触发区域 调整覆盖整个球门  给盒体加上触发条件的设置 把光拖出来 然后给子弹打入......
  • Linux--Flappy_bird实现
    目录voidhandler(intsig): mian:voidinit_curses()intset_timer(intms_t); 小鸟的操作: voidshow_pipe(): voidcreate_list()voidclear_pipe()voidmove_pipe(); test_bird.c完整代码:代码实现:#include<stdio.h>#include<curses.h>#include<signal.......
  • Web漏洞--数据库注入
    数据库注入Access、mysql、mssql、mongDB、postgresql、sqlite、oracle、sybase等#上节课JSON注入案例分析天池大数据众智平台-阿里云天池所以json注入时要在1、2、3上面去注入#简要学习各种数据库的注入特点数据库架构组成,数据库高权限操作Access是低等级的数据库,依......