广播数据包报文格式

news/2024/9/20 5:23:35/文章来源:https://www.cnblogs.com/maodoudou/p/18418493

BLE报文由不同的域组成,如果域的长度超过一个字节,就涉及到先传输字节的低位还是高位的问题,这里分字节序和比特序:

字节序:大多数的多字节域都是从低字节开始传输。但是,并不是所有的多字节域都是从低字节开始传输。

比特序:各个字节传输时,每个字节都是从低位开始。

  1. 前导:前导是一个8bit的交替序列,不是01010101就是10101010,取决于接入地址的第一个bit;接收机根据前导的无线信号强度来配置自动增益控制;
  2. 接入地址:广播接入地址和数据接入地址
    1. 广播接入地址:固定为0x8E89BED6,在广播、扫描、发起连接时使用;
    2. 数据接入地址:随机值,不同的连接有不同的值。在连接建立之后的2个设备之间使用。

          对于数据信道,数据接入地址是一个随机值,但要满足以下条件:

      1. 数据接入地址不能超过连续的6个0或1;
      2. 数据接入地址值不能和广播地址一样;
      3. 数据接入地址的4个byte值必须互不相同;
      4. 数据接入地址不能有超过24次的bit翻转(0到1或1到0算一次bit翻转) 
      5. 数据接入地址最后6bit必须有2次bit翻转; 
      6. 符合上面条件的数据接入地址大概有231个。 
  3. 报头:报头的内容取决于该报文是广播报文还是数据报文
    1.   广播报文的包头如下:

      4bit的报文类型,2bit保留,1bit发送地址类型,1bit的接收地址类型 

    2. 广播报文类型:核心规范中定义了7种类型,如图,根据该字段即可分辨出广播报文类型,如该字段为ADV_IND,表示类型为通用广播

       每种广播报文类型都具有不同的数据格式及行为。

    3. 发送地址类型和接收地址类型:发送地址类型和接收地址类型指示了设备使用公共地址(public address)还是随机地址(Random Adress)。公共地址和随机地址都一样,都包含6字节48bit,BLE设置必须拥有这两种地址类型中的一种,当然也可以同时拥有这两种地址类型。

     

  4. 长度
    1. 广播报文:长度域包含6bit,有效值的范围6-37;
    2. 数据报文:长度域包含5bit,有效值的范围0-31;
    3. 广播报文和数据报文的长度域有所不同,主要是因为广播报文除了最多31个字节的数据报文外,还必须包含6个字节的广播设备地址。6+31 = 37,所以需要多6bit的长度域。
  5. 数据(advdata):广播和扫描响应的数据格式如下图所示,由有效数据部分和无效数据部分组成:

     有效数据部分包含N个AD Structure,每个AD Structure 由length, AD Type和 AD Data组成。其中  

    • Length:AD Type 和AD  Data的长度;
    • AD Type:指示AD Data数据的含义;
    • AD Data:数据。
    • AD Structure的结构很重要,对于理解广播数据以及扫描后的数据解析很有帮助。主机扫描到广播后,如何理解广播中包含的数据的意义,逐个解析广播包中的AD Structure来获取对应数据。
    • AD Type及其表示的含义可以通过SIG官网查询,也可以查看Nordic的SDK中的定义:(ble_gap.h文件)

  6. 校验:BLE采用的是24位CRC校验,CRC对包头,长度和数据进行计算,24位CRC的生成多项式为:

     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799359.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 23连夜官宣发布,IDEA亲测可用!

0 前言 官宣发布:IDEA已支持下载:1 JEPs JEP 455 Primitive Types in Patterns, instanceof, and switch (Preview) 通过允许在所有模式上下文中使用原始类型模式,增强了模式匹配,并扩展了 instanceof 和 switch 以适用于所有原始类型。这是一项预览语言特性。 JEP 466 C…

ubuntu编译grpc protobuf

参考:Ubuntu系统中本地编译并安装grpc的C++版本及测试 - 知乎 (zhihu.com) 安装依赖:# 这些可能都已经安装了 sudo apt-get install pkg-config autoconf automake libtool make g++ unzip # 下面的可能没安装 sudo apt-get install libgflags-dev libgtest-dev sudo apt-ge…

python-逻辑运算符对应的函数

__eq__(self, other):用于 == 操作符__ne__(self, other):用于 != 操作符__lt__(self, other):用于 < 操作符__le__(self, other):用于 <= 操作符__gt__(self, other):用于 > 操作符__ge__(self, other):用于 >= 操作符

python-算数运算符对应的函数

__add__(self, other): 用于 + 操作符__sub__(self, other): 用于 - 操作符__mul__(self, other): 用于 * 操作符__truediv__(self, other): 用于 / 操作符__floordiv__(self, other):用于 // 操作符__mod__(self, other): 用于 % 操作符__pow__(sel…

Python 命令跳转微软应用商店问题解决办法

除环境变量外的另一个解决办法。最常见的解决办法就是在环境变量中将 Python 安装路径上移至 %USERPROFILE%\AppData\Local\Microsoft\WindowsApps 路径前。 但是有时候这个办法也无法起效,那么此时可以进入系统设置中,将应用执行别名中的 python 项关闭。 其路径在:应用 &…

Wordpress安装

1. 说明LNMP经典网站环境, Linux系统,Nginx网站服务,MySQL数据库(Mariadb),PHP(运行环境) Wordpress PHP代码.2. 建议的搭建顺序MySQL数据库(mariadb) PHP环境 php 7.x Nginx 直接安装即可2.1. 部署数据库查看代码 # 1.安装mariadb数据库 root@iZ2zei5cw2j6q770mgp5kvZ:~# apt …

一个cmakelist的例子(自动处理多个proto)

背景: 由于项目需要,把所有的proto文件放在了统一的文件夹中,为了方便更新以及加快编译速度,要把这个proto自动转成.cc .pb.h文件,再编译成so。 为此,写了个cmakelist.txt。主要功能: 1)自动遍历指定目录下所有proto文件,调用ptotoc生成.cc文件,如下图:cc文件存放在…

Hadoop(十三)HDFS DataNode

一、DataNode工作机制1、一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳 2、DataNode启动后向NameNode注册,通过后,周期性(6小时)的向NameNode上报所有的块信息 3、心跳是每3秒一…

Hadoop(十三)DataNode

一、DataNode工作机制1、一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳 2、DataNode启动后向NameNode注册,通过后,周期性(6小时)的向NameNode上报所有的块信息 3、心跳是每3秒一…

Hadoop(十二)NameNode 和 SecondaryNameNode

一、NN和2NN工作机制 1、NameNode中的元数据存储在哪里?存储在NameNode节点的磁盘中会导致效率过低,因为经常需要进行随机访问和响应客户请求;存储在内存中,一旦元数据丢失,整个集群就无法工作,也不合适。因此产生了在磁盘中备份元数据的FsImage。 引入Edits文件(只进行…

高效数据移动指南 | 如何快速实现数据库 MySQL 到 MongoDB 的数据同步?

本专题将基于实践经验,从常见需求入手,为大家介绍热门数据源与数据目标之间的数据同步(全量/增量)如何实现?了解如何快速搭建数据管道,实现数据的高效迁移与无缝同步。本文教程为:MySQL → MongoDB 的数据同步任务。在现代企业中,数据无处不在,贯穿于各个业务环节和系…