Как перенаправить сообщение с IotDevice на устройство IoTEdge? - PullRequest
0 голосов
/ 11 сентября 2018

Я перешел по этой ссылке Для написания пользовательских модулей . В этом уроке модуль с именем tempSensor отправляет данные другому модулю CSharpModule . Что касается учебника, я успешно его реализовал.

Что я хочу сделать: Получение телеметрических данных от IoTDevice до IoTEdge Device .

Архитектура: Azure IoTHub, подключенный к устройствам IoT и устройству IoTEdge

Что я пробовал: Я пытался отправить данные телеметрии с имитируемого устройства, подключенного к ioTEdge с помощью connectionString.

Код для отправки данных здесь

        //DeviceClient connected to IoTEdge     
        s_deviceClient = DeviceClient.CreateFromConnectionString(s_connectionString);

        private static async void SendDeviceToCloudMessagesAsync()
        {
            // Initial telemetry values
            double minTemperature = 20;
            double minHumidity = 60;
            Random rand = new Random();

            while (true)
            {
                double currentTemperature = minTemperature + rand.NextDouble() * 15;
                double currentHumidity = minHumidity + rand.NextDouble() * 20;

                // Create JSON message
                var telemetryDataPoint = new
                {
                    temperature = currentTemperature,
                    humidity = currentHumidity
                };
                var messageString = JsonConvert.SerializeObject(telemetryDataPoint);
                var message = new Message(Encoding.ASCII.GetBytes(messageString));

                // Add a custom application property to the message.                    
                message.Properties.Add("temperatureAlert", (currentTemperature > 30) ? "true" : "false");

                // Send the tlemetry message to endpoint output1
                await s_deviceClient.SendEventAsync("ouput1",message);

                //await s_deviceClient.SendEventAsync(message);
                Console.WriteLine("{0} > Sending message: {1}", DateTime.Now, messageString);

                await Task.Delay(s_telemetryInterval * 10000);
            }
        }

Здесь находится принимающая сторона кода пользовательского модуля IoTEdge ...

        static async Task Init()
        {
            AmqpTransportSettings amqpSetting = new AmqpTransportSettings(TransportType.Amqp_Tcp_Only);
            ITransportSettings[] settings = { amqpSetting };

            // Open a connection to the Edge runtime
            ModuleClient ioTHubModuleClient = await ModuleClient.CreateFromEnvironmentAsync(settings);
            await ioTHubModuleClient.OpenAsync();
            Console.WriteLine("IoT Hub module client initialized.");

        // Register a callback for messages that are received by the module.
            // await ioTHubModuleClient.SetImputMessageHandlerAsync("input1", PipeMessage, iotHubModuleClient);

            // Read the TemperatureThreshold value from the module twin's desired properties
            var moduleTwin = await ioTHubModuleClient.GetTwinAsync();
            var moduleTwinCollection = moduleTwin.Properties.Desired;
            try {
                temperatureThreshold = moduleTwinCollection["iothub-connection-device-id"];
            } catch(ArgumentOutOfRangeException e) {
                Console.WriteLine($"Property TemperatureThreshold not exist: {e.Message}"); 
            }

            // Attach a callback for updates to the module twin's desired properties.
            await ioTHubModuleClient.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertiesUpdate, null);

            // Register a callback for messages that are received by the module
            await ioTHubModuleClient.SetInputMessageHandlerAsync("input1", PipeMessage, ioTHubModuleClient);
        }

Информация о маршруте из файла deploy.template.json пользовательского модуля выглядит следующим образом.

 "routes": {
      "aggregationModuleToIoTHub": "FROM /messages/modules/aggregationModule/outputs/* INTO $upstream"           
    }

Но проблема в том, что обратный вызов PipeMessage никогда не вызывается. Насколько я понимаю, сообщения не приходят в конечную точку IoTEdge messages / input1 .

1 Ответ

0 голосов
/ 14 сентября 2018

Чтобы убедиться, что я понимаю ваш вопрос, вы пытаетесь отправить код с устройства IoT вне IoT Edge в IoT Edge, а затем направить эти данные через модуль в IoT Edge до IoT Hub ? это верно? Если это так, мы называем IoT-устройство нисходящим или «конечным» устройством. IoT Edge необходимо настроить как «прозрачный шлюз», такой как эта документация. После того, как вы это сделаете, вам нужно добавить; GatewayHostName = в конец строки подключения, где указано имя, которое вы использовали в качестве параметра 'hostname' в файле config.yaml.

...