目录 背景介绍 EdgeX 简介 InfluxDB 简介 开发过程 架构设计 EdgeX application service 前提条件 Application Service Docker 容器 InfluxDB 环境搭建 Telegraf 配置 Docker 容器 实验结果 MQTT broker 内容查看 InfluxDB Graph 开源代码 关于亿琪软件 欢迎关注 EdgeX Foundry 中文社区公众号，及时获取最新资料和分享。 日常情况下，在边缘计算端侧，一般不需要数据持久化到本地磁盘或数据库，但是，某些特殊应用下，需要做本地数据保存和分析时，这项功能就非常有必要。本文将介绍 EdgeX 边缘计算框架在本地保存 telemetry 数据到 InfluxDB 的具体方法和结果。 背景介绍 EdgeX 简介 EdgeX Foundry 边缘计算框架的分层和服务为边缘设备/节点和云/企业应用之间提供了一个双向转换引擎。EdgeX 作为边缘计算平台是非常不错的选择。 本文需要采用自定义开发的 EdgeX Application service 来完成数据持久化的工作。 InfluxDB 简介 InfluxDB 是一个由 InfluxData 公司开发的开源时序型数据库。它由Go写成，着力于高性能地查询与存储时序型数据。InfluxDB 被广泛应用于存储系统的监控数据，IoT行业的实时数据等场景。 EdgeX 数据写入（存入）InfluxDB 是非常适合且有必要的，本文使用 MQTT 和 Telegraf 作为 InfluxDB plugin 来实现具体功能。 开发过程 架构设计 EdgeX 应用程序服务(app-influxdb-export)通过 MQTT 将读数导出到 InfluxDB。此服务示例是使用 EdgeX v2.3.0 版本创建的，如需其他版本，请与我们联系或自行开发。 这个管道服务，有两部分组成： 将 EdgeX 事件/读取对象转换为 Influx line 协议； 将结果导出到 MQTT Broker，这是 Telegraf / Influx 用来监听并从中获取数据的 MQTT 主题； InfluxDB 实现数据持久化入库工作； EdgeX application service 前提条件 需要启动 EdgeX 框架； 启动 MQTT Broker 容器； Application Service 目录结构很简单，文件不多； ├── Dockerfile // docker 文件 ├── LICENSE ├── Makefile // make build ├── README.md ├── app-service-influx.png ├── go.mod // gomod 配置 ├── go.sum ├── main.go // 主程序 ├── pkg │ └── transforms │ └── conversions.go // 转换器 └── res └── configuration.toml // 配置文件 主程序，不复杂，遵循 SDK 原则即可； 这里省略源文件，请到github下载。 尝试编译，能成功生成二进制文件； make build Docker 容器 Dockerfile 描述文件； 这里省略源文件，请到github下载。 创建 docker image; docker build . -t edgexfoundry/app-influxdb:2.3.0 docker compose 片段，加入到你的 docker-compose.yml ; app-service-influxdb-export: image: edgexfoundry/app-influxdb:2.3.0 ports: - 127.0.0.1:59780:59780/tcp container_name: edgex-app-influxdb-export hostname: edgex-app-influxdb-export depends_on: - consul - data environment: CLIENTS_CORE_COMMAND_HOST: edgex-core-command CLIENTS_CORE_DATA_HOST: edgex-core-data CLIENTS_CORE_METADATA_HOST: edgex-core-metadata CLIENTS_SUPPORT_NOTIFICATIONS_HOST: edgex-support-notifications CLIENTS_SUPPORT_SCHEDULER_HOST: edgex-support-scheduler DATABASES_PRIMARY_HOST: edgex-redis EDGEX_SECURITY_SECRET_STORE: "false" MESSAGEQUEUE_HOST: edgex-redis REGISTRY_HOST: edgex-core-consul SERVICE_HOST: edgex-app-influxdb-export TRIGGER_EDGEXMESSAGEBUS_PUBLISHHOST_HOST: edgex-redis TRIGGER_EDGEXMESSAGEBUS_SUBSCRIBEHOST_HOST: edgex-redis MQTTCONFIG_BROKERADDRESS: edgex-mqtt-broker:1883 read_only: true restart: always networks: - edgex-network security_opt: - no-new-privileges:true user: 2002:2001 InfluxDB 环境搭建 Telegraf 配置 配置文件，注意保留你需要的部分； [[inputs.mqtt_consumer]] ## Broker URLs for the MQTT server or cluster. To connect to multiple ## clusters or standalone servers, use a separate plugin instance. ## example: servers = ["tcp://localhost:1883"] ## servers = ["ssl://localhost:1883"] ## servers = ["ws://localhost:1883"] servers = ["tcp://192.168.123.12:1883"] ## Topics that will be subscribed to. topics = [ "telegraf/host01/cpu", "telegraf/+/mem", "sensors/#", "edgex/EdgeXEvents" ] ## The message topic will be stored in a tag specified by this value. If set ## to the empty string no topic tag will be created. # topic_tag = "topic" ## QoS policy for messages ## 0 = at most once ## 1 = at least once ## 2 = exactly once ## ## When using a QoS of 1 or 2, you should enable persistent_session to allow ## resuming unacknowledged messages. # qos = 0 ## Connection timeout for initial connection in seconds # connection_timeout = "30s" ## Max undelivered messages ## This plugin uses tracking metrics, which ensure messages are read to ## outputs before acknowledging them to the original broker to ensure data ## is not lost. This option sets the maximum messages to read from the ## broker that have not been written by an output. ## ## This value needs to be picked with awareness of the agent's ## metric_batch_size value as well. Setting max undelivered messages too high ## can result in a constant stream of data batches to the output. While ## setting it too low may never flush the broker's messages. # max_undelivered_messages = 1000 ## Persistent session disables clearing of the client session on connection. ## In order for this option to work you must also set client_id to identify ## the client. To receive messages that arrived while the client is offline, ## also set the qos option to 1 or 2 and don't forget to also set the QoS when ## publishing. # persistent_session = false ## If unset, a random client ID will be generated. # client_id = "" ## Username and password to connect MQTT server. # username = "telegraf" # password = "metricsmetricsmetricsmetrics" ## Optional TLS Config # tls_ca = "/etc/telegraf/ca.pem" # tls_cert = "/etc/telegraf/cert.pem" # tls_key = "/etc/telegraf/key.pem" ## Use TLS but skip chain & host verification # insecure_skip_verify = false ## Client trace messages ## When set to true, and debug mode enabled in the agent settings, the MQTT ## client's messages are included in telegraf logs. These messages are very ## noisey, but essential for debugging issues. # client_trace = false ## Data format to consume. ## Each data format has its own unique set of configuration options, read ## more about them here: ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md data_format = "influx" ## Enable extracting tag values from MQTT topics ## _ denotes an ignored entry in the topic path # [[inputs.mqtt_consumer.topic_parsing]] # topic = "" # measurement = "" # tags = "" # fields = "" ## Value supported is int, float, unit # [[inputs.mqtt_consumer.topic.types]] # key = type # Configuration for sending metrics to InfluxDB 2.0 [[outputs.influxdb_v2]] ## The URLs of the InfluxDB cluster nodes. ## ## Multiple URLs can be specified for a single cluster, only ONE of the ## urls will be written to each interval. ## ex: urls = ["https://us-west-2-1.aws.cloud2.influxdata.com"] urls = ["http://192.168.123.12:8086"] ## Token for authentication. token = "PlbXqGQqYrnmZh22q88C0eS7CUyVSa9n1t2CjDY1nkA9RbXwM3BHBm0FIK3f3hT6p3oJKOrtFWLqeLgY9WQmyQ==" ## Organization is the name of the organization you wish to write to. organization = "yiqisoft" ## Destination bucket to write into. bucket = "edgex" ## The value of this tag will be used to determine the bucket. If this ## tag is not set the 'bucket' option is used as the default. # bucket_tag = "" ## If true, the bucket tag will not be added to the metric. # exclude_bucket_tag = false ## Timeout for HTTP messages. # timeout = "5s" ## Additional HTTP headers # http_headers = {"X-Special-Header" = "Special-Value"} ## HTTP Proxy override, if unset values the standard proxy environment ## variables are consulted to determine which proxy, if any, should be used. # http_proxy = "http://corporate.proxy:3128" ## HTTP User-Agent # user_agent = "telegraf" ## Content-Encoding for write request body, can be set to "gzip" to ## compress body or "identity" to apply no encoding. # content_encoding = "gzip" ## Enable or disable uint support for writing uints influxdb 2.0. # influx_uint_support = false ## HTTP/2 Timeouts ## The following values control the HTTP/2 client's timeouts. These settings ## are generally not required unless a user is seeing issues with client ## disconnects. If a user does see issues, then it is suggested to set these ## values to "15s" for ping timeout and "30s" for read idle timeout and ## retry. ## ## Note that the timer for read_idle_timeout begins at the end of the last ## successful write and not at the beginning of the next write. # ping_timeout = "0s" # read_idle_timeout = "0s" ## Optional TLS Config for use on HTTP connections. # tls_ca = "/etc/telegraf/ca.pem" # tls_cert = "/etc/telegraf/cert.pem" # tls_key = "/etc/telegraf/key.pem" ## Use TLS but skip chain & host verification # insecure_skip_verify = false Docker 容器 docker-compose.yml services: influxdb: image: influxdb:latest container_name: influxdb2 volumes: - /opt/devel/influxdb/data:/var/lib/influxdb2:rw environment: - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=mytoken ports: - 8086:8086 restart: unless-stopped telegraf: image: telegraf:latest container_name: telegraf volumes: # Sync timezone with host - /etc/localtime:/etc/localtime:ro # Map Telegraf configuration file - /opt/devel/influxdb/telegraf.conf:/etc/telegraf/telegraf.conf:ro # Map /tmp to permanent storage (this includes /tmp/metrics.out) - /opt/devel/influxdb:/tmp:rw environment: - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=mytoken restart: unless-stopped depends_on: - influxdb 启动容器 docker compose up -d 实验结果 MQTT broker 内容查看 确认 mqtt 内容为 Influx line protocol； InfluxDB Graph 确认 InfluxDB 数据接收正常。 开源代码 完整的源代码在：https://github.com/yiqisoft/edgex-app-influxdb-export.git 关于亿琪软件 上海亿琪软件有限公司成立于2016年，专注于 5G 通信、AI 人工智能、边缘计算和大数据网络安全多项技术领域，致力于物联网领域前沿技术的创新，为用户提供全方位、智能化和安全的物联网解决方案。 2023年，公司发布“YiFUSION｜工业边缘智能融合一体机”产品，为工业客户提供一整套的边缘计算+AI能力：高性能数据采集、多类型数据融合、AI算法集成、云端业务对接。在边缘网关的基础上，集成了 IoT 平台的边缘协同能力、本地Web SCADA 和 HMI 功能、本地数据存储、边缘 AI 视频分析、行业应用集成等。 2022年，公司推出 “YiCLOUD｜亿琪云”一站式物联网应用解决方案。公司的业务涵盖了智慧城市、智慧农业、智能工厂和智慧园区等多个领域，公司软硬件产品和解决方案获得华为技术认证，得到中国移动OCP认证，公司还是边缘计算产业联盟ECC成员。 感知物联，畅快无限。 联系我们 网站：http://yiqisoft.cn 邮件：support@yiqisoft.cn 电话：021-68863086 手机：186-1666-9123
开源｜ThingsBoard 项目实施及二次开发要点总结
目录 关注我们 关注 ThingsBoard 微信公众号 访问 ThingsBoard 中文社区网站 Thingsboard 项目实施 实施准备 实施要点 总结经验 Thingsboard 二次开发提示 前提 技术栈 尝试 运用技巧 关于 亿琪软件 关注我们 关注 ThingsBoard 微信公众号 手动增加微信公众号：thingsboard_cn 访问 ThingsBoard 中文社区网站 访问网址：http://www.thingsboard.club 最近在实施 ThingsBoard 项目中遇到一些问题总结，还有针对 Thingsboard 二次开发中的提示。 如果你正准备使用 Thingsboard 开源框架作为你的物联网平台来使用，这个文章对你应该有一定帮助。关于 Thingsboard 平台的介绍和基础不是本文的重点，所以，你在阅读本文时，应该具备一些 Thingsboard、物联网平台、MQTT、HTTP、物模型，等基础能力。还有，如果你要实施一套自己的物联网应用，可以参考这个文章：分享｜如何组建一个项目团队来完成物联网应用？ Thingsboard 项目实施 实施准备 统计你所在网络里面的设备、资产、测点、指标、通讯方式、状态等基础信息，可以统计一些信息形成 Excel 表格，越详细越好，多多益善； 基于你对物联网的了解，要把业务结合进来，综合考虑物联网平台到底对你的业务有什么帮助，比如：信息及时性？数据总量？统计分析？降本增效？还是有其他非技术目的？ 要有相关的技术储备，人员储备，还有资金储备，毕竟还是需要不少时间、精力、金钱和欲望投入在里面； 不管如何，你还是应该准备找一个合作伙伴，能够帮助你解决一些你无法预料到的问题，以解燃眉之急； IoT、物联网、平台，这些都是基础设施，并不能完全解决你的所有问题，要摆正 Thingsboard 在你的业务中的正确位置； 至于 Thingsboard 能帮到你什么，能做什么，有什么效果，你可以在本技术博客寻找你的答案，或到互联网找到你所需要的内容； 实施要点 这里以一个工业物联网平台为例，简单介绍一些要点供你参考： 目的：工业物联网平台，当然是为了工业生产服务，例如：这个指标采集上来，频率是多少，数据变化起到什么业务帮助。如果存粹为了做一个物联网平台而做一个，那就无所谓了，只要看上去像个平台，数据在变化，有图有真相，那也行； 方法：典型的实施方法，无非就是采集、汇聚、存储、分析，方法在不同的客户有不同的操作方式，比如：改造老平台是一种有据可循的，推翻老平台又是另一个，还有新建平台也是一脸茫然，不知所措；要根据实际的需求，制定适合自己的实施方法； 过程：来举例说明一个客户的实施过程：在这个客户而已，开源是开放的，免费的，没什么难度的，所以把实施过程简单理解为：1、安装；2、配置；3、调整；4、交付。我把其过程形容为：陷入泥潭的人，越陷越深，最后有可能会失败； 时间：有些客户觉得拿来即用，更何况 Thingsboard 是开源的，那就是多简单的事，其实，我们实施过的项目中，客户越是觉得简单的快速的，都会导致项目延迟，他们忽略了开源并不是你什么也不需要做就可以完成所有实施，赶工期不太适合用 Thingsboard 来做，假如你对开源真的有所了解的话；如果你觉得一个月能搞定，我建议你把时间放大到3个月，中间你会遇到太多的疑问和不知道，如果有合作伙伴能帮你，那你算是幸运儿，有些自己几个星期搞不定的问题，专业人士只需要十分钟； 效果：不要对项目实施的结果报以太多的期望，毕竟 Thingsboard 还有 PE 专业版在那里，开源版本只是提供了基础功能，的确可以让你达到完成一个物联网平台的概念，但是，需要太多的工作量去完善你的业务需求了，效果因人而异，各说纷云。 总结经验 开源贡献：如果你了解开源，你就知道开源不仅仅是索取，也需要贡献，如果你的实施过程中修复的问题并没有得到开源社区的合并，那么说明你以后需要一直去修改它，那是非常不利的局面，所以，建议你参与社区，参与贡献，对你长期使用 Thingsboard 是有帮助的而无害的； 可移植脚本：大版本不变化的情况下，你要尽量综合项目实施过程中的可复用脚本，这样，你在其他项目中就是亮点也是赢利点，这一点是很多实施者所忽视的地方； 形成标杆：一旦你发现客户的思路很有效果，你帮助客户实施完成，且具备一定的效益，你要知道这就是果实，要动得举一反三，运用到其他的客户那里，形成标杆项目，推广下去，毕竟复制/粘贴的成本是最低的。 Thingsboard 二次开发提示 前提 技术栈 其实就下面俩，你要突破的地方，我觉得应该就是 Angular 框架。如果你研究过 Thingsboard 源码，我的意思是你熟读多次，编译N次，简单开发过几次，你就应该明白其实很简单，只是代码量有点大，几个月应该是搞不定了，你不能放弃，如果你决定要进行二次开发，可以参考本技术博客的其他文章。 Java/Spring Boot/Postgresql Typescript/Angular/Javascript/HTML 尝试 作为一个开发者，我建议你最应该看的就是官方文档，不管你的英文能力怎么样，都应该找方法去尝试读他们的文档（虽然都是乌克兰写的）。 编译通过，这是首要条件，否则你的二次开发就此打住； 遵循其编码和框架规则，不要试图去改造它，你可能还不具备这个能力； 后端代码我觉得是非常简单且方便改造的，但是，前段代码所使用的 Angular 在国内并不主流，这也是很多开发者宁愿用其他前端框架重写，也不愿意改官方代码的原因吧； 一切二次开发都是需要基于业务需要而做的，那么就仔细分析一下业务，结合你现有的能力，首先尝试配置它而不是二次开发，以我们的经验，绝大部分需求都是可以通过配置（前端，也需要写一些 JS 代码，而且必须遵循其框架）来完成的。 运用技巧 首先就是官方文档，有些内容都是以简单的表格列出，其实可以算是设计说明书，非常有帮助； Github issue， 你要经常看，最好能翻边你所关注的所有，里面的答案比代码和文档更加清晰； 关注本技术博客的内容，与笔者沟通，把你需要的疑问提出来，我们专门针对问题解答（技术交流不收费）； 关于 亿琪软件 上海亿琪软件有限公司成立于2016年，专注于 5G 通信、AI 人工智能、边缘计算和大数据网络安全多项技术领域，致力于物联网领域前沿技术的创新，为用户提供全方位、智能化和安全的物联网解决方案。 2023年，公司发布“YiFUSION｜工业边缘智能融合一体机”产品，为工业客户提供一整套的边缘计算+AI能力：高性能数据采集、多类型数据融合、AI算法集成、云端业务对接。在边缘网关的基础上，集成了 IoT 平台的边缘协同能力、本地Web SCADA 和 HMI 功能、本地数据存储、边缘 AI 视频分析、行业应用集成等。 2022年公司推出 “YiCLOUD｜亿琪云”一站式物联网应用解决方案。公司的业务涵盖了智慧城市、智慧农业、智能工厂和智慧园区等多个领域，公司软硬件产品和解决方案获得华为技术认证，得到中国移动OCP认证，公司还是边缘计算产业联盟ECC成员。 感知物联，畅快无限。 联系我们 网站：http://yiqisoft.cn 邮件：support@yiqisoft.cn 电话：021-68863086 手机：186-1666-9123
EdgeXFoundry平台的分层和服务为边缘设备/节点和云/企业应用之间提供了一个双向转换引擎。EdgeX 作为边缘计算平台是非常不错的选择。 主要服务介绍 Device Services 设备服务 设备服务是与传感器/设备或物联网对象(“物”) 交互的边缘连接器，其中包括机器、机器人、无人机、HVAC 设备、相机等。通过利用可用的连接器，可以控制设备并/或传输数据至 EdgeX或从其传输数据。您还可以使用设备服务 SDK来创建您自己的 EdgeX设备服务。 可用的设备服务包括： MQTT Modbus TCP Modbus RTU BACnet IP & MSTP REST ONVIF IP Camera OPC-UA SNMP BEL GATT Core Services 核心服务 通过这些服务可大体了解给定部署中连接了哪些设备，正在传输哪些数据以及EdgeX的配置方式。 可用的核心服务包括： Core Data 核心数据 Core Command 核心命令/控制 Core Metadata 核心元数据 Registry & Config 注册和配置 Supporting Services 支持服务 包括诸如边缘分析 (也称为“本地分析”等微服务，以及典型的软件应用功能.例如记录、计划和数据清理等。 可用的支持服务包括： Alerts & Notification 报警和通知 Rule Engine 规则引擎 Scheduling 计划服务 Application Services 应用服务 应用服务是指将感应到的数据从 EdgeX提取、处理/转换和发送到所选端点或应用的方式。这些服务可以是分析数据包、企业或本地应用，也可以是 YiCLOUD、 AzureloTHub、AWS loT或 Google loT Core 等云系统。 可用的应用服务包括： Configurable Application Services 配置化运应用服务 Application Services 应用服务 通用配置 本地配置文件 以 device-sdk-go 为例，所谓本地配置文件，就是在边缘计算设备本地磁盘上的固定配置文件，一般情况下，在 cmd/res/ 目录下。 configuration.toml 这个文件是 SDK 的主要配置文件，规定了数据输入/处理/输出，队列定义，profile 和 device 配置文件的所在位置； profiles 目录 这个目录存在 yaml 配置文件，定义了设备类型（profile）的资源和命令； devices 目录 这个目录存在 yaml 配置文件，定义了初始设备资源； 实时注入配置 除了可以在初始化服务时的本地配置，也可以通过 API 的方式对配置进行设置，这样的情况是灵活且方便。 注册 consul 作为注册中心；各种服务，都是自己模块的信息注册到 consul 中集中管理；这是一个隐藏服务，使用者不需要特别关心，此服务以微服务运行。