当前位置:   article > 正文

mqtt相关错误解决_paho中mqtt回调函数报段错误 如何捕获异常

paho中mqtt回调函数报段错误 如何捕获异常

问题一:mqtt服务器退出时程序段错误

问题描述

1、启动mqtt服务器;启动模拟AI server的mqtt客户端
2、启动AI程序
3、ctrl+c中断mqtt服务器
4、AI程序提示重新连接,然后段错误异常退出

原因

mqtt服务器退出时,直接在connlost回调函数中调用MQTTAsync_connect函数进行重新连接会出错。

解决方法

经查询,paho-mqtt库提供了重连机制。要将automaticReconnect参数设置为1,且调用MQTTAsync_setConnected(client, (void *)client, onConnected)进行重连,并在onConnected再次进行订阅。
核心代码如下:
1)在mqtt_init()函数中增加如下代码:

conn_opts.automaticReconnect = 1;
conn_opts.minRetryInterval = 2; //seconds
conn_opts.maxRetryInterval = 365*24*60*60;
while(1)
{
	rc = MQTTAsync_setConnected(client, (void *)client, onConnected);
    if (rc == MQTTASYNC_SUCCESS)
    {
        printf("Successfully setConnected.\n");
        break;
    }
    sleep(0.5);
    printf("Failed to setConnected, return error code %d.\n", rc);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2)新增函数:

void onConnected(void* context, MQTTAsync_successData* response)
{
	printf("Successful reconnection\n");
    get_mesg_start();
}
  • 1
  • 2
  • 3
  • 4
  • 5

3)去掉connlost中调用MQTTAsync_connect函数的部分。

效果

服务器退出后,程序提示失去连接,且程序照常运行。服务器重新启动后,程序提示重新连接成功,并可正常收发消息。

问题二:mqtt请求消息格式有误时,记忆性重复报type error

问题描述

1、启动mqtt服务器;启动模拟AI server的mqtt客户端
2、启动AI程序
3、模拟AI server下发消息,其中将type字段的内容,从“GET_FEATURES”改为“GET_FEATURE”
4、log一直报type error错误,将“AI_MOD”改为“AI_MODD”时也报type error错误。

原因

回调函数msgarrvd返回值为0时,会进行重复发送。

解决方法

让回调函数msgarrvd返回值不为0。

问题三:mqtt请求消息格式有误时程序崩溃

问题描述

1、启动mqtt服务器;启动模拟AI server的mqtt客户端
2、启动人脸导入AI程序
3、模拟AI server下发消息,其中将type字段的内容,从“GET_FEATURES”改为“GET_FEATURE”或 将module字段的内容,从“AI_MOD”改为“AI_MODD”
4、程序Segmentation fault异常退出。

原因

message和topicName不能释放掉。

解决方法

mqttAsync_common.c的msgArrvd函数中去掉两行代码:
MQTTAsync_freeMessage(&message);
MQTTAsync_free(topicName);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/337293
推荐阅读
相关标签
  

闽ICP备14008679号