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相关错误解决 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1766204439a3444354.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论