1、边缘计算EdgeX-启动与试用

前言:

本文来自对edgex实际操作的记述以及对edgexfoundry的部分原文翻译和对文档的理解,已务求描述的准确性和可操作性,如有错误或建议请留言。

开发文档原文请参阅:[https://github.com/edgexfoundry/edgex-docs/ 此官方文档更新比较差,实际操作会有问题,仅用来做理解性参考是可以的]

边缘计算的开源框架比较多,比较有代表性的是针对物联网设备服务的edgexfoundry,以及针对云的能力扩展的kubeedge。

这两个项目都是开源的,采用golang进行开发。

edgexfoundry的源代码:https://github.com/edgexfoundry/edgex-go

kubeedge的源代码:https://github.com/kubeedge/kubeedge

1、EdgeX的运行方式之一:采用docker,docker-compose

注:这里假定docker,docker-compose都已安装好。需要注意docker-compose需要是较新的版本,否则后面docker-compose.yml的语法可能不支持,会报错。

1.1 新建一个目录如edgex

mkdir edgex_docker

1.2 下载该文件:
wget https://raw.githubusercontent.com/edgexfoundry/developer-scripts/master/releases/edinburgh/compose-files/docker-compose-edinburgh-1.0.1.yml

并另存为: docker-compose.yml

1.3 执行命令下载镜像 :
docker-compose pull


image.png

1.4 执行命令启动edgex微服务(如果后台有mongod进程,该服务需要提前停掉,否则运行失败):
docker-compose up -d


image.png

1.5 执行命令查看启动的微服务:
docker-compose ps


image.png

记住微服务提供服务的端口号比较重要,有利于后续操作理解,是在操作那个服务的api。

另外通过访问consul[edgex的服务注册组件],可以看到已注册的服务。


image.png

2、EdgeX的运行方式之二:直接编译源码启动

EdgeX的编译依赖zeromq(微服务组件默认的通讯方案),需要提前安装;

运行时需要mangodb,需要提前安装,否则运行会报错。

2.1 下载源码
git clone git@github.com:edgexfoundry/edgex-go.git
2.2 编译
cd edgex-go
make build
可以看到,所有编译完的微服务位于edgex-go/cmd目录。

image.png

2.3 运行
make run
或者
cd bin
./edge-launch.sh

在这里预留一个问题,在采用方式二运行时【EdgeX的运行方式之二:直接编译源码启动】并没有启动consul,但服务仍然可以正常运行,原因待后续分析【可能有默认的机制】。

3、用edgex连接一个设备(随机数发生器)

有两种方式运行该设备
3.1 源码运行
源码能址:git clone https://github.com/edgexfoundry/device-random
下载后执行 make,编译完成的可执行文件在cmd目录,可以直接运行。需要注意的是,如果是源码编译直接运行,需要edgex本身也采用二进制代码运行的方式(EdgeX的运行方式之二:直接编译源码启动),否则可能由于网络配置原因导致服务连接失败。

3.2 容器运行
修改edgex_docker下的docker-compose.yml文件,去掉下列内容的注释:

device-random:
  image: edgexfoundry/docker-device-random-go:1.0.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

可以在consul后台,发现多了一个服务:


image.png

这个设备容器可能运行错误,通过docker-compose logs device-random 查到可能是数据库数据冲突问题[原始mangodb镜像中有数据]。可以登录mongodb,删除coredata,metadata表之后,可以运行正常。

3.3 查询新增设备信息
在终端执行:
curl http://localhost:48080/api/v1/event/device/Random-Integer-Generator01/10
可以查询到设备信息。48080是core-data的服务端口。

推荐使用Postman查询,可以得到结构化数据:


image.png

4 转发设备消息到一个云应用(以MQTT Broker为例)

本例通过48071(export_client)注册一个客户端,转发消息到一个MQTT Broker,本例采用HiveMQ(这是一个公开的可访问的MQTT Broker),类似的MQTT Broker比较多,如mosquitto, EMQ,HMQ等。

在终端执行下列指令:

curl -X POST -d '{
    "name":"QuickStartExportSMG",
    "addressable":{
        "name":"HiveMQBroker",
        "protocol":"tcp",
        "address":"broker.hivemq.com",
        "port":1883,
        "publisher":"EdgeXExportPublisher",
        "topic":"EdgeXQuickStartGuideSMG"
    },
    "format":"JSON",
    "filter":{
        "deviceIdentifiers":["Random-Integer-Generator01"]
    },
    "enable":true,
    "destination":"MQTT_TOPIC"
}' http://localhost:48071/api/v1/registration

然后打开一个MQTT client连接broker.hivemq.com,订阅EdgeXQuickStartGuideSMG主题。本例通过一个mqtt的web客户端来定阅,其地址为:http://www.hivemq.com/demos/websocket-client/
完成定阅后,将会持续性收到随机数发生器发送的消息:

image.png

采用mosquitto可以完成相同的消息定阅:
mosquitto_sub -h broker.hivemq.com -p 1883 -t EdgeXQuickStartGuide

5、控制这个设备

设备注册到edgex时,需要提供一个device profile,这是一个文本描述,描述了从设备读取数据的方式,也描述了对设备的操控的方法。
上述例子中注册的随机数发生器Random-Integer-Generator01也在注册时提供了一个device profile,这个profile定义了读数据的有效范围,以及对设备控制的一些指令描述。

5.1 通过core-command(48082)来查询设备的可用指令
curl http://localhost:48082/api/v1/device/name/Random-Integer-Generator01
(建议通过Postman)

{
    "id": "ca1caf0c-dfa7-4ac8-bee3-8dfcd1df32f9",
    "name": "Random-Integer-Generator01",
    "adminState": "UNLOCKED",
    "operatingState": "ENABLED",
    "lastConnected": 0,
    "lastReported": 0,
    "labels": [
        "device-random-example"
    ],
    "location": null,
    "commands": [
        {
            "created": 1573721988576,
            "modified": 1573721988576,
            "id": "f0d0f546-e3a6-4808-99a1-1b3f3012df4f",
            "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/ca1caf0c-dfa7-4ac8-bee3-8dfcd1df32f9/command/f0d0f546-e3a6-4808-99a1-1b3f3012df4f"
            },
            "put": {
                "path": "/api/v1/device/{deviceId}/GenerateRandomValue_Int8",
                "parameterNames": [
                    "Min_Int8",
                    "Max_Int8"
                ],
                "url": "http://edgex-core-command:48082/api/v1/device/ca1caf0c-dfa7-4ac8-bee3-8dfcd1df32f9/command/f0d0f546-e3a6-4808-99a1-1b3f3012df4f"
            }
        },
        {
            "created": 1573721988593,
            "modified": 1573721988593,
            "id": "06bf3bad-4040-44d2-a62a-7dd867dcdb62",
            "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/ca1caf0c-dfa7-4ac8-bee3-8dfcd1df32f9/command/06bf3bad-4040-44d2-a62a-7dd867dcdb62"
            },
            "put": {
                "path": "/api/v1/device/{deviceId}/GenerateRandomValue_Int16",
                "parameterNames": [
                    "Min_Int16",
                    "Max_Int16"
                ],
                "url": "http://edgex-core-command:48082/api/v1/device/ca1caf0c-dfa7-4ac8-bee3-8dfcd1df32f9/command/06bf3bad-4040-44d2-a62a-7dd867dcdb62"
            }
        },
        {
            "created": 1573721988593,
            "modified": 1573721988593,
            "id": "c9f02fe1-1311-4e9a-8dbb-09e39bc45711",
            "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/ca1caf0c-dfa7-4ac8-bee3-8dfcd1df32f9/command/c9f02fe1-1311-4e9a-8dbb-09e39bc45711"
            },
            "put": {
                "path": "/api/v1/device/{deviceId}/GenerateRandomValue_Int32",
                "parameterNames": [
                    "Min_Int32",
                    "Max_Int32"
                ],
                "url": "http://edgex-core-command:48082/api/v1/device/ca1caf0c-dfa7-4ac8-bee3-8dfcd1df32f9/command/c9f02fe1-1311-4e9a-8dbb-09e39bc45711"
            }
        }
    ]
}

注意:url中的deviceid和commandid是不同的,是edgex自动生成的。
get描述了读设备内容的方法。
put描述了写设备的操作方法。

5.2 对设备的读操作
curl http://localhost:48082/api/v1/device/5c0e8a259f8fc20001a5d230/command/5c0e8a259f8fc20001a5d22b
读操作会返回:

{
    "device": "Random-Integer-Generator01",
    "origin": 1573722396641,
    "readings": [
        {
            "origin": 1573722396640,
            "device": "Random-Integer-Generator01",
            "name": "RandomValue_Int8",
            "value": "66"
        }
    ]
}

5.3 对设备的控制操作

curl -X PUT -d '[
    {"Min_Int8": "0", "Max_Int8": "50"}
]'  http://localhost:48082/api/v1/device/ca1caf0c-dfa7-4ac8-bee3-8dfcd1df32f9/command/f0d0f546-e3a6-4808-99a1-1b3f3012df4f

执行上述指令后,会把随机数生成器的生成范围从默认的-128至127,修改为0至50;

6 总结

通过一些简单的操作可以看出
1、edgex采用consul做服务注册、发现;采用mongodb(可替换)做数据及配置存贮;采用zeromq做消息中间件。
2、edgex是一组微服务(基础服务),每个微服务都独立提供http形式的api供外部调用,微服务组件之间有互相调用关系。
3、应用基于edgex的api和数据定义做二次开发,应用也是一个微服务组件(可以分为设备接入应用和功能应用)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342