【BLE MESH 学习笔记 ①】BLE MESH SDK的总体介绍文档,包括SDK的架构,目录,基本的开发方法和指引。

文章目录

【BLE MESH 学习笔记 ①】BLE MESH SDK的总体介绍文档,包括SDK的架构,目录,基本的开发方法和指引。


一、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 蓝牙应用层。
【BLE MESH 学习笔记 ①】BLE MESH SDK的总体介绍文档,包括SDK的架构,目录,基本的开发方法和指引。

  • 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的目录结构,表格中介绍了各个目录的功能。

【BLE MESH 学习笔记 ①】BLE MESH SDK的总体介绍文档,包括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的架构,目录,基本的开发方法和指引。

上一篇:人工智能Java SDK:图像预处理


下一篇:Xftp简介