说明:涉及代码模块为Telink-mesh-sdk
一、 Composition Data 结构定义
mesh节点Composition Data 数据定义元素个数以及元素下model个数与model-id数据结构如下:
- 代码结构体如下:
节点端目前采用的是一个元素结构内包含多个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[] =
},
};
举例分析:
二、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;