На github можно посмотреть исходники modbus модуля для IoT Edge. Соберем модуль из исходников и протестируем его работу.
- Если на ПК установлен Git, то зайдем в рабочую директорию и сделаем клонирование папки исходников с Git Hub на локальный ПК, запустив команду:
git clone https://github.com/Azure/iot-edge-modbus.git
- Полезно создать новый проект Azure IoT modules для копирования некоторых параметров.
- После завершения клонирования найдем файл deployment.template.json.
- В файле добавим блок с информацией о используемом Azure Container Registry. В случае с моим реестром с именем warlibregistry располагающийся по адресу «warlibregistry.azurecr.io» блок будет таким:
"registryCredentials": { "warlibregistry": { "username": "$CONTAINER_REGISTRY_USERNAME_warlibregistry", "password": "$CONTAINER_REGISTRY_PASSWORD_warlibregistry", "address": "warlibregistry.azurecr.io" } }
- Копируем или создаем файл «.env» в котором содержатся данные для авторизации в Azure Container Registry.
CONTAINER_REGISTRY_USERNAME_warlibregistry=WarlibRegistry CONTAINER_REGISTRY_PASSWORD_warlibregistry=FrM6/W0BEv
- Заходим в папку modules с исходниками и в файле modules.json правим параметр repository, заменив localhost:5000 на правильный путь к репозиторию:
... "image": { "repository": "warlibregistry.azurecr.io/iotedgemodbus", ... }
- Открываем Visual Studio Code -> Open Folders… и выбираем корневую правку в котором лежит скаченный с git hub проект ..\iot-edge-modbus.
- Встаем на файл deployment.template.json, жмем правую кнопку мыши и выбираем пункт «Build and Push IoT Edge Solution».
- Если реквизиты введены верно, то сборка модуля закончится успешно на в указанном Azure Container Registry появится собранный модуль.
- Заходим в папку config и из файла deployment.json в разделе «image»
"modules": { "modbus": { "version": "1.0", "type": "docker", "status": "running", "restartPolicy": "always", "settings": { "image": "warlibregistry.azurecr.io/iotedgemodbus:0.0.1-amd64", "createOptions": "" } } }
копируем ссылку на модуль. Она понадобится для развертывания модуля на IoT Edge устройстве.
- Заходим на Azure Portal в «All resources» -> [Ваш IoT hub] -> IoT Edge -> создаем новое устройство.
- Заходим в созданное устройство и жмем Set modules.
- В «Container Registry Settings» прописываем права доступа к вашему Azure Container Registry. Эти параметры есть в файле .env и в файле deployment.json.
- В разделе «Deployment module» -> «IoT Edge Module».
- Вводим настройки как в статье. Имя дал modbus1, URI из deployment.json: warlibregistry.azurecr.io/iotedgemodbus:0.0.1-amd64. Параметры properties.desired.
"properties.desired": { "PublishInterval": "2000", "SlaveConfigs": { "TermoSensor": { "SlaveConnection": "192.168.26.110", "HwId": "TermoSensor-0a:01:01:01:01:01", "TcpPort": "8899", "Operations": { "Op01": { "PollingInterval": "5000", "UnitId": "1", "StartAddress": "30002", "Count": "1", "DisplayName": "Temp" }, "Op02": { "PollingInterval": "5000", "UnitId": "1", "StartAddress": "30003", "Count": "1", "DisplayName": "Humidity" } } } } }
- Параметры Route: «FROM /messages/modules/modbus/outputs/modbusOutput INTO $upstream».
- Развертываем модуль на IoT Edge устройстве.
- После развертывания смотрим логи:
PS C:\WINDOWS\system32> iotedge list NAME STATUS DESCRIPTION CONFIG edgeHub running Up 9 seconds mcr.microsoft.com/azureiotedge-hub:1.0 modbus1 running Up 11 seconds warlibregistry.azurecr.io/iotedgemodbus:0.0.1-amd64 edgeAgent running Up 19 seconds mcr.microsoft.com/azureiotedge-agent:1.0 PS C:\WINDOWS\system32> iotedge logs modbus1 -f IoT Hub module client initialized. Desired property change: {"PublishInterval":"2000","SlaveConfigs":{"TermoSensor":{"SlaveConnection":"192.168.26.110","HwId":"TermoSensor-0a:01:01:01:01:01","TcpPort":"8899","Operations":{"Op01":{"PollingInterval":"5000","UnitId":"1","StartAddress":"30002","Count":"1","DisplayName":"Temp"},"Op02":{"PollingInterval":"5000","UnitId":"1","StartAddress":"30003","Count":"1","DisplayName":"Humidity"}}}},"$version":1} Attempt to load configuration: {"PublishInterval":"2000","SlaveConfigs":{"TermoSensor":{"SlaveConnection":"192.168.26.110","HwId":"TermoSensor-0a:01:01:01:01:01","TcpPort":"8899","Operations":{"Op01":{"PollingInterval":"5000","UnitId":"1","StartAddress":"30002","Count":"1","DisplayName":"Temp"},"Op02":{"PollingInterval":"5000","UnitId":"1","StartAddress":"30003","Count":"1","DisplayName":"Humidity"}}}},"$version":1} Invalid RetryCount: , set to DefaultRetryCount: 10 Invalid RetryInterval: , set to DefaultRetryInterval: 50 Empty CorrelationId: , set to DefaultCorrelationId: DefaultCorrelationId Empty CorrelationId: , set to DefaultCorrelationId: DefaultCorrelationId Saving reported properties: {"PublishInterval":2000,"SlaveConfigs":{"TermoSensor":{"Operations":{"Op01":{"PollingInterval":5000,"UnitId":1,"StartAddress":"30002","Count":1,"DisplayName":"Temp","CorrelationId":"DefaultCorrelationId"},"Op02":{"PollingInterval":5000,"UnitId":1,"StartAddress":"30003","Count":1,"DisplayName":"Humidity","CorrelationId":"DefaultCorrelationId"}},"SlaveConnection":"192.168.26.110","RetryCount":10,"RetryInterval":50,"TcpPort":8899,"HwId":"TermoSensor-0a:01:01:01:01:01","BaudRate":null,"StopBits":null,"DataBits":null,"Parity":null}}} 30002: 255 30003: 393 30002: 255 30003: 393
- Не забываем останавливать сервис iotedge командой «stop-service iotedge», либо конейнер, когда не нужна отправка данных в облако, чтобы не расходовать средства.