2016-05-06 13 views
0

現在、Windows10 IoTコアとRaspberry PI 2を使用してAzure IoTハブでR & Dを実行しています。参照用のサンプルhereを使用してIoTハブからデバイスにアラートを送信しています部屋の温度が例えば25℃より高いとき。しかしサンプルはmbedボード用です。Azure IoTハブからデバイスへのアラート/コマンドの受信

は、これを行うために、私はIoTをハブに温度データを送信しますラズベリーパイのためのサンプルUWPアプリを開発しました。 Azureでは、IoTハブを入力としてフィルタリングしてデータをフィルタリングし(25度以上の温度のみ)、EventHubを出力するストリーム分析ジョブを作成しました。ここでは、EventHubからデータを読み込んでIoTハブに戻して、ラズベリーパイから温度情報を送信するために使用しているものと同じワーカーロール/クラウドサービスを作成しました。

ここに私の疑問は、どのようなIoTハブは、ラズベリーパイから送信されたデータとWorkerロールによって送信されたデータを区別することができますか?どのように私は労働者の役割によって送られたデータだけを受け取ることができますか?

私はクラウドからデバイスへのメッセージを読むと、私がラズベリーパイから送信したデータを受信して​​いるためです。ここで

私は25件のメッセージよりも温度だけ大きい代わりに、Workerロールメッセージを私はIoTをハブからデータを読み取るために以下のコードを試みたが、すべての私のメッセージは、ラズベリーパイから送信されたばかり、捕まってしまいました。

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ハブからアラートを送信する方法は、ストリーム分析ジョブでフィルタリングされたメッセージのみです。

更新:

私はラズベリーパイによって送信されたIoTハブからのすべてのメッセージを取得しています受信するために上記のコードを使用します。

しかし、私はメッセージを受信するために以下のコードを使用するとき、私はIoTをハブにWorkerロールによって送信されたメッセージだけを取得しています。

これは私の要件であり、達成することができます。

答えて

0

IoTハブは、デバイスとクラウド間の双方向非対称通信方式を提供します。あなたのIoTデバイス上のクラウドからメッセージを受信するプロセスは、かなりよく記述されています。in this article

要するに

、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); 
} 

ここdeviceClientは、あなたがこのように作成Microsoft.Azure.Devices.Client.DeviceClientのインスタンスである:

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

はい、私はあなたに同意します。あなたが言及している記事は問題ありません。私は自分のコードを使ってクラウドからメッセージを受け取ることができますが、ここではラズベリーパイによって送られたすべてのメッセージを受け取ります。すべてのメッセージが必要なのは、温度値が25より大きいメッセージだけです。ストリーム分析、イベントハブ、IoTハブにフィルタリングされたメッセージを返す作業者ロールを使用しています。 – narendramacha

+0

@narendramacha、あなたのコードの問題は、IoT HubをEventHub(単方向)として扱うことになると思います。したがって、同じメッセージを返すことになります。 IoT Hubでは、このようなことは起こらないはずです。そのため、記事のようなIoT固有のコードをいくつか試してみることをお勧めします。 –

+0

あなたが言ったことは正しかった、いくつかの練習の後、IoTハブが(私のシナリオでは)ワーカーの役割によって送られたメッセージだけを返信することを観察しました。 DeviceClient Receiveメソッドを使用すると、ワーカーロールがメッセージをIoTハブに送信したときにのみ実際に受信されます。これは、Raspberry Pi @ Dmitri Soshnikovによって送信されたメッセージ – narendramacha

関連する問題