概述
本文讲述如何在树莓派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(一定要是这个类型!!否则没有反应,不要问为什么,因为在这个坑里待了很久。 哭脸.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微服务到嵌入式开发板上是第一步,最重要的如何将微服务与实际的应用场景结合,这就需要各位开拓自己的思维。