说明:涉及代码模块为Telink-mesh-sdk

一、 Composition Data 结构定义

mesh节点Composition Data 数据定义元素个数以及元素下model个数与model-id数据结构如下:

ble mesh原理 mesh blend_ble mesh

 

  • 代码结构体如下:
    节点端目前采用的是一个元素结构内包含多个model.
mesh_composition_data_local_t model_sig_cfg_s_cps = {   // can't extern, must static
    {
        // head =
        {
            VENDOR_ID,      // u16 cid = ;//sig定义的设备id
            MESH_PID_SEL,   // u16 pid = ;//产品id
            MESH_VID,       // u16 vid = ;// 版本id
            MESH_NODE_MAX_NUM, //CACHE_BUF_MAX,  // u16 crpl = ;//重放冲击保护SEQ数值
            //mesh_page_feature_t feature = 
            {
                FEATURE_RELAY_EN,       // u16 relay       :1;
                FEATURE_PROXY_EN,        // u16 proxy       :1;
                FEATURE_FRIEND_EN,      // u16 frid        :1;
                FEATURE_LOWPOWER_EN,    // u16 low_power   :1;
                0,                      // u16 rfu         :12;
            },
        },
        // mesh_element_primary_t ele_primary = 
        {
            0,                     // u16 loc; 0x0000 means unknown//sig定义描述id
            ARRAY_SIZE(md_id_sig_primary),      // u8 nums;
            ARRAY_SIZE(md_id_vendor_primary),   // u8 numv;
            {MD_ID_ARRAY_PRIMARY},              // u16 md_sig[] = 
            {MD_ID_ARRAY_PRIMARY_VD},           // u32 md_vendor[] = 
        },

        
};

 

举例分析:

 

ble mesh原理 mesh blend_自定义_02

二、SIG-MODEL定义说明

一个节点默认的sig-model包含(model-ID 为16位):

  • Configuration Server model (ID = 0x0000):用于参数配置
    主要有一下几个重要部分。
  • 订阅发布设置
  • 心跳设置
  • 中继设置
  • 以及一下其他设置,具体参考model操作码和mesh协议规定格式
  • Health Server mode (ID = 0X0002):用于设备健康状态上报
  • 用户还可以添加官方其他的sig-model 实现自定义应用

 

  • telink-mesh-model的软件架构分析:
  • 1、实现model函数接口实现mesh_cmd_sig_func[]:
const mesh_cmd_sig_func_t mesh_cmd_sig_func[] = {
    // OP_TYPE_SIG1
    {APPKEY_ADD, 0, SIG_MD_CFG_CLIENT, SIG_MD_CFG_SERVER, mesh_cmd_sig_cfg_appkey_set, APPKEY_STATUS},
    {APPKEY_UPDATE, 0, SIG_MD_CFG_CLIENT, SIG_MD_CFG_SERVER, mesh_cmd_sig_cfg_appkey_set, APPKEY_STATUS},
    {COMPOSITION_DATA_STATUS, 1, SIG_MD_CFG_SERVER, SIG_MD_CFG_CLIENT, mesh_cmd_sig_cfg_cps_status, STATUS_NONE},
    {CFG_MODEL_PUB_SET, 0, SIG_MD_CFG_CLIENT, SIG_MD_CFG_SERVER, mesh_cmd_sig_cfg_model_pub_set, CFG_MODEL_PUB_STATUS},
    {HEALTH_CURRENT_STATUS,1,SIG_MD_HEALTH_SERVER,SIG_MD_HEALTH_CLIENT,mesh_cmd_sig_health_cur_sts,STATUS_NONE},
    {HEALTH_FAULT_STATUS,1,SIG_MD_HEALTH_SERVER,SIG_MD_HEALTH_CLIENT,mesh_cmd_sig_health_fault_sts,STATUS_NONE},
    {HEARTBEAT_PUB_STATUS,1,SIG_MD_CFG_SERVER,SIG_MD_CFG_CLIENT, mesh_cmd_sig_heart_pub_status ,STATUS_NONE },
//......未补全  详细参考源代码
}

主要实现sig-model操作码相关接口函数,部分接口函数功能不开源。

  • 2、各个model对应的flash 存储地址表,mesh_md_adr_map[] 接口与mesh_save_map[]接口:
  • 存储地址映射
mesh_md_adr_map_t mesh_md_adr_map[] = {
    {0, {VENDOR_MD_LIGHT_S, VENDOR_MD_LIGHT_C, VENDOR_MD_LIGHT_S2, -1, -1, -1}, FLASH_ADR_MD_VD_LIGHT}, // must first
    {1, {SIG_MD_CFG_SERVER, -1, -1, -1, -1, -1}, FLASH_ADR_MD_CFG_S},
    {1, {SIG_MD_HEALTH_SERVER, SIG_MD_HEALTH_CLIENT, -1, -1, -1, -1}, FLASH_ADR_MD_HEALTH},
    {1, {SIG_MD_G_ONOFF_S, SIG_MD_G_ONOFF_C, SIG_MD_G_LEVEL_S, SIG_MD_G_LEVEL_C, -1, -1}, FLASH_ADR_MD_G_ONOFF_LEVEL},
    //......未补全  详细参考源代码
}
  • 存储model参数数据结构体(这里参考源代码定义,不展开)
const mesh_save_map_t mesh_save_map[] = {
//  {FLASH_ADR_SW_LEVEL, (u8 *)&light_res_sw_save, &mesh_sw_level_addr, sizeof(light_res_sw_save)},    //del light model
    {FLASH_ADR_MD_CFG_S, (u8 *)&model_sig_cfg_s, &mesh_md_cfg_s_addr, sizeof(model_sig_cfg_s)},
    {FLASH_ADR_MD_HEALTH, (u8 *)&model_sig_health, &mesh_md_health_addr, sizeof(model_sig_health)},
//  {FLASH_ADR_MD_G_ONOFF_LEVEL, (u8 *)&model_sig_g_onoff_level, &mesh_md_g_onoff_level_addr, sizeof(model_sig_g_onoff_level)},
//......未补全  详细参考源代码
}

这部分主要用于model数据参数存储与保存。

Configuration Server model 对应结构体:model_sig_cfg_s

Health Server mode 对应结构体:model_sig_health

 

  • 3、消息数据格式,由sig-mesh定义,用户不需要自行设计,直接参考官方mesh-model传输数据格式
  • 这部分telink已经根据sig-mesh定义完成,部分开源。

 

 

三 、vendor-model 定义说明:

一个节点的vendor-model包含(vendor-model-ID 为32位 = companyID+modelID)

用户自定义实现:

  • mesh_cmd_vd_func[] :实现函数功能 与操作码相关接口供系统回调处理
  • mesh_md_adr_map[]: 设计对应的存储地址
  • 自定义Model需要分配一个指定的Model ID,以及该Model实现功能所需要的Opcode/Payload

以天猫精灵为例:

  • 自定义model定义:
    表1 Vendor Model ID

Model Name

SIG Model ID

Vendor Model Server

0x01A80000

Vendor Model Client

0x01A80001

mesh节点设备作为Vendor Model Server,dongle作为Vendor Model Client。

  • 扩展消息Opcode定义:

Message Name

Opcode

Vendor Message Attr Get

0xD001A8

Vendor Message Attr Set

0xD101A8

Vendor Message Attr Set Unacknowledged

0xD201A8

Vendor Message Attr Status

0xD301A8

Vendor Message Attr Indication

0xD401A8

Vendor Message Attr Confirmation

0xD501A8

Vendor Message Transparent msg

0xCF01A8

 

  • 消息结构定义:(更多具体参考天猫精灵协议文档,自定义实现)
    Vendor message里的数据都使用小端优先方式传输。
    这里举例说明:Vendor Message Attr Get (属性参数获取)
    该消息用于Vendor Model Client获取Vendor Model Server的一个或多个属性值,消息格式如下:

Field

Size

Note

Opcode

3

0xD001A8

TID

1

Transaction Identifier,每条新消息递增

Attr Type

2

读取的Attr类型

typedef struct{
    u8 tid;
    u16 attr_type;
}vd_msg_attr_get_t;

 

  • 实现接口函数:
  • 消息存储flash地址定义:

  • model对应flash存储数据结构体协议格式:
typedef struct{
#if MD_SERVER_EN
    model_g_light_s_t srv[LIGHT_CNT];           // server
    #if MD_VENDOR_2ND_EN
    model_g_light_s_t srv2[LIGHT_CNT];           // server
    #endif
#endif
#if MD_CLIENT_VENDOR_EN
    model_client_common_t clnt[1];              // client
#endif
}model_vd_light_t;

typedef struct{
    model_common_t com;             // must first
    u8 rfu1[8];
    u8 sec_nw_beacon;
    u8 ttl_def;
    u8 gatt_proxy;
    u8 frid;
    u8 relay;
    mesh_transmit_t relay_retransmit;   // must after relay
    mesh_transmit_t nw_transmit;
    u8 net_key_list;    // wait for define struct
    u8 app_key_list;    // wait for define struct
    u8 md2app_key_list; // wait for define struct
    u8 rfu2[2];
    mesh_heartbeat_pub_str hb_pub;
    mesh_heartbeat_sub_str hb_sub;  // wait for define struct
#if DIRECTED_FORWARDING_MODULE_EN
    mesh_directed_forward_t directed_forward;
#endif
}model_sig_cfg_s_t;