BLE广播
广播
BLE的广播,类似于村头的喇叭,喇叭一响,全村人都通知到位,其目的如下:
- 将自身的数据发送出去,此过程不需要建立连接。如蓝牙温度计,将测量的温度通过广播的方式发送出去。
- 让别人发现自己并建立连接。通过广播中携带的设备能力、名称以及其他自定义的数据,让周围蓝牙扫描到并建立连接,以便进一步交互。
1、广播通道
广播的数据只能通过37/38/39这三个通道发送出去,默认广播一次在这三个通道上轮流发送一遍数据,每个通道广播间隔小于10ms,也可指定每次广播只在其中某个通道上发送。
2、广播间隔
以一定的时间间隔广播数据,这个时间间隔称为广播间隔,即advertising interval。为了改善设备的兼容性,在两个广播时间间隔之间,还会加上一个随机的0-10ms的delay时间。如下图所示,一个广播事件的周期为advertising interval+delay。
- advertising interval的范围为20ms ~ 10.24s,并且是0.625ms的整数倍。
- 不可连接的广播类型广播间隔最低为100ms。
- 特殊的定向广播方式:
- high duty cycle directed advertising,以小于等于3.7ms的广播间隔持续定向广播,且1.28s后需退出此广播模式。用于快速连接,如蓝牙键鼠设备,断开后需要快速连接,就采用这样的定向广播方式。
- Low duty cycle directed advertising,和普通广播一样。
3、广播包PDU格式
3.1 Advertising Header
Advertising Header,长度1个字节,每bit的具体定义如下:
-
PDU Type为4 bits,详细定义如下表:
PDU Type Packet Name Description Payload 0000 ADV_IND 通用广播指示
connectable undirected advertising eventAdvA (6 octets) + AdvData (0-31 octets) 0001 ADV_DIRECT_IND 定向连接指示
connectable directed advertising eventAdvA (6 octets) + InitA (6 octets) 0010 ADV_NONCONN_IND 不可连接指示
non-connectable undirected advertising eventAdvA (6 octets) + AdvData (0-31 octets) 0011 SCAN_REQ 主动扫描请求
Scanner wants information from AdvertiserScanA (6 octets) + AdvA (6 octets) 0100 SCAN_RSP 主动扫描响应
Advertiser gives more information to ScannerAdvA (6 octets) + ScanRspData (0-31 octets) 0101 CONNECT_REQ 连接请求
Initiator wants to connect to AdvertiserinitA (6 octets) + AdvA (6 octets) + LLData(22 octets) 0110 ADV_SCAN_IND 可扫描指示
scannable undirected advertising eventAdvA (6 octets) + AdvData (0-31 octets) 0111~1111 Reserved 保留 Reserved Reserved -
TxAdd/RxAdd,各占1bit,表示随后的Advertiser Address字段代表的蓝牙MAC地址类型,值0代表Public地址,值1代表Random地址。
1)如果只需要定时传输一些简单的数据(如某一个温度节点的温度信息),后续不需要建立连接,则可以使用ADV_NONCONN_IND。广播者只需要周期性的广播该类型的PDU即可,接收者按照自己的策略扫描、接收,二者不需要任何额外的数据交互。
2)如果除了广播数据之外,还有一些额外的数据需要传输,由于种种原因,如广播数据的长度限制、私密要求等,可以使用ADV_SCAN_IND。广播者在周期性广播的同时,会监听SCAN_REQ请求。接收者在接收到广播数据之后,可以通过SCAN_REQ PDU,请求更多的数据。
3)如果后续需要建立点对点的连接,则可使用ADV_IND。广播者在周期性广播的同时,会监听CONNECT_REQ请求。接收者在接收到广播数据之后,可以通过CONNECT_REQ PDU,请求建立连接。
4)通过ADV_IND/CONNECT_REQ的组合建立连接,花费的时间比较长。如果双方不关心广播数据,而只是想快速建立连接,恰好如果连接发起者又知道对方(广播者)的蓝牙地址(如通过扫码的方式获取),则可以通过ADV_DIRECT_IND/CONNECT_REQ的方式。
3.2 Advertiser Address(AdvA)
俗称蓝牙MAC地址,长度为6个字节。如果是广播包,则是advertiser的MAC地址;如果是扫描包或者连接请求包,则是scanner的MAC地址。参考前面的设备地址说明:
3.3 AD Type 广播数据格式
所有的 AD Type的定义在文档 Core Specification Supplement 中。 AD Type 包括如下类型:
- Flags: TYPE = 0x01。这个数据用来标识设备 LE 物理连接的功能。DATA 是 0 到多个字节的 Flag 值,每个 bit 上用 0 或者 1 来表示是否为 True。如果有任何一个 bit 不为 0,并且广播包是可连接的,就必须包含此数据。各 bit 的定义如下:
- bit 0: LE 有限发现模式
- bit 1: LE 普通发现模式
- bit 2: 不支持 BR/EDR
- bit 3: 对 Same Device Capable(Controller) 同时支持 BLE 和 BR/EDR
- bit 4: 对 Same Device Capable(Host) 同时支持 BLE 和 BR/EDR
- bit 5..7: 预留
- Service UUID: 广播数据中一般都会把设备支持的 GATT Service 广播出来,用来告诉外面本设备所支持的 Service。有三种类型的 UUID:16 bit, 32bit, 128 bit。广播中,每种类型类型有有两个类别:完整和非完整的。这样就共有 6 种 AD Type。
- 非完整的 16 bit UUID 列表: TYPE = 0x02;
- 完整的 16 bit UUID 列表: TYPE = 0x03;
- 非完整的 32 bit UUID 列表: TYPE = 0x04;
- 完整的 32 bit UUID 列表: TYPE = 0x05;
- 非完整的 128 bit UUID 列表: TYPE = 0x06;
- 完整的 128 bit UUID 列表: TYPE = 0x07;
- Local Name: 设备名字,DATA 是名字的字符串。 Local Name 可以是设备的全名,也可以是设备名字的缩写,其中缩写必须是全名的前面的若干字符。
- 设备全名: TYPE = 0x08
- 设备简称: TYPE = 0x09
- TX Power Level: TYPE = 0x0A,表示设备发送广播包的信号强度。DATA 部分是一个字节,表示 -127 到 + 127 dBm。
- 带外安全管理(Security Manager Out of Band):TYPE = 0x11。DATA 也是 Flag,每个 bit 表示一个功能:
- bit 0: OOB Flag,0 表示没有 OOB 数据,1 表示有
- bit 1: 支持 LE
- bit 2: 对 Same Device Capable(Host) 同时支持 BLE 和 BR/EDR
- bit 3: 地址类型,0 表示公开地址,1 表示随机地址
- 外设(Slave)连接间隔范围:TYPE = 0x12。数据中定义了 Slave 最大和最小连接间隔,数据包含 4 个字节:
- 前 2 字节:定义最小连接间隔,取值范围:0x0006 ~ 0x0C80,而 0xFFFF 表示未定义;
- 后 2 字节:定义最大连接间隔,同上,不过需要保证最大连接间隔大于或者等于最小连接间隔。
- 服务搜寻:外围设备可以要请中心设备提供相应的 Service。其数据定义和前面的 Service UUID 类似:
- 16 bit UUID 列表: TYPE = 0x14
- 32 bit UUID 列表: TYPE = 0x1F
- 128 bit UUID 列表: TYPE = 0x15
- Service Data: Service 对应的数据。
- 16 bit UUID Service: TYPE = 0x16, 前 2 字节是 UUID,后面是 Service 的数据;
- 32 bit UUID Service: TYPE = 0x20, 前 4 字节是 UUID,后面是 Service 的数据;
- 128 bit UUID Service: TYPE = 0x21, 前 16 字节是 UUID,后面是 Service 的数据;
- 公开目标地址:TYPE = 0x17,表示希望这个广播包被指定的目标设备处理,此设备绑定了公开地址,DATA 是目标地址列表,每个地址 6 字节。
- 随机目标地址:TYPE = 0x18,定义和前一个类似,表示希望这个广播包被指定的目标设备处理,此设备绑定了随机地址,DATA 是目标地址列表,每个地址 6 字节。
- Appearance:TYPE = 0x19,DATA 是表示了设备的外观。
- 厂商自定义数据: TYPE = 0xFF,厂商自定义的数据中,前两个字节表示厂商 ID,剩下的是厂商自己按照需求添加,里面的数据内容自己定义。
posted on 2021-09-08 20:11 Wahahahehehe 阅读(2139) 评论(0) 编辑 收藏 举报