Это первая часть серии Iot Edge, см. основную статью. Часть 2 в настоящее время находится в разработке и скоро появится.

Глядя на нашу архитектуру, мы должны иметь возможность подключать устройства и получать от них какой-то интересный вывод, прежде чем мы сможем что-то с ними делать. В этой первой части мы в основном сосредоточимся именно на этом — подключении наших устройств и отправке данных в наш ресурс Центра Интернета вещей.

Поэтому в этой части у нас есть следующие предпосылки:

Примечание: я использовал следующие переменные:

YOUR_IOTHUB_NAME = xavier-iothub

YOUR_DEVICE_ID = xavier-device-1

YOUR_EDGE_VM = xavier-edge-1

Предпосылки

Центр Интернета вещей — подключайте свои устройства и управляйте ими

  • az iot hub create --resource-group DEMO-IoTEdge --name {YOUR_IOTHUB_NAME} --sku F1 создаст бесплатный центр Интернета вещей (лимиты: 8 тыс. сообщений в день и 500 зарегистрированных устройств)

Azure Shell + расширение IoT Cli

  • Примечание. Простой способ — использовать https://shell.azure.com и запустить az extension add --name azure-cli-iot-ext

Среда выполнения Azure Edge на устройстве

Устройство ARM IoT (мы используем ARM, потому что это может вызвать проблемы совместимости, но, скорее всего, у нас будут устройства ARM в полевых условиях)

Регистрация устройства

Создание устройства имитации

Проверка Поддерживаемые устройства IoT Edge показала мне, что Ubuntu 18.04 поддерживается на ARM. Однако, поскольку на момент написания статьи у меня не было доступа к устройству ARM, я решил развернуть виртуальную машину на Azure, что легко сделать через рынок: https://azuremarketplace.microsoft.com/marketplace/apps/ microsoft_iot_edge.iot_edge_vm_ubuntu.

az vm create --resource-group DEMO-IoTEdge --name xavier-edge-1 --image microsoft_iot_edge:iot_edge_vm_ubuntu:ubuntu_1604_edgeruntimeonly:latest --admin-username xavier --ssh-key-values "YOUR_SSH_KEY" --size Standard_B1ms

Примечание: если вы устанавливаете на ARM, не стесняйтесь следовать руководству по адресу: https://docs.microsoft.com/en-us/azure/iot-edge/how-to-install-iot- edge-linux-arm

Создание идентификатора устройства IoT Edge

Как только наши предварительные условия выполнены, мы можем начать добавлять наши устройства. Для этого запуска: az iot hub device-identity create --hub-name {YOUR_IOTHUB_NAME} --device-id {YOUR_DEVICE_ID} --edge-enabled, который создаст устройство с поддержкой Edge. Это вернет что-то вроде этого:

{
  "authentication": {
    "symmetricKey": {
      "primaryKey": "{MASKED}",
      "secondaryKey": "{MASKED}"
    },
    "type": "sas",
    "x509Thumbprint": {
      "primaryThumbprint": null,
      "secondaryThumbprint": null
    }
  },
  "capabilities": {
    "iotEdge": true
  },
  "cloudToDeviceMessageCount": 0,
  "connectionState": "Disconnected",
  "connectionStateUpdatedTime": "0001-01-01T00:00:00",
  "deviceId": "xavier-device-1",
  "deviceScope": "ms-azure-iot-edge://xavier-device-1-{ID}",
  "etag": "{ETAG}",
  "generationId": "{ID}",
  "lastActivityTime": "0001-01-01T00:00:00",
  "status": "enabled",
  "statusReason": null,
  "statusUpdatedTime": "0001-01-01T00:00:00"
}

Подключение нашего устройства IoT Edge к IoT Hub

После развертывания этой виртуальной машины мы теперь можем настроить наш IoT Edge, получив строку подключения к центру Интернета вещей и выполнив команду оболочки, которая доступна в образе.

Чтобы получить нашу строку подключения, мы можем запустить:

az iot hub device-identity show-connection-string --device-id {YOUR_DEVICE_ID} --hub-name {YOUR_IOTHUB_NAME}

Который вернет что-то вроде:

{
  "connectionString": "HostName={YOUR_IOTHUB}.azure-devices.net;DeviceId={YOUR_DEVICE_ID};SharedAccessKey={ACCESS_KEY}"
}

Теперь мы можем запустить следующий сценарий, который был предварительно развернут на нашем пограничном устройстве через образ Marketplace, который настроит наше пограничное устройство:

az vm run-command invoke -g Demo-IoTEdge -n {YOUR_EDGE_VM} --command-id RunShellScript --script "/etc/iotedge/configedge.sh '{YOUR_DEVICE_CONNECTION_STRING}'"

Что должно показать следующее при успешном выполнении:

xavier@Azure:~$ az vm run-command invoke -g Demo-IoTEdge -n xavier-edge-1 --command-id RunShellScript --script "/etc/iotedge/configedge.sh 'HostName=xavier-iothub.azure-devices.net;DeviceId=xavier-device-1;SharedAccessKey={YOUR_DEVICE_ACCCESS_KEY}'"
{
  "value": [
    {
      "code": "ProvisioningState/succeeded",
      "displayStatus": "Provisioning succeeded",
      "level": "Info",
      "message": "Enable succeeded: \n[stdout]\n Wed May 22 13:24:14 UTC 2019 Connection string set to HostName=xavier-iothub.azure-devices.net;DeviceId=xavier-device-1;SharedAccessKey={YOUR_DEVICE_ACCCESS_KEY}\n\n[stderr]\n",
      "time": null
    }
  ]
}

Примечание. Теперь вы можете проверить, запущен ли IoT Edge, подключившись к компьютеру по протоколу SSH и выполнив sudo systemctl status iotedgeинтересные команды: journalctl -u iotedge — проверить журналы, sudo iotedge list — показать работающие модули

Создание эхо-модуля нашего пограничного устройства

В целях тестирования мы хотим создать небольшой контейнер, который каждые 2 секунды передает текущее время в Центр Интернета вещей. Для этого делаем несколько шагов:

  1. Палитра команд (ctrl + p): Azure: вход
  2. Палитра команд (ctrl + p): Azure IoT Edge: новое решение IoT Edge
  • Путь: /home/xavier/iot-edge/
  • Решение. EdgeSolutionCameraFilter
  • Шаблон модуля: модуль C#
  • Имя модуля: EchoModule (пока наш демонстрационный контейнер)
  • Репозиторий Docker: xavierregistry.azurecr.io/echomodule

Примечание. для получения дополнительных сведений и подробностей перейдите на https://docs.microsoft.com/en-us/azure/iot-edge/tutorial-csharp-module, который проходит через этапы создания температурной модели.

Примечание 2. На моем компьютере не установлен Docker. Однако мы можем легко обойти это, используя удаленную виртуальную машину Linux и используя VS Code Remote-SSH

Как только мы это сделаем, мы увидим следующий шаблонный код, созданный после того, как мы откроем нашу папку.

Этот шаблонный код создает модуль, который будет воспроизводить наш ввод на выходном канале. Чтобы было понятнее, я переименовал input1 в input-echo, а output1 в output-echo.

Еще я добавил таймер, который будет отправлять сообщение каждые 30 секунд, чтобы было ясно, что он действительно что-то делает и что нам не обязательно что-то ему отправлять ;) Код, который я использовал для этого:

// Register a Timer that will send every X seconds
var myTimer = new System.Timers.Timer();
myTimer.Elapsed += new System.Timers.ElapsedEventHandler((object source, System.Timers.ElapsedEventArgs e) => {
    var now = DateTime.Now.ToString("g");
    var message = new Message(Encoding.UTF8.GetBytes($"Sending event at {now}"));
    ioTHubModuleClient.SendEventAsync("output", message);
});
myTimer.Interval = 30 * 1000; // Every 30 seconds
myTimer.Enabled = true;

Последнее, что нам нужно сделать, это удалить несколько строк из наших файлов deployment.template.json и deployment.template.debug.json в корневой папке:

"sensorToEchoModule": "FROM /messages/modules/tempSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/EchoModule/inputs/input1\")"

И несколько строк, которые развертывают другой модуль, который нам не нужен.

"tempSensor": {
  "version": "1.0",
  "type": "docker",
  "status": "running",
  "restartPolicy": "always",
  "settings": {
    "image": "mcr.microsoft.com/azureiotedge-simulated-temperature-sensor:1.0",
    "createOptions": "{}"
  }
},

Теперь мы готовы собрать, опубликовать и, наконец, развернуть наш пограничный модуль.

Сборка, публикация и развертывание пограничного модуля

Создание и публикация нашего пограничного модуля

Теперь мы можем легко создать и опубликовать наш пограничный модуль, щелкнув правой кнопкой мыши наш deployment.template.json и выбрав «Создать и отправить пограничное решение Интернета вещей».

Примечание. Мне это не удалось из-за проблем с разрешениями на моем компьютере с Linux, однако, когда у вас открыт терминал, вы можете просто нажать стрелку вверх и добавить sudo впереди. Совет: ctrl + a перейти к началу строки

Теперь это создаст и подтолкнет наше решение, в результате чего:

# Docker container is building
Step 1/12 : FROM microsoft/dotnet:2.1-sdk AS build-env
2.1-sdk: Pulling from microsoft/dotnet
c5e155d5a1d1: Pull complete 
221d80d00ae9: Pull complete 
4250b3117dca: Pull complete 
3b7ca19181b2: Pull complete 
5980daa97e3c: Pull complete 
7cbae962589c: Pull complete 
4ab425e558b6: Pull complete 
Digest: sha256:481a526515bd95f7ecbe866b99ddac6130da3402e8e4fb09712123393d3f1475
Status: Downloaded newer image for microsoft/dotnet:2.1-sdk
 ---> 511c1f563ce6
Step 2/12 : WORKDIR /app
 ---> Running in ed3388ecf107
Removing intermediate container ed3388ecf107
 ---> e8033981828f
Step 3/12 : COPY *.csproj ./
 ---> 4614b845cc5d
Step 4/12 : RUN dotnet restore ---> Running in 2db5ed302e26  Restore completed in 3.24 sec for /app/EchoModule.csproj.
Removing intermediate container 2db5ed302e26
 ---> b74b9ac5490b
Step 5/12 : COPY . ./
 ---> 8132d7ecea0d
 Step 6/12 : RUN dotnet publish -c Release -o out
 ---> Running in 62098984d63d
Microsoft (R) Build Engine version 16.1.76+g14b0a930a7 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 485.11 ms for /app/EchoModule.csproj.
  EchoModule -> /app/bin/Release/netcoreapp2.1/EchoModule.dll
  EchoModule -> /app/out/
Removing intermediate container 62098984d63d
 ---> 46899da4cedb
Step 7/12 : FROM microsoft/dotnet:2.1-runtime-stretch-slim
2.1-runtime-stretch-slim: Pulling from microsoft/dotnet
743f2d6c1f65: Pull complete 
074da88b8de0: Pull complete 
ac831735b47a: Pull complete 
625946e33cc4: Pull complete 
Digest: sha256:5ff2b0f6e69b44f6404d46445be34408551331429d5a84b667cfee49ebd8117d
Status: Downloaded newer image for microsoft/dotnet:2.1-runtime-stretch-slim
 ---> f7da44fabfad
Step 8/12 : WORKDIR /app
 ---> Running in b999e9d179aa
Removing intermediate container b999e9d179aa
 ---> 247b2ac0a988
Step 9/12 : COPY --from=build-env /app/out ./
 ---> ef30f581b39d
Step 10/12 : RUN useradd -ms /bin/bash moduleuser
 ---> Running in 172a5e40a83e
Removing intermediate container 172a5e40a83e
 ---> dc3691450b75
Step 11/12 : USER moduleuser
 ---> Running in c71d5ab2fc77
Removing intermediate container c71d5ab2fc77
 ---> d4798c0654e7
Step 12/12 : ENTRYPOINT ["dotnet", "EchoModule.dll"]
 ---> Running in 547f0facbdd8
Removing intermediate container 547f0facbdd8
 ---> 114a7cc96b50
Successfully built 114a7cc96b50
Successfully tagged xavierregistry.azurecr.io/echomodule:0.0.1-amd64

# Pushing it
The push refers to repository [xavierregistry.azurecr.io/echomodule]
11e1e4b905fe: Pushed 
a0d529ad3f07: Pushed 
f081219e5aa6: Pushed 
be1595c6dfc4: Pushed 
ecf7942d9af2: Pushed 
ea4e5356527d: Pushed 
6270adb5794c: Pushed 
0.0.1-amd64: digest: sha256:7021323942c2323adb48d17ec73b00e69ec19216c816de59e2eb6e9a0b3f682c size: 1789

Развертывание нашего пограничного модуля

Теперь, когда наш модуль создан и отправлен в наш репозиторий, теперь мы можем отправить его в наш пограничный модуль. Для этого просто щелкните правой кнопкой мыши на нашем устройстве и выберите «Создать развертывание для одного устройства».

Это откроет наш вывод и покажет:

Когда мы сейчас откроем наше устройство, мы увидим, что под модулями у нас развернут дополнительный модуль.

Тестирование нашего развертывания

Чтобы отслеживать наше устройство, теперь мы можем перейти к нашим устройствам и выбрать «Начать мониторинг встроенной конечной точки события», которая откроет для нас регистратор. Когда мы это сделали, мы теперь через несколько секунд увидим:

[IoTHubMonitor] [5:59:27 PM] Message received from [xavier-device-1/EchoModule]:
"Sending event at 05/24/2019 17:59"

Для нашего модуля Echo теперь мы можем отправить сообщение C2D (из облака на устройство). Мы делаем это, снова щелкнув правой кнопкой мыши наше устройство, выбрав «Отправить сообщение D2C в IoTHub» и введя наше сообщение.

Когда все пойдет хорошо, мы увидим следующее в нашем журнале событий устройства:

[D2CMessage] Sending message to [IoT Hub] ...
[IoTHubMonitor] [6:02:36 PM] Message received from [xavier-device-1]:
"Hello World"

Вывод

Теперь мы создали наш первый начальный модуль, так что давайте начнем по-настоящему и поработаем над созданием нашего модуля AI Edge во второй части!

Первоначально опубликовано на https://xaviergeerinck.com 10 августа 2019 г.