2016-05-06 91 views
0

我正在使用Windows10 IoT核心和Raspberry PI 2在Azure IoT集線器上執行R & D.我正在按照示例以供參考here以從IoT集線器向設備發送警報例如,當房間的溫度大於25℃時。但樣本是針對mbed板的。接收Azure IoT Hub到設備的警報/命令

爲此,我爲Raspberry Pi開發了一個示例UWP應用程序,它將溫度數據發送到IoT中心。在Azure中,我創建了一個流分析作業,它將IoT中心作爲輸入並過濾數據(僅溫度高於25度),然後將其發送至輸出EventHub。在這裏,我創建了一個工作者角色/雲服務,它將從EventHub中讀取數據並將其發送回IoT集線器,與我用於從樹莓派發送溫度信息的同一個服務器相同。

這裏我的疑問是,物聯網Hub如何區分從樹莓派發送的數據和工作人員角色發送的數據?以及如何只接收工作角色發送的數據?

因爲如果我讀雲到設備消息,我正在接收從樹莓派發送的數據。

這裏我被卡住了,我嘗試了下面的代碼從IoT Hub讀取數據,但是從樹莓派中獲取所有消息,而不是溫度超過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其通過覆盆子PI發送的消息上述代碼。

但是當我使用下面的代碼接收消息時,我只收到工作角色發送給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); 
     } 

這是我的要求,我能夠實現它。

回答

0

物聯網集線器提供設備和雲之間的雙向不對稱通信方式。在您的物聯網設備上從雲接收消息的過程描述得非常好in this article

總之,嘗試使用下面的代碼從物聯網中心收到的雲到設備的消息:

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

是的,我同意你的意見。你提到的文章很好。我也可以使用我的代碼接收來自雲端的消息,但在這裏我收到了覆盆子pi發送的所有消息。我不想要所有消息,我只想要溫度值大於25的消息。爲此,我使用流分析,事件中心和工作人員角色將過濾後的消息發送回IoT中心。 – narendramacha

+0

@narendramacha,我認爲你的代碼的問題可能是你把IoT Hub當作EventHub(這是單向的),因此你得到的是和你一樣的消息。使用物聯網集線器不應該發生這種情況,這就是爲什麼我建議您嘗試一些更多物聯網特定的代碼,如文章中的代碼。 –

+0

你說的是對的,經過一番練習,我觀察到IoT Hub只發送由工作者角色發送的消息(在我的方案中)。當我使用DeviceClient接收方法時,它實際上只在工作角色向IoT Hub發送消息時才接收,而不是由Raspberry Pi發送的消息@Dmitri Soshnikov – narendramacha

相關問題