Синхронизация требуемых и сообщаемых свойств Azure Device Twin - PullRequest
0 голосов
/ 30 апреля 2019

Что является наиболее подходящим способом синхронизации требуемых и сообщаемых свойств.

В настоящее время, как мне кажется, это должно быть:

  1. На маршрутизации настройки портала Azure для «требуемого обновления свойства»"событие для IotHub.
  2. Создание класса, реализующего IEventProcessor:

внутренний класс LoggingEventProcessor: IEventProcessor {общедоступная задача OpenAsync (контекст PartitionContext) {Console.WriteLine ($) открытие LoggingEventProcessor, раздел:{context.PartitionId} ");return Task.CompletedTask;}

public async Task CloseAsync(PartitionContext context, CloseReason reason)
{
    Console.WriteLine($"LoggingEventProcessor closing, partition: {context.PartitionId}, reason: {reason}");
    if (reason == CloseReason.Shutdown)
    {
        await context.CheckpointAsync();
    }
}

public Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
{
    foreach (var msg in messages)
    {
        string messageSource = (string)msg.SystemProperties["iothub-message-source"];
        var deviceId = msg.SystemProperties["iothub-connection-device-id"];
        var payload = Encoding.ASCII.GetString(msg.Body.Array,
            msg.Body.Offset,
            msg.Body.Count);

        switch (messageSource)
        {
            case "deviceLifecycleEvents":
                Twin tw = JsonConvert.DeserializeObject<Twin>(payload);
                Console.WriteLine($"Events received on partition: {context.PartitionId}, deviceId: {deviceId}, payload: {payload}");
                break;
            case "twinChangeEvents":
                DeviceClient deviceClient = DeviceClient.CreateFromConnectionString(connectionStringBuilder.ToString(), Microsoft.Azure.Devices.Client.TransportType.Amqp);
                var props = new TwinCollection();
                props["temperature"] = payload;
                return deviceClient.UpdateReportedPropertiesAsync(props);
                break;
            default:
                Console.WriteLine($"Message source '{messageSource}' not supported");
                break;
        }
    }
    return context.CheckpointAsync();
}

public Task ProcessErrorAsync(PartitionContext context, Exception error)
{
    Console.WriteLine($"LoggingEventProcessor closing, partition: {context.PartitionId}, reason: {error.Message}");
    return Task.CompletedTask;
}

}

Есть идея получше?Что-нибудь с Microsoft.Azure.Devices.JobClient или около того?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...