0

私は現在、Windows10 IoTコアとRaspberry PI 2を使用してAzure IoTハブの研究開発を行っています。たとえば、部屋の温度が25度を超えると、IoTハブからデバイスにアラートを送信するために、ここのサンプルに従っています。ただし、サンプルは mbed ボード用です。

これを行うために、IoT ハブに温度データを送信する Raspberry Pi 用のサンプル UWP アプリを開発しました。Azure で、IoT ハブを入力として受け取り、データをフィルター処理して (25 度を超える温度のみ)、出力 EventHub に送信するストリーム分析ジョブを作成しました。ここでは、EventHub からデータを読み取り、raspberry pi から温度情報を送信するために使用している IoT ハブに戻すワーカー ロール/クラウド サービスを作成しました。

ここで私の疑問は、IoT Hub がラズベリー pi から送信されたデータとワーカー ロールによって送信されたデータをどのように区別できるかということです。ワーカーロールによって送信されたデータのみを受信するにはどうすればよいですか?

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

ここで行き詰まりました。以下のコードを試して IoT Hub からデータを読み取ろうとしましたが、25 メッセージを超える温度のみであるワーカー ロール メッセージではなく、raspberry pi から送信されたすべてのメッセージを取得しました。

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 Hub からデバイスに送信する方法は?

アップデート:

上記のコードを使用して受信すると、ラズベリー pi によって送信された IoT Hub からのすべてのメッセージを取得しています。

しかし、メッセージを受信するために以下のコードを使用すると、worker ロールによって 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);
        }

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

4

1 に答える 1

0

IoT Hub は、デバイスとクラウド間の双方向の非対称通信方法を提供します。IoT デバイスでクラウドからメッセージを受信するプロセスについては、この記事で詳しく説明しています。

つまり、次のコードを使用して、クラウドからデバイスへのメッセージを 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));
于 2016-05-06T15:37:20.497 に答える