【BLE MESH 学习笔记 ①】BLE MESH SDK的总体介绍文档,包括SDK的架构,目录,基本的开发方法和指引。
2021/10/18 23:09:58
本文主要是介绍【BLE MESH 学习笔记 ①】BLE MESH SDK的总体介绍文档,包括SDK的架构,目录,基本的开发方法和指引。,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 一、BLE MESH SDK专题介绍
- 二、BLE MESH SDK 学习笔记
- 三、推荐阅读顺序
- 四、正文
- 4.1 概述
- 4.2 SDK介绍
- 4.2.1 架构说明
- 4.2.2 目录说明
- 4.2.3 Mesh组件
- 4.2.4 Mesh Node
- 4.2.5 Mesh Models
- 4.2.6 Genie APP
- 五、应用开发
- 另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!
一、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
- 关注下面微信公众号二维码,干货多多,第一时间推送!
这篇关于【BLE MESH 学习笔记 ①】BLE MESH SDK的总体介绍文档,包括SDK的架构,目录,基本的开发方法和指引。的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南