Azure IoT 中心 - 设备是从设备到 IoT 中心的自定义二进制有效负载,需要解析方式
Azure IoT hub - Device is custom binary payload from device to IoT hub and needs way for parsing
我有一个设备正在向服务器发送二进制数据包。我想将其迁移到 Azure IoT 中心。我想坚持使用二进制数据本身并在 Azure 函数中解析二进制数据。
我已经使用 Azure SDK 在 .NET 中编写了设备模拟器,并编写了在 IoT 中心收到消息时触发的 Azure 函数。
设备模拟器中的代码:
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 转换为字节数组,但没有成功。
尝试以下操作:
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}"))}");
}
不要使用字符串作为输入绑定属性,而是使用 EventData。有关完整示例,请参阅我的代码 here。
[FunctionName("IotHubMessageProcessor")]
public static void Run([IoTHubTrigger("messages/events", Connection = "iothubevents_cs", ConsumerGroup = "receiverfunction")]EventData message, ILogger log)
然后您可以从消息对象中读取正文(原始内容)作为 stream。
当您使用字符串时,IoTHub 绑定会在内部尝试将消息正文解释为 UTF-8 编码的字符串 - 这在您的情况下显然会失败。
我有一个设备正在向服务器发送二进制数据包。我想将其迁移到 Azure IoT 中心。我想坚持使用二进制数据本身并在 Azure 函数中解析二进制数据。
我已经使用 Azure SDK 在 .NET 中编写了设备模拟器,并编写了在 IoT 中心收到消息时触发的 Azure 函数。
设备模拟器中的代码:
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 转换为字节数组,但没有成功。
尝试以下操作:
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}"))}");
}
不要使用字符串作为输入绑定属性,而是使用 EventData。有关完整示例,请参阅我的代码 here。
[FunctionName("IotHubMessageProcessor")]
public static void Run([IoTHubTrigger("messages/events", Connection = "iothubevents_cs", ConsumerGroup = "receiverfunction")]EventData message, ILogger log)
然后您可以从消息对象中读取正文(原始内容)作为 stream。
当您使用字符串时,IoTHub 绑定会在内部尝试将消息正文解释为 UTF-8 编码的字符串 - 这在您的情况下显然会失败。