BLE的通道以及数据包结构

1. 通道(channel)

对于无线通信,数据是在某一频率上传输的,BLE采用频率是2.4GHz,频段范围是2.4000 GHz - 2.4835GHz,在这个范围内,又为40个通道,其中37,38,39通道是广播通道。其余37个通道是数据通道,如下图所示:

从图中可以看到,40个通道并不是线性递增分布的,3个广播通道是分散的,BLE数据传输过程中采用跳频技术,而跳频的计算要就要考虑跳过广播通道,3个广播分散的另一个好处就是有利于避开干扰。

如下图所示,广播通道避开了部分802.11WIFI信道,其仍然有9个数据通道和802.11不重合。

2. BLE设备之间交互的数据

在BLE设备建立连接之前,他们之间可以通过广播通道上(37,38,39 channel)交互数据,例如发送广播,扫描以及扫描回应,在建立连接之后,BLE设备之间在数据通道上交互数据。

BLE的数据可以概括为广播通道上传输的数据和数据通道上传输的数据:

  • 广播通道PDU:在广播通道上传送的数据。
  • 数据通道PDU:在数据通道上传送的数据。

3. BLE数据包结构

BLE规范中只有一个固定的包结构:

每一个包都有四个部分组成:

  • 1-2字节的前导码preamble
  • 4个字节的接入地址Access Address,
  • 2-257个字节数据包PDU,
  • 3个字节的PDU校验码 CRC

Preamble:用于频率的同步,时间估计以及自动增益控制(AGC)等,对于广播通道的数据,前导码为:0xAA,对于数据通道,前导码为0xAA 或者0x55,当接入地址的最低位是1时,前导码是0x55,否则为0xAA.

当是1M PHY时,preamble是一个字节;

当是2M PHY时,preamble是两个字节;

接入地址(Access Address):对于广播通道的数据,接入地址定义为0x8E89BED6,而对于数据通道的接入地址,每次设备建立连接时都不同,具体需要满足一定的规则,可以参考Version 4.2 [Vol 6, Part B] 2.1。接入地址和蓝牙地址是两个不同的概念,接入地址是为了同步用的,真正建立连接时使用的地址才是蓝牙地址。PDU: 分为两类:广播类型PDU (在广播通道上传送的PDU) 和数据类型PDU (在数据通道上传输的PDU) CRC: 是一个针对PDU校验的24位数据,CRC的算法定义可以参考PACKET FORMAT。

4. BLE的PDU分类

BLE的PDU分为两类,广播类型PDU和数据类型PDU,结构如下:

PDU中前两个字节的是header,通过header的内容,就可展开PDU类型,分析具体的payload,在后面的章节中逐渐展开,例如,广播通道PDU进一步展开:

广播通道上的PDU数据总共有7个类型,分别为4 Advertising + 2 Scanning +1 Connect-request。

以此类推,就能分解出BLE所有的包。

我们先看看一个大的BLE PDU展开图:

进一步的,要分析广播通道上的PDU,先分析这个包属于哪一类PDU,在找到该类型的PDU数据结构,进而解析具体含义。

原文地址:https://www.cnblogs.com/someone-device/p/12148055.html

时间: 2024-10-14 07:00:36

BLE的通道以及数据包结构的相关文章

TCP/IP数据包结构具体解释

[关键词] TCP IP 数据包 结构 具体解释 网络 协议 一般来说,网络编程我们仅仅须要调用一些封装好的函数或者组件就能完毕大部分的工作,可是一些特殊的情况下,就须要深入的理解 网络数据包的结构,以及协议分析.如:网络监控,故障排查等-- IP包是不安全的,可是它是互联网的基础,在各方面都有广泛的应用.由IP协议衍生的协议族有10数种(据我所知),以后还会出现 很多其它的基于IP的协议- 先从实际出发吧! 一般我们在谈上网速度的时候,专业上用带宽来描写叙述,事实上不管说网速或者带宽都是不准确

一个简单的SOCKET程序的数据包结构和封解包函数

/*练习写套接字通信程序时候写的一段代码,本来想写个聊天室但写来写去进度卡在界面上接节下来都是通信部分的代码 因为只是试验用所以都是用C写的,等界面部分完工后会用类来封装一下 因为本人E文很烂所以变量和函数的命名是具有中国特色的,求理解.不过我注释的很详细了 谨以此文纪念我那坑爹的编程自学生涯......................**/ #include "stdio.h" #include <windows.h> //////////////////////////

数据包结构

IP包头结构(20字节) |--4位版本---|--4位部首长度 --|---8位服务类型(TOC)---|---------------------16位总长度----------------------| |----------------------------16位标识符-----------------------|-3位标识-|--------------13位片偏移-----------------| |-----------8位生存时间---------|---------- 8

以太网数据包、IP包、TCP/UDP 包的结构(转)

源:以太网数据包.IP包.TCP/UDP 包的结构 版本号(Version):长度4比特.标识目前采用的IP协议的版本号.一般的值为0100(IPv4),0110(IPv6). IP包头长度(Header Length):长度4比特.这个字段的作用是为了描述IP包头的长度,因为在IP包头中有变长的可选部分.该部分占4个bit位,单位为32bit(4个字节),即本区域值 = IP头部长度(单位为bit)/ (8*4),因此,一个IP包头的长度最长为“1111”,即15*4=60个字节.IP包头最小

TCP/IP协议数据包文件PCAP分析器

一.设计原理 1.PCAP文件构成 参考http://blog.csdn.net/gulu_gulu_jp/article/details/50494909 PCAP文件由一个PCAP文件头和多个PCAP数据包组成,PCAP数据又由数据包头和数据包内容组成.数据包内容才是我们将要进行分析还原的TCP/IP协议数据.PCAP总体结构如图 11所示: 图 11 PCAP文件总体结构 以TCP协议为例,详细解析PCAP文件格式.PCAP前24个字节为文件头,包含了文件信息,其结构如图 11所示.接着1

010 使用netmap函数接管网卡,接收数据包,回应ARP请求

一.本文目的: 上一节中,我们已经在CentOS 6.7 上安装好了netmap,也能接收和发送包了,这节我们来调用netmap中的API,接管网卡,对网卡上收到的数据包做分析,并回应ARP请求. 二.netmap API简要介绍: 1.netmap API 主要包含在两个头文件中:netmap.h和netmap_user.h.在netmap/sys/net/目录下,其中netmap_user.h调用netmap.h. 2.netmap API一共七八个函数调用:nm_open()生成文件描述符

用Golang自己构造ICMP数据包

ICMP是用来对网络状况进行反馈的协议,可以用来侦测网络状态或检测网路错误. 限于当前Golang在网络编程方面的代码稀缺,资料甚少,所以分享一个用Golang来构造ICMP数据包并发送ping程序的echo消息的实例. RFC792定义的echo数据包结构: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Linux程序设计学习笔记----网络编程之网络数据包拆封包与字节顺序大小端

网络数据包的封包与拆包 过程如下: 将数据从一台计算机通过一定的路径发送到另一台计算机.应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示: 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据包(packet),在链路层叫做帧(frame).数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理. 上图对应两台计算机在同一网段中的情况,

Linux内核--网络栈实现分析(二)--数据包的传递过程(上)

本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7492423 更多请看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析.”(下)“表示分析是从上向下分析. 上一篇博文中我们从宏观上分析了L