是否有 Mosquitto 日志条目的描述?

物联网 MQTT 蚊子
2021-06-23 05:29:05

我有一个包含大约 150 个 Mosquitto 日志条目的电子表格。它与我发布的 30 条消息配对,及时匹配。也就是说,Mosquitto 条目的数量大约是已发布条目的 5 倍。许多似乎表明我发布的东西超时了。其他人说“套接字错误”。但是所有订阅者都收到了消息。

我的问题是,在每小时发布 2 或 3 个 2 或 3 天后,突然没有订阅者得到我发布的任何内容。但据我所知,日志“看起来一样”。但是有成千上万的条目。

编辑:该链接将显示我的电子表格。我把它编辑成只有 44 行。有两个垂直部分。我在左侧发布的消息和右侧的 Mosquitto 日志条目。抱歉,当我将它们粘贴到电子表格中时,分隔符将它们分布在许多列中。前 3 个左右的 pub 看起来不错,但随后 12:13:26 的 pub 出现了套接字错误,尽管订阅者收到了 pub。在那之后,事情似乎也随着超时而变得更糟。

捕蚊短片

其余的 100 行左右(我没有包括在内)非常相似。超时和套接字错误。但是订阅者得到了酒吧。

pubs 来自我编写的在我的 Raspberry Pi 上运行的 C 程序。订阅者是 OpenHAB 中的项目,它们也位于同一 RPi 上。这是进行发布的 C 代码:

void publish(char *Topic, char *action)
{
    mosquitto_lib_init();
    mosq = mosquitto_new(NULL,true,NULL);
    mosquitto_loop_start(mosq);
    mosquitto_connect_async(mosq,MQTT_Host,MQTT_Port,1);
    mosquitto_publish(mosq,NULL,Topic,strlen(action),action,2,false);
    printf("Mosquitto Sending: %s %s to %s:%d\n",Topic,action,MQTT_Host,MQTT_Port);
}
1个回答

电子表格确实不是处理这些日志的最佳方式,它使它们很难正确阅读。下次请只发布文本并使用{}工具栏中选项将其格式化为代码。

您提供的日志条目没有任何明显错误。

也就是说,C 代码让我很担心,看起来您正在为每个发布事件创建一个新的 MQTT 客户端,然后没有关闭它们或在之后正确清理资源。您很可能会泄漏客户端结构和网络线程。这些是会导致事情在某些时候崩溃的事情。

首先假设发布消息的应用程序长时间运行,它应该创建一个 MQTT 客户端对象并在应用程序的生命周期内重用它。

这意味着库的初始化、客户端的创建、网络循环的开始和连接都应该移到publish函数之外,并且mosq应该是变量,这是在一个更全局的范围内,以便以后可以访问。

同样使用 1 秒作为 KeepAlive 值只会给您的经纪人带来大量额外负载(特别是对于您当前正在泄漏且未清理的客户端)。更好的值是 60。

您可以在连接行的日志中看到 KeepAlive 值:

12:23:31pm New client connected from 192.168.1.115 as mosq-0g6AG1QuASdsrJZqAz (p2,  c1, k1).
  • p 是协议版本,其中 1 -> MQTT3.1 2 -> MQTT3.11 5 -> MQTT5
  • c 是如果设置了干净的会话标志
  • k 是保活值

ps 否 除了src代码之外没有对日志输出的描述