第1篇:了解Matter物模型翻译器

news2024/11/18 12:18:53

第1篇:了解Matter物模型翻译器

  • 1. Matter物模型简介
  • 2. 物模型翻译成编程语言
  • 3. 思考题

1. Matter物模型简介

Matter物模型的介绍可以参考: Matter Core Specification的第7章

Matter物模型直观展示,可以看下图1-1, Matter Dimmable Light的实例。
在Matter协议中,所有的设备都看做一个节点(node)。这个节点可以包含多个端点(Endpoint)。图1-1 左侧Endpoint 0 是记录节点的基本信息,比如设备名,厂商名,固件版本号,硬件版本等等。 Endpoint 1 是记录设备可使用的功能集的端点,并且有设备类型Matter Dimmable Light。

每个Endpoint里带有很多功能集。比如这里的Light有开关功能。在Matter中功能集被定义为一个个的Cluster, 比如OnOff Cluster是表示开关功能集。
Cluster有分Server和Client 角色。在这里,只需要把提供服务的一方定义为Server, 比如Matter Dimmable Light。使用服务的一方定义为Client,比如手机App,需要控制Light。
图1-1 Matter Dimmable Light实例一个OnOff Cluster里面有有很多属性,如图1-2所示。比如OnOff属性。参考: Matter Application Specification 第1.5章节的介绍

图1-2 Matter Dimmable Light实例的OnOff Cluster的属性每个Cluster可带有相关命令(Command), Client和Server之间的交互可以通过命令来完成。如图1-3所示,手机App可以通过On 命令打开Light, 或者通过Off命令关闭Light。
 图1-3 Matter Dimmable Light实例的命令集合以此类推,可以通过Matter工程提供的zap工具配置其他的功能集,配置好后保存名为*.zap格式的物模型配置文件。

2. 物模型翻译成编程语言

物模型配置好后,还需要翻译成编程语言才能编程固件,大致过程如下:

*.zap格式的物模型配置文件是一个json格式的 文件, 截取其中的片段。

 {
          "name": "On/Off",
          "code": 6,
          "mfgCode": null,
          "define": "ON_OFF_CLUSTER",
          "side": "server",
          "enabled": 1,
          "attributes": [
            {
              "name": "OnOff",
              "code": 0,
              "mfgCode": null,
              "side": "server",
              "type": "boolean",
              "included": 1,
              "storageOption": "NVM",
              "singleton": 0,
              "bounded": 0,
              "defaultValue": "0x00",
              "reportable": 1,
              "minInterval": 0,
              "maxInterval": 65344,
              "reportableChange": 0
            }
          ]
        }

这个配置文件最终需要翻译成电脑可以读懂编程语言,比如C++/Java/Object C/Python等。
在翻译成代码之前,需要转译为一种*.matter后缀的中间格式。截取其中的片段

/** Attributes and commands for switching devices between 'On' and 'Off' states. */
server cluster OnOff = 6 {

  enum OnOffStartUpOnOff : ENUM8 {
    kOff = 0;
    kOn = 1;
    kTogglePreviousOnOff = 2;
  }

  bitmap Feature : BITMAP32 {
    kLighting = 0x1;
    kDeadFront = 0x2;
  }

  bitmap OnOffControl : BITMAP8 {
    kAcceptOnlyWhenOn = 0x1;
  }
  readonly attribute boolean onOff = 0;
  readonly attribute boolean globalSceneControl = 16384;
  readonly attribute attrib_id attributeList[] = 65531;
  readonly attribute bitmap32 featureMap = 65532;
  readonly attribute int16u clusterRevision = 65533;

  command Off(): DefaultSuccess = 0;
  command On(): DefaultSuccess = 1;
  command Toggle(): DefaultSuccess = 2;
  command OffWithEffect(OffWithEffectRequest): DefaultSuccess = 64;
  command OnWithRecallGlobalScene(): DefaultSuccess = 65;
  command OnWithTimedOff(OnWithTimedOffRequest): DefaultSuccess = 66;
}

这个表示方法大家可能很熟悉,像C++语言的类,也就是通过这种相当接近编程语言的中间格式,进一步再转换为各种编程语言。
为了有更直观的印象,先展示最终的转换结果,看通过*.matter文件最终需要生成怎样的编程语言文件。
比如生成C++语言 的五个文件如下表1-1,其他语言原理亦然。

文件列表
CHIPClusters.h
MClusterCommandHandler.cpp
access.h
endpoint_config.h
gen_config.h

截取 endpoint_config.h文件的片段,这个文件定义名为GENERATED_ATTRIBUTES 的宏, 这个宏记录节点(node)中所有Cluster的所有的属性。这个宏是C++数组里的元素,这样C++代码通过解析这个宏就可以知道设备物模型有什么属性了。

#define GENERATED_ATTRIBUTES                                                                                                       \
    {                                                                                                                              \
                                                                                                                                   \
        /* Endpoint: 0, Cluster: Groups (server) */                                                                                \
        { ZAP_EMPTY_DEFAULT(), 0x00000000, 1, ZAP_TYPE(BITMAP8), 0 },        /* NameSupport */                                     \
            { ZAP_SIMPLE_DEFAULT(0), 0x0000FFFC, 4, ZAP_TYPE(BITMAP32), 0 }, /* FeatureMap */                                      \
            { ZAP_SIMPLE_DEFAULT(4), 0x0000FFFD, 2, ZAP_TYPE(INT16U), 0 },   /* ClusterRevision */                                 \
                                                                                                                                   \
            /* Endpoint: 0, Cluster: Descriptor (server) */                                                                        \
            { ZAP_EMPTY_DEFAULT(), 0x00000000, 0, ZAP_TYPE(ARRAY), ZAP_ATTRIBUTE_MASK(EXTERNAL_STORAGE) },  /* DeviceTypeList */   \
            { ZAP_EMPTY_DEFAULT(), 0x00000001, 0, ZAP_TYPE(ARRAY), ZAP_ATTRIBUTE_MASK(EXTERNAL_STORAGE) },  /* ServerList */       \
            { ZAP_EMPTY_DEFAULT(), 0x00000002, 0, ZAP_TYPE(ARRAY), ZAP_ATTRIBUTE_MASK(EXTERNAL_STORAGE) },  /* ClientList */       \
            { ZAP_EMPTY_DEFAULT(), 0x00000003, 0, ZAP_TYPE(ARRAY), ZAP_ATTRIBUTE_MASK(EXTERNAL_STORAGE) },  /* PartsList */        \
            { ZAP_SIMPLE_DEFAULT(0), 0x0000FFFC, 4, ZAP_TYPE(BITMAP32), 0 },                                /* FeatureMap */       \
            { ZAP_EMPTY_DEFAULT(), 0x0000FFFD, 2, ZAP_TYPE(INT16U), ZAP_ATTRIBUTE_MASK(EXTERNAL_STORAGE) }, /* ClusterRevision */  \

3. 思考题

本节先留几个思考题供读者思考,下一篇文章继续为你揭秘《第2篇:Matter物模型翻译器原理》。

  1. 物模型*.zap格式文件转换为*.matter格式文件好处在哪?
  2. 物模型*.zap格式文件如何转换为*.matter格式的文件?
  3. *matter格式的中间文件是怎么转换成电脑编译器可以识别的代码的?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/813843.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】7、D-Bus 消息总线系统

文章目录 d-bus 官网 d-bus详解 D-Bus 是一种消息总线系统,是应用程序相互通信的一种简单方法。除了进程间通信之外,D-Bus 还有助于协调进程生命周期; 它使得编写“单实例”应用程序或守护进程以及在需要应用程序和守护进程的服务时按需启动它们变得简…

【学习笔记】关于RAW图片的概念学习

这里是尼德兰的喵芯片设计相关文章,欢迎您的访问! 如果文章对您有所帮助,期待您的点赞收藏! 让我们一起为成为芯片前端全栈工程师而努力! 前言 能为我介绍一下raw图片吗? 当谈论"Raw图片"时&am…

c++ ,vs2019, cpp20规范之 forward_list 源码分析

通过阅读源码可知,该单向链表不像list双向链表那样有专门的前导节点。即list._Mypair._Myval2._head._next才指向第一个有效数据节点。而 forward_list ._Mypair._Myval2._head 已经指向了有效数据节点。原因就在于复杂巧妙的类型转换。如下图的构造函数里&#xff…

C语言实现定时器,定时触发函数

最近想到使用C语言实现一个简单的定时器。使用操作系统windows.h提供的多线程API就能实现 首先定义一个定时器结构体,包含定时时间和触发的函数指针 typedef struct Stimer{int valid;//定时器有效long timingMS;//定时时间TriggerFunc tf;//触发函数 }Stimer;创建…

python下的control库使用

文章目录 control的官方网站函数示例强迫响应forced_response control的官方网站 函数示例 强迫响应forced_response import numpy as np import os import sys import control as ctrl import matplotlib.pyplot as pltdef lim_x(x, lim0):res 0if x > lim:res 1else:…

qt代码练习

计时器练习 namespace Ui { class third; }class third : public QWidget {Q_OBJECTpublic:explicit third(QWidget *parent nullptr);~third();QLabel *labth1 new QLabel(this);QTextEdit *txtth1 new QTextEdit("闹钟",this);QLineEdit *leth1 new QLineEdit(t…

Stable Diffusion:网页版 体验 / AI 绘图

一、官网地址 Stable Diffusion Online 二、Stable Diffusion AI 能做什么 Stable Diffusion AI绘图是一种基于Stable Diffusion模型的生成式AI技术,能够生成各种类型的图像,包括数字艺术、照片增强和图像修复等。以下是一些可能的应用: …

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(13)-Fiddler请求和响应断点调试

1.简介 Fiddler有个强大的功能,可以修改发送到服务器的数据包,但是修改前需要拦截,即设置断点。设置断点后,开始拦截接下来所有网页,直到取消断点。这个功能可以在数据包发送之前,修改请求参数&#xff1b…

【wsl-windows子系统】安装、启用、禁用以及同时支持docker-desktop和vmware方案

如果你要用docker桌面版,很可能会用到wsl,如果没配置好,很可能wsl镜像会占用C盘很多空间。 前提用管理员身份执行 wsl-windows子系统安装和启用 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper…

什么是DOTS?

(图片为实机测试) DOTS全称:(Burst Job SystemEntity Component System) 新型高性能、多线程面向数据的技术堆栈 是由:BrustJob System ECS组合而成,是一种面向数据对象的编程体系,在unity中您也可以对…

机器学习-Gradient Descent

机器学习(Gradient Descent) videopptblog 梯度下降(Gradient Descent) optimization problem: 损失函数最小化 假设本模型有两个参数𝜃1和𝜃2,随机取得初始值 求解偏微分,梯度下降对参数进行更新 Visualize: 确定梯度方向&…

学习使用axios,绑定动态数据

目录 axios特性 案例一:通过axios获取笑话 案例二:调用城市天气api接口数据实现天气查询案例 axios特性 支持 Promise API 拦截请求和响应(可以在请求前及响应前做某些操作,例如,在请求前想要在这个请求头中加一些…

leetcode 1372. 二叉树中的最长交错路径

给你一棵以 root 为根的二叉树,二叉树中的交错路径定义如下: 选择二叉树中 任意 节点和一个方向(左或者右)。 如果前进方向为右,那么移动到当前节点的的右子节点,否则移动到它的左子节点。 改变前进方向&a…

IIS创建网站报错 \\?\C:\Windows\inetsrv\config\applicationHost.config

现象: IIS创建不了网站,IIS配置没有发生改变 原因: 服务器C盘无空间,释放空间后问题解决。

Java-day03(程序流程控制)

程序流程控制 1.顺序结构 程序从上至下逐行执行,无判断与跳转 public class Test1{ public static void main(String[] args){int i 1;int j i 1; System.out.println(j);} }2.分支结构 依据条件,选择性执行某段语句 主要有以下两种 2.1 i…

计算机毕设 深度学习卫星遥感图像检测与识别 -opencv python 目标检测

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长…

VSCode搭建GCC环境

1. 下载 https://www.mingw-w64.org/downloads/ https://github.com/niXman/mingw-builds-binaries/releases 2.安装 x86_64-12.2.0-release-win32-seh-rt_v10-rev1.7z解压到D盘 我的电脑–属性–系统属性–环境变量–系统变量–path D:\MinGW-w64\x86_64-12.2.0-release…

用html+javascript打造公文一键排版系统10:单一附件说明排版

如果公文有附件,一般会在公文正文下作附件说明。 一、附件说明的格式 一般为: 公文如有附件,在正文下空一行左空二字编排"附件"二字,后标全角冒号和附件名称。如有多个附件,使用阿拉伯数字标注附件顺序号&…

OSI 7层模型 TCP/IP四层模型 5层模型都是什么,作用是什么【每层的协议没整理完】

7层模型 && 4层TCP/IP 模型对照关系 7层&&5层&&4层模型对照: 我们的教科书为了更好地表示数据包在网络传输上的封装和解封装,抽象出了5层模型 7层模型: 各层的用途: 应用层:为计算机上用户提…

Qt 2. QSerialPortInfo显示串口信息

在ex2.pro 添加&#xff1a; QT serialport//main.cpp #include "ex2.h" #include <QtSerialPort/QtSerialPort> #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Ex2 w;w.show();QList<QSerialPortInfo>…