详细总结EddyStone BLE广播包协议规范

本文内容来自微信公众号:Pavel Han。

EddyStone简介

Eddystone 是专门针对蓝牙低功耗(BLE)广播包定义的数据格式。 它是由 Google 在 2015 年推出的开源 Beacon 协议,旨在提供比苹果 iBeacon 更开放、功能更丰富的广播标准。

详细总结EddyStone BLE广播包协议规范

在蓝牙的协议栈中,Eddystone 运行在 GAP(Generic Access Profile) 层之上。它利用了BLE 广播包中 31 字节的载荷(Payload)进行通信,实际上也就是基于这个31字节的数据长度所规定的一套标准化的数据结构 。

  • 因为是工作在 BLE 的广播模式之下,因此进行通信的设备双方不需要建立配对连接。在通信过程中,广播设备只是单向地定时向外发射信号,任何在其覆盖范围内的扫描设备负责监听这些信息 。
  • 不同于 iBeacon 在广播通信的过程中只发出一组 ID,Eddystone 允许设备轮流广播不同类型的广播帧(Frames),这是 EddyStone的一大特色。

EddyStone的四种主要的帧类型

UID(身份与状态帧)

这种帧类型主要用于标识设备的身份 。其帧结构如下:

  • Namespace ID (10 Bytes):类似于设备的姓名,用于标识某个特定的公司或者产品类型/系列 。所以一般情况下某个公司生产的同一型号的设备的Namespace ID都是相同的。
  • Instance ID (6 Bytes):类似于设备的名称,用于标识具体的某台设备。即使是同一型号的设备,其Instance ID也是不同的,用于区分不同的设备。
  • 自定义空间:这部分空间可自定义其具体的含义 。

TLM(遥测帧)

这个帧一般用于广播设备的状态,如电量、温度、开机时间等,是设备的状态帧。

URL(网页跳转帧)

这个帧类型是 Eddystone 最著名的功能。它用于直接广播一个压缩后的 URL 地址(如 https://goo.gl/...)。

其实这也是Beacon类型的蓝牙设备的典型应用场景

  • 手机靠近某个公交站,会自动弹出附近的路线信息网页,无需安装 App。
  • 手机靠近超市的某个区域,会收到一个网页URL,其中包含有这个区域对应商品的促销信息。

EID(安全帧)

这个帧类型主要用于对 ID 进行加密处理,每隔一段时间变换一次 ID,防止设备被他人非法追踪。

EddyStone的包结构

首先总结一下典型的BLE广播包的整体包结构。在空气中传输的原始数据包长度通常为 8 到 47 字节

详细总结EddyStone BLE广播包协议规范

EddyStone的所有数据结构就包含在其中的Payload中。Payload部分的长度为6-37字节,其中包含了设备的 MAC 地址和实际的广播数据 (ADV Data) ,除去 6 字节的设备地址以外,剩下的 31 字节 就是用户可定义的广播数据区。它由多个 AD Structure 组成(如上图的AD 0到AD N),每个AD Structure结构的格式为:[长度] [类型] [数据]

对于 Eddystone 协议而言,其通常包含以下三个标准的 AD Structure:

  • Flags :对于所有的EddyStone设备而言,这部分是相同的
    用于告知扫描者该设备的物理特性(如:仅限发现模式、不支持经典蓝牙)。
    • 字节流:02 01 06
      ◦ 02: 后面数据的长度。
      ◦ 01: 类型(Flags)。
      ◦ 06: 数值(代表 LE General Discoverable Mode + BR/EDR Not Supported)。
  • 16-bit Service UUID:对于所有的EddyStone设备而言,这部分是相同的
    用于告知扫描者这是一个符合 Eddystone 标准的设备。
    • 字节流:03 03 AA FE
      ◦ 03: 后面数据的长度。
      ◦ 03: 类型(16-bit Service UUID)。
      ◦ AA FE: Eddystone 的官方注册 UUID (0xFEAA),采用小端序存储,所有的EddyStone设备都必须包含这个UUID。
  • Service Data (核心载荷):这是广播协议存放实际数据的地方。
    • 字节流示例 (UID Frame):17 16 AA FE 00 xx xx xx
      ◦ 0-17: 长度可根据包内容长度变换,最长23 字节。
      ◦ 16: 类型为Service Data,即0x16,固定不变。
      ◦ AA FE: UUID 0xFEAA,固定不变。
      ◦ 00/10/20/30: Eddystone Frame Type。
      ◦ 后续为不同的帧数据

因此,可以简单认为:对于所有标准的 Eddystone 设备包和广播包,前 7 个字节(02 01 06 03 03 AA FE)是完全相同且固定的。各个设备真正的差异化竞争和业务逻辑的区分,全部集中在类型为 16 之后的 Service Data 载荷中。

EddyStone的帧类型与Service Data结构的对应

以上提到,对于所有的EddyStone设备的广播包而言,其广播包的Payload部分包含有三个AD Structure,其中前两个AD Structure的数据内容完全固定并且相同,只有最后一个AD Structure即Service Data部分真正用于承载差异化的数据。

Service Data部分的第一个字节为Length,其对应了这个部分的长度有多长;第二个字节固定为0x16,即代表这个部分为Service Data类型,因此是固定不变的;第3-4个字节同样为固定的UUID 0xFEAA。所以 EddyStone 广播包真正的应用层差异主要体现在Service Data第五个字节及其以后的部分。

以下安装不同的EddyStone帧类型对其帧结构进行总结,后续的解释以Service Data的第五个字节位置(即EddyStone Frame Time)为起始点

UID帧(身份与状态帧)

  • Byte 0,Frame Type,1 Byte,固定为 0x00
  • Byte 1,TX Power,1 Byte,0米处的校准接收信号强度 (RSSI),范围为 -100 到 +20 dBm
  • Byte 2-11,Namespace ID,10 Bytes,用于区分不同的范围/组织/厂商/产品类型
  • Byte 12-17,Instance ID,6 Bytes,用于标识具体的设备即设备ID,每个设备都不同
  • Byte 18-19,Reserved,2 Bytes,官方规范预留,通常填充0

URL帧(网页跳转帧)

  • Byte 0,Frame Type,1 Byte,固定为 0x10
  • Byte 1,TX Power,1 Byte,0米处的校准 RSSI 值
  • Byte 2,URL Scheme,1 Byte,前缀编码(如0x00代表http://www. ,0x03代表https:// 。
  • Byte 3-19,Encoded URL,1-17 Bytes,经过压缩后的网址内容(非 ASCII,有专门的后缀压缩码)

TLM (遥测帧)

  • Byte 0,Frame Type,1 Byte,固定为 0x20
  • Byte 1,TLM Version,1 Byte,协议版本(目前通常为0)
  • Byte 2-3,VBATT,2 Bytes,电池电压,单位为毫伏 (mV)
  • Byte 4-5,Temperature,2 Bytes,设备温度(8.8 固定小数点格式,单位摄氏度)
  • Byte 6-9,ADV_CNT,4 Bytes,自重启以来发送的广播包总数
  • Byte 10-13,SEC_CNT,4 Bytes,自重启以来的运行时间(单位 0.1 秒)

EID(安全帧)

  • Byte 0,Frame Type,1 Byte,固定为 0x30
  • Byte 1,TX Power,1 Byte0米处的校准 RSSI 值
  • Byte 2-9,Ephemeral ID,8 Bytes,随时间变化的 8 字节加密标识符

补充1:以上提到的8.8固定小数点格式是什么意思?

8.8 固定小数点格式是一种用 2 个字节(16 位)来表示带小数点的数值的高效方法。它将 16 位划分为两个相等的部分:高 8 位表示整数,低 8 位表示小数。

一个 16 位的字段被拆分为:
• 高 8 位 (Most Significant Byte, MSB):有符号整数部分。采用补码形式(即大于0x80为负数,小于0x80为正数),范围是 -128 到 +127。
• 低 8 位 (Least Significant Byte, LSB):无符号分数部分。它代表 256 分之几(即 n/256)。

补充2:以上提到的Encoded URL的压缩流程是什么?

在 Eddystone-URL 规范中,为了在蓝牙广播有限的 31 字节 空间内塞入尽可能长的网址,Google 并没有使用复杂的通用压缩算法,而是采用了一种基于查表法的字节替换技术。这种方法分为两部分:前缀压缩 和 后缀/常用词压缩。

前缀压缩。用 1 个字节代表网址的开头,常见的映射关系如下:

  • 0x00:http://www.
  • 0x01:   https://www.
  • 0x02:   http://
  • 0x03:   https://

后缀压缩。其他普通的 ASCII 字符(如 a-z0-9-)直接按原样存储。但对于顶级域名(TLD)和常用路径符号,规范定义了一套特殊的单字节替换码(通常在 0x00 到 0x0D 范围内):

  • 0x00:.com/
  • 0x01:.org/
  • 0x02:.edu/
  • 0x03:.net/
  • 0x07:.com
  • 0x08:.org
  • 0x0B:.net

尝试从底层原理的角度去理解和解释技术问题:音视频/摄像头/智能家居/蓝牙/WiFi/无线通信/AI。
敬请关注微信公众号:Pavel Han。

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐