亿琪软件-开源博客 - 边缘计算
type: channel
link: https://www.yiqisoft.cn/blogs/category/edge_computing/
items: EdgeX Foundry 开发设备服务的几个关键点
items: 在 ubuntu22.04 中 安装 EdgeX 并运行 device-sdk-c sample
items: K3S 私有化部署方案实践
items: 分享｜五分钟学会使用 ThingsBoard 规则链
items: 分享｜五分钟快速学会 ThingsBoard 对接物联网网关
items: PLC | 西门子 Siemens S7 ISO-on-TCP 通讯协议探究——提高数据采集效率故障分析（使用边缘计算网关）
items: 开源｜EdgeX 消息总线 MessageBus
items: EdgeX 配置和注册介绍
items: 技术｜ONVIF 摄像头视频读取，YiEDGE 拉流，RV1126 实现推理
items: 技术｜在 RV1126 之上使用 rknn_toolkit_lite 和 eKuiper pipeline 进行图片识别推理

EdgeX Foundry 开发设备服务的几个关键点
type: item
date: 2025-04-10T07:45:00+00:00
description: EdgeX Foundry 开发设备服务的几个关键点 1.设备服务工作流 2.设备服务示例模板 2.1 SDK 相关工作流 2.2 template.c 的细节 3.删除设备的处理逻辑 4.增加设备 4.1 增加设备的方式 4.2 增加设备的处理逻辑 总结 EdgeX Foundry 开发设备服务的几个关键点 EdgeX Foundry 设备服务是与传感器/设备或物联网对象 (“物”) 交互的边缘连接器，它需要与各种设备交互，将数据传输到边缘计算系统，并根据需求执行控制命令。EdgeX Foundry 通过其模块化设计和丰富的工具集，使得设备服务的开发变得更加简单高效。我们还可以使用设备服务 SDK 来创建您自己的 EdgeX 设备服务，本文重点介绍使用 C-SDK 开发设备服务源代码的几个必须明确的关键点 。 1.设备服务工作流 以 设备服务 template.c 为例，作为一个虚拟设备服务，它可以将数据发送到核心数据微服务，用户可以通过命令和控制微服务发送命令并获得响应，虚拟设备服务的这些功能在执行功能或性能测试时不需要任何实际设备就可以使用。 注意点： 虚拟设备服务对核心数据和元数据微服务具有依赖性，因为初始化过程需要检查或注册配置文件，设备和值描述符，因此，核心数据和元数据服务必须在设备服务初始化之前完全启动。 服务启动时，服务会通过从 YAML 文件加载“值描述符”,“设备服务”,“设备描述”来初始化，并登记在元数据微服务中，YAML文件默认存在，也可以自行创建。虚拟设备服务为元数据微服务提供回调API来管理设备实例。 2.设备服务示例模板 2.1 SDK 相关工作流 EdgeX Foundry 的 C-SDK 提供了一个设备服务模板（位于 examples/template.c 强烈推荐先看一遍代码），它提供了一套规范化的开发示例，包括自定义回调函数、设备服务启动关闭、内存开辟释放等，是我们初次接触设备服务开发的良好开端。设备服务工作流在上一节有了一个大致的介绍，结合官方的指导文档 servicewritersguide.md (强烈推荐先阅读一遍)，这里进一步描述设备服务内部 SDK 相关的工作流，展示如下： 从根本上说，设备服务由多个回调组成，上图中的 SDK 内部工作流均在一系列回调函数中作处理。一个设备服务只有一个设备服务实例结构体指针 Implementation 每次调用回调时，该指针都会被传递，如初始化回调函数的第一个参数 (template_driver *) impl。 /* --- template.c ---- */ /* Initialize performs protocol-specific initialization for the device * service. */ static bool template_init ( void *impl, struct iot_logger_t *lc, const iot_data_t *config ) { template_driver *driver = (template_driver *) impl; iot_log_debug (lc, "Template Init."); return true; } 2.2 template.c 的细节 一个设备服务必须要自定义好的回调函数如下：每一个回调函数的实现正如上面提到的 template_init 那样。 /* Device Callbacks */ devsdk_callbacks *templateImpls = devsdk_callbacks_init ( template_init, template_get_handler, template_put_handler, template_stop, template_create_addr, template_free_addr, template_create_resource_attr, template_free_resource_attr ); 同时设备服务 SDK 还提供了一些非必要的回调函数，以便于开发者实现更灵活的需求，在 servicewritersguide.md 的 Optional handlers 部分有提到。举一个例子，一个设备服务实例可以实现 device_added、device_updated 和 device_removed 处理程序，然后它将收到服务管理的设备范围的更改通知。如果需要特殊的初始化/关闭操作来优化设备的使用，这可能会有所帮助。只需要将该函数实现，并注册进设备服务的回调初始化函数即可： //device_added 的具体实现 static void device_a…

在 ubuntu22.04 中 安装 EdgeX 并运行 device-sdk-c sample
type: item
date: 2025-03-13T09:15:00+00:00
description: 在 ubuntu22.04 中 安装 EdgeX 并运行 device-sdk-c sample 1.克隆源码-EdgeX 2.安装工具 3.编译运行-EdgeX 4.克隆源码-SDK-C 5.添加第三方依赖库 6.编译-C SDK 7.编译运行 random 设备服务示例 总结 在 ubuntu22.04 中 安装 EdgeX 并运行 device-sdk-c sample EdgeX Foundry 作为一个开源的边缘计算框架，为开发者提供了一个灵活、可扩展的平台，用于构建和管理边缘设备及服务。然而，对于初次接触 EdgeX 的用户来说，从零开始安装并运行其相关组件（如 device-sdk-c 示例）可能会面临不少挑战。 无论是环境的配置、依赖的安装，还是编译与调试的过程，每一步都需要细致的操作和清晰的思路。本文将以 Ubuntu 22.04 为基础平台，详细记录如何从克隆 EdgeX 源码到成功运行 device-sdk-c 的 sample 示例的全过程。希望通过这篇博客，不仅能为新手提供一份实用的操作指南，也能让有经验的开发者在遇到问题时找到解决思路。 1.克隆源码-EdgeX 在开始安装 EdgeX 之前，我们需要先获取其源码，而 GitHub 是获取最新版本的最佳途径。为了让后续操作更加有条理，我们首先在用户主目录下创建一个专属的工作目录，用于存放 EdgeX 相关的文件。以下是具体操作： 打开终端，输入以下命令创建一个名为 edgex 的文件夹，并进入该目录： mkdir edgex && cd edgex 接下来，我们需要从 GitHub 上克隆 EdgeX 的 Compose 文件仓库，这是运行 EdgeX 服务的核心配置文件集合。执行以下命令： git clone https://github.com/edgexfoundry/edgex-compose.git cd edgex-compose 结果显示如下： root@ubuntu:/home/ubuntu# mkdir edgex && cd edgex root@ubuntu:/home/ubuntu/edgex# git clone https://github.com/edgexfoundry/edgex-compose.git Cloning into 'edgex-compose'... remote: Enumerating objects: 5826, done. remote: Counting objects: 100% (3563/3563), done. remote: Compressing objects: 100% (319/319), done. remote: Total 5826 (delta 3504), reused 3250 (delta 3244), pack-reused 2263 (from 3) Receiving objects: 100% (5826/5826), 1.59 MiB | 1.76 MiB/s, done. Resolving deltas: 100% (4949/4949), done. root@ubuntu:/home/ubuntu/edgex# ls edgex-compose 输出信息显示了克隆进度，最终 ls 命令确认目录中已存在 edgex-compose 文件夹，说明这一步成功完成。 2.安装工具 EdgeX 的部署离不开 Docker，因为它通过容器化技术简化了服务的管理和运行。因此，我们需要先在 Ubuntu 系统中安装 Docker。以下是详细的安装步骤： 使用官方脚本安装 Docker，并指定阿里云镜像源以加速下载： curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh --mirror Aliyun docker -v 第一条命令通过 curl 下载安装脚本并保存为 get-docker.sh 文件；第二条命令执行脚本，--mirror Aliyun 参数指定使用阿里云镜像源，避免默认源下载缓慢；最后通过 docker -v 检查版本，确保安装成功。安装过程的输出类似： root@ubuntu:/home/ubuntu# curl -fsSL https://get.docker.com -o get-docker.sh root@ubuntu:/home/ubuntu# sh get-docker.sh --mirror Aliyun # Executing docker install script, commit: 4c94a56999e10efcf48c5b8e3f6a…

K3S 私有化部署方案实践
type: item
date: 2024-10-05T16:32:00+00:00
description: 准备工作 硬件 软件 基础配置 数据库配置 Docker 数据库 PostgreSQL MySQL 部署 K3S 管理集群 主机名 K3S 核心安装 自动安装(推荐) 手动二进制文件安装(不推荐) Master / Worker 手动加入(如有必要) 安装 Rancher 集群管理工具和 Harbor Registry 仓库 准备工作 安装 Kubernetes 包管理工具 Helm 安装证书管理器 cert-manager 安装 Rancher 安装 Harbor 使用 Ceph（推荐） 使用 NFS 部署 pv 和 pvc 部署 Harbor Helm 批量上传所需 image 到 Harbor 部署 K3S 业务集群 所有的 Master 和 Worker 都加入业务集群 Rancher 中创建一个新的集群 Master 加入集群(初始化业务集群) Worker 加入业务集群 (部署/更新) Harbor hub CA 证书到所有的 Master 和 Worker (手动操作)导出 Harbor hub HTTPS 证书 (自动部署)Harbor Hub CA 证书 新建一个 Secret 新建一个 DaemonSet 基于 K3S 部署业务应用(边缘计算框架) EdgeX Foundry Base 部署辅助应用：流媒体，推理服务器，NVR 部署 OpenVINO AI 应用 总结 准备工作 硬件 主 K3S Master 节点：3台, master101, master102, master103 业务 K3S Master 节点：3台，master151, master152, master153 Worker 节点：N台，随意, worker01, worker02, ... 软件 基础配置 操作系统：Ubuntu Server 22.04 最小化安装系统，包含：openssh-server, iputils-ping, net-tools, vim PRETTY_NAME="Ubuntu 22.04.5 LTS" NAME="Ubuntu" VERSION_ID="22.04" VERSION="22.04.5 LTS (Jammy Jellyfish)" 管理集群 主机名 IP 其他 database 192.168.198.100 数据库+NFS存储，如有需要做 HA master101 192.168.198.101 管理 K3S master master102 192.168.198.102 管理 K3S master master103 192.168.198.103 管理 K3S master 业务集群 主机名 IP 其他 master151 192.168.123.151 业务 K3S master + worker master152 192.168.123.152 业务 K3S master + worker master153 192.168.123.153 业务 K3S master + worker worker161 192.168.123.161 业务 worker worker162 192.168.123.162 业务 worker 数据库配置 Docker 准备 docker 环境 curl -fsSL https://get.docker.com | sh - 验证 docker docker images REPOSITORY TAG IMAGE ID CREATED SIZE 设置一个 Registry 镜像 cat /etc/docker/daemon.json { "insecure-registries" : [ "0.0.0.0/0" ], "registry-mirrors": [ "https://xxx.mirror.swr.myhuaweicloud.com" ] } 重启 docker systemctl restart docker 数据库 PostgreSQL 创建 compose.yml services: postgres: image: postgres:alpine container_name: postgres restart: unless-stopped environment: POSTGRES_USER: k3s POSTGRES_PASSWORD: talent POSTGRES_DB: k3s ports: - "5432:5432" volumes: - ./data:/var/lib/postgresql/data - ./init-db.sh:/docker-entrypoint-initdb.d/init-db.sh …

分享｜五分钟学会使用 ThingsBoard 规则链
type: item
date: 2023-12-29T08:29:00+00:00
description: 规则链概述 创建规则链 规则链元素介绍 应用案例 总结与建议 ThingsBoard是一款强大的开源平台，提供了丰富的功能来管理和监控物联网设备。其中，规则链（Rule Chains）是ThingsBoard中一个关键的特性，它允许用户定义和执行自定义的业务规则，实现设备数据的处理、转换和触发特定动作。本篇博客将带你在短短五分钟内学会使用ThingsBoard规则链，让你更灵活地管理你的物联网应用。 规则链概述 规则链，即低代码的逻辑处理模块，简而言之，描述了服务器在接收数据后的处理流程 有 3 个主要组成部分： 消息： 任何传入事件。它可以是来自设备的传入数据、设备生命周期事件、REST API 事件、RPC 请求等。 规则节点： 对传入消息执行的函数。有许多不同的节点类型可以对传入消息进行过滤、转换或执行某些操作。 规则链： 节点通过关系相互连接，因此来自规则节点的出站消息被发送到下一个连接的规则节点。 创建规则链 在控制台的左侧导航栏中，找到并点击“规则链”选项。这将带你进入规则链管理页面，其中你可以查看和管理现有的规则链。 在设备配置管理页面，填写规则链的名称。保存后使用规则链。 规则链元素介绍 节点类型及其功能 在规则链中，有不同类型的节点，每个节点都有特定的功能。常见的节点类型包括： 过滤器节点： 用于筛选数据，只允许满足特定条件的数据通过。 属性集节点：用于更新传入消息的元数据 转换器节点： 用于将数据从一种格式或单位转换为另一种格式或单位。 动作节点： 用于触发特定的动作或通知。 外部节点：用于与外部系统进行交互，提供将消息及数据路由到外部。 示例规则链 在 Thingsboard UI 中，转到规则链部分并打开根规则链。这个示例可以包括一系列节点，如上传遥测、存储日志和RPC调用等。 应用案例 数据过滤和清理 考虑一个场景，设备传感器每秒钟发送一批数据，但我们只对特定阈值以上的数据感兴趣。通过使用规则链的过滤器节点，可以轻松地过滤掉那些不满足条件的数据，只保留我们关心的数据。 在本案例中，我们将配置 ThingsBoard 规则引擎来存储 -40 到 80°C 范围内的所有温度。 我们将使用此脚本进行数据验证： return msg.temperature < -40 || msg.temperature > 80 如果温度在有效范围内，脚本将返回True，否则将返回False。如果脚本返回True，传入消息将被路由到以True关系连接的下一个节点。 现在我们使用Post Telemetry关系将Message Type Switch节点与Script Filter节点连接： 接下来，我们需要使用True关系将Script Filter节点与Save Telemetry节点连接起来。因此所有有效的遥测数据都将被保存： 上传telemetry温度为200，我们将看到设备最新遥测部分中未添加遥测： { "temperature": "200" } 现在修改温度为24，再次发送请求 { "temperature": "24" } 我们将看到遥测数据已成功保存。 实时数据转换 假设设备传感器提供的数据是以摄氏度为单位，但我们更喜欢使用华氏度。通过规则链中的转换器节点，可以将摄氏度转换为华氏度，确保我们得到的数据在我们熟悉的单位中。 下面的案例中，通过配置 ThingsBoard 规则引擎区分设备A和设备B，同时根据设备属性值分别将遥测数据中的温度进行不同处理。 我们使用到属性集节点中的originator attributes 在消息元数据中添加消息发起者属性(client\shared\server)和最新的遥测值，通过isTempCalculate属性区分设备A和设备B 我们会使用脚本来验证传入的温度是否在有效范围内，并返回Success或Failure。 我们将使用此脚本进行数据验证： if (metadata.isTempCalculate && metadata.isTempCalculate === "true") { if (typeof msg.temperature !== 'undefined') { msg.temperature = precisionRound(msg.temperature / 10, 2); } }else{ } function precisionRound(number, precision) { var factor = Math.pow(10, precision); return Math.round(number * factor) / factor; } return {msg: msg, metadata: metadata, msgType: msgTy…

分享｜五分钟快速学会 ThingsBoard 对接物联网网关
type: item
date: 2023-12-11T07:11:00+00:00
description: 如何将物联网网关与ThingsBoard集成？ 准备工作 ThingsBoard 对接物联网网关的步骤 配置ThingsBoard设备 配置ThingsBoard仪表板 与映翰通网关IG902建立连接 验证连接 小结与进一步探索 常见问题FAQ 关于我们 "亿琪软件" "联系我们--商业服务" 如何将物联网网关与ThingsBoard集成？ 准备工作 安装配置映翰通网关 连接设备 添加控制器 添加测点 ThingsBoard 对接物联网网关的步骤 配置ThingsBoard设备 在 ThingsBoard 中创建一个新设备 转到设备管理页面，创建设备并为设备分配唯一标识符和其他必要的信息。 添加凭证，获取设备的 Access Token，以便设备与平台进行通信。 连接成功后自动同步控制器与遥测数据 配置ThingsBoard仪表板 在 ThingsBoard 中创建仪表板 转到仪表板管理页面，创建一个新仪表板，为其分配一个易记的名称。 添加设备相关的控件，例如图表、指示灯等，以显示设备的实时数据。 与映翰通网关IG902建立连接 找到物联网连接或 MQTT 配置选项 进入映翰通网关 IG902 的管理界面。 输入 ThingsBoard 的 MQTT 服务器地址、端口和认证信息 添加 MQTT 消息发布 保存配置并启动网关 验证连接 确保设备状态显示为在线 返回 ThingsBoard 仪表板，检查仪表板上的控件，确保它们显示来自映翰通网关 IG902 的实时数据。 小结与进一步探索 通过本篇文章的学习，读者可以快速的了解并学会如何使用 ThingsBoard 进行与物联网网关的对接。本篇文章使用的是映翰通网关，读者可自由更换进行配置，步骤总体来说是大同小异的。 ThingsBoard平台集成网关的优势 集成的好处： 将物联网网关与 ThingsBoard 平台集成，带来了实时监控、数据可视化、分析和报告的诸多好处。这种集成不仅简化了数据管理，还提高了系统的可维护性，加强了对设备性能的洞察。 潜在的应用场景： 物联网网关与 ThingsBoard 的集成在各个行业都有广泛的应用场景。从工业自动化到智能城市，从农业到医疗保健，这种集成能够为不同领域的物联网应用提供更强大、高效的解决方案。 常见问题FAQ 物联网网关无法连接到ThingsBoard平台，应该如何排除问题？ 首先，检查物联网网关的配置是否正确，包括 MQTT 服务器地址、端口和认证信息。确保网络连接正常。 验证ThingsBoard服务器的可访问性。同时，查看ThingsBoard的日志以获取更多详细信息。 关于我们 "亿琪软件" 上海亿琪软件有限公司成立于 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

PLC | 西门子 Siemens S7 ISO-on-TCP 通讯协议探究——提高数据采集效率故障分析（使用边缘计算网关）
type: item
date: 2023-03-30T07:56:00+00:00
description: 目录 需求/故障现场 分析过程 winCC 数据采集抓包 分析过程1：采集20个 real 数据字段 分析过程2：采集10个 word 数据字段 自有软件数据采集抓包 每次只是读取了1个 word 数据字段 解决方案构思 验证 读取1000个字节 下一步是继续验证分多个 item 进行数据采集 winCC 数据格式 自己代码 开发过程 大概过程描述 总结 效果展示 改进？ 解决方案 关于 亿琪软件 众所周知，我们软件读取 PLC 数据时按照 Bool/Byte/Word/Real 等类型进行通讯，有时候，需要频繁读取 PLC 多个数据字段偏移量时，就会造成传输效率低下的问题。 需求/故障现场 PLC 上有 100 个 word 需要读取，偏移量顺序排列，比如：从 0 - 200； 需要 1 秒读取 1 次数据； 转换后，数据转发到第三方系统：MQTT，SQL等； 逐个读取每个 word，两个字节，需要在一个 TCP 会话中执行 100 次请求； 每次请求，三个 TCP 数据传输，每次需要 15ms（423行-421行：3.614448-3.598902=0.015546s）； 这样的话，100次请求需要1.5546s，算上网络延迟和处理性能问题，整个过程需要2秒以上； 结果就是：完全达不到 1秒1次 采集的需求。 分析过程 winCC 数据采集抓包 分析过程1：采集20个 real 数据字段 winCC 将数据包分解成 3个 item 分析过程2：采集10个 word 数据字段 同样原理，winCC 将数据包按照每个 item 32 个字节 自有软件数据采集抓包 每次只是读取了1个 word 数据字段 解决方案构思 每次按照要求，获取所有需要的数据偏移量； 取回来后，按照测点要求，自己根据数据类型分解出来； 循环读取下一次数据； 验证 读取1000个字节 可以看到分了5次数据，222+222+222+222+112=1000 下一步是继续验证分多个 item 进行数据采集 winCC 数据格式 效率高，每次只需要 <2ms，分析原因：每次读取都是连续的地址空间，不需要PLC进行分段读取； 自己代码 效率低，每次需要20-50ms，分析原因：每个 item 里面只有一个测点（word类型），需要分段读取； 开发过程 大概过程描述 由于每次请求的数据量（按测点）叠加在一起，通过 S7DataItem 来组合，最多20个 item，打包一起发送到 PLC； 收到每次的返回数据，再解析成对象插入二维表，等待处理； 全部处理完成，统一根据请求数量，返回相应的结果集； 总结 PLC 针对于每个测点的处理时间在 1-3秒，数量越多，时间越长，是累加的； 100个测点，算上 TCP 包头和包尾，大概来回数据时间是 220ms左右，200个测点是 400ms左右； 通过这种方式，一个 PLC 建议采集点不超过 500个，虽然对 PLC 性能影响不大，但是处理时间较长，不适用1秒一次采集需求； 每个型号 PLC 的处理性能不一样，支持的 TCP 连接数也不一定一样，所以，要根据具体需求来决定。 效果展示 存入 SQL 数据库，完全控制在1秒一次采集 4 个 TCP 连接非常稳定 网关性能稳定 与 PLC 交互的网卡网络流量很少 改进？ 类似 winCC 的模式，一次性读取一段偏移量，节省 TCP 开销，也节省 PLC 处理每个测点； 针对一次读取来的一段偏移量内容进行解析，需要对字节码流处理非常熟悉； 对于新建项目，比较适合用改进的方法，毕竟 PLC 可以根据需求改动测点偏移量； 解决方案 关于 亿琪软件 上海亿琪软件有限公司成立于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

开源｜EdgeX 消息总线 MessageBus
type: item
date: 2023-03-01T02:46:00+00:00
description: 消息总线在 EdgeX 框架中起到了至关重要的作用，模块之间的数据交互，外部系统之间的桥梁，消息总线可以说是不可或缺的必要条件。默认情况下，redis 服务成为了 EdgeX 消息总线的初始化配置。 通用配置 EdgeX 消息总线是可以根据需求来配置和更改具体的实现引擎： Redis（默认） MQTT NATS Core NATS JetStream ZeroMQ（已过时） eKuiper 规则引擎 EdgeX MessageBus 用于内部 EdgeX 服务到服务的通信。它并不意味着作为外部服务与内部 EdgeX 服务通信的入口点。 eKuiper 规则引擎是一个例外，因为它与 EdgeX 紧密集成。 一般情况下，由于 eKuiper 跟 EdgeX 在部署时处于一个阶段，eKuiper 可以直接从 MessageBus 中直接获取数据，并遵循 MessageBus 消息格式进行解析和处理。 通过 eKuiper 最简单的创建 stream 命令，即可完成对 EdgeX MessageBus 配置：CREATE STREAM EdgeXStream () WITH ( FORMAT = "JSON", TYPE = "edgex" ) 同样的情况，eKuiper 可以简单的命令创建 数据输出到 EdgeX： { "id": "ruleRedisEvent", "sql": "SELECT temperature * 3 AS t1, humidity FROM events", "actions": [ { "edgex": { "protocol": "redis", "host": "localhost", "port": 6379, "topic": "application", "profileName": "ekuiperProfile", "deviceName": "ekuiper", "contentType": "application/json" } } ] } 提示 非专业人士，不建议直接调用 EdgeX MessageBus 进行开发和使用。

EdgeX 配置和注册介绍
type: item
date: 2023-03-01T02:16:00+00:00
description: 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 中集中管理；这是一个隐藏服务，使用者不需要特别关心，此服务以微服务运行。

技术｜ONVIF 摄像头视频读取，YiEDGE 拉流，RV1126 实现推理
type: item
date: 2023-02-17T15:41:00+00:00
description: 目录 ONVIF 协议 YiEDGE 边缘计算框架 管理 ONVIF 摄像头 同步到 Message Bus YiEVAS 系统 eKuiper 作为 pipeline 引擎 ONVIF 通告获取 stream rule-onvif-camera 拉流，抓帧，推理 拉流 抓帧 推理 结果输出 创建被管理摄像头 在边缘计算视频分析方面，ONVIF 协议实现了摄像头管理，YiEDGE 实现了拉流和图片输出，YiEVAS 模块 Pyairknn 实现推理。 ONVIF 协议 开放型网络视频接口论坛（英语：Open Network Video Interface Forum，简称ONVIF），是一个国际开放型网络视频产品标准网络接口开发论坛. IPC 摄像头必须支持 ONVIF 协议； 实现自动多摄像头并行处理性能要求； ONVIF Device Manager，用这个软件连接摄像头查看。 YiEDGE 边缘计算框架 YiEDGE 框架基于 EdgeX 框架做了深层次定制，实现了更加自动化的功能，增加了南向设备接口协议，增加了北向云平台接口协议。 管理 ONVIF 摄像头 采用 device onvif camera 设备层协议，对接各种支持 ONVIF 的摄像头设备； 定期探测网络中的 IPC； 轮训摄像头状态，获取 streamuri 地址；创建被管理摄像头 这里以 HK 摄像头为例，10s 轮训一次。 { "apiVersion": "v2", "statusCode": 200, "device": { "created": 1676646639846, "modified": 1676646710817, "id": "9a9a3276-cf19-4e01-908c-801a520ba5be", "name": "IPC-HK", "adminState": "UNLOCKED", "operatingState": "UP", "labels": [ "" ], "serviceName": "device-onvif-camera", "profileName": "onvif-camera", "autoEvents": [ { "interval": "10s", "onChange": false, "sourceName": "StreamUri" } ], "protocols": { "Onvif": { "Address": "192.168.123.183", "DeviceStatus": "UpWithAuth", "FirmwareVersion": "V5.7.3 build 220315", "FriendlyName": "HIKVISION DS-IPC-T12HV3-IA", "HardwareId": "88", "LastSeen": "Fri Feb 17 15:11:50 UTC 2023", "MACAddress": "c0:6d:ed:eb:cb:59", "Manufacturer": "HIKVISION", "Model": "DS-IPC-T12HV3-IA", "Port": "80", "SerialNumber": "DS-IPC-T12HV3-IA20220913AACHK56293791" } } } } streamUri 信息内容 [ { "id": "c88007b8-4316-451c-87b4-2dec7f1f540d", "origin": 1676646870752047000, "deviceName": "IPC-HK", "resourceName": "StreamUri", "profileName": "onvif-camera", "valueType": "Object", "value": "", "objectValue": { "MediaUri": { "InvalidAfterConnect": false, "InvalidAfterReboot": false, "Timeout": "PT60S", "Uri": "rtsp://192.168.123.183:554/Streaming/Channels/0?transportmode=unicast&profile=Profile_1" } } } ] 同步到 Message Bus 以上信息都会同步到数据总线； 可以自定义轮训时间； 筛选需要通告总线的 IPC； YiEVAS 系统 eKuiper 作为 pipeline 引擎 大概模式如下： |source输入->|rule规则引擎->|sink输出->| |:----|:----|:----| |onvi…

技术｜在 RV1126 之上使用 rknn_toolkit_lite 和 eKuiper pipeline 进行图片识别推理
type: item
date: 2023-02-17T14:20:00+00:00
description: 本文使用 Base64，OPENCV，Numpy 和 Image 组件进行数据读取转换。 图片格式 一般在边缘计算端进行推理，不会使用一张一张图片，而是采用视频流读帧的方式。 二进制文件格式 file_bytes = "binary file" // 初始化图片二进制 encoded = base64.decodebytes(file_bytes.encode("ascii")) // 转换成base64 img = Image.open(io.BytesIO(encoded)).resize((width, height)) // 打开图片 input_data = np.array(img) // 转换成 numpy image = cv2.cvtColor(input_data, cv2.COLOR_BGR2RGB) // OPENCV 读取图片 图片(二进制)-->base64-->Image-->numpy array-->opencv Base64 编码格式 如果是 Base64 格式输入，处理方法一样，但是，在输入流的地方，要注意 source 采用 json 编码。 // 代码通用 // 输入格式： {"image": "/9j/4AAQSk....X//2Q=="} 图片(json base64）-->Image-->numpy array-->opencv eKuiper source 读取源（输入输入） eKuiper 定义 source 唯一区别就是 format: binary/json，假设都是采用 mqtt broker 作为图片输入。 Binary 二进制格式 输入源定义： { "Name" : "binaryimage", "Options" : { "confKey" : "edgex_mqtt_broker", "datasource" : "image", "format" : "binary", "type" : "mqtt" }, "Statement" : null, "StreamFields" : null, "StreamType" : 0 } 输入图片示例代码, GOLANG，这里的 payload 直接是 ReadFile，二进制： package main import ( "fmt" "io/ioutil" "time" mqtt "github.com/eclipse/paho.mqtt.golang" ) func main() { const TOPIC = "binaryimage" images := []string{ "parrot.jpg", "owl.jpg", "out.jpg", // 其他你需要的图像 } opts := mqtt.NewClientOptions().AddBroker("tcp://192.168.123.184:1883") client := mqtt.NewClient(opts) if token := client.Connect(); token.Wait() && token.Error() != nil { panic(token.Error()) } for _, image := range images { fmt.Println("Publishing " + image) payload, err := ioutil.ReadFile(image) if err != nil { fmt.Println(err) continue } if token := client.Publish(TOPIC, 0, false, payload); token.Wait() && token.Error() != nil { fmt.Println(token.Error()) } else { fmt.Println("Published " + image) } time.Sleep(1 * time.Second) } client.Disconnect(0) } Json 格式 输入源定义： { "Name" : "jsonimage", "Options" : { "confKey" : "edgex_mqtt_broker", "datasource" : "image", "format" : "json", "type" : "mqtt" }, "Statement" : null, "StreamFields" : null, "StreamType" : 0 } 输入图片为 base64 编码后的结果，json 格式如下，发送到 mqtt broker 即可： image.json { …