EdgeX Application Service 应用服务
一、概述
应用服务是一种在边缘处理传感器数据和/或将其发送到外部系统(无论是分析包、企业本地应用程序、Azure IoT、AWS IoT或Google IoT Core等云系统)的手段。在将数据发送到所选端点或发布给另一个应用程序服务之前,应用程序服务提供了准备(转换、丰富、过滤等)和整理(格式化、压缩、加密等)数据的方法。目前支持的开箱即用的导出端点包括HTTP和MQTT端,但自定义端可以与现有功能一起实现。
应用程序服务基于 “Functions Pipelines” 的概念。 “Functions Pipelines” 是按指定顺序处理消息(默认情况下为EdgeX事件/读数消息)的函数集合。触发器Triggers是管道中的第一个函数。触发器类似于消息到达被监视的消息队列。最常用的触发器是MessageBus触发器。
应用程序功能SDK可用于帮助创建自定义应用程序服务。目前,唯一支持SDK的语言是Golang,未来社区开发和支持的SDK可能会用于其他语言。SDK可作为Golang模块使用,以保持操作系统(OS)无关性,并符合最新的EdgeX依赖关系管理指南。
任何基于应用功能SDK构建的应用程序都被视为应用服务。提供此SDK是为了通过将触发器、预先存在的函数和您创建的自定义函数组装到一个或多个函数管道中来帮助构建自定义应用程序服务。
二、标准函数
如前所述,应用程序服务是围绕函数管道的思想构建的。SDK提供了许多可以在函数管道中使用的标准函数。此外,开发人员可以实现自己的自定义管道功能,并将其添加到他们的应用程序服务功能管道中。
示例:
最常见用例之一是处理来自MessageBus的数据, 并将数据过滤到与给定应用程序相关的内容并对其进行格式化。为了帮助实现这一点,SDK中包含了六个主要的管道函数。
- 第一个是FilterByProfileName函数,它将删除与配置的ProfileNames匹配或不匹配的事件,如果过滤后没有剩余事件,则管道的执行将停止。
- 第二个是FilterByDeviceName函数,该函数将删除与配置的DeviceName匹配或不匹配的事件,如果过滤后没有剩余事件,则管道的执行将停止。
- 第三个是FilterBySourceName函数,它将删除与配置的SourceName匹配或不匹配的事件,如果筛选后没有剩余事件,管道的执行将停止。SourceName是创建事件的源(命令或资源)的名称。
- 第四个是FilterByResourceName,它表现出与DeviceNameFilter相同的行为,除了在ResourceName而不是DeviceName上过滤事件的读数。如果过滤后没有读数,管道的执行将停止。
- SDK中提供的第五和第六个函数通过调用XMLTransform或JSONTransform将接收到的数据转换为XML或JSON。
通常,在根据需要过滤和转换数据之后,导出是将数据运送到所需位置的管道中的最后一步。SDK中包含三个主要功能来帮助实现这一点。第一个和第二个是HTTPPost/HTTPut函数,它将把提供的数据POST/PUT到指定的服务,第三个是MQTTSecretSend()函数,它会将提供的数据发布到配置中指定的MQTT Broker。
App SDK提供的功能远不止过滤、格式化和导出。上面的简单示例用于演示函数管道是如何工作的。有了编写自己的自定义管道函数的能力,您的自定义应用程序服务就可以满足您的用例需求。
SDK中包含了启动函数管道的三个主要触发方式:
- HTTP触发器:通过POST向端点/api/v3/Trigger发送消息(通常是EdgeX事件数据)作为包体。
- EdgeX MessageBus触发器:指定的配置中有连接详细信息。
- 外部MQTT触发器:指定的配置中有连接详细信息。
最后,可以通过调用ResponseData()将数据发送回触发器响应包体。
- 如果触发器是HTTP,那么它将出现在HTTP响应中。
- 如果触发器是EdgeX MessageBus,则它将在配置的发布主题上发布回EdgeX MessageBus。
- 如果触发器是外部MQTT,则它将被发布到配置的发布主题。
三、应用服务构建方法
Application Service提供了Configurable和Custom这两种使用方法供开发者选择。
3.1 Configurable方法
App Functions SDK中提供了一套完整的内置功能,在我们使用App Service Configurable这个服务的时候,就可以直接对这些内置功能进行配置并调用。该服务通过App Functions SDK和配置文件(configuration.toml)共同完成应用服务实例的定义,而这就是应用服务开发中的Configurable方法。对于采用内置功能就可以实现的Application Service来讲,这个构建服务的方法很实用。
3.1.1 在configuration.toml中进行配置
App-Service-Configurable可以让开发者通过简单的配置使用SDK中的内置函数,而不需要通过编译来构建服务。在App-Service-Configurable工程中访问/res/ configuration.toml路径,可以在configuration.toml文件的[Writable.Pipeline]部分完成对函数管道的构建。
具体配置可参考:
edgex-examples/application-services/configurable/app-service-configurable-ibm/res/ibm-mqtt-export/configuration.yaml
示例:
- FilterByDeviceName - 过滤特定设备的事件。
- Transform - 将数据转换为XML
- HTTPExport - 将数据发送到接收XML数据的HTTP端点
Writable:
Pipeline:
ExecutionOrder: "FilterByDeviceName, Transform, HTTPExport"
Functions:
FilterByDeviceName:
Parameters:
FilterValues: "Random-Float-Device, Random-Integer-Device"
Transform:
Parameters:
Type: "xml"
HTTPExport:
Parameters:
Method: "post"
MimeType: "application/xml"
Url: "http://my.api.net/edgexdata"
在[Writable.Pipeline]部分,通过设定ExecutionOrder的参数,确定了函数管道中顺序排列的所有函数,数据流进管道以后就将按照此顺序进行处理。[Writable.Pipeline]部分则完成了对的每一个管道函数中参数的配置,只有进行正确的配置才能启动函数管道。比如,对FilterByDeviceName函数就需要设定可通过过滤的设备名,而Transform函数就需要设置目标转换格式,HTTPExport则需要对导出方式、地址等参数进行设置。
默认情况下,提供的配置设置为使用EdgexMessageBus作为触发器。这意味着您必须让EdgeX与发送数据的设备一起运行,才能触发管道。您还可以将触发器更改为HTTP。
3.1 自定义方法
当仅凭内置功能无法满足用例需求时,需要自定义应用程序服务。此时,您必须使用App Functions SDK开发自己的自定义应用程序服务。此时需要通过App Functions SDK去构建自定义的应用服务,包括自定义的触发器以及自定义的函数管道等。
示例:
edgex-examples/application-services/custom/advanced-filter-convert-publish/main.go
Private配置:
Writable:
LogLevel: INFO
Service:
Host: localhost
Port: