EdgeX Foundry 心得 之三 -- 数据导出服务和APPService

在上一篇中,使用deviceService将数据发送给了core-data中, 并且可以通过api的方式来查看数据

 

这一篇中,将把core-data的数据通过数据导出服务(export-distro)或APPService输出到云端

export-distro是EdgeX体系中自带的微服务,只能通过配置的方式过滤和简单的处理数据(包括加密等操作)

在实际开发中, 我们大多数时间用的还是APPService来想云端(北向)输出数据

先来实验一下数据导出服务,例子中, 使用http方式注册到export-distro并验证, MQTT方式只给出注册参数具体实验过程,导出服务不是本系列文章的重点

 https://www.hangge.com/blog/cache/detail_2341.html 这篇博文中讲的更加详细,

先来准备一个可以接收数据的服务器,这里我们就借用上一篇里面,测试设备时写的那个http服务

并且我们在host4的服务器中启动起来(go run main.go)就行

发送请求的url就是   http://host4:1210/bye  先用postman测试一下, 忽略我的localhost

 

 

 

现在可以想EdgeX注册导出云端的http服务了

检查一下export-client  和export-distro 两个服务是否正常运行,

http://host2:48071/api/v1/registration

{
    "name": "随便起不重复",
    "addressable": {
        "name": "随便起不重复",
        "protocol": "http",
        "method": "POST",
        "address": "host4",
        "port": 1210,
        "path": "/bye"
    },
    "format": "JSON",
    "filter":{
        "deviceIdentifiers":["rand-numeric(设备名,就是要导出哪个设备的数据)"]
    },
    "enable": true,
    "destination": "REST_ENDPOINT"
}

忽略我的ip

 成功后 我们通过 device---->deviceService ----- > EdgeX 的数据就可以转发给 host4:1210/bye了

启动host3的服务

 

 我们单独拿出来一段格式化一下

{
    "id": "1c736295-e443-4075-b47b-de63663eeb56",
    "device": "rand-numeric",
    "origin": 1584272171882812485,
    "readings": [
        {
            "id": "73292196-4922-4968-9e4e-5e304e62ede3",
            "origin": 1584272171882700374,
            "device": "rand-numeric",
            "name": "int",
            "value": "65"
        }
    ]
}

readings中的内容,就是上传的数据

接下来我们通过另一个方式来发送数据

也就是我们开发的重点 ApppService服务

AppService主要是使用  app-functions-sdk-go

我们直接使用官方的demo,就像deviceservice的sdk一样,在官方提供了许多可以用的例子

git clone https://github.com/edgexfoundry-holding/app-service-examples.git

之后我们进入目录app-service-examples/app-services

 

 

 我们会看到很多目录,只留下http-command-service 和simple-filter-xml-post两个目录就可以了

http-command-service是之后反控的内容才能用的到, 目前先放在这里

并且吧simple-filter-xml-post 重命名为simple-filter-json-post

 

 退回到app-service-examples目录 

执行命令 make build

这时候可能会出错误报错信息libzmq没装

 

 sudo apt-get install libzmq3-dev

安装完之后再次编译还是有错

 这是因为包不匹配的原因早成的, 截止到我在写这边博客的时候(2020-03-16)

修改go.mod文件内容替换成下面的版本。我挨着试的, 这已经是能用的最高版本了

require (
    github.com/dghubble/sling v1.3.0
    github.com/edgexfoundry/app-functions-sdk-go v1.0.1-dev.9
    github.com/edgexfoundry/go-mod-core-contracts v0.1.33
)

现在打包正确,

注意  app-functions-sdk-go v1.0.1-dev.9 从9往后的版本, 应用服务添加了安全校验,

如果你和我一样使用 docker-compose-fuji-no-secty.yml 启动的docker容器,那么appservice打包后启动会报错

 

 

 按照dev.9及一下版本打包不会有问题

 接下来我们修改代码,让接收数据并能导出

编辑  appservices/simple-filter-json-post/main.go

在55行左右

edgexSdk.SetFunctionsPipeline(
        transforms.NewFilter(deviceNames).FilterByDeviceName,
        transforms.NewConversion().TransformToXML,
        transforms.NewHTTPSender("<Your endpoint goes here>", "application/xml", false).HTTPPost,
    )
TransformToXML ==> TransformToJSON
Your endpoint goes here ==> host4:1210/bye
application/xml ==> application/json

重新打包
之后编辑appservices/simple-filter-json-post/res/configure.toml
service 里面的host改成启动simple-filter-json-post服务的ip
其他项里面的host改成 EdgeX启动的服务ip 在我这里就是host2

注意到
transforms.NewFilter(deviceNames).FilterByDeviceName,在这里过滤了deviceName
这个值是从42 行
deviceNames, err := edgexSdk.GetAppSettingStrings("DeviceNames")
所以还要修改 appservices/simple-filter-json-post/res/configure.toml 文件的

 

 之后就可以启动了

我们通过日志来分析

首先是设备产生数字 看一下时间以16这个数字的数据为例  11:55:55

 

设备的数据发送给了deviceService  时间11:55:55

 

 通过EdgeX给appService,appservice我没打印日志,截图是停掉进程之后接的, 所以忽略最后两行日志

 

 最后发送给北向的http服务,北向服务的时间我没打印, 凑合看把, 可以注意一下顺序, 是一样的

但是这里要说明的是, 因为我的是demo, 系统完全没有负载,也都在局域网里面, 所以才能保证了消息的顺序,如果是在生产环境中, 

由于进入到EdgeX是由消息队列来通信的, 所以输出到北向的数据是不能满足数据顺序的, 这里要稍微注意一下

 

 

验证到这里, 差不多一条线的内容就写完了, 当然我这里只是一个demo, 在系统开发过程中, 还遇到了一些问题, 

比如我们的实际场景是我们对接的不是一个设备, 而是对接了一个系统, 这个系统提供了一个数据库让我们定时采集数据,如何解决这个问题,

还有开发中, 其实我们很多时候定义资源,不是一对一的关系, 而是一个命令会对应多个deviceResource的时候, 我们的profile文件要怎么写

随着开发遇到的问题, 会在主线文章写完后, 再做整理

下一篇开始, 我们要考虑如何从北向南,也就是反控是如何实现的

 

posted @ 2020-03-15 19:39  安仲炜  阅读(2930)  评论(2)    收藏  举报