1.EdgeX Foundry 快速熟悉
[TOC]
https://docs.edgexfoundry.org/
一、EdgeX简介
EdgeX Foundry是由Linux Foundation托管的与供应商无关的开源平台,为工业IoT 边缘计算提供了通用框架。核心是一组松散耦合的微服务,这些微服务组织在不同的层中。
1.EdgeX的构思宗旨
- EdgeX Foundry必须与平台无关
- 硬件操作系统(Linux,Windows等)分发-必须允许通过边缘,网关,雾中,云等上的微服务分发功能。协议和传感器无关。
- EdgeX Foundry必须非常灵活
- 平台的任何部分都可以由其他微服务或软件组件进行升级、替换或增强,允许服务根据设备功能和用例进行扩展和缩小
- EdgeX Foundry必须提供存储和转发功能(以支持断开连接/远程的边缘系统)
- EdgeX Foundry必须支持设备/传感器现场部署 ,必须安全且易于管理。
2.EdgeX的服务层
EdgeX Foundry是开源微服务的集合。这些微服务分为4个服务层和2个基础增强系统服务。服务层从设备服务层的物理领域的边缘遍历到出口服务层的信息领域的边缘,核心服务层为中心。
image imageEdgeX Foundry的4个服务层:
- 输出服务层(Export Services)
- 允许外部服务(第三方应用)在EdgeX内注册为来自核心的数据的接收者。
- EdgeX Foundry 可以长时间独立于云平台运行,无需连接到“北侧”系统。当需要把边缘数据和智能分析输送到云平台时,这项工作将在本层执行。
- 支持服务层(Supporting Services)
- 涵盖大量的微服务(提示和通知、日志记录、调度、规则引擎),提供边缘分析和智能。
- 核心服务层(Core Services)
- 注册表和配置(Configuration and Registration):为其他 EdgeX Foundry 微服务提供关于 EdgeX Foundry 内相关服务的信息,包括微服务配置属性。
- 核心数据(Core Data):一个持久性存储库和相关的管理服务,用于从南侧对象收集的数据。
- 元数据(Metadata):提供配置新设备并将其与自己的设备服务配对的功能。
- 命令(Command):处理北向应用发往南向设备的请求;还会处理框架内其他微服务发往南向设备的请求,如本地的分析服务。
- 设备服务层(Device Services)
- 本层负责与边缘设备进行交互,可以同时为多个设备进行服务。
- DS层将由IoT对象生成和传递的数据转换为通用的EdgeX Foundry数据结构,并将转换后的数据发送到CoreX服务,以及EdgeX Foundry的其他层中的其他微服务。
EdgeX Foundry的2个基础系统服务:
- 安全(Security)
- EdgeX Foundry 内部和外部的安全部件,保护由 EdgeX Foundry 管理的设备、传感器、和其他 IoT 对象的数据和控制命令安全。
- 系统管理(Device + System Management)
- 提供安装、升级、启动、停止和监控 EdgeX Foundry 微服务、BIOS 固件、操作系统和其他网关软件等功能。
3.通信方向定义
定义:“南侧”和“北侧”
-
南侧:物理领域内以及与这些设备、传感器、执行器和其他IoT对象直接通信并从中收集数据的网络边缘中的所有IoT对象统称为“南侧”。
-
北侧:收集、存储、聚集、分析和转换为信息的云(或企业系统),并且与云进行通信的网络部分称为网络的“北侧” 。
EdgeX使数据可以根据需要和指示“向北”、“向南”或横向发送。
4.平台要求
- 内存:至少1 GB
- 硬盘空间:至少需要3 GB的空间来运行EdgeX Foundry容器,但是您可能需要更多空间,具体取决于传感器和设备数据将保留多长时间。
- 操作系统:EdgeX Foundry已在许多系统上成功运行,包括但不限于以下系统
- Windows(版本7-10)
- Ubuntu桌面(版本14-16)
- Ubuntu Server(版本14)
- Ubuntu Core(版本16)
- Mac OS X 10
5.EdgeX 微服务部署场景
-
第一种部署场景,现场靠近设备侧部署设备服务,用于采集设备数据和执行控制命令。核心服务、分析服务和导出服务则部署在云端。
-
第二种部署场景:现场靠近设备侧部署设备服务,其余服务部署在网关上,网关将数据再发送到云端。
-
第三种部署场景:设备服务、核心服务、导出服务和分析服务都部署在边缘侧。
-
第四种部署场景:设备服务和核心服务部署在网关上,导出服务和分析服务部署在雾计算节点上,分析后的数据由雾计算节点发送到云端。
-
第五种部署场景:设备服务部署在现场嵌入式单片机上,核心服务、分析服务和导出服务部署在雾计算节点上,雾计算节点再连到云端。
二、EdgeX使用
EdgeX Foundry是十几个微服务的集合,这些服务被部署为提供最小的边缘平台功能。可以下载EdgeX Foundry微服务源代码并将其内置到部署工件中。
用户可以使用更简单的选项来使用Docker并在微服务Docker容器中运行EdgeX Foundry。随着新代码被检入源存储库,EdgeX Foundry微服务会自动构建并打包。
1.获取并运行EdgeX Foundry
image-
安装Docker和Docker Compose
-
安装Docker Compose:用于定义和运行多容器Docker应用程序的工具。通过Compose,可以使用YAML文件来配置应用程序的服务。然后使用一个命令,就可以从配置中创建并启动所有服务。
# 基于ubuntu x86_64 # 下载Docker Compose的当前稳定版本 sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose docker-compose --version
-
下载EdgeX Foundry Docker Compose文件
- 安装Docker和Docker Compose之后,需要Docker Compose文件,该文件是所有EdgeX Foundry微服务的清单,向Docker / Docker Compose指定了所需的容器以及如何运行这些容器。
- 需要下载的Docker容器映像
- 容器启动的顺序
- 运行容器的参数
-
EdgeX Foundry Docker Compose文件的集合
- docker-compose.yml文件将从Docker Hub提取最新的带标签EdgeX微服务。
- docker-compose命令说明
- 安装Docker和Docker Compose之后,需要Docker Compose文件,该文件是所有EdgeX Foundry微服务的清单,向Docker / Docker Compose指定了所需的容器以及如何运行这些容器。
-
运行EdgeX Foundry
mkdir ~/EdgeX && cd ~/EdgeX # 将下载的Docker Compose文件并重命名为docker-compose.yml git clone https://github.com/edgexfoundry/developer-scripts.git cp developer-scripts/blob/master/releases/edinburgh/compose-files/docker-compose-edinburgh-1.0.1.yml ./ mv docker-compose-edinburgh-1.0.1.yml docker-compose.yml # 拉取将所有EdgeX Docker映像 sudo docker-compose pull # 获取Docker Compose名称列表 docker-compose config --services volume consul config-seed vault vault-worker kong-db kong-migrations kong edgex-proxy mongo logging system notifications metadata data command scheduler export-client export-distro rulesengine device-virtual ui portainer # 安装并启动EdgeX sudo docker-compose up -d # -d 后台运行容器 # 查看所有容器运行状况 sudo docker-compose ps # 显示容器日志 docker-compose logs -f [compose-contatainer-name] # 停止容器 sudo docker-compose stop # 启动容器 sudo docker-compose start # 停止和删除所有容器 sudo docker-compose down
-
基础微服务Ping检查
-
每个EdgeX Foundry微服务均已构建为响应“ ping” HTTP请求。EdgeX Foundry微服务容器运行后,可以“ ping”任何一个微服务以检查其是否正在运行。
-
打开浏览器或HTTP REST客户端工具(PostMan),然后使用服务的ping地址来查看它是否可用
# 如:Core Data Microservice curl http://localhost:48080/api/v1/ping pong
-
EdgeX Foundry microservices, their ports, and "ping" URLs.
EdgeX Foundry Microservice Docker Compose Container Container Name Port Ping URL Core Command command edgex-core-command 48082 http://[host]:48082/api/v1/ping Core Data data edgex-core-data 48080 http://[host]:48080/api/v1/ping Core Metadata metadata edgex-core-metadata 48081 http://[host]:48081/api/v1/ping Export Client export-client edgex-export-client 48071 http://[host]:48071/api/v1/ping Export Distribution export-distro edgex-export-distro 48070 http://[host]:48070/api/v1/ping Rules Engine rulesengine edgex-support-rulesengine 48075 http://[host]:48075/api/v1/ping Support Logging logging edgex-support-logging 48061 http://[host]:48061/api/v1/ping Support Notifications notifications edgex-support-notifications 48060 http://[host]:48060/api/v1/ping Support Scheduler scheduler edgex-support-scheduler 48085 http://[host]:48085/api/v1/ping Virtual Device Service device-virtual edgex-device-virtual 49990 http://[host]:49990/api/v1/ping
-
-
-
EdgeX Foundry Consul 注册
-
所有EdgeX Foundry微服务都会在Consul注册表中注册,在本机浏览器访问:http://localhost:8500/ui.
image
-
2.测试docker device service
测试docker compose的随机数设备服务
1)开启设备服务
修改docker-compose.yml 文件,打开device-random 设备服务
#################################################################
# Device Services
#################################################################
......
device-random:
image: edgexfoundry/docker-device-random-go:1.0.0
ports:
- "49988:49988"
container_name: edgex-device-random
hostname: edgex-device-random
networks:
edgex-network:
aliases:
- edgex-device-random
volumes:
- db-data:/data/db
- log-data:/edgex/logs
- consul-config:/consul/config
- consul-data:/consul/data
depends_on:
- data
- command
重新启动服务:sudo docker-compose up -d
2)测试设备服务
-
通过RESTful API 查找平台启动的device services
GET http://10.55.2.185:48082/api/v1/device/name/Random-Integer-Generator01 { "id": "59f51186-af23-4340-823f-0bbd8a65449f", "name": "Random-Integer-Generator01", "adminState": "UNLOCKED", "operatingState": "ENABLED", "lastConnected": 0, "lastReported": 0, "labels": [ "device-random-example" ], "location": null, "commands": [ { "created": 1584601835378, "modified": 1584601835378, "id": "db0dbed8-ad94-4706-9f34-6110e2b45797", "name": "GenerateRandomValue_Int8", "get": { "path": "/api/v1/device/{deviceId}/GenerateRandomValue_Int8", "responses": [ { "code": "503", "description": "service unavailable" } ], "url": "http://edgex-core-command:48082/api/v1/device/59f51186-af23-4340-823f-0bbd8a65449f/command/db0dbed8-ad94-4706-9f34-6110e2b45797" }, "put": { "path": "/api/v1/device/{deviceId}/GenerateRandomValue_Int8", "parameterNames": [ "Min_Int8", "Max_Int8" ], "url": "http://edgex-core-command:48082/api/v1/device/59f51186-af23-4340-823f-0bbd8a65449f/command/db0dbed8-ad94-4706-9f34-6110e2b45797" } }, { "created": 1584601835378, "modified": 1584601835378, "id": "529b5a88-2309-4040-b783-193dbe7ec3d3", "name": "GenerateRandomValue_Int16", "get": { "path": "/api/v1/device/{deviceId}/GenerateRandomValue_Int16", "responses": [ { "code": "503", "description": "service unavailable" } ], "url": "http://edgex-core-command:48082/api/v1/device/59f51186-af23-4340-823f-0bbd8a65449f/command/529b5a88-2309-4040-b783-193dbe7ec3d3" }, "put": { "path": "/api/v1/device/{deviceId}/GenerateRandomValue_Int16", "parameterNames": [ "Min_Int16", "Max_Int16" ], "url": "http://edgex-core-command:48082/api/v1/device/59f51186-af23-4340-823f-0bbd8a65449f/command/529b5a88-2309-4040-b783-193dbe7ec3d3" } }, { "created": 1584601835378, "modified": 1584601835378, "id": "748abcf5-487f-457a-833f-a0784a1f5f39", "name": "GenerateRandomValue_Int32", "get": { "path": "/api/v1/device/{deviceId}/GenerateRandomValue_Int32", "responses": [ { "code": "503", "description": "service unavailable" } ], "url": "http://edgex-core-command:48082/api/v1/device/59f51186-af23-4340-823f-0bbd8a65449f/command/748abcf5-487f-457a-833f-a0784a1f5f39" }, "put": { "path": "/api/v1/device/{deviceId}/GenerateRandomValue_Int32", "parameterNames": [ "Min_Int32", "Max_Int32" ], "url": "http://edgex-core-command:48082/api/v1/device/59f51186-af23-4340-823f-0bbd8a65449f/command/748abcf5-487f-457a-833f-a0784a1f5f39" } } ] }
- device-random这个service包含Random-Boolean-Device、Random-Integer-Device、 Random-Integer-Generator01等多个设备
- Random-Integer-Generator01设备有 GenerateRandomValue_Int8、GenerateRandomValue_Int16、GenerateRandomValue_Int32这 3 种属性
- device-random这个service包含Random-Boolean-Device、Random-Integer-Device、 Random-Integer-Generator01等多个设备
-
控制设备
通过命令微服务(Command Service)检查到设备可以调用的设备属性,使用put或get其url值读取或设置设备参数
GET http://10.55.2.185:48082/api/v1/device/59f51186-af23-4340-823f-0bbd8a65449f/command/db0dbed8-ad94-4706-9f34-6110e2b45797 { "device": "Random-Integer-Generator01", "origin": 1584603177404, "readings": [ { "origin": 1584603177404, "device": "Random-Integer-Generator01", "name": "RandomValue_Int8", "value": "-22" } ] } PUT http://10.55.2.185:48082/api/v1/device/59f51186-af23-4340-823f-0bbd8a65449f/command/db0dbed8-ad94-4706-9f34-6110e2b45797 {"Min_Int8":"-10", "Max_Int8":"10" } # json格式
3.device-service数据推送
EdgeX Foundry 除了接受端设备的数据外,还可以将数据推送到各种云服务上,例如将获取到的随机数据推送到 MQTT 服务器上。
三、EdgeX开发
https://docs.edgexfoundry.org/1.2/getting-started/Ch-GettingStartedDevelopers/
开发EdgeX Foundry微服务所需软件
-
MongoDB:EdgeX Foundry使用MongoDB作为传感器数据以及有关所连接设备/传感器的元数据的持久性机制。(在edgex docker-compose已经包含,可忽略)
-
Redis:备用开源(BSD许可)数据库,可以与EdgeX一起使用,代替MongoDB进行许多服务。(备用数据库,可忽略)
-
ZeroMQ:一些EdgeX Foundry服务依赖ZeroMQ进行通信。
# 安装 # 下载脚本https://gist.github.com/katopz/8b766a5cb0ca96c816658e9407e83d00 sudo bash setup-zeromq.sh
1.EdgeX Foundry-Go开发
EdgeX Foundry的开源微服务是用Go 1.12编写的。
-
wget https://dl.google.com/go/go1.14.linux-amd64.tar.gz sudo tar -zxvf go1.14.linux-amd64.tar.gz -C /usr/local
-
构建在edgex-go中找到的现有服务
cd $GOPATH/src/github.com/edgexfoundry/ git clone https://github.com/edgexfoundry/edgex-go.git cd edgex-go # 使用提供的Makefile在一个调用中构建所有服务 make build # 成功构建服务,并启动数据库并运行后,运行Core的Go服务 make run
-
验证EdgeX是否正常工作
curl http://localhost:48080/api/v1/ping pong
-
测试EdgeX设备微服务
-
edgex-go只运行核心服务,并不会收集任何传感器数据。为了使传感器数据流入EdgeX核心服务,需要以类似的方式获取、构建和运行EdgeX设备服务。
-
参考示例:https://github.com/edgexfoundry/device-sdk-go
$ cd $GOPATH/src $ git clone https://github.com/edgexfoundry/device-sdk-go.git $ cd device-sdk-go/example/cmd/device-simple # 修改ports $ vim res/configuration.toml - Port = 49990 + Port = 49991 # 不与EdgeX Foundry docker-compose 微服务冲突 # 确保EdgeX Foundry docker-compose 微服务已启动,再运行设备微服务 $ go run main.go Init: useRegistry: profile: confDir: Loading configuration from: /home/michael/project/Go/workspace/src/device-sdk-go/example/cmd/device-simple/res/configuration.toml Load configuration from local file and bypassing registration in Registry... Calling service.Start. EnableRemote is false, using local log file level=INFO ts=2020-03-18T02:37:45.364236074Z app=device-simple source=init.go:138 msg="Check Metadata service's status ..." level=INFO ts=2020-03-18T02:37:45.36429449Z app=device-simple source=init.go:138 msg="Check Data service's status ..." level=INFO ts=2020-03-18T02:37:45.387768867Z app=device-simple source=init.go:48 msg="Service clients initialize successful." level=INFO ts=2020-03-18T02:37:45.396067426Z app=device-simple source=service.go:150 msg="Device Service device-simple exists" level=INFO ts=2020-03-18T02:37:45.40177515Z app=device-simple source=service.go:95 msg="*Service Start() called, name=device-simple, version=to be replaced by makefile" level=INFO ts=2020-03-18T02:37:45.402692484Z app=device-simple source=service.go:99 msg="Listening on port: 49991" level=INFO ts=2020-03-18T02:37:45.407686942Z app=device-simple source=service.go:124 msg="Service started in: 44.01196ms" level=INFO ts=2020-03-18T02:37:55.425878945Z app=device-simple source=utils.go:93 Content-Type=application/json correlation-id=449118ac-763d-48a9-a5e7-0e9b5c20bdc3 msg="SendEvent: Pushed event to core data" level=INFO ts=2020-03-18T02:38:05.418998892Z app=device-simple source=utils.go:93 Content-Type=application/json correlation-id=4a3fc51d-ce40-409f-b19b-f1ed7c4bb7a0 msg="SendEvent: Pushed event to core data"
EdgeX设备微服务与EdgeX服务层的微服务地位是平等的,各个微服务之间是通过网络进行通信。
-
2.混合环境开发
https://docs.edgexfoundry.org/1.2/getting-started/Ch-GettingStartedHybrid/
为所需的所有微服务下载并运行EdgeX Docker容器,并从所选的开发人员工具中运行单个微服务,并通过适当的地址使其指向其他微服务。
-
运行最小EdgeX环境所需的微服务
- Volume
- Consul
- Config-seed
- Mongo
- Core Data
- Core Metadata
- Core Command
- Support Logging
- Support Notifications
-
在Go Land中获取并运行代码
-
将设备微服务device-xxx-go项目导入Go Land
- go项目的主机环境配置文件是cmd/device-xxx/res/configuration.toml
- go项目的docker环境的配置文件是cmd/device-xxx/res/docker/configuration.toml
- 在Docker中运行的服务未在“ localhost”上运行,它们在Docker Engine中运行。Docker Engine的IP地址通常为172.17.0.1
-
运行go项目
cd device-sdk-go/example/cmd/device-simple # 修改ports $ vim res/configuration.toml - Port = 49990 + Port = 49991 # 不与EdgeX Foundry docker-compose 微服务冲突 # 确保EdgeX Foundry docker-compose 微服务已启动,再运行设备微服务 $ go run main.go
-
2.设备服务开发
https://docs.edgexfoundry.org/1.2/getting-started/Ch-GettingStartedSDK/
设备服务SDK可帮助开发人员快速为EdgeX创建新的设备连接器,提供了每个设备服务所需的通用支架,开发人员可以专注于通过设备协议与设备进行通信的特定代码。
-
提供了通用的模板代码来接收和响应命令请求。
-
提供了通用代码以帮助将来自传感器的数据获取到EdgeX Core Data中
设备服务SDK分为C SDK和Golang SDK
1)EdgeX C SDK
-
先决条件
- Linux主机
- 支持C11的GCC版本。
- CMake版本3或更高版本。
- 开发库和头文件:
- curl(版本7.32或更高版本)
- microhttpd(0.9版)
- libyaml(0.1.6版或更高版本)
- libcbor(版本0.5)
- libuuid(来自util-linux v2.x)
-
安装依赖
sudo apt install libcurl4-openssl-dev libmicrohttpd-dev libyaml-dev libcbor-dev
-
获取构建SDK
git clone -b fuji https://github.com/edgexfoundry/device-sdk-c.git cd ./device-sdk-c ./scripts/build.sh
2)EdgeX Golang SDK
-
安装依赖
# 安装Go Lang(1.11或更高版本) # make sudo apt install build-essential
-
获取SDK
cd $GOPATH/src/github.com/edgexfoundry/ git clone https://github.com/edgexfoundry/device-sdk-go.git ~/project/Go/workspace/src/device-sdk-go$ tree . ├── api │ └── oas3.0 │ └── device-sdk.yaml ├── async.go ├── bin │ ├── test-attribution-txt.sh │ └── test-go-mod-tidy.sh ├── Dockerfile.build ├── example │ ├── cmd │ │ └── device-simple │ │ ├── Attribution.txt │ │ ├── device-simple.log │ │ ├── Dockerfile │ │ ├── main.go │ │ └── res │ │ ├── configuration.toml │ │ ├── docker │ │ │ └── configuration.toml │ │ ├── off.jpg │ │ ├── on.png │ │ └── Simple-Driver.yaml │ └── driver │ └── simpledriver.go ├── go.mod ├── go.sum ├── internal │ ├── autoevent │ │ ├── executor.go │ │ ├── executor_test.go │ │ └── manager.go │ ├── cache │ │ ├── devices.go │ │ ├── devices_test.go │ │ ├── init.go │ │ ├── init_test.go │ │ ├── profiles.go │ │ ├── profiles_test.go │ │ ├── provisionwatchers.go │ │ ├── provisionwatchers_test.go │ │ ├── valuedescriptors.go │ │ └── valuedescriptors_test.go │ ├── clients │ │ ├── init.go │ │ └── init_test.go │ ├── common │ │ ├── apperror.go │ │ ├── consts.go │ │ ├── globalvars.go │ │ ├── types.go │ │ ├── utils.go │ │ └── utils_test.go │ ├── config │ │ ├── environment.go │ │ ├── environment_test.go │ │ ├── loader.go │ │ ├── loader_test.go │ │ └── test │ │ └── configuration.toml │ ├── controller │ │ ├── correlation │ │ │ ├── handler.go │ │ │ └── middleware.go │ │ ├── restfuncs.go │ │ ├── restfuncs_test.go │ │ ├── restrouter.go │ │ └── restrouter_test.go │ ├── endpoint │ │ └── endpoint.go │ ├── handler │ │ ├── callback │ │ │ ├── device.go │ │ │ ├── general.go │ │ │ ├── profile.go │ │ │ └── provisionwatcher.go │ │ ├── command.go │ │ ├── command_test.go │ │ ├── control.go │ │ ├── status.go │ │ └── version.go │ ├── mock │ │ ├── consts.go │ │ ├── data │ │ │ ├── device │ │ │ │ ├── New-Device-02.json │ │ │ │ ├── New-Device.json │ │ │ │ ├── Random-Boolean-Generator.json │ │ │ │ ├── Random-Float-Generator.json │ │ │ │ ├── Random-Integer-Generator.json │ │ │ │ └── Random-UnsignedInteger-Generator.json │ │ │ ├── deviceprofile │ │ │ │ ├── New-Device.json │ │ │ │ ├── Random-Boolean-Generator.json │ │ │ │ ├── Random-Float-Generator.json │ │ │ │ ├── Random-Integer-Generator.json │ │ │ │ └── Random-UnsignedInteger-Generator.json │ │ │ └── provisionwatcher │ │ │ ├── Boolean-Watcher.json │ │ │ ├── Float-Watcher.json │ │ │ ├── Integer-Watcher.json │ │ │ ├── New-Watcher.json │ │ │ └── UnsignedInteger-Watcher.json │ │ ├── dataloader.go │ │ ├── mock_addressableclient.go │ │ ├── mock_deviceclient.go │ │ ├── mock_deviceprofileclient.go │ │ ├── mock_devicevirtualdriver.go │ │ ├── mock_eventclient.go │ │ ├── mock_provisionwatcherclient.go │ │ └── mock_valuedescriptorclient.go │ ├── provision │ │ ├── devices.go │ │ └── profiles.go │ └── transformer │ ├── overflowerror.go │ ├── transformparam.go │ ├── transformresult.go │ ├── transformresult_test.go │ ├── transformvaluechecker.go │ └── transformvaluechecker_test.go ├── Jenkinsfile ├── LICENSE ├── Makefile ├── manageddevices.go ├── managedprofiles.go ├── managedwatchers.go ├── pkg │ ├── models │ │ ├── asyncvalues.go │ │ ├── commandrequest.go │ │ ├── commandvalue.go │ │ ├── commandvalue_test.go │ │ ├── event.go │ │ ├── protocoldiscovery.go │ │ └── protocoldriver.go │ └── startup │ └── bootstrap.go ├── README.md ├── service.go ├── snap │ ├── hooks │ │ └── install │ ├── local │ └── snapcraft.yaml └── version.go
-
开发新的设备服务项目
cd $GOPATH/src/github.com/edgexfoundry/ # 新设备服务的名称是为设备服务的名称添加前缀device- mkdir device-simple cp -rf ./device-sdk-go/example/* ./device-simple/ cp ./device-sdk-go/Makefile ./device-simple cp ./device-sdk-go/VERSION ./device-simple/ cp ./device-sdk-go/version.go ./device-simple/ tree device-simple/ device-simple/ ├── cmd │ └── device-simple │ ├── Dockerfile │ ├── main.go │ └── res │ ├── configuration.toml │ ├── docker │ │ └── configuration.toml │ ├── off.jpg │ ├── on.png │ └── Simple-Driver.yaml ├── driver │ └── simpledriver.go ├── Makefile ├── VERSION └── version.go cd device-simple/ # 修改main.go文件的import vim cmd/device-simple/main.go "github.com/edgexfoundry/device-simple" "github.com/edgexfoundry/device-simple/driver" # 修改Makefile vim Makefile MICROSERVICES=cmd/device-simple/device-simple GOFLAGS=-ldflags "-X github.com/edgexfoundry/device-simple.Version=$(VERSION)" cmd/device-simple/device-simple: $(GO) build $(GOFLAGS) -o $@ ./cmd/device-simple # 创建初始模块定义并将其写入go.mod文件 GO111MODULE=on go mod init # 编译工程 make build # 直接编译工程一般会出错,因为go.mod制定的版本与sdk版本不对应导致
- 推荐在已经做好的device-template上做工程修改来开发
3)RESTful API 介绍与使用
EdgeX Foundry 各个微服务都提供了相应的 RESTful API 接口供我们调用,我们可以通过这些接口进行设备注册、推送客户端注册、数据(日志、事件、配置...)查看等等操作。
-
接口调用
- 开发测试时,可以使用 Postman 工具发送请求调用接口。
-
导入接口文件
-
EdgeX Foundry 接口十分丰富,如果都要在 Postman 这边一个个手动输入会十分麻烦。官方准备好了 raml 接口描述文档,直接导入 Post 中使用即可。
-
到其 GitHub 主页(点击跳转),将源码下载到本地,其中 raml 接口描述文档就在 api/raml 文件夹中。
$ ls github.com/edgexfoundry/edgex-go/api/raml/ core-command.raml core-metadata.raml support-notifications.raml system-agent.raml core-data.raml support-logging.raml support-scheduler.raml
-
打开 Postman,点击左上方的 Import 按钮。将前面下载下来的 raml 文件拖入弹出框中,即可完成导入。
-
导入后我们切换到 Collections 选项卡,可以看到这里已经有所有的接口了。我们双击任意一接口,右侧则自动填写好相关内容方便我们调用。
-
-
将localhost修改为目标设备ip地址,可以远程访问其他主机的docker compose微服务
-
3.应用服务开发
https://docs.edgexfoundry.org/1.2/microservices/application/Ch-ApplServices/