如果我之后断开连接,Cumulocity 无法发布消息
Cumulocity cannot publish message if I Disconnect afterwards
我正在尝试编写一个服务来将数据转发到 cumulocity。
当传感器读取数据时,它会将数据发送到我们的服务器。
然后服务器将该数据转发到我的服务。
我解析它并使用智能 REST 模板将其发送到 cumulocity。
我查看了指南并将代码复制到那里进行了一些测试。
例如,设备创建消息如下所示。
public async Task ClientTest([FromBody] JObject sensorjson)
{
var cDetails = new ConnectionDetailsBuilder()
.WithClientId("clientId")
.WithHost("mqtt.cumulocity.com")
.WithCredentials("Credentials")
.WithCleanSession(true)
.(WithProtocol(TransportType.Tcp).Build();
MqttClient client = new MqttClient(cDetails);
await client.EstablishConnectionAsync();
string topic = "s/us";
string payload = $"100,TestDevice,Test";
var message = new MqttMessageRequestBuilder()
.WithTopicName(topic)
.WithQoS(QoS.AT_LEAST_ONCE)
.WithMessageContent(payload)
.Build();
await client.PublishAsync(message);
await client.Disconnect();
}
当代码是这样的时候,我的cumulocity租户中没有创建任何设备。
当我注释掉 await client.Disconnect();
时,它会创建设备。
这背后的原因是什么?
在我的真实代码中,如果我在某些时候不断开连接,则无法维持内存使用。如果我断开我的消息,请不要转到代理。
我该怎么办?
问题是因为您正在以 QOS1(至少一次)发布消息。这需要在客户端和代理之间进行多数据包握手。
await
应该意味着发布代码等待此完成,但看起来不是,这意味着您要在客户端完成 QOS1 的握手之前关闭它
我正在尝试编写一个服务来将数据转发到 cumulocity。
当传感器读取数据时,它会将数据发送到我们的服务器。 然后服务器将该数据转发到我的服务。 我解析它并使用智能 REST 模板将其发送到 cumulocity。
我查看了指南并将代码复制到那里进行了一些测试。 例如,设备创建消息如下所示。
public async Task ClientTest([FromBody] JObject sensorjson)
{
var cDetails = new ConnectionDetailsBuilder()
.WithClientId("clientId")
.WithHost("mqtt.cumulocity.com")
.WithCredentials("Credentials")
.WithCleanSession(true)
.(WithProtocol(TransportType.Tcp).Build();
MqttClient client = new MqttClient(cDetails);
await client.EstablishConnectionAsync();
string topic = "s/us";
string payload = $"100,TestDevice,Test";
var message = new MqttMessageRequestBuilder()
.WithTopicName(topic)
.WithQoS(QoS.AT_LEAST_ONCE)
.WithMessageContent(payload)
.Build();
await client.PublishAsync(message);
await client.Disconnect();
}
当代码是这样的时候,我的cumulocity租户中没有创建任何设备。
当我注释掉 await client.Disconnect();
时,它会创建设备。
这背后的原因是什么?
在我的真实代码中,如果我在某些时候不断开连接,则无法维持内存使用。如果我断开我的消息,请不要转到代理。
我该怎么办?
问题是因为您正在以 QOS1(至少一次)发布消息。这需要在客户端和代理之间进行多数据包握手。
await
应该意味着发布代码等待此完成,但看起来不是,这意味着您要在客户端完成 QOS1 的握手之前关闭它