当前位置: 首页 > news >正文

「连载」边缘计算(二十)02-23:边缘部分源码(源码分析篇)

(接上篇)

EdgeCoredevicetwin

前面对EdgeCore组件的edged功能模块进行了分析,本节对EdgeCore组件的另一个功能模块devicetwin进行剖析,包括devicetwin的struct调用剖析、devicetwin的具体逻辑剖析、devicetwin的缓存机制剖析。

1.devicetwin的struct调用剖析

EdgeCore模块注册函数入手,具体如下所示。

KubeEdge/edge/cmd/EdgeCore/app/server.go

// registerModules register all the modules started in EdgeCore

func registerModules() {

devicetwin.Register()

...

}

进入registerModules()函数中的devicetwin.Register()函数定义,具体如下所示。

KubeEdge/edge/pkg/devicetwin/devicetwin.go

// Register register devicetwin

func Register() {

dtclient.InitDBTable()

dt := DeviceTwin{}

core.Register(&dt)

}

Register()函数主要做了如下3件事。

1)初始化devicetwin需要的数据库表(dtclient.InitDBTable());

2)实例化DeviceTwin struct(dt := DeviceTwin{});

3)注册将已经实例化的DeviceTwin struct(core.Register(&dt))。

下面深入剖析初始化devicetwin需要的数据库表具体做了哪些事情以及DeviceTwin struct具体由哪些属性组成。

(1)devicetwin数据库相关struct剖析

这部分剖析初始化devicetwin需要的数据库及数据库表相关的struct,具体如下所示。

KubeEdge/edge/pkg/devicetwin/dtclient/sql.go

//InitDBTable create table

func InitDBTable() {

klog.Info("Begin to register twin model")

dbm.RegisterModel("twin", new(Device))

dbm.RegisterModel("twin", new(DeviceAttr))

dbm.RegisterModel("twin", new(DeviceTwin))

}

InitDBTable()函数中,通过封装的beegoorm(https://GitHub.com/astaxie/beego/tree/develop/orm)创建数据库twin,并初始化device、device_attr和device_twin三张表。与上述三张表对应的结构体如下所示。

KubeEdge/edge/pkg/devicetwin/dtclient/device_db.go

//Device the struct of device

type Device struct {

ID          string `orm:"column(id); size(64); pk"`

Name        string `orm:"column(name); null; type(text)"`

Description string `orm:"column(description); null; type(text)"`

State       string `orm:"column(state); null; type(text)"`

LastOnline  string `orm:"column(last_online); null; type(text)"`

}

KubeEdge/edge/pkg/devicetwin/dtclient/deviceattr_db.go

//DeviceAttr the struct of device attributes

type DeviceAttr struct {

ID          int64  `orm:"column(id);size(64);auto;pk"`

DeviceID    string `orm:"column(deviceid); null; type(text)"`

Name        string `orm:"column(name);null;type(text)"`

Description string `orm:"column(description);null;type(text)"`

Value       string `orm:"column(value);null;type(text)"`

Optional    bool   `orm:"column(optional);null;type(integer)"`

AttrType    string `orm:"column(attr_type);null;type(text)"`

Meta Data    string `orm:"column(metadata);null;type(text)"`

}

KubeEdge/edge/pkg/devicetwin/dtclient/devicetwin_db.go

//DeviceTwin the struct of device twin

type DeviceTwin struct {

ID              int64  `orm:"column(id);size(64);auto;pk"`

DeviceID        string `orm:"column(deviceid); null; type(text)"`

Name            string `orm:"column(name);null;type(text)"`

Description     string `orm:"column(description);null;type(text)"`

Expected        string `orm:"column(expected);null;type(text)"`

Actual          string `orm:"column(actual);null;type(text)"`

ExpectedMeta    string `orm:"column(expected_meta);null;type(text)"`

ActualMeta      string `orm:"column(actual_meta);null;type(text)"`

ExpectedVersion string `orm:"column(expected_version);null;type(text)"`

ActualVersion   string `orm:"column(actual_version);null;type(text)"`

Optional        bool   `orm:"column(optional);null;type(integer)"`

AttrType        string `orm:"column(attr_type);null;type(text)"`

Meta Data        string `orm:"column(metadata);null;type(text)"`

}

以上3个文件中除了包含与device、device_attr和device_twin三张表对应的结构体定义外,还有针对这三张表的增、删、改、查方法的定义。

未完待续…… 

相关文章:

「连载」边缘计算(二十)02-23:边缘部分源码(源码分析篇)

(接上篇) EdgeCore之devicetwin 前面对EdgeCore组件的edged功能模块进行了分析,本节对EdgeCore组件的另一个功能模块devicetwin进行剖析,包括devicetwin的struct调用链剖析、devicetwin的具体逻辑剖析、devicetwin的缓存机制剖析…...

Swagger接口文档管理工具

Swagger 1、Swagger1.1 swagger介绍1.2 项目集成swagger流程1.3 项目集成swagger 2、knife4j2.1 knife4j介绍2.2 项目集成knife4j 1、Swagger 1.1 swagger介绍 官网:https://swagger.io/ Swagger 是一个规范和完整的Web API框架,用于生成、描述、调用和…...

关于HTML5表单验证的方法教程

简介 HTML5表单验证是一种在客户端对用户输入进行验证的方法,可以有效地减少对于服务器端验证的依赖。通过使用HTML5表单验证,可以为用户提供实时的错误提示和更好的用户体验。本教程将介绍如何在HTML5中使用各种验证属性和技术来实现表单验证。 基本表…...

.NET生成MongoDB中的主键ObjectId

前言 因为很多场景下我们需要在创建MongoDB数据的时候提前生成好主键为了返回或者通过主键查询创建的业务,像EF中我们可以生成Guid来,本来想着要不要实现一套MongoDB中ObjectId的,结果发现网上各种各样的实现都有,不过好在阅读C#…...

BeautifulSoup+xpath+re+css简单复习+新的scrapy的学习

1.BeautifulSoupsoup BeautifulSoup(html,html.parser)all_icosoup.find(class_"DivTable") 2.xpath trs resp.xpath("//tbody[idcpdata]/tr") hong tr.xpath("./td[classchartball01 or classchartball20]/text()").extract() 这个意思是找…...

Python爬虫实战:从API获取数据

引言 在现代软件开发中,API已经成为获取数据的主要方式之一。API允许不同的软件应用程序相互通信,共享数据和功能。在本文中,我们将学习如何使用Python从API获取数据,并探讨其在实际应用中的价值。 目录 引言 二、API基础知识 …...

音频转换器哪个好?3款电脑软件+3款手机应用

在当今的数字时代,音频转换已成为许多用户日常的需求。为了帮助您找到最佳的音频转换工具,我们将介绍3款电脑软件和3款手机应用。这些工具都各有特点,能够满足不同用户的需求。 1.电脑软件篇 1.1金舟音频大师 金舟音频大师是一款多功能的音…...

惯性导航 | 运动学---运动模型

惯性导航 | 运动学---运动模型 IMU系统的运动学 IMU系统的运动学 惯性测量单元(IMU)已经非常普及了。我们在绝大多数电子设备中都能找到IMU:车辆、手机、手表、头盔,甚至足球当中都内置了IMU。它们的体积很小,安装在设…...

Java Web(十一)--JSON Ajax

JSON JSon在线文档: JSON 简介 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。轻量级指的是跟xml做比较。数据交换指的是客户端和服务器之间业务数据的传递格式。 它基于 ECMAScript (W3C制定的JS规范)的一个子集,采…...

GL/gl.h: No such file or directory(CentOS8 QT5.12.12)

1.问题描述 新建的QT工程,出现如下问题: GL/gl.h: No such file or directory 2.原因分析 centos系统里面缺少opengl库 3.解决方法 运行命令: yum install mesa-libGL -devel -y...

【外设篇】-显示器

显示屏是一种电光转换工具,现在市面上的显示器都是LCD(Liquid Crystal Display,液晶显示器) 显示器参数介绍 对比度 是指画面黑与白的比值,对比度越高能使色彩表现越丰富,对比度越高,显示器的…...

可视化图文报表

Apache Echarts介绍 Apache Echarts是一款基于Javascript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。 官网&#xff1a;Apache ECharts 入门案例&#xff1a; <!DOCTYPE html> <html>…...

CW023A-H035 CW023A-R230铜合金硬度材质书

CW023A-H035 CW023A-R230铜合金硬度材质书C2100W-O、C2680TWS-OL、C2200W-1/2H、C2800TS-O 、C2800T-H、C2800T-1/2H、C2700TS-O、C4430T-O、C2700T-O、C2700T-H、C2700T-OL、C2800TS-1/2H、C2800T-OL、C2700-O、C2800TS-H、C2700-H、C2700T-1/2H、C2600TS-1/2H、C2700-1/2H、C…...

Ribbon负载均衡:提升应用性能与可靠性的秘密武器(一)

本系列文章简介&#xff1a; 本系列文章将深入探讨Ribbon负载均衡的工作原理、应用场景和实践经验&#xff0c;帮助大家更好地理解和应用这一强大的技术。通过合理配置和优化Ribbon负载均衡&#xff0c;您可以为您的应用带来更高的性能和可靠性&#xff0c;从而获得竞争优势并满…...

python递归算法

递归算法 一、嵌套调用的过程二、递归的基本原则1、递归的基本原则2、无限递归调用3、正常递归调用4、阶乘问题5、力扣&#xff1a;231. 2 的幂6、力扣面试题 08.05. 递归乘法7、力扣、326. 3 的幂8、力扣342. 4的幂 一、嵌套调用的过程 def show1():print("show 1 run s…...

azure devops工具实践分析

对azure devops此工具的功能深挖&#xff0c;结合jira的使用经验的分析 1、在backlog的功能描述&#xff0c;可理解为需求项&#xff0c;这里包括了bug&#xff0c;从开发的角度修复bug也是个工作项&#xff0c;所以需求的范围是真正的需求&#xff08;开发接收到的已经确认的…...

2024年2月19日-2月25日(全面进行+收集免费虚幻商城资源,20小时,合计2561小时,剩余7439小时)

试试周一到周五重点进行&#xff0c;周末抄写源码&#xff0c;周一晚上看书很快就在22&#xff1a;00睡着&#xff0c;早上可以看看视频教程&#xff0c;出租车上补觉。 执行如下&#xff1a; 周一&#xff1a; 8&#xff1a;01-9&#xff1a;20ue4 rpg&#xff08;184&#xf…...

Ubuntu制作本地安装源

Ubuntu制作本地安装源 应用场景离线安装包的制作&#xff08;可联网电脑&#xff09;更新源安装软件 生成依赖关系在另外一台Ubuntu上离线安装安装 使用deb http方式安装安装nginx更新ubuntu数据库&#xff0c;并安装应用 应用场景 当我们需要在多台电脑安装同一个软件,并且软…...

java springmvc/springboot 项目通过HttpServletRequest对象获取请求体body工具类

请求 测试接口 获取到的 获取到打印出的json字符串里有空格这些&#xff0c;在json解析的时候正常解析为json对象了。 工具类代码 import lombok.extern.slf4j.Slf4j; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.we…...

新手怎么使用github?

GitHub新手使用指南&#xff0c;涵盖了从注册、创建仓库、版本控制基本操作到SSH密钥配置等关键步骤&#xff1a; 第一步&#xff1a;注册与登录 访问GitHub官方网站&#xff1a;https://github.com。点击页面右上角的"sign up"按钮开始注册账号。输入有效的电子邮…...

OmenSuperHub终极指南:解锁惠普OMEN游戏本全部性能的完整教程

OmenSuperHub终极指南&#xff1a;解锁惠普OMEN游戏本全部性能的完整教程 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度&#xff0c;自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub OmenSuperHub是一款专为惠普OMEN…...

3个OBS StreamFX插件功能解决你的直播画面痛点

3个OBS StreamFX插件功能解决你的直播画面痛点 【免费下载链接】obs-StreamFX StreamFX is a plugin for OBS Studio which adds many new effects, filters, sources, transitions and encoders! Be it 3D Transform, Blur, complex Masking, or even custom shaders, youll f…...

从ZLToolKit的semaphore设计,聊聊C++11/14线程同步那些容易踩的坑

从ZLToolKit信号量实现剖析C线程同步的五大陷阱与解决方案 在构建高性能多线程应用时&#xff0c;任务队列作为核心基础设施&#xff0c;其同步机制的可靠性直接影响整个系统的稳定性。ZLToolKit中基于条件变量自实现的semaphore类&#xff0c;虽然代码不足20行&#xff0c;却巧…...

OpenCore Legacy Patcher终极指南:4步让老Mac显卡驱动重获新生

OpenCore Legacy Patcher终极指南&#xff1a;4步让老Mac显卡驱动重获新生 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 让旧Mac焕发新生的终极解决方案来了…...

AMD Ryzen调试神器:免费解锁隐藏性能的完整指南

AMD Ryzen调试神器&#xff1a;免费解锁隐藏性能的完整指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcode.…...

Cosmos-Reason1-7B详细步骤:从/root/cosmos-reason-webui目录开始的定制化配置

Cosmos-Reason1-7B详细步骤&#xff1a;从/root/cosmos-reason-webui目录开始的定制化配置 1. 项目概述 Cosmos-Reason1-7B是NVIDIA开源的一款7B参数量的多模态物理推理视觉语言模型(VLM)&#xff0c;作为Cosmos世界基础模型平台的核心组件&#xff0c;专注于物理理解与思维链…...

StructBERT在智能招聘中的应用:候选人简历与JD关键词语义匹配效果展示

StructBERT在智能招聘中的应用&#xff1a;候选人简历与JD关键词语义匹配效果展示 1. 智能招聘的痛点与解决方案 招聘过程中最耗时的环节是什么&#xff1f;很多HR会告诉你&#xff1a;是简历筛选。面对海量简历&#xff0c;如何快速准确地找到与职位要求最匹配的候选人&…...

别再只调sklearn默认参数了!手把手教你优化SVR回归模型的5个关键步骤

突破SVR模型性能瓶颈&#xff1a;5个被低估的调参实战策略 当你的支持向量回归&#xff08;SVR&#xff09;模型表现平平&#xff0c;准确率卡在某个阈值无法突破时&#xff0c;可能正陷入"默认参数陷阱"。许多机器学习实践者习惯直接调用sklearn的SVR()默认设置&…...

告别环境报错!手把手教你为《深入理解计算机系统》第三版(CSAPP 3e)在Ubuntu 20.04/WSL2下编译专属库

告别环境报错&#xff01;手把手教你为《深入理解计算机系统》第三版&#xff08;CSAPP 3e&#xff09;在Ubuntu 20.04/WSL2下编译专属库 最近在WSL2环境下学习《深入理解计算机系统》&#xff08;CSAPP&#xff09;时&#xff0c;发现官方代码包直接编译总会报错。经过多次尝试…...

CSS如何实现根据滚动进度触发的过渡效果_配合JS修改类名触发transition

滚动进度需通过JS检测并切换CSS类名来触发transition&#xff0c;不能直接绑定scrollY&#xff1b;必须显式定义初始状态、避免内联样式覆盖、合理节流并处理渲染时机问题。滚动进度如何映射到 CSS transition 的触发点CSS 本身不能直接读取滚动位置&#xff0c;transition 也不…...