2016-05-06 6 views
0

В настоящее время я делаю R & D на концентраторах Azure IoT с использованием ядра IoT и малины IQ Windows10. Я следую образцу для ссылки here для отправки предупреждений устройству с концентратора IoT когда температура комнаты больше 25, например. Но образец предназначен для mbed board.Получение предупреждений/команд от Azure IoT Hub к устройству

Для этого я разработал образец приложения UWP для малины Pi, который отправит данные о температуре в концентратор IoT. В Azure я создал задание по анализу потока, которое будет принимать IoT-концентратор в качестве входного сигнала и фильтровать данные (только температура выше 25 градусов), а затем отправить его на выход EventHub. Здесь я создал рабочую роль/облачную службу, которая будет считывать данные из EventHub и отправлять обратно в концентратор IoT тому же, который я использую для отправки информации о температуре из малины pi.

Здесь мое сомнение заключается в том, как IoT Hub различает данные, отправленные из малины pi и данные, отправленные рабочей ролью? и как я могу получить только данные, отправленные рабочей ролью?

Потому что, если я читаю сообщения облака для устройства, я получаю данные, которые я отправил из малины pi.

Здесь я застрял, я попробовал приведенный ниже код, чтобы читать данные из концентратора IoT, но получая все мои сообщения, отправленные из малины pi вместо рабочих сообщений ролей, которые содержат только температуру более 25 сообщений.

public async void ReceiveDataFromCloud() 
    { 


     startingDateTimeUtc = DateTime.UtcNow; 
     ServiceBusConnectionStringBuilder builder = new ServiceBusConnectionStringBuilder(ConnectionString); 
     builder.TransportType = ppatierno.AzureSBLite.Messaging.TransportType.Amqp; 

     factory = MessagingFactory.CreateFromConnectionString(ConnectionString); 

     client = factory.CreateEventHubClient(eventHubEntity); 
     group = client.GetDefaultConsumerGroup(); 
     receiver = group.CreateReceiver(partitionId.ToString(), startingDateTimeUtc);//startingDateTimeUtc 
     for (int i = 0; i <= 0; i++) 
     { 
      while (true) 
      { 
       EventData data = receiver.Receive(); 

       if (data != null) 
       { 
        var receiveddata = Encoding.UTF8.GetString(data.GetBytes()); 

        //var messageString = JsonConvert.DeserializeObject<ConferenceRooms>(receiveddata);      

        Debug.WriteLine("{0} {1} {2}", data.SequenceNumber, data.EnqueuedTimeUtc.ToLocalTime(), Encoding.UTF8.GetString(data.GetBytes())); 

       } 
       else 
       { 
        break; 
       } 

       await Task.Delay(2000); 

      } 

     } 

     receiver.Close(); 
     client.Close(); 
     factory.Close(); 

    } 

Как отправить оповещения от концентратора IoT обратно на устройства только сообщения, отфильтрованные аналитической работой потока?

Update:

Когда я использую приведенный выше код для получения Я получаю все сообщения от IoT Hub, которые посылаются на Raspberry Pi.

Но когда я использую приведенный ниже код для получения сообщения, я получаю только сообщения, отправленные рабочей ролью в концентратор IoT.

while (true) 
     { 
      Message receivedMessage = await deviceClient.ReceiveAsync(); 
      if (receivedMessage == null) continue; 

      Console.ForegroundColor = ConsoleColor.Yellow; 
      Console.WriteLine("Received message: {0}", Encoding.ASCII.GetString(receivedMessage.GetBytes())); 
      Console.ResetColor(); 

      await deviceClient.CompleteAsync(receivedMessage); 
     } 

Это мое требование, и я могу его достичь.

ответ

0

IoT Hub обеспечивает двунаправленный асимметричный способ связи между устройством и облаком. Процесс получения сообщений из облака на вашем устройстве IoT описан достаточно хорошо in this article.

Короче, попробуйте использовать следующий код, чтобы получить облако-устройство сообщения IoT Hub:

while (true) 
{ 
    Message receivedMessage = await deviceClient.ReceiveAsync(); 
    if (receivedMessage == null) continue; 

    Console.ForegroundColor = ConsoleColor.Yellow; 
    Console.WriteLine("Received message: {0}", Encoding.ASCII.GetString(receivedMessage.GetBytes())); 
    Console.ResetColor(); 

    await deviceClient.CompleteAsync(receivedMessage); 
} 

Здесь deviceClient является экземпляром Microsoft.Azure.Devices.Client.DeviceClient, который вы создаете, как это:

deviceClient = DeviceClient.Create(iotHubUri, 
    newDeviceAuthenticationWithRegistrySymmetricKey("myFirstDevice", deviceKey)); 
+0

Да, я согласен с тобой. Статья, о которой вы упоминаете, в порядке. Я также могу получать сообщения из облака, используя свой код, но здесь я получаю все сообщения, отправленные малиновым пи. Я не хочу, чтобы все сообщения мне нужны только для сообщений, где значение температуры больше 25. Для этого я использую поточную аналитику, концентраторы событий и рабочую роль, которые будут отправлять обратно отфильтрованные сообщения в концентратор IoT. – narendramacha

+0

@narendramacha, я думаю, что проблема с вашим кодом может заключаться в том, что вы рассматриваете концентратор IoT как EventHub (который является однонаправленным), и, таким образом, вы получаете те же сообщения, которые вы отправляете обратно. С IoT Hub это не должно происходить так, поэтому я предлагаю вам попробовать еще один код, специфичный для IoT, как тот, который приведен в этой статье. –

+0

То, что вы сказали, правильно. После некоторых упражнений я заметил, что IoT Hub отправляет сообщения только сообщения, отправленные рабочей ролью (в моем сценарии). Когда я использую метод приема DeviceClient Receive, он фактически получает только тогда, когда рабочая роль отправляет сообщение в IoT Hub, а не сообщения, отправленные малиной Pi @Dmitri Soshnikov – narendramacha