admin 管理员组

文章数量: 1184232

mqtt服务器退出时程序段错误

  • 问题一:mqtt服务器退出时程序段错误
    • 问题描述
    • 原因
    • 解决方法
    • 效果
  • 问题二:mqtt请求消息格式有误时,记忆性重复报type error
    • 问题描述
    • 原因
    • 解决方法
  • 问题三: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);
}

2)新增函数:

void onConnected(void* context, MQTTAsync_successData* response)
{
	printf("Successful reconnection\n");
    get_mesg_start();
}

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

本文标签: 错误 MQTT