前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蓝牙数据报文解析

蓝牙数据报文解析

作者头像
Linux兵工厂
发布2023-02-28 12:55:44
2.2K0
发布2023-02-28 12:55:44
举报
文章被收录于专栏:Linux兵工厂

1.前言

由于工作需要,初次接触蓝牙。从最基础的知识开始了解。引用wiki中的介绍:

蓝牙(英语:Bluetooth),一种无线通讯技术标准,用来让固定与移动设备,在短距离间交换资料,以形成个人局域网(PAN)。其使用短波特高频(UHF)无线电波,经由2.4至2.485 GHz的ISM频段来进行通信。1994年由电信商爱立信(Ericsson)发展出这个技术。它最初的设计是希望创建一个RS-232数据线的无线通信替代版本。它能够连接多个设备,以克服同步的问题。蓝牙技术目前由蓝牙技术联盟(SIG)来负责维护其技术标准,其成员已超过三万,分布在电信、电脑、网络与消费性电子产品等领域[5]。IEEE曾经将蓝牙技术标准化为IEEE 802.15.1,但是这个标准已经不再继续使用。

蓝牙的标准是IEEE 802.15.1,蓝牙协议工作在无需许可的ISM(Industrial Scientific Medical)频段的2.45GHz。最高速度可达723.1kb/s。为了避免干扰可能使用2.45GHz的其它协议,蓝牙协议将该频段划分成79个信道,(带宽为1MHz)每秒的信道转换可达1600次。

2.工作方式

蓝牙技术分为基础率/增强数据率(BR/EDR)和低耗能(LE)两种技术类型。其中BR/EDR型是以点对点网络拓扑结构创建一对一设备通信;LE型则使用点对点(一对一)、广播(一对多)和网格(多对多)等多种网络拓扑结构

3.版本发展

version

4.数据传输

数据传输时,蓝牙模块分主机和从机两种模式。主机模式能够搜索别的蓝牙模块并且主动与之建立连接。从机模式不能主动的建立连接,从机处于广播状态等待主机连接请求。

5.BLE蓝牙数据包

研究UbertoothOne(想了解UbertoothOne的可以看往期文章)有一段时间了,嵌入式段的移植以及ubertooth相关命令的运行都没有问题。现在是对各个命令的输出结果还是有一些不明白的地方,很有必要花时间做一个详细的分析及记录。结果涉及到蓝牙数据包协议,需要对数据包相关字段做一个详细的解析才能更好的开展后面的业务。

  • 信道BLE的物理通道即“频道,分别是‘f=2402+k*2 MHz, k=0, … ,39’,带宽为2MHz”的40个RF Channel。其中,有3个信道是advertising channel(广播通道),分别是37、38、39,用于发现设备(Scanning devices)、初始化连接(initiating a connection)和广播数据(broadcasting date);其他的37个信道为data channel(数据通道),用于两个连接的设备间的通讯。
  • 数据包格式在低功耗蓝牙规范中,数据包格式分广播报文数据报文两种。广播报文:设备发现、连接建立、传输广播数据报文:自适应跳频以及设备间数据传输 设备利用广播报文发现、连接其它设备,而在连接建立之后,便开始使用数据报文。无论是广播报文还是数据报文,链路层只使用一种数据包格式。它由“前导码”(preamble)、“访问码”(access code)、”有效载荷“和”循环冗余校验“(Cyclical Redundancy Check,CRC)校验码组成。其中,”访问码“又称为”访问地址/接入地址“(access address)。
  • 前导码:1个字节长度,接收中用于频率同步、数据速率同步、自动增益控制调整。前导是一个8比特的交替序列。不是01010101就是10101010,取决于接入地址的第一个比特。若接入地址的第一个比特为0:01010101 若接入地址的第一个比特为1:10101010
  • 访问地址:4个字节长度,访问地址有两种类型(广播访问地址和数据访问地址) 广播访问地址:固定为0x8E89BED6,在广播、扫描、发起连接时使用。数据访问地址:随机地址,不同的连接有不同的值。在连接建立之后的两个设备间使用。
  • PDU1. 广播报文PDU:广播报文PDU头

PDU类型:

RFU:保留 TxAdd:发送地址字段 RxAdd:接收地址字段 发送地址字段和接收地址字段指示了设备使用公共地址(Public Address)还是随机地址(Random Address)。公共地址和随机地址的长度一样,都包含6个字节共48位。BLE设备至少要拥有这两种地址类型中的一种,当然也可以同时拥有这两种地址类型。长度:长度域包含6个比特,有效值的范围是6~37。

广播报文PDU数据数据:包含N个AD Structure,每个AD Structure由Length,AD Type和AD Data组成。其中:Length:AD Type和AD Data的长度。AD Type:指示AD Data数据的含义。

代码语言:javascript
复制
#define BLE_GAP_AD_TYPE_FLAGS                               0x01 /**< Flags for discoverability. */
#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE   0x02 /**< Partial list of 16 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE         0x03 /**< Complete list of 16 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE   0x04 /**< Partial list of 32 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE         0x05 /**< Complete list of 32 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE  0x06 /**< Partial list of 128 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE        0x07 /**< Complete list of 128 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME                    0x08 /**< Short local device name. */
#define BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME                 0x09 /**< Complete local device name. */
#define BLE_GAP_AD_TYPE_TX_POWER_LEVEL                      0x0A /**< Transmit power level. */
#define BLE_GAP_AD_TYPE_CLASS_OF_DEVICE                     0x0D /**< Class of device. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C               0x0E /**< Simple Pairing Hash C. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R         0x0F /**< Simple Pairing Randomizer R. */
#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_TK_VALUE           0x10 /**< Security Manager TK Value. */
#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_OOB_FLAGS          0x11 /**< Security Manager Out Of Band Flags. */
#define BLE_GAP_AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE     0x12 /**< Slave Connection Interval Range. */
#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT       0x14 /**< List of 16-bit Service Solicitation UUIDs. */
#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT      0x15 /**< List of 128-bit Service Solicitation UUIDs. */
#define BLE_GAP_AD_TYPE_SERVICE_DATA                        0x16 /**< Service Data - 16-bit UUID. */
#define BLE_GAP_AD_TYPE_PUBLIC_TARGET_ADDRESS               0x17 /**< Public Target Address. */
#define BLE_GAP_AD_TYPE_RANDOM_TARGET_ADDRESS               0x18 /**< Random Target Address. */
#define BLE_GAP_AD_TYPE_APPEARANCE                          0x19 /**< Appearance. */
#define BLE_GAP_AD_TYPE_ADVERTISING_INTERVAL                0x1A /**< Advertising Interval. */
#define BLE_GAP_AD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS         0x1B /**< LE Bluetooth Device Address. */
#define BLE_GAP_AD_TYPE_LE_ROLE                             0x1C /**< LE Role. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C256            0x1D /**< Simple Pairing Hash C-256. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R256      0x1E /**< Simple Pairing Randomizer R-256. */
#define BLE_GAP_AD_TYPE_SERVICE_DATA_32BIT_UUID             0x20 /**< Service Data - 32-bit UUID. */
#define BLE_GAP_AD_TYPE_SERVICE_DATA_128BIT_UUID            0x21 /**< Service Data - 128-bit UUID. */
#define BLE_GAP_AD_TYPE_3D_INFORMATION_DATA                 0x3D /**< 3D Information Data. */
#define BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA          0xFF /**< Manufacturer Specific Data. */

2. 数据报文PDU

数据报文PDU头

LLID(逻辑链路ID):0x01表示该数据包是一个帧的延续内容,或者这是一个空的“逻辑链路控制及适配协议”数据包;0x02表示一个“逻辑链路控制及适配协议”数据包的开始;0x03表示这是一个“逻辑链路控制”数据包的内容 NESN:下一个期望的序列号,用于对接收到的数据包进行确认 MD:更多数据字段,主要是为了说明发送方是否还有要发给接收者的数据 RFU :保留位Length:用以表示包含“信息完整性校验码”(Message Integrity Check,MIC)在内的“有效载荷数据”的长度。数据PDU数据同广播报文PDU数据

  • 校验码:3个字节长度,“循环冗余校验”(Cyclical Redundancy Check,CRC),可检查数据的正确性

蓝牙数据包解析先到这里,后续根据协议解析具体的UbertoothOne输出结果。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linux兵工厂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.前言
    • 2.工作方式
      • 3.版本发展
        • 4.数据传输
          • 5.BLE蓝牙数据包
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档