可参考ubuntu环境在线安装Docker
根据官网指导,安装Docker Compose
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
$ wget https://raw.githubusercontent.com/edgexfoundry/developer-scripts/master/compose-files/docker-compose.yml
使用原来的镜像源可能速度比较慢,建议使用国内镜像源:
Docker 官方中国区:https://registry.docker-cn.com
网易:http://hub-mirror.c.163.com
中国科学技术大学:https://docker.mirrors.ustc.edu.cn
先修改/etc/docker/daemon.json:
$ vi /etc/docker/daemon.json
添加如下内容:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
重新加载守护进程,然后重启docker:
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
可查看Registry Mirrors修改是否生效:
$ sudo docker info
切换完镜像源后下载镜像:
$ sudo docker-compose pull
下载的时候经常会在某个状态卡住,多次尝试未果后选择科学上网瞬间搞定了>o<:
Pulling volume ... done
Pulling consul ... done
Pulling config-seed ... done
Pulling mongo ... done
Pulling logging ... done
Pulling notifications ... done
Pulling metadata ... done
Pulling data ... done
Pulling command ... done
Pulling scheduler ... done
Pulling export-client ... done
Pulling export-distro ... done
Pulling rulesengine ... done
Pulling device-virtual ... done
Pulling portainer ... done
镜像安装可参考github上提供的其他方法
$ sudo docker-compose up -d
因为网络问题反复执行了好几次才没报错:
edgex-files is up-to-date
edgex-support-rulesengine is up-to-date
Starting edgex_portainer_1 ...
edgex-core-consul is up-to-date
Starting edgex-config-seed ...
Starting edgex-config-seed ... done
edgex-support-logging is up-to-date
edgex-core-data is up-to-date
edgex-core-metadata is up-to-date
edgex-support-notifications is up-to-date
edgex-export-client is up-to-date
edgex-core-command is up-to-date
edgex-support-scheduler is up-to-date
Starting edgex_portainer_1 ... done
edgex-device-virtual is up-to-date
$ sudo docker-compose ps
返回如下结果:
Name Command State Ports
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
edgex-config-seed /bin/sh -c /edgex/cmd/conf ... Exit 0
edgex-core-command /core-command --consul --p ... Up 0.0.0.0:48082->48082/tcp
edgex-core-consul docker-entrypoint.sh agent ... Up 8300/tcp, 8301/tcp, 8301/udp, 8302/tcp, 8302/udp, 0.0.0.0:8400->8400/tcp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8600->8600/tcp, 8600/udp
edgex-core-data /core-data --consul --prof ... Up 0.0.0.0:48080->48080/tcp, 0.0.0.0:5563->5563/tcp
edgex-core-metadata /core-metadata --consul -- ... Up 0.0.0.0:48081->48081/tcp, 48082/tcp
edgex-device-virtual /bin/sh -c java -jar -Djav ... Up 0.0.0.0:49990->49990/tcp
edgex-export-client /export-client --consul -- ... Up 0.0.0.0:48071->48071/tcp
edgex-export-distro /export-distro --consul -- ... Up 0.0.0.0:48070->48070/tcp, 0.0.0.0:5566->5566/tcp
edgex-files /bin/sh -c /usr/bin/tail - ... Up
edgex-mongo docker-entrypoint.sh /bin/ ... Up 0.0.0.0:27017->27017/tcp
edgex-support-logging /support-logging --consul ... Up 0.0.0.0:48061->48061/tcp
edgex-support-notifications /support-notifications --c ... Up 0.0.0.0:48060->48060/tcp
edgex-support-rulesengine /bin/sh -c java -jar -Djav ... Up 0.0.0.0:48075->48075/tcp
edgex-support-scheduler /support-scheduler --consu ... Up 0.0.0.0:48085->48085/tcp
edgex_portainer_1 /portainer -H unix:///var/ ... Up 0.0.0.0:9000->9000/tcp
EdgeX Foundry提供了虚拟设备以便调试,默认关闭,可修改下载的docker-compose.yml,将如下内容的注释去掉:
device-random:
image: edgexfoundry/docker-device-random-go: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
$ sudo docker-compose up -d device-random
由于之前没有下载过虚拟设备的镜像,执行命令后会重新拉取该镜像:
Pulling device-random (edgexfoundry/docker-device-random-go:0.7.1)...
0.7.1: Pulling from edgexfoundry/docker-device-random-go
76ae2d597c16: Pull complete
Digest: sha256:fa3196f3075f579e105f313f0f9e1a3c6c40b31ce83967cdfa597a1208df41a3
Status: Downloaded newer image for edgexfoundry/docker-device-random-go:0.7.1
edgex-files is up-to-date
edgex-core-consul is up-to-date
edgex-mongo is up-to-date
Starting edgex-config-seed ... done
edgex-support-logging is up-to-date
Starting edgex-core-metadata ...
Starting edgex-core-metadata ... done
edgex-core-command is up-to-date
Creating edgex-device-random ... done
通过EdgeX提供的日志服务查看启动的Random-Integer-Generator01发送的数据:
$ curl http://localhost:48080/api/v1/event/device/Random-Integer-Generator01/10
启动虚拟设备微服务前,返回为[];启动后,能得到类似如下的发送信息:
[{"id":"5ce6b2020e360800014fbb98","pushed":0,"device":"Random-Integer-Generator01","created":1558622722001,"modified":0,"origin":1558622722001,"schedule":null,"event":null,"readings":[{"id":"5ce6b2020e360800014fbb99","pushed":0,"created":1558622722001,"origin":1558622722000,"modified":0,"device":"Random-Integer-Generator01","name":"RandomValue_Int16","value":"9162"}]}
EdgeX的北向可连接不同的云服务与应用,可通过MQTT broker验证EdgeX的北向数据。
$ curl -X POST -d '{
"name":"QuickStartExport",
"addressable":{
"name":"HiveMQBroker",
"protocol":"tcp",
"address":"broker.hivemq.com",
"port":1883,
"publisher":"EdgeXExportPublisher",
"topic":"EdgeXQuickStartGuide"
},
"format":"JSON",
"filter":{
"deviceIdentifiers":["Random-Integer-Generator01"]
},
"enable":true,
"destination":"MQTT_TOPIC"
}' http://localhost:48071/api/v1/registration
安装了MQTT client的话,可以直接通过命令行订阅设备发布的消息:
$ mosquitto_sub -h broker.hivemq.com -p 1883 -t EdgeXQuickStartGuide
可周期性接收到如下类似的信息:
{"id":"5ce6ba050e36080001cfa68a","pushed":0,"device":"Random-Integer-Generator01","created":1558624773002,"modified":0,"origin":1558624773001,"schedule":null,"event":null,"readings":[{"id":"5ce6ba050e36080001cfa68b","pushed":0,"created":1558624773002,"origin":1558624773001,"modified":0,"device":"Random-Integer-Generator01","name":"RandomValue_Int8","value":"104"}]}
{"id":"5ce6ba050e36080001cfa68c","pushed":0,"device":"Random-Integer-Generator01","created":1558624773002,"modified":0,"origin":1558624773001,"schedule":null,"event":null,"readings":[{"id":"5ce6ba050e36080001cfa68d","pushed":0,"created":1558624773002,"origin":1558624773001,"modified":0,"device":"Random-Integer-Generator01","name":"RandomValue_Int32","value":"411637861"}]}
{"id":"5ce6ba050e36080001cfa68e","pushed":0,"device":"Random-Integer-Generator01","created":1558624773003,"modified":0,"origin":1558624773001,"schedule":null,"event":null,"readings":[{"id":"5ce6ba050e36080001cfa68f","pushed":0,"created":1558624773003,"origin":1558624773001,"modified":0,"device":"Random-Integer-Generator01","name":"RandomValue_Int16","value":"2984"}]}
使用EdgeX不能直接给设备下发指令,需要统一通过指令微服务(Command Service)下发
$ curl http://localhost:48082/api/v1/device/name/Random-Integer-Generator01
执行后会返回如下的JSON数据:
{
"id": "5ce6b1fd9f8fc20001eef84e",
"name": "Random-Integer-Generator01",
"adminState": "UNLOCKED",
"operatingState": "ENABLED",
"lastConnected": 0,
"lastReported": 0,
"labels": ["device-random-example"],
"location": null,
"commands": [{
"created": 1558622717068,
"modified": 0,
"origin": 0,
"id": "5ce6b1fd9f8fc20001eef849",
"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/5ce6b1fd9f8fc20001eef84e/command/5ce6b1fd9f8fc20001eef849"
},
"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/5ce6b1fd9f8fc20001eef84e/command/5ce6b1fd9f8fc20001eef849"
}
}, {
"created": 1558622717072,
"modified": 0,
"origin": 0,
"id": "5ce6b1fd9f8fc20001eef84a",
"name": "GenerateRandomValue_Int16",
"get": {
"path": "/api/v1/device/{deviceId}/GenerateRandomValue_Int16",
"responses": [{
"code": "200",
"description": null,
"expectedValues": ["RandomValue_Int16"]
}, {
"code": "503",
"description": "service unavailable",
"expectedValues": []
}],
"url": "http://edgex-core-command:48082/api/v1/device/5ce6b1fd9f8fc20001eef84e/command/5ce6b1fd9f8fc20001eef84a"
},
"put": {
"path": "/api/v1/device/{deviceId}/GenerateRandomValue_Int16",
"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/5ce6b1fd9f8fc20001eef84e/command/5ce6b1fd9f8fc20001eef84a"
}
}, {
"created": 1558622717073,
"modified": 0,
"origin": 0,
"id": "5ce6b1fd9f8fc20001eef84b",
"name": "GenerateRandomValue_Int32",
"get": {
"path": "/api/v1/device/{deviceId}/GenerateRandomValue_Int32",
"responses": [{
"code": "200",
"description": null,
"expectedValues": ["RandomValue_Int32"]
}, {
"code": "503",
"description": "service unavailable",
"expectedValues": []
}],
"url": "http://edgex-core-command:48082/api/v1/device/5ce6b1fd9f8fc20001eef84e/command/5ce6b1fd9f8fc20001eef84b"
},
"put": {
"path": "/api/v1/device/{deviceId}/GenerateRandomValue_Int32",
"responses": [{
"code": "200",
"description": null,
"expectedValues": []
}, {
"code": "503",
"description": "service unavailable",
"expectedValues": []
}],
"parameterNames": ["Min_Int32", "Max_Int32"],
"url": "http://edgex-core-command:48082/api/v1/device/5ce6b1fd9f8fc20001eef84e/command/5ce6b1fd9f8fc20001eef84b"
}
}]
}
容器外,需要使用宿主机地址去访问URL,URL后半部分内容与之前的json内容保持一致:
$ curl http://localhost:48082/api/v1/device/5ce6b1fd9f8fc20001eef84e/command/5ce6b1fd9f8fc20001eef84b
执行后会返回如下的JSON数据:
{
"id": "",
"pushed": 0,
"device": "Random-Integer-Generator01",
"created": 0,
"modified": 0,
"origin": 1558626326372,
"schedule": null,
"event": null,
"readings": [{
"id": "",
"pushed": 0,
"created": 0,
"origin": 1558626326372,
"modified": 0,
"device": "Random-Integer-Generator01",
"name": "RandomValue_Int32",
"value": "1225254283"
}]
}
虚拟设备默认数据范围是 Min_Int32 ~ Max_Int32,现在使用指令微服务中的put方法修改为0 ~ 100:
$ curl -X PUT -d '[ {"Min_Int32": "0", "Max_Int32": "100"} ]' http://localhost:48082/api/v1/device/5ce6b1fd9f8fc20001eef84e/command/5ce6b1fd9f8fc20001eef84b
手动查看设备上报的结果
$ curl http://localhost:48082/api/v1/device/5ce6b1fd9f8fc20001eef84e/command/5ce6b1fd9f8fc20001eef84b
可见随机值在0 ~ 100之间:
{"id":"","pushed":0,"device":"Random-Integer-Generator01","created":0,"modified":0,"origin":1558627626973,"schedule":null,"event":null,"readings":[{"id":"","pushed":0,"created":0,"origin":1558627626973,"modified":0,"device":"Random-Integer-Generator01","name":"RandomValue_Int32","value":"82"}]}
至此,利用EdgeX提供的虚拟设备将设备数据发送到云端以及使用指令服务控制设备的操作就完成了。