开发者学堂课程【云上能力本地化之边缘计算:Link Edge边缘设备接入流程开发指南】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/559/detail/7673
Link Edge边缘设备接入流程开发指南
内容介绍:
一、 流程背景
二、 驱动框架
三、 设备接入SDK
四、 驱动部署
边缘计算设备介入的开发流程,设备接入作为边缘端的一个基本能力,主要的作用就是数据采集和收集,首先介绍接下来会是以驱动框架之后使设备接入的 SDK 以及最后的一个驱动部署,驱动部署就是指刚刚完成了一个包如何部署到边缘段,并让其运行起来。
一、流程背景
这是所说的设备接入识别率计算的一个最基本的能力,设备接入之后的数据就可以再为你进行一个计算处理,同时也可以将数据分配到云端,要让云端去处理,或者说是两种模式都支持如果是在边缘本地来处理的话,我们会提供相应的一些计算单元让其进行复制,进行一个清洗处理。
目前有支持的计算单元有函数计算、规则计算、流计算以及一些其他的计算单元。如果说是讲数据流转到云平台以后,可以基于平台提供哪些工具,可以进一步对数据进行一些存储分析,或者是可视化的一些展示。
二、驱动框架
1 ,框架
这个框架主要就是驱动内部的一些主要功能,一些功能模块的说明,以及它的运行流程的一些说明。
这个图展示了就是云边端的一个关系,最左端这边就是端的设备端,那边指的就是边有关,云指的就是云平台,不同种类的设备,有不同的接入方式和通讯方式,因此我们也提供了不同的技术策略,假如说设备它本身走的是标准的协议,OPC-UA Client 或者是 Modbus Master。
开发者这一块就可以以零编码的方式对设备进行介入。如果设备它本身采用的是是有禁止的协议,我们这一块也是提供了相应的 SDK,那开发者可以利用一些 SDK 独立开发一个 driver 让设备进行接入,之后接入设备接入以后就可以在边缘端的一些计算模块进行一些数据的清晰,如果想上云的话,也可以通过云代理的方式来将数据推送到云端,也可以将云端的数据下发到通过边缘端,然后最终下发到本阶段,这也是可以的。
2,驱动
讲一下关于驱动这一块的一些内部处理逻辑,驱动这一块它主要包含三大类,这块的话主要一个就是数据交互,还有一个就是模型的转换和连接管理。
(1)连接管理
首先设备接入上来的时候,它肯定是要有对应的连接管理,目前的话连接管理的话,我们是以更准确的来说是驱动我们是以以协议为维度来进行划分的。
那比如说 modbus,我就专门有一个 modbus 的驱动,如果说是私有协议的一个协议的话,这个时候我们就会专门针对私有协议开发一个 driver,凡是支持这个协议的设备都可以通过驱动来接入到我们的边缘网关上。所以说连接管理就是指的是所有的终端设备跟边缘无关建立的通信连接。其实这一块的话连接不同的协议,它根据协议种类来接入。
(2)模型转换
模型转换这块指的就是当设备连接成功以后,对自己上报的数据,设备私有数据将其转换成一个标准的模型,我目前指的标准的模型指的就是我们阿里云官方定义的物模型,主要包含了三大类,一个就是属性,一个是事件,还有一个是服务,主要指的是设备本身的一些操控能力,有计算单元或者是云端来进行设备进行一些操控,所以说我们把它划分为一个服务能力。
(3)数据交互
数据交互指的主要就是指你转换之后的一个标准模型跟其他的计算单元或者是云端进行一个交互,数据交互这一块是通过我们提供的 SDK 来进行一个操作。
像 Modbus 和 OPCUA 这一块的话,因为我们已经完全实现了,因为它是一个标准的协议,所以说我们这块的数据交互模型转换和连接管理这一块我们都已经实现了。
所以说正是我刚才所说的开对开发者而言,它是零开发就可以介入到驱动上。但如果说是一个私有的协议的话,开发者需要去做的两块事儿就是一个是模型的转换,还有一个就是连接管理这一块,这两块需要进行开发。
3,例子
这张图主要就说明的是我们 Java 内部的一个逻辑的一个处理。像这块指的就是云端整个一这一块的话,整个指的就是边远端其中小框,淡黄色的这一块,小框它指的就是整个的一个处理逻辑。
里边的话像就是连接管理,这块上面其实对上的话,它是一个我们提供的 SDK,
中间这一块就是转换后的一个物模型之间的交互模式。比如说连接成功以后上报的数据,首先要经过物模型的转换标准模型,然后通过上报接口 report 在那块接口的话将进行上报,主要就是比如说有时间而言,首先这个时候你可以将通过 report的结果可以将其手机上报上去,比如说它本身设备有一个操控能力,比如说灯的一个开和关,可以通过云端将这个指令下发下来,再通过 CallService 这个接口,它其实是一个回调接口,然后再将接口数据标准的数据模型下发下来,再通过数据模型将其转换成设备的私有数据,在下班的时候对你的设备对设备进行一个操控。
三、设备接入SDK
然后接下来我们就介绍一下关于设备接入的 SDK,SDK 是基于我们提供的一个SDK,开发者拿到 SDK 就可以能完成 driver 的一个独立开发,大概也就是开发者他利用 SDK 来进行一个 driver 一个私有的开发。
目前支持的语言,SDK 语言包,有 C版的 Python 版的还有 CS版的这些,其实我目前是在官网上都提供了相关的一些资料,开发者可以在官网上可以把这些资料都可以通过查阅。
1,接下来我们就 Python- SDK,来说明看他提供了哪些 API 接口,我们主要对其进行说明。
主要我把这块分为两大类,一块就是一个回调接口,也就是说你提供的服务能力来在这去实现。然后另外一个就是来提供你的一些API接口。
(1)那么API接口的话主要就是一些设备状态信息的上报,或者是属性将其上报,前几次这些都是已经转换后的模型,数据模型再次申报。
举个例子,比如说现在当前它有一个灯,灯可能是一个七彩灯,现在灯它可能有多种颜色,你这个时候你可以把灯的光色度定义成一个属性,可能表征其中颜色相当于数据模型,它的属性就是相当于颜色分别代表了。
可以通过云端,比如说下发一个指令,然后后来我要设置属性,比如说我现在是要设置成白色,或者是我要设置成红色,那这个时候你需要去操作一个指令,同时它的一个属性名称,假如说灯会光色度,然后你可以把指令下发下来,这一块里边就需要开发者自己去把这个数据模型转换成你的私有数据,然后再将私有数据再下发到你,这个时候就这个设备进行操控。然后 callService 这一块,比如说它是一个灯的话,有开有关。
你想发一个指令,你想操作这个灯,以后你就可以通过交易 callService,比如说当前灯的服务就是 callService,它的名称叫 light of 就相当于它的操控。
假如说名字就填一个 light,lights 完了以后它的操作方式就是开和关,通过 X的参数就可以将其下方开或关,只需要去接下来你就需要去实现你当前假如你判断是开,可以拿你去处理一个开的一个逻辑控制,利用你设备的私有协议,对设备进行一个开的操作,假如说这是关,你再设备进行一个关的操作就可以了,所以callService 接口,是要有开发者自己来实现,假如说本身你只是一些事项上报或者属性上报,也就说是你的属性是只读的,是不可写的因为 set 和 get properties of set purpose 这个相当于是对属性的一个写的操作,假如说你的属性本身只是一个读的操作的话,其实这三个接口可以都质控,像我这样先把他写的 pass 就可以了。
相当于这三个接口只是定义了,但并没实现就可以。你只需要去对属性的一个上报,或者是一个视角上报就可以了,这个是根据具体的设备能力来进行一个物模型的描述,如果说你的设备能力比较很复杂的话,可能到时候制定出来无模型应该也是比较复杂的,比如说如果这个设备比较单一的话,比如说拿一个灯来说,它就两种状态,应该是开和关,可能它只是检测它当前的一个状态,客观的话你这个时候只需要去进行一个属性 light,完了以后当前的状态再通过这个接口去上报就可以了。
所以说这是根据具体的设备复杂度来开发不同的 driver,有可能非常的复杂,有可能只是一个很简单的,到时候有圆满的结构。
(2)还有一个就是操作过程当中,首先你设备在你上报属性和上报事件之前,也就是在整个云端到设备端的一个操控,数据交互之前肯定先要去注册一个设备,所以说我们提供的一个接口就是通过register and online。
接口来对这个设备进行本身进行一个注册操作,其实相当于就是让边缘内部完了以后给你颁发一个身份信息,也就是一个微信标识,这个接口其实只需要在启动的时候,就是你的 Java 本身启动的时候去注册一次就可以了,后续在的 Java 没退出之前的话,理论上来说这个结果不需要再去注册 The online 这个就是跟你的设备本身的连接有关,假如说当设备的设备它已经掉线了,你这个时候就去置为一个offline,相当于是通知边缘端,你当前这个设备掉线了,如果说这个设备你就连接上了或者是他给你主动连接了,这个时候再去把它高速变端,你的设备上线了,你去操作一个 online 就可以了。整个结果的一个调用流程。
2,接口调用顺序
后续我会有一个流程图来说明
那就这个接口的一个调用顺序也就说是你当你的 Java 一起来以后,首先你要去获取的一个配置信息,接口也已经放在官网上了,你通过查看官网文档就可以获取到配置,配置信息有两部分组成,一部分是驱动自身的。
这些信息它是用户不需要去感知或者是不需要去了解的,有一部分信息他可能是要用户的就是看 driver 设备自身的一些私有数据,比如说我现在 driver 它需要去了解哪些设备,它的设备是如何连接的,比如说IP地址或者是端口号这些的,所以说这些用户开发者也可以自定义这些信息,然后到时候也会一一起补助下来,然后通过接口你可以也拿到你自己的一些私有数据,信息拿到以后这个时候要去做的。
所以连接就是指的是纯粹的是跟设备之间的一些联系操作,有可能是你 driver 主动跟设备进行连接,或者是有设备端来主动跟你联系,因为目前我们的 driver 是CS架构,但是两种模式我们现在其实都支持去看 driver 如何开发,所以说你设备连接不仅限于 Java主动连接设备,或者说是设备可以连接 Java,其实它是两种模式都是可以的。
假如设备连接成功以后,我们就需要去注册设备,所以说如果首次的话就相当于重新启动以后你需要去做的事就是先去做一个设备注册,注册成功以后,它里边内部会也做一次上线处理,所以说之后就可以进行一个数据模型的转换,就相当于整个数据的上报,或者是下端的一些控制。
如果说是在操作过程当中,突然离线了或者是断联了,出现这种异常情况的时候,检测到以后,首先要去调一个设备下端接口,需要去通知边缘端当前设备出现异常或者是断联其实这个时候不是说是你整个 java 就要退出了,而是继续去检测或者是继续要去重连这个设备,直到连接成功以后,之后,又可以进行整个业务逻辑的一些处理,数据上报什么的。
比如说你的 Java 主动去连接一个设备的话,有可能第一次联系的时候联系失败了,连接成功之前的话,你的所有的逻辑在向数据上属性上报这一块都不能处理的,所以说必须是连接成功以后你才能去做设备上线,而不能两个逻辑不能先反过来,要严格按照接口调用的关系图这个顺序图来走。
如果调设备上线接口的时候出现异常,假如它内部出现一些逻辑错误或者是未知错误的时候,在他没有恢复之前,你的设备上线其实是一直注册失败的,所以说你也需要去重新尝试上线,直到上线成功以后,就可以进行一些整个的数据流转的一些或者是转发的一些。
四、驱动部署
驱动部署这一块因为涉及到一个实际的操作,所以说我就直接通过目前的云端控制台来说驱动是如何部署的,就能部署的前景,首先是你一个 java 已经开发完成了,达成一个驱动包,打成一个驱动包完了以后将其上传到云端然后在云端控制台,然后再把它部署到边缘计算端,然后边缘计算再给拉起来,然后最后你的设备就可以介入。
1,实际操作
我现在实际操作一下,看怎么去部署一个驱动。需要首先去添加一个驱动包,我们就会在边缘计算里面有个驱动管理的,驱动管理里面你肯定就可以把你的驱动包进行一个上传。
比如说我现在我要去新增一个驱动,目前我们是以 Python 来演示的,所以说我们直接就选择Python3就行。然后这驱动名称比如说你现在也是你的都是环境监控的一个设备,所以说你这个驱动名称你就起一个监控相关的名字,我这起一个叫envMonitor。
再就是一个环境监控,我这个时候驱动名称这个你可写可不写,但是为了便于跟其他的一些驱动的辨识,我建议还是把这块描述信息写一下为了赶时间我们现在暂时不行了,因为我这边本地我已经有一个驱动包了,这个时候只需要对它进行一个上传就可以。
这个里面有一个环境监测,设备协议的一个驱动包,然后直接将它进行打开之后它就可以自动上传,其实它已经将驱动包上传到云端了,上传到云端的时候,就要去创建一个边缘实例,上传一个驱动包了,把驱动包要跟当前的边缘网关要做一个绑定,现在先把这个删掉。
2,驱动配置
现在假如说这是一个边缘实例,现在是相当于它的边缘往下是没有通过设备的,那么现在比如说我先去添加一个设备,添加完了以后它就会生成一个设备,去配置它的驱动,因为我们之前已经上传了一个驱动包,所以说我们把驱动包跟具体的设备做一个关联就行,到时候他就会统一进行下发。
之前说的配的信息,用户可以在这儿去填写一些自己的配置信息,然后通过执行接口就可以拿到自己的配置信息。
我在自定义配置这一块再说几点,有可能假如说你的驱动它本身要管理几十个甚至上百个设备,上百个设备的话,它每个设备都有自己的一些连接信息。
比如说他要连接的是端口号,他的 Ip地址或者是他的一些串口号之类的,你就可以把你的所有的针对这个设备,你可以把它的配置信息写在这儿,比如说它的端口,端口号是123,我们这儿因为现在是暂时我们只是搭一个 envMonitor,所以说我们自定义信息我们暂时先不配,它其实已经跟驱动已经相当于跟这个设备已经关联上了,把整个就整个边缘实例部署下去的时候,他 java 运行起来的时候,他就会去连接对应的设备。
我们再看一下驱动配置他其实已经做了半年了,所以说你在选的时候,他里边是已经很有驱动的,当然了你也可以再重新去更改它的驱动,但是我们现在也不需要更改,这个时候相当于整个已经部署完成了。部署完成了以后,我们现在是一般主要去配的消息路由。
3,消息路由
消息路由的话它主要是指定当前设备,或者说是它里边的某一些设备,它数据流向或者数据要专门路由给哪个计算单元,或者是直接上传到云端,其实这些都是可以进行一个自定义的配置。因为目前没有对应的规则计算或者是函数计算,所以说目前默认的话,我们把我们的所有的数据都路由到云端。
在这里去配了,我们现在比如消息来源,我们就选择设备,因为我们现在的设备接入这一块,我们讲解的设备接入,所以说我们的数据都是从数据来源都设备端,那么就选择对应的设备,他会首先让你去选对应的产品,下来再去选择对应的设备,因为我现在只有一个设备,那么去选择他的项目。
然后这个里面还有一个消息过滤的,相当于它是一个全量还是一个细化全部的话相当于你的视角属性,其实都可以一次性都会上我的云端,然后消息目标辨识的消息语言端,这是消息目的端。
我们这一块因为现在没有函数计算,没有创建函数计算,我们只需要选择IoT Hub就行,这个设备的所有的消息它都会流向IoT Hub,也就是到时候我也对云端控制台它会展示出来的。
服务级别我们一般默认选0就行,应该是跟消息的消息服务级别有关,我们这块不做过多关心,然后点击确认。就是消息路由这块配的信息他就会创建好。
我们就可以直接通过部署,就可以整个把你配的信息以及驱动包都可以部署到边缘端,这一部分其实前面按理来说应该要把边缘计算这块的一个部署应该讲解,他会在最佳时间里面会去讲解,我们只是在一个现有的环境下去部署一个新的驱动还有一个需要说明的就是当你去部署驱动的时候,有可能失败,这个时候失败的原因其实主要有几个方面,一个方面就是它可能是你的边缘网关没有启动起来,还有一个就是你的网络出现异常,这个时候会产生失败,所以说要根据具体的问题来具体来分析,我们现在我默认的情况下,我当前的边缘实例其实边缘文化是在运行的,我这个时候其实部署的时候它应该会部署下去的,所以说我点击了一个部署的时候,他会将我部署的刚配置的信息都会一次性会部署下去,这个时候其实已经显示在部署中。
我们刚刚配了两个信息,一个是驱动包,一个是路由一个包,这个时候他就会一直处于一个部署中,那现在是部署成功了,他部署下去他会把他的状态都显示出来,如果部署成功的话,他就会把他所有的信息都会提出来,这样的话其实就是人机交互更友好一些,这个时候其实你部署下去以后,最终呈现的效果其实相当于这个时候就会上报数据,我们这个时候去看一下它对应的 PC的设备,最终呈现的效果应该当前驱动是已经运行起来了。
这个是我们刚刚驱动名称,因为你的驱动名称它会到时候会在你的进程运行起来的时候,它会把这个名字显现出来,所以这样设点也便于查找,现在其实这个是存在的,说明我们现在这个驱动包它是已经运行起来了,只不过现在是显示的是离线。
我这边要查看我这边设备显示的是离线的原因是这个设备其实还没连接上,当这个设备其实联系上以后,这个时候其实你就可以看到设备的上线状态,而且这样会上线,这个设备现在你看它是在线的,我们看一下他的运行状态的话,其实他就会把他的所有的数据上报起来现在我们回过头来再来说一下我创建的设备,为什么我会能看见这些数据或者是这些数据之前是为什么会没有?其实这个跟那个产品的创建和设备创建有关系的。
我们在创建一个设备的时候,首先我们先会去描述它这个设备本身具备的能力,你像刚刚我们看到这个设备的话,它是一个环境检测,能看到他的湿度,还有它的温度,甲醛,还有 pm2.5什么的,这些数据,这些数据其实就是我们现在创建产品的时候,其实已经把这个设备的能力已经描述出来了,我们可以具体去看一下,看一下这个设备它具备哪些能力。
这个就相当于是在做功能定义的时候,对创建一个产品的时候,我们对它的功能进行了一些定义,比如说我们现在再添加一个功能的话,这个时候你看就相当于视频能力的抽象,我们把它抽象为属性服务和视角,我们现在是把它都抽象成属性,去填写具体的属性名称,当然了这些里面它有一些已经集成后的一些标准的昵称,你可以去选择就行。
假如说我们选择比如说关键字的时候,他会自己弹出来一些,你要觉得哪个合适其实你就可以直接选择就行。这些只是一些名称,这个时候他还要去进行他们数据类型,我选择 pm2.5它的一个数据类型,浓度他自己会展示出来当前的数据类型,而且它会有单位输出,你看它 pm2.5因为只有只有读没有去设定对吧?
pm2.5这个值本身它就是一个可读的状态,但是他不可写,他自己会把所有的这些模型都已经建好,假如说我这个时候点个确认的话,会成功。他会把他的标识服务以及数据类型什么都腾出来了。假如说我们点个确认,相当于就新增了一个工作电压。
假如说这个环境检测以及它本身也可以检测电压的话,就是他的工作电压的话,他也可以把这个数据给报上来,报上来先到你的 Java 里面,你把它转成对应的模型,这个数据就会到社会会展出来。