本系列的学习笔记,部分摘抄来自平头哥社区的文档,部分来自 本人CSDN半颗心脏 的吸收、转化后的见解,毕竟身为一个技术搬运工,也是有助于对国内物联网的技术发展。如有不同的见解或错误的技术见解,请文后留言,本人第一时间更改。
BLE MESH SDK是一个基于蓝牙Mesh软件开发套件,来自 平头哥社区 。目前适应于安信可PB-02蓝牙开发板或平头哥低功耗蓝牙芯片CH6121。
该开发套件以YoC平台为基础,对蓝牙MESH协议栈做了深度优化和整合,为开发者提供了通用的MESH组件,涵盖了SIG MESH Model和私有Model以及丰富的芯片外设驱动。
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网络接入。
BLE MESH SDK是一个基于蓝牙Mesh软件开发套件,来自 平头哥社区 。目前适应于安信可PB-02蓝牙开发板或平头哥低功耗蓝牙芯片CH6121。该开发套件以YoC平台为基础,对蓝牙MESH协议栈做了深度优化和整合,为开发者提供了通用的MESH组件,涵盖了SIG MESH Model和私有Model以及丰富的芯片外设驱动。
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模组和天猫精灵灯控节点。
下面是BLE MESH SDK的目录结构,表格中介绍了各个目录的功能。
本章节介绍SDK中包含的几个关键Mesh组件的功能和使用方法。
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; } }
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; } }
天猫精灵组件,支持天猫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