私は現在、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);
}
これが私の要件であり、私はそれを達成することができます。