我有一个将二进制数据包发送到服务器的设备。我想将其迁移到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 转换为字节数组,但没有用。
答案 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编码的字符串-在您的情况下显然会失败。