ble mesh学习笔记(4)元素model的理解

2023-05-16

说明:涉及代码模块为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 NameSIG Model ID
    Vendor Model Server0x01A80000
    Vendor Model Client0x01A80001

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

  • 扩展消息Opcode定义:

    Message NameOpcode
    Vendor Message Attr Get0xD001A8
    Vendor Message Attr Set0xD101A8
    Vendor Message Attr Set Unacknowledged0xD201A8
    Vendor Message Attr Status0xD301A8
    Vendor Message Attr Indication0xD401A8
    Vendor Message Attr Confirmation0xD501A8
    Vendor Message Transparent msg0xCF01A8

 

  • 消息结构定义:(更多具体参考天猫精灵协议文档,自定义实现)

    Vendor message里的数据都使用小端优先方式传输。

    这里举例说明:Vendor Message Attr Get (属性参数获取)

    该消息用于Vendor Model Client获取Vendor Model Server的一个或多个属性值,消息格式如下:

    FieldSizeNote
    Opcode30xD001A8
    TID1Transaction Identifier,每条新消息递增
    Attr Type2读取的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;
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ble mesh学习笔记(4)元素model的理解 的相关文章

随机推荐

  • 增强现实入门实战,使用ArUco标记实现增强现实

    点击上方 AI算法修炼营 xff0c 选择加星标或 置顶 标题以下 xff0c 全是干货 在本文中 xff0c 我们将介绍ArUco标记以及如何使用OpenCV将其用于简单的增强现实任务 xff0c 具体形式如下图的视频所示 一 什么是Ar
  • 停车位检测新数据集、新方法,精准又快速(含视频解读)

    点击上方 AI算法修炼营 xff0c 选择 星标 公众号 精选作品 xff0c 第一时间送达 本文是一篇关于停车位检测的文章 xff0c 文章的视频有详细解读 xff0c 文章的创新点就是在圆形描述器来回归定点坐标 地址 xff1a htt
  • available()方法的使用总结

    先看看API的说明 xff1a public int available throws IOException 返回此输入流下一个方法调用可以不受阻塞地从此输入流读取 xff08 或跳过 xff09 的估计字节数 下一个调用可能是同一个线程
  • simpleBGC32-软件代码开源

    simpleBGC32官方只提供了硬件开源 xff0c 导致市场上有大量的v1 3版的硬件电路板用于飞机云台 xff0c 通过烧录官方给的hex文件实现基本功能 但是由于针对simpleBGC32的软件代码没有开源 xff0c 所以很多需要
  • Gazebo环境下VIO SLAM系统实现

    Gazebo环境下VIO SLAM系统实现 Gazebo环境下VIO SLAM系统实现简介0 准备工作1 搭建gazebo环境1 1 相机1 2 IMU 2 VINS MONO2 1 安装及make2 2 参数修改2 3 外参标定2 3 1
  • 滤波学习理解----EKF(一)

    最近回到slam方向了 xff0c 所以有时间整理一下最近的收获 最复杂也是最简单的模块 滤波 引入 那么滤波是什么呢 xff1f 滤波就是由于观测observation xff08 OB xff09 天生具备的误差和噪声 当有多个信号源观
  • 在VMware里装Kali Linux选graphical install后黑屏解决方案

    我用的是VMware 16 xff0c 装Kali Linux 2020 xff0c 选graphical install后黑屏 其实不管选哪个都黑屏 一开始按照网上的netsh winsock reset xff0c 虚拟打印机 xff0
  • USB移动存储设备上安装Kali Linux(独立系统 非Live 非虚拟机)Standalone Kali Linux + grub2 + luks加密

    前言 本文分享的是在USB移动设备上安装Kali Linux独立系统 非Live版 xff01 非虚拟机版 xff01 非Live版 xff01 非虚拟机版 xff01 非Live版 xff01 非虚拟机版 xff01 这里的USB设备包括
  • 简单git多人协同

    git网上的资料非常多 xff0c 本文只希望能提供一个简单直观的使用教程 xff0c 可能不严谨 如果本文有任何问题 xff0c 请及时指正 git简介 本章介绍git的基本概念 xff0c 了解git就可以跳过 什么是git xff1f
  • Arch 安装 Visual Studio Code(支持Wayland)

    文章目录 安装vscode在Wayland下模糊的解决方法在Wayland下无法使用输入法的解决方法 安装vscode 虽然官网下载一般是首先 xff0c 但是比较复杂 xff0c 所以推荐使用AUR xff1a yay S visual
  • 安装并使用NoMachine

    1 进入NoMachine官网下载NoMachine安装包 2 安装NoMachine xff0c 一路到底 xff0c 不需更改其他设置 xff08 安装目录随意 xff09 3 下载IP扫描工具 xff1a Advanced IP Sc
  • Wayland环境下通过xwayland支持docker图形界面

    写在前面 在之前的文章里已经讲解了怎么直接在docker中使用wayland支持图形界面 xff08 docker内外都使用wayland xff09 xff0c 文章链接 xff1a 使用Docker安装ROS2 ros humble 并
  • ZigBee生产测试项说明

  • C#窗体缩放时窗体上控件同缩放比例变化

    1 定义2个全局float 变量X Y xff0c 用来记录窗体默认窗口时的宽度和高度 float X 默认窗口的宽度 float Y 默认窗口的高度 2 窗体Load的时候将窗体的宽度 高度赋值给X Y private void Form
  • C# winform存储配置文件之App.config文件读写

    有时候一些用户的配置需要写入在本地 xff0c 不能每次程序启动都让用户重新设置一下吧 下面先说基本用法 xff1a 1 创建winform项目之后自动会生成App config文件 xff0c 如果默认没有 就对项目右键 新建项 APP配
  • C# 解决串口接收数据不完整处理方法

    使用缓存机制完成 首先通过定义一个成员变量List lt byte gt buffer 61 new List lt byte gt 4096 用来存放所有的数据 xff0c 在接收函数里 xff0c 通过buffer AddRange 方
  • ble-mesh笔记整理(1) ble-mesh通信理解

    最近有时间将之前整理的 xff0c 关于蓝牙mesh开发学习过程的一些笔记 xff0c 以及一些对mesh协议文档理解的翻译文档 xff0c 发布出来给大家一起学习和参考 xff0c 主要是一个学习的过程参考 蓝牙Mesh通过网状网的组网结
  • ble-mesh 学习笔记(2)-如何给mesh-node配网

    1 配网方式选择 基于手机设备为provisioner进行进行PB GATT 配网 如果一个蓝牙4 0的手机需要用作Provisioner xff0c 并完成对其他节点的配网过程 则需要使用Mesh Provisioning Service
  • ble mesh学习笔记(3)mesh节点设备广播类型

    蓝牙Mesh网络一共有3种广播包 xff0c 如下图所示 1 PB ADV的包是用在Provisioning过程的 xff0c Provisioning是一个设备加入Mesh网络的过程 2 Mesh Message xff0c 这个是在设备
  • ble mesh学习笔记(4)元素model的理解

    说明 xff1a 涉及代码模块为Telink mesh sdk 一 Composition Data 结构定义 mesh节点Composition Data 数据定义元素个数以及元素下model个数与model id数据结构如下 xff1a