Я выполнил все инструкции по настройке «нисходящего устройства» для отправки сообщений через IoT Edge, работающий в прозрачном шлюзе. Я считаю, что мои правила маршрутизации верны, но мой функциональный модуль не получает никаких сообщений через поток сообщений.
Я выполнил следующие инструкции: https://docs.microsoft.com/en-us/azure/iot-edge/how-to-create-transparent-gateway-linux
Я использую 2 виртуальные машины Linxu (ubuntu 16.04.5).
- Виртуальная машина прозрачного шлюза IoT Edge настроена со всеми правильно настроенными, настроенными и проверенными сертификатами. Я смог использовать инструмент openssl из
openssl s_client -connect {my-gateway-machine-name-dns-name} .centralus.cloudapp.azure.com: 8883 -CAfile /certs/certs/azure-iot-test-only.root.ca.cert.pem - шоуцерты
Нисходящее устройство, работающее на виртуальной машине Linux с установленными и проверенными сертификатами. Моя строка подключения выглядит следующим образом:
HostName = {IoTHubName} .azure-devices.net; DeviceId = TC51_EdgeDownStreamDevice01; SharedAccessKey = {My-Shared-Access-Key} = GatewayHostName = {my-gateway-machine-name-dns-name} .centralus.cloudapp.azure. ком
а. Я подтвердил, что получил успешную проверку сертификата SSL с помощью инструмента openssl. б. Я использую следующее на своем нисходящем устройстве для моего подключения с помощью NodeJS SDK
var client = DeviceClient.fromConnectionString (connectionString, Mqtt); c. Я вижу сообщения, появляющиеся в Azure IoT Hub в облаке, но я не могу запустить мой модуль на прозрачном шлюзе IoT Edge, чтобы он был поражен.
- Вот мои правила маршрутизации, настроенные для edgeHub, как указано в разделе «Маршрутизация сообщений от нижестоящих устройств» на странице образца документа.
Вот что показано в примерах документов: {"routes": {"sensorToAIInsightsInput1": "FROM / messages / * ГДЕ НЕ IS_DEFINED ($ connectionModuleId) INTO BrokeredEndpoint (\" / modules / ai_insights / inputs / input1 \ ")", " AIInsightsToIoTHub ":" FROM / messages / modules / ai_insights / output / output1 INTO $ upstream "}}
Это то, что установлено в моей конфигурации маршрутизации: "routes": {"downstreamBatterySensorToBatteryDataFunctionInput1": "FROM / * WHERE NOT IS_DEFINED ($ connectionModuleId) INTO BrokeredEndpoint (\" / modules / BatteryDataFunctionModule / inputs / input1 \ ")", "BatteryDodule ":" FROM / messages / modules / BatteryDataFunctionModule / output / * INTO $ upstream "}
** Обратите внимание, что я использовал «FROM / * WHERE NOT IS_DEFINED» и «FROM / messages / * WHERE NOT IS_DEFINED»
- Мой модуль на IoT Edge настроен как функция. Когда я использую готовый пример, в котором имитатор является другим модулем, работающим на IoT Edge, моя функция выполняется правильно. Модуль не запускается только тогда, когда я пытаюсь использовать «Нисходящее устройство».
Я включил «Ведение журнала отладки для службы IoT Edge» на моем прозрачном шлюзе.
This is the basic Run method for the Function module:
#r "Microsoft.Azure.Devices.Client"
#r "Newtonsoft.Json"
using System.IO;
using Microsoft.Azure.Devices.Client;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
// Filter messages based on the temperature value in the body of the message and the temperature threshold value.
public static async Task Run(Message messageReceived, IAsyncCollector<Message> output, TraceWriter log)
{
Как я могу выяснить, как заставить мой модуль, работающий в IoT Edge, запускаться / запускаться с нисходящего устройства?