EdgeX Foundry试运行

简介

EdgeX Foundry是一个由Linux基金会发起的,且厂商中立的开源IoT边缘计算项目。它可以采集来自多个源的数据,并将这些数据转发到一个中央系统。EdgeX Foundry支持多种IoT设备使用的协议,如BACNET、OPC-UA、MQTT和REST。EdgeX Foundry由一系列运行在容器中的微服务构成,微服务之间使用REST API接口进行交互。

可以将EdgeX 作为一个上层服务和设备之间的媒介,例如,某个设备使用了BACNET协议,但上层服务并不支持该协议,此时可以使用EdgeX 将上层服务的REST API转换为设备期望的协议和格式。

可以使用EdgeX 提供的规则功能,基于输入创建动作触发逻辑,如当值A大于X式,执行一个pre-set命令。

通常会把EdgeX Foundry 安装在离传感器或产生数据较近的位置,如一个边缘网关应用附近。因此可能会安装上千个EdgeX,每个EdgeX负责各自数据的采集、转换和转发工作。

更完整的介绍,参见官方文档

安装

版本发布

可以在wiki上查看EdgeX的发布情况,当前最新版本名为Hanio,下一个版本名为Ireland。本次使用的版本为Hanio

最好使用已经发布的版本,官方的master分支可能不大稳定

部署

官方提供了使用docker-compose的安装方式。官方git仓库提供了所有版本的docker-compose文件,使用分支名区分:

EdgeX 提供了两个可视化工具:portaineredgex-ui-goportainer相当于一个简单的容器管理平台,edgex-ui-go相当于一个设备管理平台。

下载并运行docker-compose.yml即可,结果如下,最后两个就是可视化工具portaineredgex-ui-go

查看设备

执行如下命令查看已有的设备:

# curl http://127.0.0.1:48082/api/v1/device

更多参见EdgeX的官方API文档

创建设备

下面创建两种设备:

  • 传感器集群:生成温度和湿度数据
  • 一般设备:使用REST接口,支持命令

后续使用两种方式创建设备:

  • 手动方式:使用单独的REST命令创建传感器集群
  • 脚本方式:使用Python脚本创建一般设备

EdgeX使用设备配置文件作为添加新设备的简单方法。设备配置文件是一个描述设备、数据格式以及支持的命令的模板,它是一个文本文件,以YAML的格式上传到EdgeX,并在后续创建新设备时引用。一种设备类型只能有一个配置文件。

传感器集群

使用EdgeX Foundry REST APIs手动创建该设备,也可以使用脚本方式创建。下面使用Postman发送REST 请求,步骤如下:

  • 创建值描述信息
  • 上传设备配置文件
  • 创建设备

每一步操作都会用一个相同的主机IP地址,以及一个端口号。不同的端口号代表不同的微服务,例如:

  • 48080:edgex-core-data
  • 48081:edgex-core-metadata
  • 48082:edgex-core-command

创建值描述信息

值描述信息会告诉EdgeX转发的数据格式以及数据的标签。本例中,值描述信息分别给出了温度和湿度的值。

首先创建与湿度有关的值描述,可以看到最后返回了一个id

# curl -X POST http://127.0.0.1:48080/api/v1/valuedescriptor -d '{
"name": "humidity",
"description": "Ambient humidity in percent",
"min": "0",
"max": "100",
"type": "Int64",
"uomLabel": "humidity",
"defaultValue": "0",
"formatting": "%s",
"labels": [
"environment",
"humidity"
]
}'
83d8ba2c-d12e-4531-99e6-213c3c84a895

创建与温度有关的值描述:

# curl -X POST http://127.0.0.1:48080/api/v1/valuedescriptor -d '{
"name": "temperature",
"description": "Ambient temperature in Celsius",
"min": "-50",
"max": "100",
"type": "Int64",
"uomLabel": "temperature",
"defaultValue": "0",
"formatting": "%s",
"labels": [
"environment",
"temperature"
]
}'
0a8f5637-db7d-4108-8f48-03a116ad8726

可以使用curl http://127.0.0.1:48080/api/v1/valuedescriptor|jq查看已创建的值描述。

上传设备配置文件

下载设备配置文件并上传,可以看到也返回了一个Id'

# curl --location --request POST 'http://127.0.0.1:48081/api/v1/deviceprofile/uploadfile' --form 'file=@"/home/sensorClusterDeviceProfile.yaml"'
01373409-433d-4775-b7e1-4ede47daab80

可以使用curl http://127.0.0.1:48081/api/v1/deviceprofile|jq查看上传的设备配置文件:

创建设备

在创建设备之前需要注意以下两点:

  • 设备(REST设备)依赖名为"edgex-device-rest"的设备服务
  • 创建设备时使用的profile.name字段必须与上传的设备配置文件中的name字段"SensorCluster"相同

执行如下命令创建设备:

# curl -X POST http://127.0.0.1:48081/api/v1/device -d '{
"name": "Temp_and_Humidity_sensor_cluster_01",
"description": "Raspberry Pi sensor cluster",
"adminState": "unlocked",
"operatingState": "enabled",
"protocols": {
"example": {
"host": "dummy",
"port": "1234",
"unitID": "1"
}
},
"labels": [
"Humidity sensor",
"Temperature sensor",
"DHT11"
],
"location": "Tokyo",
"service": {
"name": "edgex-device-rest"
},
"profile": {
"name": "SensorCluster"
}
}'
a687ea40-13ca-4ed3-bb00-140ae84344a1

向EdgeX Foundry发送数据

向EdgeX Foundry发送温度和湿度数据:

# curl --request POST 'http://127.0.0.1:49986/api/v1/resource/Temp_and_Humidity_sensor_cluster_01/temperature' --header 'Content-Type: text/plain' --data-raw '23'

# curl --request POST 'http://127.0.0.1:49986/api/v1/resource/Temp_and_Humidity_sensor_cluster_01/humidity' --header 'Content-Type: text/plain' --data-raw '33'

使用curl http://127.0.0.1:48080/api/v1/event/count/Temp_and_Humidity_sensor_cluster_01查看该设备上的事件数:

读取传入的数据

# curl -X GET http://localhost:48080/api/v1/reading/device/Temp_and_Humidity_sensor_cluster_01/100|jq
[
{
"id": "b72e2fde-fe8c-41ed-baa4-dab0155bc53d",
"created": 1622629900723,
"origin": 1622629900721518000,
"device": "Temp_and_Humidity_sensor_cluster_01",
"name": "humidity",
"value": "33",
"valueType": "Int64"
},
{
"id": "07b596c3-248a-4800-b0f6-6d5cb58964b6",
"created": 1622629813141,
"origin": 1622629813139238100,
"device": "Temp_and_Humidity_sensor_cluster_01",
"name": "temperature",
"value": "23",
"valueType": "Int64"
},
...
]

到此为止,数据已经传入到EdgeX Foundry,短时间内会保存在Redis DB中。由于数据不会在边缘设备中保存太久,因此需要配置如何导出数据。

导出数据

EdgeX 为多种云服务和应用提供了exporters,为了简化,下面使用社区提供的配置将EdgeX的数据发送到那个公开的MQTT broker(基于Hive MQ)。

下载docker-compose.yml并运行,按照前面的方式添加设备(可能需要清除docker volume)。操作步骤可以见exporting-data。这样在公开的MQTT broker上就可以看到自己发送的数据。

可以在consul的Key/Value中设置

执行docker logs -f edgex-app-service-configurable-rules就可以查看数据发送日志:

level=DEBUG ts=2021-06-02T14:54:39.641349729Z app=AppService-rules-engine source=runtime.go:59 msg="Processing message: 1 Transforms"
level=DEBUG ts=2021-06-02T14:54:39.642895079Z app=AppService-rules-engine source=outputdata.go:38 msg="Setting output data"
level=DEBUG ts=2021-06-02T14:54:42.359115397Z app=AppService-rules-engine source=runtime.go:59 msg="Processing message: 1 Transforms"
level=DEBUG ts=2021-06-02T14:54:42.359264279Z app=AppService-rules-engine source=outputdata.go:38 msg="Setting output data"
level=DEBUG ts=2021-06-02T14:55:36.565067194Z app=AppService-rules-engine source=runtime.go:59 msg="Processing message: 1 Transforms"
level=DEBUG ts=2021-06-02T14:55:36.565268032Z app=AppService-rules-engine source=outputdata.go:38 msg="Setting output data"

总结

EdgeX后续的Roadmap如下,其中下个版本Ireland将会把API从v1升级为v2:

'Barcelona': October 2017
'California': July 2018
'Delhi': November 2018
'Edinburgh': July 2019
'Fuji': November 2019
'Geneva': ~ April 2020
'Hanoi': ~ October 2020
'Ireland': ~ June 2021
'Jakarta': ~ November 2021
'Kamakura': ~ April 2022

本文只是一个EdgeX的试用,并没有深入讲解内部实现。总体上看EdgeX可以看作是运行在边缘设备周边的适配器,负责协议转换和数据的临时存储等。后续如果有机会涉及此方面工作再深入研究。

感谢Linux基金会以及该项目的贡献者。

参考

EdgeX Foundry试运行的更多相关文章

  1. 手把手教你在 SuperEdge 上用 EdgeX Foundry 接入 IoT 设备

    作者 连泓乔,华南理工计算机科学与技术大三在读,主要研究容器领域,Kubernetes.容器等云原生技术爱好者,SuperEdge 优秀贡献者. 王冬,腾讯云研发工程师,专注于 Kubernetes. ...

  2. edgex简述

    一.概述 Edgex foundry是一个Linux 基金会运营的开源边缘计算物联网软件框架项目,该项目的核心是基于与硬件和操作系统完全无关的参考软件平台建立的互操作框架,使能即插即用的组件生态系统, ...

  3. 树莓派使用Docker部署EdgeX(jakarta版本)

    使用Docker部署EdgeX 老师安排我搞边缘计算,搞了很久都没能明白边缘计算是什么,甚至对其兴趣不大,前一阵弄好了lorawan网关,该做网关内部的边缘计算了,发现自己已经慢慢地学了进去,总是想要 ...

  4. 读懂SAP Leonardo物联网平台

    读懂SAP Leonardo物联网平台 https://blog.csdn.net/weixin_42137700/article/details/81903290 本文比较系统.全面地介绍了SAP ...

  5. 关于k8s这项大动作,预示着边缘计算迎来“开源”发展的新周期……

    在文章<最近在边缘计算领域,发生了一件足以载入物联网史册的大事…>我曾经提到Kubernetes(简称K8s)将从超大规模云计算环境,被带入到物联网边缘计算场景中. 事情有了新进展,从本周 ...

  6. 国外物联网平台(7):FogHorn

    国外物联网平台(7) ——FogHorn 马智 引言: 据外媒在本月20日报道,硅谷初创公司FogHorn正在与谷歌合作以简化工业物联网应用的部署.本文对FogHorn的技术.产品.应用和生态进行了分 ...

  7. edgex0.7.1_1.0.1的X86编译和交叉编译

    一. X86编译 1. 安装zeromq库 根据setup script安装: wget https://github.com/zeromq/libzmq/releases/download/v4.2 ...

  8. 我们建了一个 Golang 硬核技术交流群(内含视频福利)

    目录 目录 Golang 是什么? 我们为什么选择 Golang? Golang 是云时代的宠儿! 我们搞了一场 Golang 入门直播 Golang 是什么? Golang 是谷歌 2009 年发布 ...

  9. 白话边缘计算解决方案 SuperEdge

    一.SuperEdge的定义 引用下SuperEdge开源官网的定义: SuperEdge is an open source container management system for edge ...

随机推荐

  1. day8.函数基础

    一.函数介绍 1.什么是函数     函数就是盛放代码的容器,把实现某一功能的一组代码丢到一个函数中     就做成了一个小工具       具备某一功能的工具->函数     事先准备工具的过 ...

  2. JDBC_12_JDBC事务

    JDBC事务 JDBC中事务默认自动提交,每执行一次SQL就会自动提交一次. 这样的话可能出现数据安全性问题. connection.setAutoCommit(false) false代表关闭自动提 ...

  3. 算法tip:栈的可生成性问题

    算法tip:栈的可生成性问题 问题描述 给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,判断它们是否可以在最初空栈上进行推入 push 和弹出 pop 操作.(LeetCod ...

  4. 《机器学习Python实现_10_02_集成学习_boosting_adaboost分类器实现》

    一.简介 adaboost是一种boosting方法,它的要点包括如下两方面: 1.模型生成 每一个基分类器会基于上一轮分类器在训练集上的表现,对样本做权重调整,使得错分样本的权重增加,正确分类的样本 ...

  5. 1.7.8- HTML合并单元格

    跨行与跨列

  6. postman传入cookie的三种方式

    1.直接在环境变量里面设置 2.在登录接口的tests,把返回值的cookie设置为全局变量 3.直接在cookie里面传入

  7. hdu4772 水模拟

    题意:       给你两个矩阵,问你两个矩阵的最大相同元素个数(位置也要求相同),矩阵可以90旋转多次. 思路:       水题,直接模拟就行了,方法很多,可以直接写坐标关系,或者一层一层处理,就 ...

  8. UVA11419 我是SAM

    题意:      给你一个n*m的矩阵,上面有一些格子上有目标,我们可以在格子的外面用枪打目标,一发子弹可以消灭一行或者一列目标,问你最少多少枪能把目标打光,并且输出开枪的位置,题目没说spj(特判) ...

  9. CString,string,char数组的转换

    来源:http://ticktick.blog.51cto.com/823160/317550 //----------------ANSI字符串转换为UNICODE字符串-------------- ...

  10. SAP ABAP ALV 颜色设置(两个ALV函数例子) 列 行 单元格

    @[TOC](设置ALV颜色)# 前言淦! 要求花花绿绿的ALV ,那就淦他! 需要的参数和对应颜色放在最后.稍微改改就能用. 介绍两个常用的ALV函数实现1.REUSE_ALV_GRID_DISPL ...