【蓝牙精品系列文档】【03_blemesh架构】04_配网流程详解 配网流程详解核心概念配网(Provisioning)是将未配网设备加入 Mesh 网络的过程。Provisioner(配网器)通过一系列步骤为设备分配地址、密钥和网络参数。配网角色角色说明Provisioner配网器,通常是手机 App 或专用设备Provisionee待配网设备,即未配网的 Mesh 节点Unprovisioned Device Beacon 详解(配网发现)完整空口封装未配网设备通过0x2B Mesh Beacon广播自己,让 Provisioner 发现。完整三层封装:空口 ADV_NONCONN_IND(不可连接广播): ┌─────────────────────────────────────────────────────────┐ │ AD Structure │ │ ┌──────────┬──────────┬─────────────────────────────┐ │ │ │ Length │ AD Type │ Mesh Beacon PDU │ │ │ │ 1B │ 0x2B │ (见下方) │ │ │ └──────────┴──────────┴─────────────────────────────┘ │ └─────────────────────────────────────────────────────────┘ Mesh Beacon PDU 内部: ┌──────────┬──────────────────┬────────────┬───────────────┐ │BeaconType│ Device UUID:16B │ OOB Info:2B│ URI Hash:4B │ │ 0x00 │ (设备唯一标识) │(带外信息) │(URI 哈希,可选)│ │ 1B │ 16B │ 2B │ 0 或 4B │ └──────────┴──────────────────┴────────────┴───────────────┘ ↑ BeaconType=0x00 标识这是 Unprovisioned Device Beacon空口示例假设设备 UUID =00112233445566778899AABBCCDDEEFF,无 URI Hash:空口字节: 14 2B 00 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 00 00 │ │ │ └─────────── Device UUID 16B ───────────────┘└ OOB ┘ │ │ └─ BeaconType=0x00 (Unprovisioned) │ └─ AD Type=0x2B (Mesh Beacon) └─ Length=20(BeaconType(1) + UUID(16) + OOB(2) + AD Type(1) = 20) 如果有 URI Hash:Length=24,多 4 字节BeaconType 类型(只有两种)源码beacon.c:#defineBEACON_TYPE_UNPROVISIONED0x00#defineBEACON_TYPE_SECURE0x01BeaconType名称谁发作用链路层 PDU0x00Unprovisioned Device Beacon未配网设备让 Provisioner 发现自己ADV_NONCONN_IND0x01Secure Network Beacon已配网节点同步 IV Index/KR,维持网络ADV_NONCONN_IND没有其他类型,Mesh Profile Spec 只定义了这两种。两种 Beacon 的完整格式对比BeaconType=0x00 Unprovisioned Device Beacon (19 或 23 字节): ┌──────────┬──────────────────┬────────────┬───────────────┐ │BeaconType│ Device UUID │ OOB Info │ URI Hash │ │ 0x00 │ 16B │ 2B │ 0 或 4B │ └──────────┴──────────────────┴────────────┴───────────────┘ BeaconType=0x01 Secure Network Beacon (22 字节): ┌──────────┬───────┬────────────┬────────────┬──────────┐ │BeaconType│ Flags │ Network ID │ IV Index │ Auth Val │ │ 0x01 │ 1B │ 8B │ 4B │ 8B │ └──────────┴───────┴────────────┴────────────┴──────────┘OOB Info 字段(16 bit 位图)OOB Info (2 字节,大端): ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │bit15│bit14│bit13│bit12│bit11│bit10│bit9 │bit8 │bit7 │bit6 │bit5 │bit4 │bit3 │bit2 │bit1 │bit0 │ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ OnDev InMan OnPpr InBox OnBox Other RFU RFU RFU Str Num NFC Bar 2D URI Other bit0 = Other bit5 = Number bit11 = On Box bit1 = URI bit6 = String bit12 = In Box bit2 = 2D Code bit7-10 = RFU bit13 = On Paper bit3 = Bar Code bit4 = NFC bit14 = In Manual bit15 = On Dev bit1=URI 时带 URI HashPB-ADV vs PB-GATT 配网方式选择两种配网承载方式方式承载链路层Provisioner 要求设备要求PB-ADVADV Bearer(广播)ADV_NONCONN_IND有 ADV 收发能力BLE_MESH_PB_ADVPB-GATTGATT Bearer(连接)ADV_IND + GATT有 BLE GATT 能力BLE_MESH_PB_GATT设备端:通过编译开关决定支持哪种源码shell.c:#ifMYNEWT_VAL(BLE_MESH_PB_ADV)staticintcmd_pb_adv(intargc,char*argv[]){returncmd_pb(BT_MESH_PROV_ADV,argc,argv);/* PB-ADV */}#endif#ifMYNEWT_VAL(BLE_MESH_PB_GATT)staticintcmd_pb_gatt(intargc,char*argv[]){returncmd_pb(BT_MESH_PROV_GATT,argc,argv);/* PB-GATT */}#endif设备编译开关发什么广播支持的配网方式BLE_MESH_PB_ADV0x2B Unprovisioned Beacon(ADV_NONCONN_IND)PB-ADVBLE_MESH_PB_GATT0x1827 可连接广播(ADV_IND)PB-GATT两个都开两种广播都发(分时复用空口)两种都支持Provisioner 端:根据自己能力选择Provisioner 类型能力选择手机只有 GATT,没有 ADV Bearer 收发只能 PB-GATT专业网关/Provisioner有完整 Mesh 协议栈优先 PB-ADV(更快)两者都支持都有优先 PB-ADV判断流程Provisioner 扫描发现设备: │ ├─ 扫到 0x2B Unprovisioned Beacon (ADV_NONCONN_IND) │ → 设备支持 PB-ADV │ → Provisioner 自己支持 PB-ADV 吗? │ ├─ 是 → 用 PB-ADV 配网(发 0x29 Link Open) │ └─ 否 → 继续等 0x1827 可连接广播 │ ├─ 扫到 0x1827 可连接广播 (ADV_IND) │ → 设备支持 PB-GATT │ → GATT 连接 → 用 PB-GATT 配网 │ └─ 两个都扫到 → Provisioner 优先用 PB-ADV(更快,不需要建立连接)两种方式的空口对比PB-ADV(通过广播交互配网数据): Provisioner Device │ 0x2B Unprovisioned Beacon │ │ ───────────────────────────── │ 设备广播发现 │ │ │ 0x29 Link Open (UUID) │ │ ───────────────────────────── │ 建立配网链路 │ 0x29 Link Ack │ │ ───────────────────────────── │ │ │ │ 0x29 Provisioning PDU │ 配网协议交互 │ ───────────────────────────── │ (Invite/Caps/Start/...) │ 0x29 Provisioning PDU │ │ ───────────────────────────── │ │ ... │ │ 0x29 Link Close │ │ ───────────────────────────── │ 关闭配网链路 PB-GATT(通过 GATT 连接交互配网数据): Provisioner Device │ 0x1827 可连接广播 │ │ ───────────────────────────── │ 设备广播发现 │ │ │ GATT Connect │ │ ───────────────────────────── │ 建立 BLE 连接 │