文章目录
一、BLE MESH SDK专题介绍
本系列的学习笔记,部分摘抄来自平头哥社区的文档,部分来自 本人CSDN半颗心脏 的吸收、转化后的见解,毕竟身为一个技术搬运工,也是有助于对国内物联网的技术发展。如有不同的见解或错误的技术见解,请文后留言,本人第一时间更改。
BLE MESH SDK是一个基于蓝牙Mesh软件开发套件,来自 平头哥社区 。目前适应于安信可PB-02蓝牙开发板或平头哥低功耗蓝牙芯片CH6121。
该开发套件以YoC平台为基础,对蓝牙MESH协议栈做了深度优化和整合,为开发者提供了通用的MESH组件,涵盖了SIG MESH Model和私有Model以及丰富的芯片外设驱动。
二、BLE MESH SDK 学习笔记
1 《BLE Mesh SDK用户开发指南》 BLE MESH SDK的总体介绍文档,包括SDK的架构,目录,基本的开发方法和指引。
2 《CB6121快速上手手册》 CB6121开发板的使用指南,包括开发环境的搭建,编译和烧录的方法,调试方法等。
3 《BLE MESH灯控开发指南》 Mesh灯控的开发文档,主要介绍灯控的示例
4 《BLE MESH开关开发指南》 Mesh开关的开发文档,主要介绍开关的示例
5 《BLE Mesh Provisioner开发指南》 Provisioner的开发示例介绍
6 《BLE MESH配网模块用户手册》 基于AT命令的Provisioner模块使用说明,开发者参考该文档,使用AT命令构建Mesh网络
7 《BLE MESH API》 BLE MESH SDK API说明
8 BLE_MESH_SDK_上手.mp4 BLE MESH SDK的上手视频,包括开发环境的搭建,编译和烧录方法
9 SIG MESH入网和控制演示.mp4 Mesh网络的构建指导视频,视频将介绍如何搭建一个灯控和开关的Mesh网络
10 天猫精灵MESH网络接入.mp4 天猫精灵的接入演示视频
11 ble_mesh_sdk_v.1.0.0.zip ble mesh sdk 代码压缩包
关注本人微信公众号 “徐宏blog” 或扫描文章末尾二维码,发送 211018 获取此系列的全部PDF文档!
三、推荐阅读顺序
建议开发者按照如下顺序了解BLE MESH SDK开发过程。
1、阅读《BLE Mesh SDK用户开发指南》,了解SDK概况。
2、观看 《BLE_MESH_SDK_上手.mp4》,了解开发环境的搭建,编译和烧录方法。
3、观看 SIG MESH入网和控制演示.mp4,搭建一个简单的MESH网络。
4、阅读《BLE MESH灯控开发指南》和《BLE MESH开关开发指南》,了解Mesh 节点的开发流程。
5、阅读《BLE Mesh Provisioner开发指南》,了解Provisioner的开发流程。
6、阅读《BLE MESH配网模块用户手册》,尝试使用AT Provisioner模块,搭建Mesh 网络。
7、观看 天猫精灵MESH网络接入.mp4,尝试天猫精灵Mesh网络接入。
四、正文
4.1 概述
BLE MESH SDK是一个基于蓝牙Mesh软件开发套件,来自 平头哥社区 。目前适应于安信可PB-02蓝牙开发板或平头哥低功耗蓝牙芯片CH6121。该开发套件以YoC平台为基础,对蓝牙MESH协议栈做了深度优化和整合,为开发者提供了通用的MESH组件,涵盖了SIG MESH Model和私有Model以及丰富的芯片外设驱动。
4.2 SDK介绍
4.2.1 架构说明
BLE MESH SDK总体分为四个层次,自下而上分别为SoC蓝牙芯片层,Kernel 内核层,Service服务层和BT Applications 蓝牙应用层。
-
Kernel 内核层:
包含标准的BLE(5.0)/MESH(1.0)协议栈,Ali OS操作系统,芯片驱动。 -
Service 蓝牙服务层:
Mesh Model组件,其中支持的Sig Models有Generic Level Model,Generic Onoff Model,, Light Level Model,Light CTL Model等,此外还有一个Vendor Model,支持数据透传。 -
Mesh Node组件
提供Mesh 节点入网和配置功能,开发者可以基于该组件开发Mesh节点应用 -
Mesh Provisioner组件
支持MESH节点管理,包括新增Mesh节点,删除Mesh节点,获取节点信息等功能。 -
Genie APP组件
天猫精灵Mesh组件,支持天猫精灵网络协议。 -
BT Applications
蓝牙应用层,包含灯控节点,开关节点,Provisioner AT模组和天猫精灵灯控节点。
4.2.2 目录说明
下面是BLE MESH SDK的目录结构,表格中介绍了各个目录的功能。
4.2.3 Mesh组件
本章节介绍SDK中包含的几个关键Mesh组件的功能和使用方法。
- Mesh Node组件
- Mesh Models组件
- Genie APP组件
4.2.4 Mesh Node
Mesh Node支持Mesh节点配置和Model消息的接收功能。组件的主要API如下表:
API | 说明 |
---|---|
ble_mesh_node_init | Mesh Node组件的初始接口 |
ble_mesh_node_OOB_input_num | 配网过程中,要求输入数字的接口 |
ble_mesh_node_OOB_input_string | 配网过程中,要求数据字符串的接口 |
示例代码
1.初始化
初始化Node节点,主要配置节点的设备名称,UUID,事件的回调。
/* 定义设备名称,使用手机APP扫描时可以看到该名称 */
#define DEVICE_NAME "YoC Light NODE"
/* 定义设备UUID */
#define LIGHT_DEV_UUID {0xcf, 0xa0, 0xe3, 0x7e, 0x17, 0xd9, 0x11, 0xe8, 0x86, 0xd1, 0x5f, 0x1c, 0xe2, 0x8a, 0xde, 0x02}
node_config_t g_node_param = {
/* 设置当前为设备节点 */
.role = NODE,
/* 设置节点的UUID */
.dev_uuid = LIGHT_DEV_UUID,
/* 设置节点的Device Name */
.dev_name = DEVICE_NAME,
/* 注册Model的事件处理回调函数 */
.user_model_cb = app_event_cb,
/* 注册Provision的事件处理回调函数 */
.user_prov_cb = app_prov_event_cb,
/* RSSI上报功能使能标识,默认关闭 */
.rssi_report_enable = 0,
};
/* MESH节点初始化,设置节点UUID、Device Name并注册Model事件回调函数 */ ret = ble_mesh_node_init(&g_node_param);
2.回调处理
Node节点在配网或者复位过程中会产生如下事件,开发者应当在user_prov_cb回调中处理:
Event | 说明 |
---|---|
BT_MESH_EVENT_NODE_REST | 节点复位事件 |
BT_MESH_EVENT_NODE_PROV_COMP | 节点入网成功事件 |
BT_MESH_EVENT_NODE_OOB_INPUT_NUM | 配网过程中,要求输入数字 |
BT_MESH_EVENT_NODE_OOB_INPUT_STRING | 配网过程中,要求输入字符串 |
void app_prov_event_cb(mesh_prov_event_en event, void * p_arg) {
switch (event) {
/* 配网成功,亮绿灯 */
case BT_MESH_EVENT_NODE_PROV_COMP: {
if (p_arg) {
mesh_node_local_t * node = (mesh_node_local_t * ) p_arg;
LOGI(TAG, "prov complete %04x", node - > prim_unicast);
prov_succeed_flag = 1;
led_control(led_dev, COLOR_GREEN, -1, -1);
}
}
break;
/* 节点复位,绿灯闪烁 */
case BT_MESH_EVENT_NODE_REST: {
LOGI(TAG, "node reset");
led_control(led_dev, COLOR_GREEN, 200, 200);
}
break;
/* 配网要求输入数字,通过其他方式比如按键,获取数字后,调用
ble_mesh_node_OOB_input_num接口输入 */
case BT_MESH_EVENT_NODE_OOB_INPUT_NUM: {
if (p_arg) {
LOGI(TAG, "oob input num size:%d", *(uint8_t * ) p_arg);
}
}
break;
/* 配网要求输入字符串,通过其他方式比如按键,获取字符串后,调用
ble_mesh_node_OOB_input_string接口输入 */
case BT_MESH_EVENT_NODE_OOB_INPUT_STRING: {
LOGI(TAG, "oob input string size:%d", *(uint8_t * ) p_arg);
}
break;
default:
break;
}
}
4.2.5 Mesh Models
Mesh Models组件提供Generic Onoff,Generic Level,Light Lightness,Light CTL的Server/Client Models,此外还有一个Vendor Model。
Mesh Model的API较多,下表列出几个主要的,其他的请参考《BLE MESH SDK API说明》
Event | 说明 |
---|---|
ble_mesh_model_init | Mesh Model组件的初始接口 |
ble_mesh_model_get_comp_data | 获取Mesh Model组件的Models结构 |
ble_mesh_model_set_cb | 设置Mesh Model组件的回调函数 |
ble_mesh_model_find | 查找指定的Mesh Model |
ble_mesh_model_status_get | 获取指定model的状态 |
示例代码
1.初始化
初始化Mesh Model组件,主要配置需要使用的Models。
/* 定义设备的Models */
static struct bt_mesh_model elem0_root_models[] = {
/* Configuration Server Model, 必选Model */
BT_MESH_MODEL_CFG_SRV_NULL(),
/* Health Server Model, 可选Model */
BT_MESH_MODEL_HEALTH_SRV_NULL(),
/* Generic OnOff Server Model */
BT_MESH_MODEL_GEN_ONOFF_SRV_NULL(),
};
/* 定义设备的Composition data */
static
const struct bt_mesh_comp mesh_comp = {
.cid = 0x01A8, //厂商ID
.elem = elements,
.elem_count = ARRAY_SIZE(elements),
};
/* MESH Model组件初始化 */
ret = ble_mesh_model_init( & mesh_comp);
/* Mesh Model回调函数注册,需要注意如果使用Mesh Node组件,不需要注册该回调,通过Node组件的中的user_model_cb回调获取Model信息 */
ble_mesh_model_set_cb(app_event_cb);
2.回调处理
Mesh Model组件根据使用的Models不同会产生不同的事件回调,下面是一个灯控的设置的事件。
/*
设备Models定义完成后,将通过回调函数返回相关Models的事件,应用需要处理相关事件。 以Generic OnOff Server Modle为例,
*/
void app_event_cb(mesh_model_event_en event, void * p_arg) {
switch (event) {
/* Generic OnOff Server Model的SET事件, 说明Generic OnOff Client来设置开关状态 */
case BT_MESH_MODEL_ONOFF_SET: {
if (p_arg) {
model_message message = * (model_message * ) p_arg;
S_ELEM_STATE * elem_state = (S_ELEM_STATE * ) message.user_data;
/* 解析数据,记录开关状态,并控制LED灯的开和关 */
if (elem_state - > state.onoff[T_TAR]) {
/* 开 灯 */
led_set_status(led2, true);
} else {
/* 关 灯 */
led_set_status(led2, false);
} }
}
break;
default:
break;
}
}
4.2.6 Genie APP
天猫精灵组件,支持天猫MESH Models,天猫精灵的接入,三要素写入/存储/获取功能组件的主要API如下表:
API | 说明 |
---|---|
genie_init | Genie APP组件初始化 |
示例代码
1.初始化
初始化天猫精灵组件
/* 初 始 化 */
genie_init();
2.处理函数
以下内容需要在应用层定义和实现,可以参考applications\bluetooth\genie_light\src\light.c中实现:
/* 定义使用的Models */
static struct bt_mesh_model element_models[] = {
MESH_MODEL_CFG_SRV_NULL(),
MESH_MODEL_HEALTH_SRV_NULL(),
#ifdef CONFIG_MESH_MODEL_GEN_ONOFF_SRV
MESH_MODEL_GEN_ONOFF_SRV( & g_elem_state[0]),
#endif
# ifdef CONFIG_MESH_MODEL_GEN_LEVEL_SRV
MESH_MODEL_GEN_LEVEL_SRV( & g_elem_state[0]),
#endif
# ifdef CONFIG_MESH_MODEL_LIGHTNESS_SRV
MESH_MODEL_LIGHTNESS_SRV( & g_elem_state[0]),
#endif
# ifdef CONFIG_MESH_MODEL_CTL_SRV
MESH_MODEL_CTL_SRV( & g_elem_state[0]),
#ifndef CONFIG_ALI_SIMPLE_MODLE
MESH_MODEL_CTL_SETUP_SRV( & g_elem_state[0]),
#endif# endif
};
/* 定义使用的Vendor Models */
static struct bt_mesh_model g_element_vendor_models[] = {
#
ifdef CONFIG_MESH_MODEL_VENDOR_SRV
MESH_MODEL_VENDOR_SRV( & g_elem_state[0]),
#endif
};
struct bt_mesh_elem elements[] = {
BT_MESH_ELEM(0, element_models, g_element_vendor_models, 0),
};
//设置广播时间
uint32_t get_mesh_pbadv_time(void) {
return MESH_PBADV_TIME * 1000;
}
/* 返回vendor model element的数量 */
uint8_t get_vendor_element_num(void) {
return MESH_ELEM_COUNT;
}
/* 设置默认绑定地址 */
void mesh_sub_init(u16_t * p_sub) {
uint16_t sub_list[CONFIG_BT_MESH_MODEL_GROUP_COUNT];
memset(sub_list, 0, sizeof(sub_list));
#ifdef DEFAULT_MESH_GROUP1
sub_list[0] = DEFAULT_MESH_GROUP1;#
endif
# ifdef DEFAULT_MESH_GROUP2
sub_list[1] = DEFAULT_MESH_GROUP2;#
endif
memcpy(p_sub, sub_list, sizeof(sub_list));
}
/* 入网成功事件 */
void user_prov_complete(u16_t net_idx, u16_t addr) {
//flash 3 timers
}
/* 节点复位事件 */
void user_prov_reset(void) {
}
/* 用户数据初始化 */
void user_init() {
}
/* 用户处理事件回调 */
void user_event(E_GENIE_EVENT event, void * p_arg) {
E_GENIE_EVENT next_event = event;
switch (event) {
case GENIE_EVT_SW_RESET:
case GENIE_EVT_HW_RESET_START:
....
break;
if (next_event != event) {
genie_event(next_event, p_arg);
}
}
}
3.三元组写入
Genie APP组件需要用到三元组才能接入天猫精灵,三要素的获取请参考天猫精灵开发者网站。在Genie APP内部有一个调试三要素,位于modules\genie_app\base\tri_tuple_default.h。Genie APP组件支持通过CLI命令写入和读取三要素。
命令如下:
/* 设置三要素 */
set_tt <product id> <key> <mac address>
/* 获取三要素 */
get_tt
五、应用开发
1开发环境
环境搭建和烧录方法,请参考《CB6121快速上手手册》。
2.Mesh 灯控
Mesh灯控示例请参考《MESH灯控开发指南》。
3.Mesh 开关
Mesh开关示例请参考《MESH开关开发指南》。
5.AT Provisioner
Mesh SDK中提供一个了AT Provisoner模组解决方案,开发者可以使用该方案对其他Mesh节点进行配网和控制。
相关的AT命令和使用方法,请参考《MESH配网模块用户手册》。
6.API说明
SDK API请参考《BLE MESH SDK API说明》
关注本人微信公众号 “徐宏blog” 或扫描下方二维码,发送 211018 获取此系列的全部PDF文档!
另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!
- 玩转
esp8266
带你飞、加群QQ
群,不喜的朋友勿喷勿加:434878850 - 个人邮箱:xuhongv@yeah.net 24小时在线,有发必回复!
- esp8266源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
- esp32源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32
- 关注下面微信公众号二维码,干货多多,第一时间推送!