概述
本文講述如何在樹莓派3B+上通過docker拉取鏡像,并運行edgex 微服務,達到在樹莓派3B+上完成edgex-device-random測試的目標
Edgex Foundry 簡介
EdgeX Foundry 旨在創建一個通用的、開源的、廠商中立的邊緣計算軟件平臺。所謂邊緣就是與物理世界的設備、傳感器、執行器等物聯網設備直接交互的網絡端。EdgeX 平臺幫助、鼓勵快速發展的物聯網解決方案提供商在一個可互操作的模塊組件生態中互相合作。
1.準備工作
準備一個樹莓派3b+開發板,一個空的u盤,一個空的32g SD卡,樹莓派配套用的顯示器、鼠標、鍵盤等外設。
2.安裝系統
①在EdgeX官網下載為樹莓派定制的Ubuntu Linux 18.10(64 bit)系統。(這里也提供一個該文件的百度網盤的下載鏈接:鏈接:https://pan.baidu.com/s/1zwfCATkIuo3X9QHOoUGGtg 提取碼:u67a)下載文件如下圖所示(此系統已經包含了docker-compose組件,組件在/usr/local/bin文件夾下,驗證是否安裝好可在終端輸入:docker-compose version進行查看)。
②將準備好的u盤進行格式化,格式化類型選擇FAT32(一定要是這個類型?。》駝t沒有反應,不要問為什么,因為在這個坑里待了很久。?? 哭臉.jpg)。格式化之后,將下載好的usb_installer.zip文件的內容解壓至u盤中,u盤中的解壓完畢的內容,如下圖所示。
③將準備好的SD卡也進行格式化,格式化類型選擇FAT32(一定要是這個類型!?。?。
④將u盤與SD卡插入樹莓派開發板,并為樹莓派開發板插上配套的鼠標、鍵盤、顯示器等外設。確認所有接口都插牢固后,再給樹莓派開發板供電。
⑤供電之后需等待10秒左右,樹莓派開發板就會自動的安裝u盤里的系統。在系統的安裝過程中,按照系統的要求一步步“繼續”即可。(和正常的Ubuntu系統安裝沒什么區別)在完成所有的安裝操作后,樹莓派會通過SD卡中的系統再次重啟。
3.安裝docker
?????? Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中。EdgeX的微服務封裝在Docker容器中,在部署EdgeX服務的時候只需要在本地拉取EdgeX微服務的鏡像,并在本地運行即可。
安裝步驟如下:
①? 在/etc/apt/文件夾下,終端輸入:
sudo chmod 777 sources.list? ? ? //修改文件的操作權限
②先用系統自帶的文本編輯器將/etc/apt/sources.list文件中 cn.ports.ubuntu.com修改為mirrors.tuna.tsinghua.edu.cn???? //將軟件源替換為清華鏡像源
③替換為軟件源之后,先更新系統軟件源。
sudo apt-get update???? //更新軟件源
④ 安裝docker,因為安裝的系統已經將docker的軟件安裝源添加,所以直接安裝就可以
sudo apt-get install docker-ce??
⑤ 將非root用戶加入docker用戶組省去sudo
sudo usermod -aG docker $USER?
⑥?檢查docker版本號
docker? version?????????
Ps:這里推薦幾個一鍵安裝docker的腳本(任選其一使用),如果已經成功了安裝docker就不需要了:
腳本一:
curl –sSL https://get.docker.com/ | sh
腳本二:
curl -sSL https://get.daocloud.io/docker | sh
腳本三:
curl -sSL https://get.docker.com | bash –s docker –mirror Aliyun
由于國內訪問直接訪問Docker hub網速比較慢,拉取鏡像的時間就會比較長。一般我們會使用鏡像加速或者直接從國內的一些平臺鏡像倉庫上拉取,這里使用daocloud加速器:在docker安裝好之后,終端輸入:
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
然后需要重啟docker服務,在終端輸入:
sudo systemctl restart docker.service
該腳本可以將 --registry-mirror 加入到你的Docker 配置文件 /etc/docker/daemon.json 中。適用于 Ubuntu14.04、Debian、CentOS6、CentOS7、Fedora、Arch Linux、openSUSE Leap 42.1,其他版本可能有細微不同。
4.部署EdgeX
參照Edgex官網下的安裝步驟安裝,在官網下載最新的docker-compose文件,并將其文件名稱修改為docker-compose.yml保存在本地目錄中下。注意:官網提供的docker-compose.yml文件中拉取的鏡像是amd/X86架構的,并不適合在樹莓派的arm64位上運行,要對docker-compose.yml文件進行部分修改,主要修改部分是將拉取的鏡像替換為arm64的鏡像,修改方法如下:
1.將
image: edgexfoundry/docker-edgex-volume:0.6.0
修改為:
image:edgexfoundry/docker-edgex-volume-arm64:0.8.0
2.將
image: consul:1.1.0
修改為:
image:arm64v8/consul:1.1.0
3. 將
image: edgexfoundry/docker-core-config-seed-go:0.7.1
修蓋為:
image: edgexfoundry/docker-core-config-seed-go-arm64:0.7.1
4. 將
image: edgexfoundry/docker-edgex-mongo:0.6.0
修改為:
image:edgexfoundry/docker-edgex-mongo-arm64:0.8.0
5.將
image: edgexfoundry/docker-support-logging-go:0.7.1
修改為:
??? image:edgexfoundry/docker-support-logging-go-arm64:0.7.1
6. 將
image: edgexfoundry/docker-support-notifications-go:0.7.1
修改為:
image:edgexfoundry/docker-support-notifications-go-arm64:0.7.1
7. 將
image: edgexfoundry/docker-core-metadata-go:0.7.1
修改為:
image:edgexfoundry/docker-core-metadata-go-arm64:0.7.1
8. 將
image: edgexfoundry/docker-core-data-go:0.7.1
修改為:
image:edgexfoundry/docker-core-data-go-arm64:0.7.1
9. 將
image: edgexfoundry/docker-core-command-go:0.7.1
修改為:
image:edgexfoundry/docker-core-command-go-arm64:0.7.1
10. 將
image: edgexfoundry/docker-support-scheduler-go:0.7.1
修改為:
image:edgexfoundry/docker-support-scheduler-go-arm64:0.7.1
11. 將
image: edgexfoundry/docker-export-client-go:0.7.1
修改為:
image:edgexfoundry/docker-export-client-go-arm64:0.7.1
12.將
image: edgexfoundry/docker-export-distro-go:0.7.1
修改為:
image:edgexfoundry/docker-export-distro-go-arm64:0.7.1
13.將
image: edgexfoundry/docker-support-rulesengine:0.7.0
修改為:
image:edgexfoundry/docker-support-rulesengine-arm64:0.7.0
14.將
image: edgexfoundry/docker-device-virtual:0.6.0
修改為:
image:edgexfoundry/docker-device-virtual-arm64:0.5.0
15.將
image: edgexfoundry/docker-device-random-go:0.7.1
修改為:
image:edgexfoundry/docker-device-random-go-arm64:0.7.1
16.將
image: edgexfoundry/docker-device-mqtt-go:0.7.1
修改為:
image:edgexfoundry/docker-device-mqtt-arm64:0.5.0
17.將
image: edgexfoundry/docker-device-modbus-go:0.7.1
修改為:
image:edgexfoundry/docker-device-modbus-go-arm64:0.7.1
18.將
image: nexus3.edgexfoundry.org:10004/docker-device-bluetooth:0.6.0
修改為:
image:edgexfoundry/docker-device-bluetooth-arm64:0.5.0
19.將
image: nexus3.edgexfoundry.org:10004/docker-device-bacnet:0.6.0
修改為:
image:edgexfoundry/docker-device-bacnet-arm64:0.5.0
20.將
image: edgexfoundry/docker-edgex-ui-go:0.1.1
修改為:
image:edgexfoundry/docker-edgex-ui-go-arm64:0.1.1
21.將
image:? portainer/portainer
修改為:
image:? portainer/portainer:linux-arm64
有個別的幾個鏡像沒有arm64的,但是不影響Edgex的核心服務。大家也可去docker hub搜索Edgexfoundry的arm64的container,可能會有更新。此處提供一個arm64鏡像的docker-compose.yml文件供參考。下載地址如下:
鏈接:https://pan.baidu.com/s/1PF9ISFUlUFJRIvtZs3_4mA
提取碼:8cry
首先,在docker-compose.yml所在的文件處,打開終端輸入以下命令從Docker Hub下載EdgeX Foundry 的Docker鏡像:
docker-compose pull
然后啟動所有EdgeX Foundry微服務:
docker-composeup –d
正常執行后界面如下:
最后,驗證EdgeX容器是否已全部啟動:
docker-compose ps
正常啟動后界面如下:
注意:edgex config seed微服務的state顯示Exit 0表示正常退出,因為config seed只是初始化關聯的服務然后退出。
5.demo運行
?????? EdgeXFoundry提供隨機數設備服務(Random Number Device Service),該服務可用于測試,它在可配置范圍內返回一個隨機數。運行此服務的配置包含在docker-compose.yml文件中,但默認情況下處于禁用狀態。
5.1連接設備
要啟用隨機數設備服務,請在docker-compose.yml中取消注釋以下行:
??device-random:
???image: edgexfoundry/docker-device-random-go-arm64:0.7.1
???ports:
?????- "49988:49988"
???container_name: edgex-device-random
???hostname: edgex-device-random
???networks:
?????- edgex-network
???volumes:
?????- db-data:/data/db
?????- log-data:/edgex/logs
?????- consul-config:/consul/config
?????- consul-data:/consul/data
???depends_on:
?????- data
?????- command
然后,您可以啟動隨機設備服務:
docker-compose up -d device-random
設備服務將自動注冊名為Random-Integer-Generator01的設備,該設備將開始將其隨機數讀數發送到EdgeX。您可以通過查詢EdgeX Logging服務來驗證是否正在發送這些讀數:
curl http:// localhost:48080 / api / v1 / event /device / Random-Integer-Generator01 / 10
5.2控制設備
我們不能直接在設備上調用命令,而是使用EdgeX Foundry Command Service來執行此操作。 第一步是通過向Command服務詢問您的設備來檢查可以調用哪些命令,返回的json文件格式大致如下:
{
"id": "5ca3475e9f8fc200010fd6a1",
"name": "Random-Integer-Generator01",
"adminState": "UNLOCKED",
"operatingState": "ENABLED",
"lastConnected": 0,
"lastReported": 0,
"labels": ["device-random-example"],
"location": null,
"commands": [{
"created": 1554204510191,
"modified": 0,
"origin": 0,
"id": "5ca3475e9f8fc200010fd69c",
"name": "GenerateRandomValue_Int8",
"get": {
"path": "/api/v1/device/{deviceId}/GenerateRandomValue_Int8",
"responses": [{
"code": "200",
"description": null,
"expectedValues": ["RandomValue_Int8"]
}, {
"code": "503",
"description": "service unavailable",
"expectedValues": []
}],
"url": "http://edgex-core-command:48082/api/v1/device/5ca3475e9f8fc200010fd6a1/command/5ca3475e9f8fc200010fd69c"
},
"put": {
"path": "/api/v1/device/{deviceId}/GenerateRandomValue_Int8",
"responses": [{
"code": "200",
"description": null,
"expectedValues": []
}, {
"code": "503",
"description": "service unavailable",
"expectedValues": []
}],
"parameterNames": ["Min_Int8", "Max_Int8"],
"url": "http://edgex-core-command:48082/api/v1/device/5ca3475e9f8fc200010fd6a1/command/5ca3475e9f8fc200010fd69c"
}
}
注意:URL對每個設備來說不完全相同,因為設備和命令生成的唯一ID將不同。 因此,請務必將您的值用于以下步驟。
您會注意到這一個命令同時具有get和put選項。get調用將返回一個隨機數,并自動調用以將數據發送到EdgeX的其余部分。 您也可以使用提供的get的URL手動調用它(要將get的URL中的/edgex-core-command替換為localhost):
Curl http://localhost:48082/api/v1/device/5ca3475e9f8fc200010fd6a1/command/5ca3475e9f8fc200010fd69c
此命令將返回如下所示的JSON結果:
{
"id": "",
"pushed": 0,
"device": "Random-Integer-Generator01",
"created": 0,
"modified": 0,
"origin": 1554371806210,
"schedule": null,
"event": null,
"readings": [{
??? "id": "",
??? "pushed": 0,
??? "created": 0,
??? "origin": 1554371806210,
??? "modified": 0,
??? "device": "Random-Integer-Generator01",
??? "name": "RandomValue_Int8",
??? "value": "125"
}]
}
此讀數的默認范圍是-128到127.我們可以通過調用命令將讀數的默認范圍進行修改,將其限制為0到100之間的正值:
curl -X PUT-d '[
??? {"Min_Int8": "0","Max_Int8": "100"}
]' http://localhost:48082/api/v1/device/5ca3475e9f8fc200010fd6a1/command/5ca3475e9f8fc200010fd69c
現在,每當我們調用get命令時,返回的值將介于0和100之間。
至此,表示已經成功地將Edgex的微服務部署在樹莓派3B+上。在這里要感謝魏學長的幾個關鍵部分的指導,哈哈哈哈 @不講道理的魏同學
Ps:部署Edgex微服務到嵌入式開發板上是第一步,最重要的如何將微服務與實際的應用場景結合,這就需要各位開拓自己的思維。