edgex foundry中文3 | 快速开始 | 附个人踩坑记录

868 阅读9分钟
# 本人声明: 
# 1、翻译来自官方网站原文。仅做个人学习。 
# 2、个人能力十分有限,借助了翻译工具并作了修改和备注【ps:xxx】,但仍只能满足个人理解使用,错误和漏洞百出,希望读者指正批评。 
# 3、官网地址:[EdgeX Foundry Documentation](https://docs.edgexfoundry.org/2.4/)

快速入门

本指南将使用 Docker 容器在短短 5 分钟内在您的计算机上启动并运行 EdgeX。我们现在将跳过冗长的描述。此处的目标是尽可能简单地为你提供从设备到云的可用的IoT Edge 技术栈。

如果需要更详细的说明或本文档中看到的某些命令的细节,请参阅用户入门或开发人员入门指南。

设置

开始运行 EdgeX 的最快方法是使用我们预先构建的 Docker 映像。要使用它们,您需要安装以下内容:

运行edgeX

jakarta (v 2.1) 是 EdgeX 的最新版本,在本指南中按示例使用。【ps:编写文档时最新,当前已经不是最新版】

安装 Docker 和 Docker Compose 后,您需要:

  • 下载/保存最新的Docker Compose文件
  • 发出命令以从 Docker Hub 下载并运行 EdgeX Foundry Docker 映像

这可以通过如下所示的单个命令来完成(请注意 x86 与 ARM 体系结构的选项卡)。

x86

curl https://raw.githubusercontent.com/edgexfoundry/edgex-compose/jakarta/docker-compose-no-secty.yml -o docker-compose.yml; docker-compose up -d

ARM

curl https://raw.githubusercontent.com/edgexfoundry/edgex-compose/Jakarta/docker-compose-no-secty-arm64.yml -o docker-compose.yml; docker-compose up -d

ps:下载失败的,复制网址手动vi一个yml文件,另外docker pull失败一般是因为网络原因,多执行几次就可以了

验证 EdgeX 容器是否已启动:

ps: pull成功了,启动compose时我遇到了一个新的问题 1672363715706.png 这里需要把yml里面的对应配置注释掉:文中有多处,请把security_opt及下级配置参数全部注释 1672363921112.png

docker-compose ps 

【ps:docker ps也行,我用上述命令未成功】 图像 如果所有 EdgeX 容器都正确拉取并启动且没有错误,您应该会看到类似于上图的进程状态 (ps)。

已连接的设备

EdgeX Foundry提供虚拟设备服务,对测试和开发非常有用。它模拟许多设备,每个设备在可配置的参数内随机生成各种类型的数据。例如,随机整数设备将生成随机整数。

虚拟设备(也称为设备虚拟)服务已经是作为默认 EdgeX 配置的一部分拉取并运行的服务。

您可以通过在 EdgeX 核心数据服务中查询为随机整数设备发送的事件记录来验证虚拟设备读数是否已发送:

curl http://localhost:59880/api/v2/event/device/name/Random-Integer-Device

图像 通过请求随机整数设备的核心数据接收的最后事件记录,验证虚拟设备服务是否正常运行。

注意

默认情况下,返回的最大事件数为 20(默认限制)。您可以传递参数以获取更多或更少的事件记录。limit

curl http://localhost:59880/api/v2/event/device/name/Random-Integer-Device?limit=50

控制设备

从设备读取数据只是EdgeX能力的一部分。您还可以使用它来控制您的设备 - 这称为“启动”设备。当设备向 EdgeX 服务注册时,它会提供一个设备配置文件,用于描述该设备可用的数据读数以及控制该设备的命令。

当我们的虚拟设备服务注册设备时,它还使用配置文件来定义命令,这些命令允许您告诉服务不要生成随机整数,而是始终返回您设置的值。Random-Integer-Device

您不会直接在设备上调用命令,而是使用 EdgeX Foundry命令服务来执行此操作。第一步是通过向命令服务询问有关设备的信息来检查哪些命令可以调用:

curl http://localhost:59882/api/v2/device/name/Random-Integer-Device

这将返回大量 JSON,因为您可以在此设备上调用许多命令,但我们将在本指南中使用的命令是(获取当前整数 16 值的命令)和(用于禁用随机整数 16 数字的生成并指定要返回的整数值的命令)。查找类似于 JSON 中显示的命令,如下所示:Int16``WriteInt16Value``Int16``WriteInt16Value

{
    "apiVersion": "v2",
    "statusCode": 200,
    "deviceCoreCommand": {
        "deviceName": "Random-Integer-Device",
        "profileName": "Random-Integer-Device",
        "coreCommands": [
            {
                "name": "WriteInt16Value",
                "set": true,
                "path": "/api/v2/device/name/Random-Integer-Device/WriteInt16Value",
                "url": "http://edgex-core-command:59882",
                "parameters": [
                    {
                        "resourceName": "Int16",
                        "valueType": "Int16"
                    },
                    {
                        "resourceName": "EnableRandomization_Int16",
                        "valueType": "Bool"
                    }
                ]
            },
            {
                "name": "Int16",
                "get": true,
                "set": true,
                "path": "/api/v2/device/name/Random-Integer-Device/Int16",
                "url": "http://edgex-core-command:59882",
                "parameters": [
                    {
                        "resourceName": "Int16",
                        "valueType": "Int16"
                    }
                ]
            }
            ...

        ]
    }
}

您会注意到命令具有或(或两者)选项。get调用将返回一个随机数(整数 16),并且是自动调用以将数据发送到 EdgeX 的其余部分(特别是核心数据)的内容。您也可以使用提供的 URL 手动调用get(无需其他参数):get``set

curl http://localhost:59882/api/v2/device/name/Random-Integer-Device/Int16

警告

请注意,localhost在此处替换了edgex-core-command。这是因为EdgeX Foundry服务在Docker中运行。Docker 识别内部主机名edgex-core-command,但是当从 Docker 外部调用服务时,您必须使用localhost才能访问它。

此命令将返回如下所示的 JSON 结果:

{
    "apiVersion": "v2",
    "statusCode": 200,
    "event": {
        "apiVersion": "v2",
        "id": "6d829637-730c-4b70-9208-dc179070003f",
        "deviceName": "Random-Integer-Device",
        "profileName": "Random-Integer-Device",
        "sourceName": "Int16",
        "origin": 1625605672073875500,
        "readings": [
            {
                "id": "545b7add-683b-4745-84f1-d859f3d839e0",
                "origin": 1625605672073875500,
                "deviceName": "Random-Integer-Device",
                "resourceName": "Int16",
                "profileName": "Random-Integer-Device",
                "valueType": "Int16",
                "binaryValue": null,
                "mediaType": "",
                "value": "-8146"
            }
        ]
    }
}

图像 通过命令服务调用 Int16 设备的随机整数设备操作的 GET 会导致设备以 JSON 格式生成下一个随机值。

此读数的默认范围是 -32,768 到 32,767。在上面的示例中,返回的值 ofwas 作为读取值。将服务设置为随机返回值后,每次发送命令时返回的值都会不同。但是,我们可以使用命令来禁用返回随机值,而是指定要返回的值。使用下面的 curl 命令调用set命令禁用随机值并每次返回值。-8146``Int16``WriteInt16Value``42

curl -X PUT -d '{"Int16":"42", "EnableRandomization_Int16":"false"}' http://localhost:59882/api/v2/device/name/Random-Integer-Device/WriteInt16Value

警告

同样,还要注意localhost替换了edgex-core-command

如果成功,服务将使用状态代码确认要返回的值的设置。200

图像 通过命令服务调用设备的 SET 命令将返回 API 版本和状态代码(200 表示成功)。

现在每次我们调用get命令时,返回的值都是。Int16``42

图像

在将 Int16 值设置为 42 并禁用随机化后,对 Int16 设备的随机整数设备操作的 GET 调用将始终返回值 42。

导出数据

ps:这一步可以不管,我用的其他导出方式,通过http导出到springboot项目中。后面有时间写一个简单的demo

EdgeX 为各种云服务和应用程序提供导出器(称为应用程序服务)。为了使本指南简单,我们将使用社区提供的“可配置的应用程序服务”将 EdgeX 数据发送到由 HiveMQ 托管的公共 MQTT 代理。然后,您可以通过 HiveMQ 提供的 MQTT 浏览器客户端监视 EdgeX 事件数据。

首先将以下应用程序服务添加到 docker-compose.yml 文件中,紧跟在“app-service-rules”服务(文件中的第一个服务)之后。间距在 YAML 中很重要,因此请确保正确复制和粘贴间距。

  app-service-mqtt:
    container_name: edgex-app-mqtt
    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_PROFILE: mqtt-export
      EDGEX_SECURITY_SECRET_STORE: "false"
      MESSAGEQUEUE_HOST: edgex-redis
      REGISTRY_HOST: edgex-core-consul
      SERVICE_HOST: edgex-app-mqtt
      TRIGGER_EDGEXMESSAGEBUS_PUBLISHHOST_HOST: edgex-redis
      TRIGGER_EDGEXMESSAGEBUS_SUBSCRIBEHOST_HOST: edgex-redis
      WRITABLE_PIPELINE_FUNCTIONS_MQTTEXPORT_PARAMETERS_BROKERADDRESS: tcp://broker.mqttdashboard.com:1883
      WRITABLE_PIPELINE_FUNCTIONS_MQTTEXPORT_PARAMETERS_TOPIC: EdgeXEvents
    hostname: edgex-app-mqtt
    image: edgexfoundry/app-service-configurable:2.0.0
    networks:
      edgex-network: {}
    ports:
    - 127.0.0.1:59702:59702/tcp
    read_only: true
    security_opt:
    - no-new-privileges:true
    user: 2002:2001

注意

这会将可配置的应用程序服务添加到您的 EdgeX 系统。可配置的应用程序服务允许您配置(相对于程序)新导出 - 在本例中,将 EdgeX 传感器数据导出到 HiveMQ 代理。您将发布到 EdgeXEvents 主题。tcp://broker.mqttdashboard.com:1883

为方便起见,请参阅EdgeX 撰写生成器的文档以创建自定义 Docker 撰写文件。

保存撰写文件,然后执行另一个撰写命令,让 Docker 撰写拉取并启动可配置的应用程序服务。

docker-compose up -d

您可以使用任何 MQTT 客户端连接到此代理以监视发送的数据。HiveMQ 提供了一个可以使用的基于 Web 的客户端。使用浏览器转到客户端的 URL。到达那里后,点击连接按钮连接到 HiveMQ 公共代理。

图像 使用 HiveMQ 提供的客户端工具,连接到可配置应用程序服务向其发送 EdgeX 数据的同一公共 HiveMQ 代理。

然后,使用“订阅”区域订阅“EdgeXEvents”主题。

图像 您必须订阅同一主题 - EdgeXEvents - 才能查看可配置应用程序服务发送的 EdgeX 数据。

您将开始看到您的随机数读数出现在屏幕上的消息区域中。

图像 订阅后,EdgeX 事件数据将开始显示在浏览器屏幕上的消息区域中。

后续步骤

祝贺!您现在拥有完整的 EdgeX 部署,从(虚拟)设备读取数据并将其发布到云中的 MQTT 代理,并且能够通过命令控制设备进入 EdgeX。

是时候通过阅读 EdgeX Foundry简介、它是什么以及它是如何构建的来继续您的旅程了。从那里,您可以学习演练,了解微服务如何协同工作以控制设备并从中读取数据,就像您刚才所做的那样。