边缘计算开源项目解读——kubeedge mappers实现

news2024/11/14 21:47:54

0 背景

        本文重点解读kubeedge项目中的mapper模块。该模块位于kubeedge的edgecore的南向边缘侧,主要对接入kubeedge的终端设备,进行协议的适配和转换,使其可以和边缘设备通信,转换后的协议是我们前面描述的mqtt协议,当然也支持http协议。当前该模块支持BLE、MOBUS等多种物联网协议的转换,这部分代码单独有一个git路径【1】,有自己独立的架构和功能特性。笔者将从代码架构,模块的上下文,订阅和发布消息的角度对其进行解读。

1 mapper代码架构

        mapper的代码架构从其模块功能上我们也能推断出肯定包含南向和北向两种通信方式,南向的主要是和终端设备通信,而北向则主要将消息传递给边缘设备。那这两者之间得有个桥梁,将其连接起来,本质上就是要进行协议的转换。基于这样的思路,我们再去看mapper中的代码目录就变得很清晰了。如下图所示是整个mapper模块文件夹和协议转换架构之间映射关系。

f04dbdacbd3748469711325bd2c2b75c.png

        图中左侧的代码目录分为三部分。其一是当前已经支持的协议,我们看到有七种协议,这些协议是物联网场景被广泛使用的通信协议,实现与终端设备的连接,此处映射到协议层。第二部分有di,models和service三个文件夹,其中models实现了跟协议层的交互,di主要实现了mapper的容器功能,service作为mapper模块的主控流程,此处我们将其划归到驱动层。最后的第三部分主要实现协议的转换和北向通信,主要有mqttadapter,httpadapter,clients三个核心功能。其中clients实现了与broker的通信,另外两个主要实现协议数据的转换。各层功能的交互过程将在3和4小节讲述。

2 mapper模块的上下文

        mapper模块的上下文指的是该模块在kubeedge中的所处的位置,这个模块实现了终端设备和边缘设备之间的互联,上边通过broker与EventBus通信,下边与终端设备通过各种物联网协议(BLE/MOBUS等)连接。这个模块在终端和边缘之间搭建了一座桥梁,可以让终端设备很方便地插入到边缘设备上。

b3b2d166779745e2a2d6a238b4f035ee.png

        上图中以mqtt协议为例,讨论一下这个模块的在云边端这种架构下的作用。我们已经知道在云边端场景下,设备的状态修改可以由云端发起,该期望状态首先到达边缘设备的devicetwin,存储在边缘侧的database,然后通过EventBus发布修改设备状态到broker。那这个状态如何更新到终端呢?此处就需要用到我们本文的mapper模块,该模块从broker订阅了更新设备状态的主题,broker将期望的终端状态发送到mapper,mapper再根据连接的终端设备,将期望状态转换成终端连接的协议,最后发送给终端。同样的当设备的状态发生变化时,也可以通过相反的过程上送到边缘侧和云侧。在了解了这个模块的外部交互后,我们看看模块内部的实现流程是怎样的,下面将从订阅和发布两个方向上进行梳理。

3 mapper订阅消息流程

        mapper订阅消息,订阅的主题来自于broker。整个mapper服务的入口是bootstrap,其中控制了整个的订阅流程,首先是创建一个mapper容器,然后定义了一个mapper服务实例。在实例的内部,依次实现了协议主题订阅,协议转换,协议挂载和协议的内部适配,通过这套流程就可以实现一个完整的主题订阅和实现过程。最终解析出的数据会通过BLE等协议发送给终端设备。

fa6bce1b38aa4bc2989299bbde81d68a.png

        mapper服务实例内部各子模块的功能描述和实现如下:

  • 协议主题订阅:对应clients文件夹,实现了mqtt客户端功能,完成mapper和broker的连接,主题的订阅。
  • 协议转换:对应mqttadapter文件夹,实现了mqtt协议与其他协议数据的格式转换,动态添加和删除设备。
  • 协议挂载:对应controller文件夹,实现了主题接口的订阅,调用驱动接口配置数据到设备。
  • 协议内部适配:对应ble等文件夹,实现了mqtt信息获取,设备数据初始化,ble初始化等基础功能,然后初始化订阅主题消息最后解析订阅的主题,将数据配置成ble的数据格式。

4 mapper发布消息流程

        mapper发布消息,发布的主题会发送给broker。实现的流程与上述的订阅消息类似。不同的地方是mapper服务实例内部的模块从设备端起始,最终到broker截止。如下图所示,发布的数据来自设备,包括孪生数据,用户数据和设备状态数据,其中的孪生数据会更新到边缘设备的devicetwin模块。在协议挂载挂载的是发布主题接口,实际的执行接口实现驱动控制和获取设备数据。在协议转换模块,定时上报来自设备的三类数据。最后的协议发布模块,创建发布主题,将数据发送到broker。

ead9b560b1044002bb4f6a47a34a41b7.png

5 小结

        本文从代码流程和架构的角度解读了kubeedge的mapper模块,这个模块是开发者在应用开发中需要二次开发的地方,特别是当项目中使用当前不支持的物联网协议时,就需要根据提供的架构在mapper中实现对自研协议的支持。希望本文能够对开发者有所启发,下一步笔者将转向MetaManager模块的解读,敬请期待。

参考文献:

【1】https://github.com/kubeedge/mappers-go

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

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

相关文章

玩转ThreadLocal

前言 ThreadLocal想必都不陌生,当多线程访问同一个共享变量时,就容易出现并发问题,为了保证线程安全,我们需要对共享变量进行同步加锁,但这又带来了性能消耗以及使用者的负担,那么有没有可能当我们创建一个…

只知道删除单张表的数据?不知道删除多张表的数据?

一些废话 可能在某某一天,你在表删除表数据的时候,不想一张表一张表的去删除,想把两个表的数据同时删除;然后你就会去搜索,然后你就很有很有很有很有可能会看到 me 的这篇优质(呸!!…

HOT100--(5)最长回文子串

点击查看题目详情 中心扩散法 思路: 遍历字符串,以每个字符为中心点向两边扩散,如果遇到不一样的就跳出循环。以此类推,最后截取最大回文串返回。 细节 字符个数不一定都是奇数。当个数是偶数的是时候,我们可以“忽…

学习红客技术必备,手把手教你成为“安防第一人”

互联网时代已悄悄来临,作为新时代的人们,我们日常生活、工作、学习方面都需要借助互联网来完成,这样,又产生一种新的问题,那就是网络安全的问题,有时我们拼命加班好不容易完成的东西,在一夜之间…

优化Linux系统性能的必杀技:调整进程优先级!学会使用nice命令,让你的系统飞一般的顺畅!

文章目录前言一. nice命令介绍1.1 nice的介绍1.2 cpu资源的调度1.3 nice是控制内核吗?二. 语法格式及常用选项三. 参考案例3.1 将ls命令的优先级调整为最高3.2 将 find 命令的优先级调整为最低3.3 如何查看nice值四. nice和renice的区别总结前言 大家好&#xff0c…

Zookeeper的安装

目录 Zookeeper的安装 1、环境准备 2、上传 3、解压文件到opt/zookeeper目下 4、安装完后进入zookeeper,找到conf目录 5、复制zoo_sample.cfg 6、编辑zoo.cfg 7、复制一份会话,进入zookeeper安装目录,创建一个文件夹zkdata&#xff0…

Linux·DMA 与零拷贝技术

DMA 与零拷贝技术注意事项:除了 Direct I/O,与磁盘相关的文件读写操作都有使用到 page cache 技术。1. 数据的四次拷贝与四次上下文切换很多应用程序在面临客户端请求时,可以等价为进行如下的系统调用:File.read(file, buf, len);…

NOC2021年测试卷3

1. 角色初始位置坐标是(0,0),执行下面程序后,角色会出现在什么位置上?( ) A. x坐标为10,y坐标为50B. x坐标为40,y坐标为50C. x坐标为50,y坐标为40D. x坐标为30,y坐标为502. 执行下面程序后,按一次→键,兔子会?() A. 向右移动10步B. 向左移动10步C. 向上移动…

入职外包三个月,我提桶跑路了

有一种打工人的羡慕,叫做“大厂”。 真是年少不知大厂香,错把青春插稻秧。 但是,在深圳有一群比大厂员工更庞大的群体,他们顶着大厂的“名”,做着大厂的工作,还可以享受大厂的伙食,却没有大厂…

基于龙芯+国产FPGA 的VPX以太网交换板设计(一)

“棱镜门”的曝光,暴露出我国的信息安全存在极大的安全隐患,作为信息传输 载体的网络设备,其国产化需求迫切,国产处理器、国产可编程逻辑器件、以太网交 换芯片等具有良好的应用前景,另一方面,宽带数据业务…

Java 对象深拷贝

需求 写一个java对象深拷贝工具,用以对象深拷贝。 分析 在 Java 中,变量间值的传递分为两种。对于 int,char,string,等基本数据类型进行值传递时,使用值传递。即原变量 a 的值与新变量 b 的值相等,且 a 与 b 拥有不同的内存地址…

HTML认知

HTML认知 文章目录HTML认知语法规范注释标签组成和关系标签的关系标签学习排版系列标签**标题标签****段落标签**换行标签水平线标签文本格式化标签媒体标签图片标签src 目标图片的路径alt 替换文本title 图片的标题width 宽度 / height 高度路径绝对路径相对路径(常…

win10搭建android monkeyrunner自动化测试环境

本文记录一下monkeyrunner环境搭建遇到的各种坑,以免以后再次踩坑。首先要提一下巨坑,务必要安装java 8(本文记录于2023.3),安装其他版本java,运行monneyrunner会有很多问题,见第七节。 一、安…

Threejs 教程1

threejs核心概念场景、照相机、对象、光、渲染器等1.1.场景Scene 场景是所有物体的容器,对应着显示生活中的三维世界,所有的可视化对象级相关的动作均发生在场景中。1.2.照相机Camera照相机是三维世界中的观察者,类似与眼睛。为了观察这个世界…

5款软件压力测试工具分享

一、什么是软件压力测试? 软件压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分。软件压力测试的基本思路很简单:不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试。通常要进行…

达梦: DmAPService可以手动开启,但是不能开机自启

在部署生产环境安全版数据库发现,DmAPService服务不能开机自启,这样会导致服务器重启后,部署的定时备份任务不能够成功备份数据。 为了在服务器重启后,不影响定时任务自动备份数据库,现将解决这个问题的办法总结如下&a…

《MySql学习》 MySQL的 加锁规则

MySQL加锁原则 两个原则 原则 1:加锁的基本单位是 next-key lock。next-key lock 是前开后闭区间(区间锁和行锁)。原则 2:查找过程中访问到的对象(索引)才会加锁。 两个优化 1.优化 1:索引上…

美团2面:如何保障 MySQL 和 Redis 数据一致性?这样答,让面试官爱到 死去活来

美团2面:如何保障 MySQL 和 Redis 的数据一致性? 说在前面 在尼恩的(50)读者社群中,经常遇到一个 非常、非常高频的一个面试题,但是很不好回答,类似如下: 如何保障 MySQL 和 Redis…

JavaSE学习进阶 day1_02 继承(面向对象第二大特性)

第三章 继承 (面向对象的第二大特性) 3.1 概述 3.1.1 引入 假如我们要定义如下类: 学生类,老师类和工人类,分析如下。 学生类 属性:姓名,年龄 行为:吃饭,睡觉 老师类 属性:姓名,年龄,薪水 行为:吃饭,睡觉,教书 班…

C++ List链表使用

1. list的介绍及使用1.1 list的介绍1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个…