1.EdgeX Foundry 快速熟悉

[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ù)層為中心然评。

image
image

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)再連到云端呐赡。

image

二退客、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

image
  • 安裝Docker和Docker Compose

    • 安裝docker

    • 安裝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命令說明
  • 運(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 種屬性
  • 控制設(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編寫的。

  • 安裝Go環(huán)境

    wget https://dl.google.com/go/go1.14.linux-amd64.tar.gz
    sudo tar -zxvf go1.14.linux-amd64.tar.gz -C /usr/local
    
    
  • 獲取EdgeX Foundry Golang微服務(wù)代碼

  • 構(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 介紹與使用

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/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掉弛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子喂走,更是在濱河造成了極大的恐慌殃饿,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芋肠,死亡現(xiàn)場離奇詭異乎芳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門奈惑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谬晕,“玉大人,你說我怎么就攤上這事携取。” “怎么了帮孔?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵雷滋,是天一觀的道長。 經(jīng)常有香客問我文兢,道長晤斩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任姆坚,我火速辦了婚禮澳泵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兼呵。我一直安慰自己兔辅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布击喂。 她就那樣靜靜地躺著维苔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪懂昂。 梳的紋絲不亂的頭發(fā)上介时,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音凌彬,去河邊找鬼沸柔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铲敛,可吹牛的內(nèi)容都是我干的褐澎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼原探,長吁一口氣:“原來是場噩夢啊……” “哼乱凿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咽弦,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤徒蟆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后型型,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體段审,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年闹蒜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寺枉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抑淫。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖姥闪,靈堂內(nèi)的尸體忽然破棺而出始苇,到底是詐尸還是另有隱情,我是刑警寧澤筐喳,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布催式,位于F島的核電站,受9級(jí)特大地震影響避归,放射性物質(zhì)發(fā)生泄漏荣月。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一梳毙、第九天 我趴在偏房一處隱蔽的房頂上張望哺窄。 院中可真熱鬧,春花似錦账锹、人聲如沸萌业。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咽白。三九已至,卻和暖如春鸟缕,著一層夾襖步出監(jiān)牢的瞬間晶框,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國打工懂从, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留授段,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓番甩,卻偏偏與公主長得像侵贵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子缘薛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 前言: 本文來自對edgex實(shí)際操作的記述以及對edgexfoundry的部分原文翻譯和對文檔的理解宴胧,已務(wù)求描述的...
    小石頭成長記閱讀 6,072評(píng)論 1 2
  • 概述 本文講述如何在樹莓派3B+上通過docker拉取鏡像漱抓,并運(yùn)行edgex 微服務(wù),達(dá)到在樹莓派3B+上完成ed...
    矢里昂閱讀 3,804評(píng)論 2 4
  • 1. 什么是微服務(wù) 在介紹微服務(wù)時(shí)恕齐,首先得先理解什么是微服務(wù)乞娄,顧名思義,微服務(wù)得從兩個(gè)方面去理解,什么是"微"仪或、什...
    若與閱讀 4,909評(píng)論 0 39
  • 互聯(lián)網(wǎng)架構(gòu)微服務(wù)已經(jīng)成為主流确镊,Go 語言如何去打造呢? 萬字長文全面解析 GraphQL范删,攜程微服務(wù)背景下的前后端...
    flaygo閱讀 803評(píng)論 0 2
  • LinuxDocker 使用手冊 [toc] Docker 介紹 Docker 的應(yīng)用場景 Web 應(yīng)用的自動(dòng)化打...
    SuperScfan閱讀 649評(píng)論 0 0