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文件要怎么写

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

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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM