附录02 BLE Mesh协议
约 2139 字大约 7 分钟
2026-04-25
1 概述
BLE Mesh 是蓝牙技术联盟 (SIG) 在 2017 年发布的基于 BLE 的网状网络协议。与传统的蓝牙点对点连接不同,BLE Mesh 支持多对多 (many-to-many) 通信,节点之间可以通过中继 (Relay) 转发消息,覆盖范围远超单个 BLE 连接。
BLE Mesh 特别适合智能家居、商业照明、传感器网络等场景。
2 核心概念
2.1 节点类型
| 类型 | 功能 | 典型设备 |
|---|---|---|
| Provisioner | 配网器,负责将新设备加入网络(通常是手机 App) | 手机 App |
| Node | 普通节点,加入网络后可以发送/接收消息 | 所有设备的基本功能(除了Provisioner) |
| Relay | 中继节点,转发收到的消息以扩展网络覆盖 | 常供电设备(灯泡、插座、网关) |
| Friend | Friend 节点,为低功耗节点缓存消息 | 常供电设备(灯泡、网关) |
| Low Power Node | 低功耗节点,定期唤醒向 Friend 查询是否有待处理消息 | 电池供电传感器、无线开关 |
| Proxy | 代理节点,允许非 Mesh 设备(如手机)通过 GATT 连接访问 Mesh 网络 | 网关 |
本项目节点同时启用了 Relay 和 Friend 功能,也可通过 GATT Proxy 让手机直接连接。
2.2 寻址方式
| 地址类型 | 说明 |
|---|---|
| Unicast Address | 单播地址,每个元素一个,Provision 时分配 (0x0001~0x7FFF) |
| Group Address | 组播地址,多个节点可订阅同一组 (0xC000~0xFEFF) |
| Virtual Address | 虚拟地址,基于 UUID Hash 生成,用于灵活分组 |
2.3 模型 (Model)
模型是 BLE Mesh 的基本功能单元,定义了设备能"做什么"。
| 模型类型 | 说明 |
|---|---|
| Server | 状态持有者,响应 Client 的操作请求 |
| Client | 发起操作请求的一方 |
| Control | 既可作为 Server 也可作为 Client |
2.4 标准模型
蓝牙 SIG 定义了以下标准模型,模型 ID 为 16 位。每个模型有 Server 和 Client 两种角色:Server 持有状态,Client 发起操作。
全部标准模型列表
| 模型 ID | 模型名称 | 中文名称 | 功能 | 本项目使用 |
|---|---|---|---|---|
0x0000 | Configuration Server | 配置服务器 | Mesh 网络配置管理(绑定 AppKey、订阅、发布等) | ✅ Server(强制) |
0x0001 | Configuration Client | 配置客户端 | 主动配置其他节点的网络参数 | — |
0x0002 | Health Server | 健康状态服务器 | 上报节点健康状态(故障码、Attention Timer 等) | ✅ Server |
0x0003 | Health Client | 健康状态客户端 | 查询其他节点的健康状态 | — |
0x1000 | Generic OnOff Server | 通用开关服务器 | 基本二值开关控制(ON/OFF) | ✅ Server |
0x1001 | Generic OnOff Client | 通用开关客户端 | 主动控制其他节点的开关 | — |
0x1002 | Generic Level Server | 通用等级服务器 | 可变数值等级(-32768 ~ +32767) | — |
0x1003 | Generic Level Client | 通用等级客户端 | 主动设其他节点的等级 | — |
0x1004 | Generic Default Transition Time Server | 默认过渡时间服务器 | 设定状态的默认过渡时间 | — |
0x1005 | Generic Default Transition Time Client | 默认过渡时间客户端 | 主动设默认过渡时间 | — |
0x1006 | Generic Power OnOff Server | 上电状态服务器 | 设定节点重新上电后的默认开关状态 | — |
0x1007 | Generic Power OnOff Client | 上电状态客户端 | 主动设上电默认开关 | — |
0x1008 | Generic Power Level Server | 上电等级服务器 | 设定节点重新上电后的默认等级值 | — |
0x1009 | Generic Power Level Client | 上电等级客户端 | 主动设上电默认等级 | — |
0x100A | Generic Battery Server | 电池状态服务器 | 上报电池电量 | — |
0x100B | Generic Battery Client | 电池状态客户端 | 查询电池电量 | — |
0x100C | Generic Location Server | 位置服务器 | 设定节点的全球/本地位置坐标 | — |
0x100D | Generic Location Client | 位置客户端 | 查询/设位置坐标 | — |
0x100E | Generic Admin Property Server | 设备属性服务器 | 存储/管理制造商标识等管理属性 | — |
0x100F | Generic Manufacturer Property Server | 制造属性服务器 | 读取制造商设定的固定属性 | — |
0x1010 | Generic User Property Server | 用户属性服务器 | 存储/管理用户可变的属性 | — |
0x1011 | Generic Client Property Server | 客户端属性服务器 | 管理上述三类属性的 Client 端 | — |
0x1012 | Generic Property Client | 属性客户端 | 主动读取/设属性值 | — |
0x1300 | Light Lightness Server | 亮度服务器 | 灯光亮度控制(0~65535) | ✅ Server |
0x1301 | Light Lightness Client | 亮度客户端 | 主动控制亮度 | — |
0x1302 | Light Lightness Setup Server | 亮度设置服务器 | 带预设值的亮度控制(含 Default/Temperature) | — |
0x1303 | Light CTL Server | 色温服务器 | 色温控制(暖白/冷白混光) | — |
0x1304 | Light CTL Client | 色温客户端 | 主动设色温 | — |
0x1305 | Light CTL Temperature Server | 色温温度服务器 | 色温范围管理 | — |
0x1306 | Light CTL Setup Server | 色温设置服务器 | 带预设值的色温控制 | — |
0x1307 | Light HSL Server | HSL 颜色服务器 | 色相/饱和度/亮度控制 | — |
0x1308 | Light HSL Client | HSL 颜色客户端 | 主动设颜色 | — |
0x1309 | Light HSL Hue Server | 色相服务器 | 色相范围管理 | — |
0x130A | Light HSL Saturation Server | 饱和度服务器 | 饱和度范围管理 | — |
0x130B | Light HSL Setup Server | HSL 设置服务器 | 带预设值的 HSL 控制 | — |
0x130C | Light xyL Server | xyL 颜色服务器 | CIE xy 色度 + 亮度控制 | — |
0x130D | Light xyL Client | xyL 颜色客户端 | 主动设色度 | — |
0x130E | Light xyL Setup Server | xyL 设置服务器 | 带预设值的 xyL 控制 | — |
0x130F | Light LC Server | 灯光控制器服务器 | 智能灯光控制器(占空感/日光采集) | — |
0x1310 | Light LC Client | 灯光控制器客户端 | 灯光控制器控制/上报 | — |
0x1311 | Light LC Setup Server | 灯光控制器设置服务器 | 带预设值的灯光控制 | — |
0x1400 | Sensor Server | 传感器服务器 | 传感器数据上报 | — |
0x1401 | Sensor Client | 传感器客户端 | 查询传感器数据 | — |
0x1402 | Sensor Setup Server | 传感器设置服务器 | 传感器参数配置 | — |
0x1500 | Time Server | 时间服务器 | 提供网络当前时间 | — |
0x1501 | Time Client | 时间客户端 | 查询网络时间 | — |
0x1502 | Scene Server | 场景服务器 | 场景存储与召回(一键切换灯带整体效果) | — |
0x1503 | Scene Client | 场景客户端 | 管理场景/触发场景切换 | — |
0x1504 | Scene Setup Server | 场景设置服务器 | 场景参数配置 | — |
0x1505 | Scheduler Server | 排程服务器 | 定时执行预设动作(如每天18:00开灯) | — |
0x1506 | Scheduler Client | 排程客户端 | 管理定时计划 | — |
0x1507 | Scheduler Setup Server | 排程设置服务器 | 排程参数配置 | — |
本项目使用的模型
| 模型 | 功能 | 角色 | 备注 |
|---|---|---|---|
| Configuration Server | Mesh 网络配置管理 | Server | 强制,处理 AppKey 绑定/订阅/发布等 |
| Health Server | 设备健康状态上报 | Server | Attention 回调输出日志 |
| Generic OnOff Server | 开关控制 | Server | 收到 SET 后调用 led_output_set_onoff() |
| Light Lightness Server | 亮度控制 | Server | 收到 SET 后调用 led_output_set_lightness() |
2.5 Vendor 模型
当标准模型无法满足需求时,可使用 Vendor 模型定义自定义功能。Vendor 模型使用 3 字节操作码(1 byte opcode + 2 bytes company_id),Company ID 由蓝牙 SIG 分配。
本项目 Vendor 模型:
- Company ID:0x0059 (Nordic Semiconductor)
- Model ID:0x0001
- 功能:灯效切换
3 操作码定义
本项目 Vendor Effect Server 的操作码(3 字节,小端序):
| 操作码 | 含义 | 参数长度 | 说明 |
|---|---|---|---|
0xC10059 | GET | 0 字节 | 查询当前灯效 |
0xC20059 | SET | 2 字节 [effect_id][tid] | 切换灯效,带应答 |
0xC30059 | SET_UNACK | 2 字节 [effect_id][tid] | 切换灯效,无应答 |
0xC40059 | STATUS | 2 字节 [effect_id][count] | 状态回复 |
操作码由 BT_MESH_MODEL_OP_3(op, company_id) 宏生成。
4 配网流程 (Provisioning)
节点上电 → 发送 Unprovisioned Beacon
→ 手机 App 扫描发现设备
→ App 发起 Provisioning (PB-ADV 或 PB-GATT)
→ 交换密钥、分配 Unicast Address
→ 节点输出 NetKey、AppKey、地址
→ App 通过 Config Client 绑定 AppKey 到模型
→ 模型可收发应用层消息本项目支持 PB-ADV(通过 BLE 广播信道配网)和 PB-GATT(通过 GATT 连接配网)两种方式。
5 发布/订阅机制
节点模型可以配置"发布地址"和"订阅地址":
- 发布 (Publish):模型将状态变化主动发送到指定的单播/组播地址
- 订阅 (Subscribe):模型监听来自指定地址的消息
典型灯带群控场景:所有灯带节点订阅同一组播地址,手机向该地址发送 Set 消息即可同时控制整组灯带。
6 在本项目中的应用
配网: 手机 App (Provisioner) → PB-ADV/PB-GATT → nRF52840 节点
开关: 手机 → Generic OnOff Set → led_output_set_onoff()
亮度: 手机 → Light Lightness Set → led_output_set_lightness()
灯效: 手机 → Vendor Effect Set → led_output_set_effect()
状态: 手机 → Vendor Effect Get → led_output_get_effect_id() + count