如果之后我断开连接,则无法发布消息

时间:2019-09-06 13:59:32

标签: c# connection mqtt cumulocity

我正在尝试编写一项服务以将数据转发到累积。

传感器读取数据后,会将其发送到我们的服务器。 然后,服务器将该数据转发到我的服务。 我对其进行了解析,并使用Smart REST模板将其发送给累积量。

我查看了指南,并将代码复制到那里进行测试。 例如,设备创建消息如下所示。

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();
}

当代码是这样时,在我的累积租户中没有创建任何设备。

当我注释await client.Disconnect();时,它会创建设备。

这是什么原因?

在我的真实代码中,如果我不断开连接,将无法保持内存使用率。如果我断开邮件连接,请不要去找经纪人。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

问题是因为您正在QOS1(至少一次)发布消息。这需要客户端和代理之间的多包握手。

await应该意味着发布代码等待此操作完成,但是看起来并非如此,这意味着您要关闭客户端才能完成QOS1的握手