在上一篇中,使用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文件要怎么写
随着开发遇到的问题, 会在主线文章写完后, 再做整理
下一篇开始, 我们要考虑如何从北向南,也就是反控是如何实现的