Пример автономных возможностей Azure IoT Edge - PullRequest
0 голосов
/ 28 февраля 2019

Я немного запутался в том, как использовать автономный режим IoT Edge.Я думал, что это было из коробки!

Местоположение моего IoT Hub находится на западе США.Когда я отключаю устройство Edge от сети, ничего не происходит.Данные не сохраняются и не пересылаются после повторного подключения.

У меня есть только один модуль, который отправляет данные в IoT Hub, я вижу данные, поступающие с помощью приложения Device Explorer Twin, и я сохранил данные в базе данных..

После отключения, подождите 5 минут и повторного подключения, я не вижу данных, которые я пытался отправить в автономном режиме, в базе данных.Все сообщения в автономном режиме отсутствуют (я чередую сообщение с отметкой даты и времени).

Я пропустил конфигурацию?

Есть идеи, почему автономный режим не работает для меня?Я использую Iot Edge Runtime v1.0.6 и контейнеры Windows.

Вот исходный код моего модуля тестирования:

using Microsoft.Azure.Devices.Client;
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Runtime.Loader;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;

    class Program
    {

        static int monitoringInterval { get; set; } = 60;// 60 seconds
        static System.Timers.Timer testTimer;
        static ModuleClient ioTHubModuleClient;

        static void Main(string[] args)
        {
            Init().Wait();

            StartTestTimer();

            // Wait until the app unloads or is cancelled
            var cts = new CancellationTokenSource();
            AssemblyLoadContext.Default.Unloading += (ctx) => cts.Cancel();
            Console.CancelKeyPress += (sender, cpe) => cts.Cancel();
            WhenCancelled(cts.Token).Wait();
        }

        /// <summary>
        /// Handles cleanup operations when app is cancelled or unloads
        /// </summary>
        public static Task WhenCancelled(CancellationToken cancellationToken)
        {
            var tcs = new TaskCompletionSource<bool>();
            cancellationToken.Register(s => ((TaskCompletionSource<bool>)s).SetResult(true), tcs);
            return tcs.Task;
        }

        /// <summary>
        /// Initializes the ModuleClient and sets up the callback to receive
        /// messages containing temperature information
        /// </summary>
        static async Task Init()
        {
            AmqpTransportSettings amqpSetting = new AmqpTransportSettings(TransportType.Amqp_Tcp_Only);
            ITransportSettings[] settings = { amqpSetting };

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


        static void StartTestTimer()
        {
            Console.WriteLine("Start Monitoring Timer: " + monitoringInterval + " seconds");

            // Set up a timer that triggers every minute.
            testTimer = new System.Timers.Timer();
            testTimer.Interval = monitoringInterval * 1000; // 60 seconds
            testTimer.Elapsed += new System.Timers.ElapsedEventHandler(SendEvent);
            testTimer.Start();

            SendEvent(null, null);
        }


        async static void SendEvent(object sender, System.Timers.ElapsedEventArgs args)
        {
            DateTime today = DateTime.Now;
            Console.WriteLine("[" + today + "] Send Data has started...");

            try
            {                
                //IoT device connection string
                string connectionString = "HostName=xxxxxx.azure-devices.net;DeviceId=IOT-Device1;SharedAccessKey=ett8xxxxxxxxx";

                // Connect to the IoT hub using the MQTT protocol
                DeviceClient _DeviceClient = DeviceClient.CreateFromConnectionString(connectionString, TransportType.Mqtt);
                _DeviceClient.OperationTimeoutInMilliseconds = 10000;

                Dictionary<string, Object> telemetryDataPoint = new Dictionary<string, Object>();

                string dateTime = DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString();
                telemetryDataPoint.Add("DateTime", dateTime);               

                string messageString = JsonConvert.SerializeObject(telemetryDataPoint);
                Message message = new Message(Encoding.ASCII.GetBytes(messageString));

                // Send the telemetry message
                Console.WriteLine("\n*> Sending message: {0}",  messageString);
                await _DeviceClient.SendEventAsync(message).ConfigureAwait(false);
                Console.WriteLine("Message sent!");

            }
            catch (Exception e)
            {
                Console.WriteLine("Message not sent. Connection error to Iot Hub:" + e.Message);
            }

        }

    }

1 Ответ

0 голосов
/ 01 марта 2019

Почему код создает moduleClient в Init (), но затем пытается отправить сообщение напрямую в IoT Hub с помощью deviceClient в SendEvent ()?Это полностью обходит граничную среду выполнения (в частности, edgeHub), что облегчает автономное хранение и пересылку.

Вот пример правильного способа сделать это: https://github.com/Azure/iotedge/blob/ad41fec507bb91a2e57a07cd32e287ada0ca08d8/edge-modules/SimulatedTemperatureSensor/src/Program.cs#L95

...