[TOC]
https://docs.edgexfoundry.org/
一痕惋、EdgeX簡介
EdgeX Foundry是由Linux Foundation托管的與供應(yīng)商無關(guān)的開源平臺(tái)区宇,為工業(yè)IoT 邊緣計(jì)算提供了通用框架。核心是一組松散耦合的微服務(wù)值戳,這些微服務(wù)組織在不同的層中议谷。
1.EdgeX的構(gòu)思宗旨
- EdgeX Foundry必須與平臺(tái)無關(guān)
- 硬件操作系統(tǒng)(Linux,Windows等)分發(fā)-必須允許通過邊緣堕虹,網(wǎng)關(guān)卧晓,霧中,云等上的微服務(wù)分發(fā)功能赴捞。協(xié)議和傳感器無關(guān)禀崖。
- EdgeX Foundry必須非常靈活
- 平臺(tái)的任何部分都可以由其他微服務(wù)或軟件組件進(jìn)行升級(jí)、替換或增強(qiáng)螟炫,允許服務(wù)根據(jù)設(shè)備功能和用例進(jìn)行擴(kuò)展和縮小
- EdgeX Foundry必須提供存儲(chǔ)和轉(zhuǎn)發(fā)功能(以支持?jǐn)嚅_連接/遠(yuǎn)程的邊緣系統(tǒng))
- EdgeX Foundry必須支持設(shè)備/傳感器現(xiàn)場部署 ,必須安全且易于管理艺晴。
2.EdgeX的服務(wù)層
? EdgeX Foundry是開源微服務(wù)的集合昼钻。這些微服務(wù)分為4個(gè)服務(wù)層和2個(gè)基礎(chǔ)增強(qiáng)系統(tǒng)服務(wù)。服務(wù)層從設(shè)備服務(wù)層的物理領(lǐng)域的邊緣遍歷到出口服務(wù)層的信息領(lǐng)域的邊緣封寞,核心服務(wù)層為中心然评。
EdgeX Foundry的4個(gè)服務(wù)層:
- 輸出服務(wù)層(Export Services)
- 允許外部服務(wù)(第三方應(yīng)用)在EdgeX內(nèi)注冊為來自核心的數(shù)據(jù)的接收者。
- EdgeX Foundry 可以長時(shí)間獨(dú)立于云平臺(tái)運(yùn)行狈究,無需連接到“北側(cè)”系統(tǒng)碗淌。當(dāng)需要把邊緣數(shù)據(jù)和智能分析輸送到云平臺(tái)時(shí),這項(xiàng)工作將在本層執(zhí)行。
- 支持服務(wù)層(Supporting Services)
- 涵蓋大量的微服務(wù)(提示和通知亿眠、日志記錄碎罚、調(diào)度、規(guī)則引擎)纳像,提供邊緣分析和智能荆烈。
- 核心服務(wù)層(Core Services)
- 注冊表和配置(Configuration and Registration):為其他 EdgeX Foundry 微服務(wù)提供關(guān)于 EdgeX Foundry 內(nèi)相關(guān)服務(wù)的信息,包括微服務(wù)配置屬性竟趾。
- 核心數(shù)據(jù)(Core Data):一個(gè)持久性存儲(chǔ)庫和相關(guān)的管理服務(wù)憔购,用于從南側(cè)對象收集的數(shù)據(jù)。
- 元數(shù)據(jù)(Metadata):提供配置新設(shè)備并將其與自己的設(shè)備服務(wù)配對的功能岔帽。
- 命令(Command):處理北向應(yīng)用發(fā)往南向設(shè)備的請求玫鸟;還會(huì)處理框架內(nèi)其他微服務(wù)發(fā)往南向設(shè)備的請求藐窄,如本地的分析服務(wù)生蚁。
- 設(shè)備服務(wù)層(Device Services)
- 本層負(fù)責(zé)與邊緣設(shè)備進(jìn)行交互晓勇,可以同時(shí)為多個(gè)設(shè)備進(jìn)行服務(wù)毫捣。
- DS層將由IoT對象生成和傳遞的數(shù)據(jù)轉(zhuǎn)換為通用的EdgeX Foundry數(shù)據(jù)結(jié)構(gòu)棺亭,并將轉(zhuǎn)換后的數(shù)據(jù)發(fā)送到CoreX服務(wù)皮璧,以及EdgeX Foundry的其他層中的其他微服務(wù)版述。
EdgeX Foundry的2個(gè)基礎(chǔ)系統(tǒng)服務(wù):
- 安全(Security)
- EdgeX Foundry 內(nèi)部和外部的安全部件几蜻,保護(hù)由 EdgeX Foundry 管理的設(shè)備铸本、傳感器肮雨、和其他 IoT 對象的數(shù)據(jù)和控制命令安全。
- 系統(tǒng)管理(Device + System Management)
- 提供安裝箱玷、升級(jí)怨规、啟動(dòng)、停止和監(jiān)控 EdgeX Foundry 微服務(wù)锡足、BIOS 固件波丰、操作系統(tǒng)和其他網(wǎng)關(guān)軟件等功能。
3.通信方向定義
定義:“南側(cè)”和“北側(cè)”
南側(cè):物理領(lǐng)域內(nèi)以及與這些設(shè)備舶得、傳感器掰烟、執(zhí)行器和其他IoT對象直接通信并從中收集數(shù)據(jù)的網(wǎng)絡(luò)邊緣中的所有IoT對象統(tǒng)稱為“南側(cè)”。
北側(cè):收集沐批、存儲(chǔ)纫骑、聚集、分析和轉(zhuǎn)換為信息的云(或企業(yè)系統(tǒng))九孩,并且與云進(jìn)行通信的網(wǎng)絡(luò)部分稱為網(wǎng)絡(luò)的“北側(cè)” 先馆。
EdgeX使數(shù)據(jù)可以根據(jù)需要和指示“向北”、“向南”或橫向發(fā)送躺彬。
4.平臺(tái)要求
- 內(nèi)存:至少1 GB
- 硬盤空間:至少需要3 GB的空間來運(yùn)行EdgeX Foundry容器煤墙,但是您可能需要更多空間梅惯,具體取決于傳感器和設(shè)備數(shù)據(jù)將保留多長時(shí)間。
- 操作系統(tǒng):EdgeX Foundry已在許多系統(tǒng)上成功運(yùn)行仿野,包括但不限于以下系統(tǒng)
- Windows(版本7-10)
- Ubuntu桌面(版本14-16)
- Ubuntu Server(版本14)
- Ubuntu Core(版本16)
- Mac OS X 10
5.EdgeX 微服務(wù)部署場景
第一種部署場景铣减,現(xiàn)場靠近設(shè)備側(cè)部署設(shè)備服務(wù),用于采集設(shè)備數(shù)據(jù)和執(zhí)行控制命令设预。核心服務(wù)徙歼、分析服務(wù)和導(dǎo)出服務(wù)則部署在云端。
第二種部署場景:現(xiàn)場靠近設(shè)備側(cè)部署設(shè)備服務(wù)鳖枕,其余服務(wù)部署在網(wǎng)關(guān)上魄梯,網(wǎng)關(guān)將數(shù)據(jù)再發(fā)送到云端。
第三種部署場景:設(shè)備服務(wù)宾符、核心服務(wù)酿秸、導(dǎo)出服務(wù)和分析服務(wù)都部署在邊緣側(cè)。
第四種部署場景:設(shè)備服務(wù)和核心服務(wù)部署在網(wǎng)關(guān)上魏烫,導(dǎo)出服務(wù)和分析服務(wù)部署在霧計(jì)算節(jié)點(diǎn)上辣苏,分析后的數(shù)據(jù)由霧計(jì)算節(jié)點(diǎn)發(fā)送到云端。
第五種部署場景:設(shè)備服務(wù)部署在現(xiàn)場嵌入式單片機(jī)上哄褒,核心服務(wù)稀蟋、分析服務(wù)和導(dǎo)出服務(wù)部署在霧計(jì)算節(jié)點(diǎn)上,霧計(jì)算節(jié)點(diǎn)再連到云端呐赡。
二退客、EdgeX使用
EdgeX Foundry是十幾個(gè)微服務(wù)的集合,這些服務(wù)被部署為提供最小的邊緣平臺(tái)功能链嘀∶瓤瘢可以下載EdgeX Foundry微服務(wù)源代碼并將其內(nèi)置到部署工件中。
用戶可以使用更簡單的選項(xiàng)來使用Docker并在微服務(wù)Docker容器中運(yùn)行EdgeX Foundry怀泊。隨著新代碼被檢入源存儲(chǔ)庫茫藏,EdgeX Foundry微服務(wù)會(huì)自動(dòng)構(gòu)建并打包。
1.獲取并運(yùn)行EdgeX Foundry
-
安裝Docker和Docker Compose
-
安裝Docker Compose:用于定義和運(yùn)行多容器Docker應(yīng)用程序的工具霹琼。通過Compose务傲,可以使用YAML文件來配置應(yīng)用程序的服務(wù)。然后使用一個(gè)命令枣申,就可以從配置中創(chuàng)建并啟動(dòng)所有服務(wù)树灶。
# 基于ubuntu x86_64 # 下載Docker Compose的當(dāng)前穩(wěn)定版本 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微服務(wù)的清單,向Docker / Docker Compose指定了所需的容器以及如何運(yùn)行這些容器泊窘。
- 需要下載的Docker容器映像
- 容器啟動(dòng)的順序
- 運(yùn)行容器的參數(shù)
-
EdgeX Foundry Docker Compose文件的集合
- docker-compose.yml文件將從Docker Hub提取最新的帶標(biāo)簽EdgeX微服務(wù)熄驼。
- docker-compose命令說明
- 安裝Docker和Docker Compose之后,需要Docker Compose文件糯而,該文件是所有EdgeX Foundry微服務(wù)的清單,向Docker / Docker Compose指定了所需的容器以及如何運(yùn)行這些容器泊窘。
-
運(yùn)行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 # 安裝并啟動(dòng)EdgeX sudo docker-compose up -d # -d 后臺(tái)運(yùn)行容器 # 查看所有容器運(yùn)行狀況 sudo docker-compose ps # 顯示容器日志 docker-compose logs -f [compose-contatainer-name] # 停止容器 sudo docker-compose stop # 啟動(dòng)容器 sudo docker-compose start # 停止和刪除所有容器 sudo docker-compose down
-
基礎(chǔ)微服務(wù)Ping檢查
每個(gè)EdgeX Foundry微服務(wù)均已構(gòu)建為響應(yīng)“ ping” HTTP請求像寒。EdgeX Foundry微服務(wù)容器運(yùn)行后,可以“ ping”任何一個(gè)微服務(wù)以檢查其是否正在運(yùn)行瓜贾。
-
打開瀏覽器或HTTP REST客戶端工具(PostMan)诺祸,然后使用服務(wù)的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微服務(wù)都會(huì)在Consul注冊表中注冊,在本機(jī)瀏覽器訪問:http://localhost:8500/ui.
image
-
2.測試docker device service
測試docker compose的隨機(jī)數(shù)設(shè)備服務(wù)
1)開啟設(shè)備服務(wù)
修改docker-compose.yml 文件祭芦,打開device-random 設(shè)備服務(wù)
#################################################################
# 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
重新啟動(dòng)服務(wù):sudo docker-compose up -d
2)測試設(shè)備服務(wù)
-
通過RESTful API 查找平臺(tái)啟動(dòng)的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這個(gè)service包含Random-Boolean-Device筷笨、Random-Integer-Device、 Random-Integer-Generator01等多個(gè)設(shè)備
- Random-Integer-Generator01設(shè)備有 GenerateRandomValue_Int8龟劲、GenerateRandomValue_Int16胃夏、GenerateRandomValue_Int32這 3 種屬性
- device-random這個(gè)service包含Random-Boolean-Device筷笨、Random-Integer-Device、 Random-Integer-Generator01等多個(gè)設(shè)備
-
控制設(shè)備
通過命令微服務(wù)(Command Service)檢查到設(shè)備可以調(diào)用的設(shè)備屬性,使用put或get其url值讀取或設(shè)置設(shè)備參數(shù)
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數(shù)據(jù)推送
EdgeX Foundry 除了接受端設(shè)備的數(shù)據(jù)外昌跌,還可以將數(shù)據(jù)推送到各種云服務(wù)上仰禀,例如將獲取到的隨機(jī)數(shù)據(jù)推送到 MQTT 服務(wù)器上。
三蚕愤、EdgeX開發(fā)
https://docs.edgexfoundry.org/1.2/getting-started/Ch-GettingStartedDevelopers/
開發(fā)EdgeX Foundry微服務(wù)所需軟件
MongoDB:EdgeX Foundry使用MongoDB作為傳感器數(shù)據(jù)以及有關(guān)所連接設(shè)備/傳感器的元數(shù)據(jù)的持久性機(jī)制答恶。(在edgex docker-compose已經(jīng)包含,可忽略)
Redis:備用開源(BSD許可)數(shù)據(jù)庫萍诱,可以與EdgeX一起使用悬嗓,代替MongoDB進(jìn)行許多服務(wù)。(備用數(shù)據(jù)庫裕坊,可忽略)
-
ZeroMQ:一些EdgeX Foundry服務(wù)依賴ZeroMQ進(jìn)行通信包竹。
# 安裝 # 下載腳本https://gist.github.com/katopz/8b766a5cb0ca96c816658e9407e83d00 sudo bash setup-zeromq.sh
1.EdgeX Foundry-Go開發(fā)
EdgeX Foundry的開源微服務(wù)是用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
-
構(gòu)建在edgex-go中找到的現(xiàn)有服務(wù)
cd $GOPATH/src/github.com/edgexfoundry/ git clone https://github.com/edgexfoundry/edgex-go.git cd edgex-go # 使用提供的Makefile在一個(gè)調(diào)用中構(gòu)建所有服務(wù) make build # 成功構(gòu)建服務(wù)碍庵,并啟動(dòng)數(shù)據(jù)庫并運(yùn)行后映企,運(yùn)行Core的Go服務(wù) make run
-
驗(yàn)證EdgeX是否正常工作
curl http://localhost:48080/api/v1/ping pong
-
測試EdgeX設(shè)備微服務(wù)
edgex-go只運(yùn)行核心服務(wù),并不會(huì)收集任何傳感器數(shù)據(jù)静浴。為了使傳感器數(shù)據(jù)流入EdgeX核心服務(wù)堰氓,需要以類似的方式獲取、構(gòu)建和運(yùn)行EdgeX設(shè)備服務(wù)苹享。
-
參考示例: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 微服務(wù)沖突 # 確保EdgeX Foundry docker-compose 微服務(wù)已啟動(dòng)双絮,再運(yùn)行設(shè)備微服務(wù) $ 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設(shè)備微服務(wù)與EdgeX服務(wù)層的微服務(wù)地位是平等的,各個(gè)微服務(wù)之間是通過網(wǎng)絡(luò)進(jìn)行通信得问。
2.混合環(huán)境開發(fā)
https://docs.edgexfoundry.org/1.2/getting-started/Ch-GettingStartedHybrid/
為所需的所有微服務(wù)下載并運(yùn)行EdgeX Docker容器囤攀,并從所選的開發(fā)人員工具中運(yùn)行單個(gè)微服務(wù),并通過適當(dāng)?shù)牡刂肥蛊渲赶蚱渌⒎?wù)宫纬。
-
運(yùn)行最小EdgeX環(huán)境所需的微服務(wù)
- Volume
- Consul
- Config-seed
- Mongo
- Core Data
- Core Metadata
- Core Command
- Support Logging
- Support Notifications
-
在Go Land中獲取并運(yùn)行代碼
-
將設(shè)備微服務(wù)device-xxx-go項(xiàng)目導(dǎo)入Go Land
- go項(xiàng)目的主機(jī)環(huán)境配置文件是cmd/device-xxx/res/configuration.toml
- go項(xiàng)目的docker環(huán)境的配置文件是cmd/device-xxx/res/docker/configuration.toml
- 在Docker中運(yùn)行的服務(wù)未在“ localhost”上運(yùn)行焚挠,它們在Docker Engine中運(yùn)行。Docker Engine的IP地址通常為172.17.0.1
-
運(yùn)行g(shù)o項(xiàng)目
cd device-sdk-go/example/cmd/device-simple # 修改ports $ vim res/configuration.toml - Port = 49990 + Port = 49991 # 不與EdgeX Foundry docker-compose 微服務(wù)沖突 # 確保EdgeX Foundry docker-compose 微服務(wù)已啟動(dòng)漓骚,再運(yùn)行設(shè)備微服務(wù) $ go run main.go
-
2.設(shè)備服務(wù)開發(fā)
https://docs.edgexfoundry.org/1.2/getting-started/Ch-GettingStartedSDK/
設(shè)備服務(wù)SDK可幫助開發(fā)人員快速為EdgeX創(chuàng)建新的設(shè)備連接器蝌衔,提供了每個(gè)設(shè)備服務(wù)所需的通用支架榛泛,開發(fā)人員可以專注于通過設(shè)備協(xié)議與設(shè)備進(jìn)行通信的特定代碼。
提供了通用的模板代碼來接收和響應(yīng)命令請求噩斟。
提供了通用代碼以幫助將來自傳感器的數(shù)據(jù)獲取到EdgeX Core Data中
設(shè)備服務(wù)SDK分為C SDK和Golang SDK
1)EdgeX C SDK
-
先決條件
- Linux主機(jī)
- 支持C11的GCC版本曹锨。
- CMake版本3或更高版本。
- 開發(fā)庫和頭文件:
- curl(版本7.32或更高版本)
- microhttpd(0.9版)
- libyaml(0.1.6版或更高版本)
- libcbor(版本0.5)
- libuuid(來自u(píng)til-linux v2.x)
-
安裝依賴
sudo apt install libcurl4-openssl-dev libmicrohttpd-dev libyaml-dev libcbor-dev
-
獲取構(gòu)建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
-
開發(fā)新的設(shè)備服務(wù)項(xiàng)目
cd $GOPATH/src/github.com/edgexfoundry/ # 新設(shè)備服務(wù)的名稱是為設(shè)備服務(wù)的名稱添加前綴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 # 創(chuàng)建初始模塊定義并將其寫入go.mod文件 GO111MODULE=on go mod init # 編譯工程 make build # 直接編譯工程一般會(huì)出錯(cuò)剃允,因?yàn)間o.mod制定的版本與sdk版本不對應(yīng)導(dǎo)致
- 推薦在已經(jīng)做好的device-template上做工程修改來開發(fā)
3)RESTful API 介紹與使用
EdgeX Foundry 各個(gè)微服務(wù)都提供了相應(yīng)的 RESTful API 接口供我們調(diào)用沛简,我們可以通過這些接口進(jìn)行設(shè)備注冊、推送客戶端注冊斥废、數(shù)據(jù)(日志椒楣、事件、配置...)查看等等操作营袜。
-
接口調(diào)用
- 開發(fā)測試時(shí)撒顿,可以使用 Postman 工具發(fā)送請求調(diào)用接口。
-
導(dǎo)入接口文件
-
EdgeX Foundry 接口十分豐富荚板,如果都要在 Postman 這邊一個(gè)個(gè)手動(dòng)輸入會(huì)十分麻煩凤壁。官方準(zhǔn)備好了 raml 接口描述文檔,直接導(dǎo)入 Post 中使用即可跪另。
-
到其 GitHub 主頁(點(diǎn)擊跳轉(zhuǎn))拧抖,將源碼下載到本地,其中 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唧席,點(diǎn)擊左上方的 Import 按鈕。將前面下載下來的 raml 文件拖入彈出框中嘲驾,即可完成導(dǎo)入淌哟。
-
導(dǎo)入后我們切換到 Collections 選項(xiàng)卡,可以看到這里已經(jīng)有所有的接口了辽故。我們雙擊任意一接口徒仓,右側(cè)則自動(dòng)填寫好相關(guān)內(nèi)容方便我們調(diào)用。
-
將localhost修改為目標(biāo)設(shè)備ip地址誊垢,可以遠(yuǎn)程訪問其他主機(jī)的docker compose微服務(wù)
-
3.應(yīng)用服務(wù)開發(fā)
https://docs.edgexfoundry.org/1.2/microservices/application/Ch-ApplServices/