Azure IoT中心-设备是从设备到IoT中心的自定义二进制有效负载,需要解析的方式

时间:2019-05-21 08:08:07

标签: azure azure-iot-hub

我有一个将二进制数据包发送到服务器的设备。我想将其迁移到Azure IoT中心。我想坚持使用二进制数据本身,并在Azure函数中解析二进制数据。

我已经使用Azure SDK在.NET中编写了设备模拟器,并编写了Azure功能,当在IoT中心上收到消息时会触发该功能。

设备模拟器上的代码:

double currentTemperature = 23.0;
byte[] temp= BitConverter.GetBytes(currentTemperature);
double currentHumidity = 24.0;
byte[] humidity= BitConverter.GetBytes(currentHumidity);

List<byte> bytes = new List<byte>();
bytes.AddRange(temp);
bytes.AddRange(humidity);

DeviceClient s_deviceClient; // Created device client here.
var message = new Microsoft.Azure.Devices.Client.Message(bytes.ToArray());
await s_deviceClient.SendEventAsync(message);

在Azure功能中-如果我进行转换

public static void Run(string myIoTHubMessage, ILogger log)
{
    byte[] dataArray = Encoding.ASCII.GetBytes(myIoTHubMessage);
}

在这里,我尝试了不同类型的编码以将 myIoTHubMessage 转换为字节数组,但没有用。

2 个答案:

答案 0 :(得分:0)

尝试以下操作:

using System;

public static void Run(byte[] myIoTHubMessage, IDictionary<string, object> properties, IDictionary<string, object> systemproperties, TraceWriter log)
{
    log.Info($"Temperature = {BitConverter.ToDouble(myIoTHubMessage, 0)}");
    log.Info($"Humidity = {BitConverter.ToDouble(myIoTHubMessage, 8)}");

    log.Info($"\nSystemProperties:\n\t{string.Join("\n\t", systemproperties.Select(i => $"{i.Key}={i.Value}"))}");

    log.Info($"\nProperties:\n\t{string.Join("\n\t", properties.Select(i => $"{i.Key}={i.Value}"))}");
}

答案 1 :(得分:0)

使用EventData代替使用字符串作为输入绑定属性。有关完整示例,请参见我的代码here

[FunctionName("IotHubMessageProcessor")]
public static void Run([IoTHubTrigger("messages/events", Connection = "iothubevents_cs", ConsumerGroup = "receiverfunction")]EventData message, ILogger log)

然后您可以从消息对象中以stream的形式读取正文(原始内容)。

当您使用字符串时,IoTHub绑定会在内部尝试将消息正文解释为UTF-8编码的字符串-在您的情况下显然会失败。