在做蓝牙相关的项目的时候,估量许多都猎奇为什么一次最多发送20Byte的数据,话不多说,先上图,下图为蓝牙数据发送的包结构。赤色部分为最终咱们发送的数据包巨细(Notify状态下)。

BLE中为什么一次最多只能发送 20Byte 数据

在开始之前先提一下Octet与Byte的差异,虽然两个都可以翻译成字节。 Octet 为 八比特组。 在TCP/IP发展初期有些系统结构运用的Byte是10位.

播送包简介

播送包头部

BLE中为什么一次最多只能发送 20Byte 数据
报头部分

  1. 头部主要有1个octet。
  2. PDU类型
  3. RFU为保留
  4. TxAdd 发送地址
  5. RxAdd 承受地址段

长度部分

  1. 长度主要有1个octet。
  2. 6octet为长度,取值为6-37(播送包最终有6octet设备地址,所以最少是6位)。

对于这里的37字节,我的猜测是这样的,不知道是否正确,为了兼容数据PUD中5位长度为31octet的数据,再加上6octet必须要加的设备地址。

播送数据部分

数据分为有用数据和无效数据(用0填充)+6octet设备地址。有用数据结构如下

BLE中为什么一次最多只能发送 20Byte 数据

  1. 有用数据部分由多个AD Structure组成
  2. 1个AD Structure 由 1个octct的长度和数据(Length)组成
  3. data 由 AD type(n个octct) 和 AD data(Length – n)组成

数据PDU

头部

BLE中为什么一次最多只能发送 20Byte 数据

  1. Length 为5位 0-31octct,最大31octet
  2. 减去 4octet的MIC 31-4 = 27 octet 为Payload长度。

链路层 L2CAP

BLE中为什么一次最多只能发送 20Byte 数据

27 – 2 – 2 = 23 octet

notify

BLE中为什么一次最多只能发送 20Byte 数据

23 – 1 – 2 = 20 octet.