私はこのリンクをたどっています To write custom modules。このチュートリアルでは、 tempSensor という名前のモジュールがデータを別のモジュール CSharpModule に送信します。チュートリアルに関する限り、私はそれをうまく実装しました。
私がやりたいことは、 IoTDeviceからIoTEdge Deviceへのテレメトリ データの受信です。
アーキテクチャ: IoT デバイスと IoTEdge デバイスに接続された Azure IoTHub
私が試したこと: connectionString を使用して ioTEdge に接続されたシミュレートされたデバイスからテレメトリ データを送信しようとしました。
データ送信コードはこちら
//DeviceClient connected to IoTEdge
s_deviceClient = DeviceClient.CreateFromConnectionString(s_connectionString);
private static async void SendDeviceToCloudMessagesAsync()
{
// Initial telemetry values
double minTemperature = 20;
double minHumidity = 60;
Random rand = new Random();
while (true)
{
double currentTemperature = minTemperature + rand.NextDouble() * 15;
double currentHumidity = minHumidity + rand.NextDouble() * 20;
// Create JSON message
var telemetryDataPoint = new
{
temperature = currentTemperature,
humidity = currentHumidity
};
var messageString = JsonConvert.SerializeObject(telemetryDataPoint);
var message = new Message(Encoding.ASCII.GetBytes(messageString));
// Add a custom application property to the message.
message.Properties.Add("temperatureAlert", (currentTemperature > 30) ? "true" : "false");
// Send the tlemetry message to endpoint output1
await s_deviceClient.SendEventAsync("ouput1",message);
//await s_deviceClient.SendEventAsync(message);
Console.WriteLine("{0} > Sending message: {1}", DateTime.Now, messageString);
await Task.Delay(s_telemetryInterval * 10000);
}
}
IoTEdge カスタム モジュール コードの受信側はここにあります...
static async Task Init()
{
AmqpTransportSettings amqpSetting = new AmqpTransportSettings(TransportType.Amqp_Tcp_Only);
ITransportSettings[] settings = { amqpSetting };
// Open a connection to the Edge runtime
ModuleClient ioTHubModuleClient = await ModuleClient.CreateFromEnvironmentAsync(settings);
await ioTHubModuleClient.OpenAsync();
Console.WriteLine("IoT Hub module client initialized.");
// Register a callback for messages that are received by the module.
// await ioTHubModuleClient.SetImputMessageHandlerAsync("input1", PipeMessage, iotHubModuleClient);
// Read the TemperatureThreshold value from the module twin's desired properties
var moduleTwin = await ioTHubModuleClient.GetTwinAsync();
var moduleTwinCollection = moduleTwin.Properties.Desired;
try {
temperatureThreshold = moduleTwinCollection["iothub-connection-device-id"];
} catch(ArgumentOutOfRangeException e) {
Console.WriteLine($"Property TemperatureThreshold not exist: {e.Message}");
}
// Attach a callback for updates to the module twin's desired properties.
await ioTHubModuleClient.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertiesUpdate, null);
// Register a callback for messages that are received by the module
await ioTHubModuleClient.SetInputMessageHandlerAsync("input1", PipeMessage, ioTHubModuleClient);
}
カスタムモジュールの deployment.template.json ファイルからのルート情報は以下の通りです。
"routes": {
"aggregationModuleToIoTHub": "FROM /messages/modules/aggregationModule/outputs/* INTO $upstream"
}
しかし、問題はコールバックPipeMessageが呼び出されないことです。私の理解では、IoTEdge エンドポイントのmessages/ input1 にメッセージが来ていません。