蓝牙学习之发送 Mesh Provisioning Service advertising

Mesh Provisioning Service advertising

未组网时发送的可连接的广播包,供GATT provisioner发现用。对应的payload设置API是 set_adv_provision()。数据格式详见 V1.1 spec的"7.1.2.2.1 Advertising"这个章节。 sample data详见 "8.5 Provisioning Service sample data"。

cpp 复制代码
int gatt_adv_prepare_handler(rf_packet_adv_t * p, int rand_flag){
            ...
            else if(provision_mag.gatt_mode == GATT_PROVISION_MODE){
                set_adv_provision(p);
                ret=1;
                // dispatch proxy part adv 
            }
            else if (provision_mag.gatt_mode == GATT_PROXY_MODE){
                set_adv_proxy(p);
                ret=1;
            }
}
cpp 复制代码
void set_pb_gatt_adv(u8 *p,u8 flags)
{
	PB_GATT_ADV_DAT *p_pb_adv;
	u8 temp_uuid[2]=SIG_MESH_PROVISION_SERVICE;
	p_pb_adv = (PB_GATT_ADV_DAT *)(p);
	p_pb_adv->flag_len = 0x02;
	p_pb_adv->flag_type = 0x01;
	p_pb_adv->flag_content = flags;
	p_pb_adv->uuid_len= 0x03;
	p_pb_adv->uuid_type=0x03;
	p_pb_adv->uuid_pb_uuid[0] = temp_uuid[0];//0x27
	p_pb_adv->uuid_pb_uuid[1] = temp_uuid[1];//0x18
	p_pb_adv->service_len = 0x15;//21
	p_pb_adv->service_type = 0x16;
	p_pb_adv->service_uuid[0] = temp_uuid[0];
	p_pb_adv->service_uuid[1] = temp_uuid[1];
	memcpy(p_pb_adv->service_data,prov_para.device_uuid,16);
	memcpy(p_pb_adv->oob_info , prov_para.oob_info,2);
	return;
}
void set_adv_provision(rf_packet_adv_t * p) 
{
	set_pb_gatt_adv(p->data,6);
	p->header.type = LL_TYPE_ADV_IND;
	memcpy(p->advA,tbl_mac,6);
	memcpy(p->data, p->data, 29);
	p->rf_len = 6 + 29;
	p->dma_len = p->rf_len + 2;	
	return ;
} 

使用 set_pb_gatt_adv() 来构造 PB-GATT Advertising Data

实际输出的Log如下:

复制代码
[ERR]:uuid_create_by_mac(),uuid = 30 ca e9 e9 d8 3e 4f 3c ae 51 cd ab 3a 00 02 84
[13:21:07.773]收←◆[INFO]:set_adv_provision(),p->data=02 01 06 03 03 27 18 15 16 27 18 30 ca e9 e9 d8 3e 4f 3c ae 51 cd ab 3a 00 02 84 00 00 

Flags:
02 01 06 
Service UUID List:
03 03 27 18 
Mesh Provisioning Service Data:
15 16 27 18 30 ca e9 e9 d8 3e 4f 3c ae 51 cd ab 3a 00 02 84 00 00 

✅ 0x1827 --- Mesh Provisioning Service (简单来说:0x1827 = "请把我加入网络")

中文名:Mesh 配网服务

用途:在设备未入网(unprovisioned) 时,供 GATT Provisioner(如手机 App)通过 BLE 连接后完成配网(provisioning)流程。

关键功能:

传输 Provisioning PDU(如邀请、公钥交换、认证、密钥分发等)

实现 PB-GATT(Provisioning Bearer over GATT)协议

何时使用:

设备处于出厂状态,尚未加入任何 Mesh 网络

广播中包含此 UUID(在可连接广播中),以便被发现

规范位置:Bluetooth Mesh Profile 7.1.2.2.1 Advertising

设备未组网时,会交替发送不可连接的广播包(Unprovisioned Device Beacon)和可连接的广播包(Mesh Provisioning Service advertising)。Unprovisioned Device Beacon 供 ADV-based Provisioner(如其他 Mesh 节点)发现并发起配网(PB-ADV),对应的payload设置API是 unprov_beacon_send()。Mesh Provisioning Service advertising 供GATT provisioner发现用,对应的payload设置API是 set_adv_provision()。

相关推荐
西岸行者7 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意7 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码7 天前
嵌入式学习路线
学习
毛小茛7 天前
计算机系统概论——校验码
学习
babe小鑫7 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms7 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下7 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。7 天前
2026.2.25监控学习
学习
im_AMBER7 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J7 天前
从“Hello World“ 开始 C++
c语言·c++·学习