Azure IOT Hub SDK 设置设备孪生需要 属性 布尔值不起作用
Azure IOT Hub SDK set device twin desired property with a boolean value not working
编译 json 字符串时,我在使用布尔值设置一些所需属性时遇到问题,我从 azure Hub SDK 返回异常,“”解析值时遇到意外字符:T . 路径 'properties.desired.smtpServer.logEvents',第 9 行,位置 39。"""
var twin = await _registryManager.GetTwinAsync(deviceId);
var patch =
@"{
properties: {
desired: {
smtpServer: {
encoding: '" + server.Encoding + @"',
dataLimit: " + server.DataLimit + @",
ipAddress: '" + server.IpAddress + @"',
portNumber: " + server.PortNumber + @",
logEvents: " + true + @", // not working - doesnt like the boolean
autoStart: " + true + @", // not working - doesnt like the boolean
}
}
}
}";
await _registryManager.UpdateTwinAsync(twin.DeviceId, patch, twin.ETag);
如果将 属性 logEvents 设置为字符串,则它会通过。
查看其他所需的 属性 示例,我们没有理由不能使用布尔值而不是将它们转换为字符串,我构建 json 的方式有问题吗?完全失去了这里的问题...
更新 - 一种不同的方法但仍然无效:
按照下面给出的答案,然后我尝试使用 Newtonsoft Serializer,但现在发现所需的属性根本没有更新,但同样我没有从 IOT Hub SDK 返回任何异常,所以我'我不确定如何解决这个问题。
型号类:
public class properties
{
[JsonProperty("desired")]
public desired desired { get; set; }
}
public class desired
{
[JsonProperty("smtpServer")]
public smtpServer smtpServer { get; set; }
}
public class smtpServer
{
[JsonProperty("encoding")]
public string encoding { get; set; }
[JsonProperty("dataLimit")]
public int dataLimit { get; set; }
[JsonProperty("ipAddress")]
public string ipAddress { get; set; }
[JsonProperty("portNumber")]
public int portNumber { get; set; }
[JsonProperty("logEvents")]
public bool logEvents { get; set; }
[JsonProperty("autoStart")]
public bool autoStart { get; set; }
[JsonProperty("enabled")]
public bool enabled { get; set; }
}
更新方法:
public async Task UpdateServer(string deviceId, smtpServer server)
{
var twin = await _registryManager.GetTwinAsync(deviceId);
var smtpServer = new smtpServer
{
encoding = server.encoding,
dataLimit = server.dataLimit,
ipAddress = server.ipAddress,
portNumber = server.portNumber,
logEvents = server.logEvents,
autoStart = server.autoStart,
enabled = server.enabled,
};
var desired = new desired
{
smtpServer = smtpServer
};
var properties = new properties
{
desired = desired
};
//var patch = JsonConvert.SerializeObject(properties, Formatting.Indented);
var patch = JsonConvert.SerializeObject(properties);
await _registryManager.UpdateTwinAsync(twin.DeviceId, patch, twin.ETag);
}
IoT Hub 不接受这种形式的 JSON,因为使用值 true
并将其添加到字符串中会将其转换为 True
(注意大写 T ).这不是 JSON 解析器的有效值。确保您发送的值是小写的。
虽然这会修复异常并解决您的问题(IoT Hub 会很好地接受此文本),但这仍然无效 JSON。所有属性和字符串值都应该用双引号括起来。您希望 JSON 最终看起来像这样:
{
"properties":{
"desired":{
"smtpServer":{
"encoding":"yes",
"dataLimit":100,
"ipAddress":"yes",
"portNumber":22,
"logEvents":true,
"autoStart":true
}
}
}
}
自己写 JSON 会很乏味,所以最好改用 JSON 序列化程序。 Azure SDK 在内部使用 Newtonsoft.Json,因此您可以执行以下操作而不是自己调用序列化程序:
private static async Task UpdateTwin()
{
var smtpServer = new SmtpServer
{
Encoding = "bar",
DataLimit = 100,
IpAddress = "foo",
PortNumber = 42,
LogEvents = true,
AutoStart = true
};
var registryManager = RegistryManager.CreateFromConnectionString(ConnectionString);
var twin = await registryManager.GetTwinAsync(TestDevice);
twin.Properties.Desired["smtpServer"] = smtpServer;
await registryManager.UpdateTwinAsync(twin.DeviceId, twin, twin.ETag);
}
public class SmtpServer
{
[JsonProperty("encoding")]
public string Encoding { get; set; }
[JsonProperty("dataLimit")]
public int DataLimit { get; set; }
[JsonProperty("ipAddress")]
public string IpAddress { get; set; }
[JsonProperty("portNumber")]
public int PortNumber { get; set; }
[JsonProperty("logEvents")]
public bool LogEvents { get; set; }
[JsonProperty("autoStart")]
public bool AutoStart { get; set; }
}
在我的集线器上测试了该代码,它没有问题。
编译 json 字符串时,我在使用布尔值设置一些所需属性时遇到问题,我从 azure Hub SDK 返回异常,“”解析值时遇到意外字符:T . 路径 'properties.desired.smtpServer.logEvents',第 9 行,位置 39。"""
var twin = await _registryManager.GetTwinAsync(deviceId);
var patch =
@"{
properties: {
desired: {
smtpServer: {
encoding: '" + server.Encoding + @"',
dataLimit: " + server.DataLimit + @",
ipAddress: '" + server.IpAddress + @"',
portNumber: " + server.PortNumber + @",
logEvents: " + true + @", // not working - doesnt like the boolean
autoStart: " + true + @", // not working - doesnt like the boolean
}
}
}
}";
await _registryManager.UpdateTwinAsync(twin.DeviceId, patch, twin.ETag);
如果将 属性 logEvents 设置为字符串,则它会通过。
查看其他所需的 属性 示例,我们没有理由不能使用布尔值而不是将它们转换为字符串,我构建 json 的方式有问题吗?完全失去了这里的问题...
更新 - 一种不同的方法但仍然无效:
按照下面给出的答案,然后我尝试使用 Newtonsoft Serializer,但现在发现所需的属性根本没有更新,但同样我没有从 IOT Hub SDK 返回任何异常,所以我'我不确定如何解决这个问题。
型号类:
public class properties
{
[JsonProperty("desired")]
public desired desired { get; set; }
}
public class desired
{
[JsonProperty("smtpServer")]
public smtpServer smtpServer { get; set; }
}
public class smtpServer
{
[JsonProperty("encoding")]
public string encoding { get; set; }
[JsonProperty("dataLimit")]
public int dataLimit { get; set; }
[JsonProperty("ipAddress")]
public string ipAddress { get; set; }
[JsonProperty("portNumber")]
public int portNumber { get; set; }
[JsonProperty("logEvents")]
public bool logEvents { get; set; }
[JsonProperty("autoStart")]
public bool autoStart { get; set; }
[JsonProperty("enabled")]
public bool enabled { get; set; }
}
更新方法:
public async Task UpdateServer(string deviceId, smtpServer server)
{
var twin = await _registryManager.GetTwinAsync(deviceId);
var smtpServer = new smtpServer
{
encoding = server.encoding,
dataLimit = server.dataLimit,
ipAddress = server.ipAddress,
portNumber = server.portNumber,
logEvents = server.logEvents,
autoStart = server.autoStart,
enabled = server.enabled,
};
var desired = new desired
{
smtpServer = smtpServer
};
var properties = new properties
{
desired = desired
};
//var patch = JsonConvert.SerializeObject(properties, Formatting.Indented);
var patch = JsonConvert.SerializeObject(properties);
await _registryManager.UpdateTwinAsync(twin.DeviceId, patch, twin.ETag);
}
IoT Hub 不接受这种形式的 JSON,因为使用值 true
并将其添加到字符串中会将其转换为 True
(注意大写 T ).这不是 JSON 解析器的有效值。确保您发送的值是小写的。
虽然这会修复异常并解决您的问题(IoT Hub 会很好地接受此文本),但这仍然无效 JSON。所有属性和字符串值都应该用双引号括起来。您希望 JSON 最终看起来像这样:
{
"properties":{
"desired":{
"smtpServer":{
"encoding":"yes",
"dataLimit":100,
"ipAddress":"yes",
"portNumber":22,
"logEvents":true,
"autoStart":true
}
}
}
}
自己写 JSON 会很乏味,所以最好改用 JSON 序列化程序。 Azure SDK 在内部使用 Newtonsoft.Json,因此您可以执行以下操作而不是自己调用序列化程序:
private static async Task UpdateTwin()
{
var smtpServer = new SmtpServer
{
Encoding = "bar",
DataLimit = 100,
IpAddress = "foo",
PortNumber = 42,
LogEvents = true,
AutoStart = true
};
var registryManager = RegistryManager.CreateFromConnectionString(ConnectionString);
var twin = await registryManager.GetTwinAsync(TestDevice);
twin.Properties.Desired["smtpServer"] = smtpServer;
await registryManager.UpdateTwinAsync(twin.DeviceId, twin, twin.ETag);
}
public class SmtpServer
{
[JsonProperty("encoding")]
public string Encoding { get; set; }
[JsonProperty("dataLimit")]
public int DataLimit { get; set; }
[JsonProperty("ipAddress")]
public string IpAddress { get; set; }
[JsonProperty("portNumber")]
public int PortNumber { get; set; }
[JsonProperty("logEvents")]
public bool LogEvents { get; set; }
[JsonProperty("autoStart")]
public bool AutoStart { get; set; }
}
在我的集线器上测试了该代码,它没有问题。