Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
kawaii-mqtt
MQTT
源码分析
5
kawaii mqtt 严谨使用注意事项,求助
发布于 2021-06-23 18:50:18 浏览:2079
订阅该版
![image.png](https://oss-club.rt-thread.org/uploads/20210623/a528a6bc52ddaf3a7d73454b2fa70ca9.png.webp) 两个问题,在图中已经表达了,就不再手打一遍了
查看更多
lchnu
2022-09-29
Witness, Understand, Skill
## 问题1 mqtt_publish失败,一般是掉线了,此处理逻辑因人而异。 kawaii-mqtt提供了自动重连机制,通过`mqtt_set_reconnect_handler`和`mqtt_set_reconnect_data`设置重连的句柄和数据。 我个人项目中,如果publish失败,则应用线程不做任何处理,继续发数据,避免ringbuffer被写满,自动重连上线后,发出的数据总是最新的。 具体看你的需求,如果数据不能丢,那就要另行做一段时间的缓存。 ## 问题2 QOS1和QOS2的消息复制在`mqtt_ack_handler_create`函数中,从heap上开辟了空间,存放payload。所以,`mqtt_publish函数返回成功,释放msg的内存就好`。收到PUBACK/PUBCOMP后,会调用`mqtt_puback_and_pubcomp_packet_handle`函数unrecord ack。 保存payload的具体调用过程如下: mqtt_ack_list_record --> mqtt_ack_handler_create mqtt_ack_handler_create的部分业务代码如下,内部自动暂存payload。 ```c static ack_handlers_t *mqtt_ack_handler_create(mqtt_client_t* c, int type, uint16_t packet_id, uint16_t payload_len, message_handlers_t* handler) { ack_handlers_t *ack_handler = NULL; ack_handler = (ack_handlers_t *) platform_memory_alloc(sizeof(ack_handlers_t) + payload_len); ...... ack_handler->payload_len = payload_len; ack_handler->payload = (uint8_t *)ack_handler + sizeof(ack_handlers_t); memcpy(ack_handler->payload, c->mqtt_write_buf, payload_len); /* save the data in ack handler*/ return ack_handler; } ```
4
个回答
默认排序
按发布时间排序
lllichuan
2021-06-24
这家伙很懒,什么也没写!
第一个问题, 发送失败应该踢掉连接,但是mqtt本身有一个线程维持连接的 直接踢掉会出问题,尝试了 很多办法 效果都不好,我是在这边加一个标志位 连段断开 置位,在mqtt keeplive检测的地方 写入连接状态,然后他维持连接的现场自己就踢掉了 ```c mqtt_mark = mqtt_publish(client_fd,g_run_GW_parament.mqtt_setparament.pub_topic, &msg); rt_kprintf("\nmqtt data:%d\n\n",mqtt_mark); cJSON_free(mqtt_modbus_data); if(mqtt_mark !=0) { client_fd->lcc_flag = 1; } 然后 int mqtt_keep_alive(mqtt_client_t* c) { int rc = KAWAII_MQTT_SUCCESS_ERROR; rc = mqtt_is_connected(c); if (KAWAII_MQTT_SUCCESS_ERROR != rc) { RETURN_ERROR(rc); } if(c->lcc_flag==1) { c->lcc_flag = 0; KAWAII_MQTT_LOG_W(" send err and close socket\r\n"); /*must realse the socket file descriptor zhaoshimin 20200629*/ network_release(c->mqtt_network); mqtt_set_client_state(c, CLIENT_STATE_DISCONNECTED); rc = KAWAII_MQTT_NOT_CONNECT_ERROR; /* PINGRESP not received in keepalive interval */ } ``` mqtt线程本身有重连的功能 所以 置位了 他就自动重连了 第二个问题发送完了 你就不用管了 等待回复状态就好了, `mqtt demo`自己做好了剩下的事情
ZCmengyang
2021-06-24
这家伙很懒,什么也没写!
第一个问题最流氓的做法,检测mqtt的心跳,如果检测不到心跳,强制关闭mqtt连接或者tcp连接,然后重连 第二个问题,qos的问题,如果是qos为0,那么你publish消息后就可以清除信息,如果是qos1,他至少保证一次消息被接受,所以你应该在收到服务器的ack消息后清除信息,(同理如果你没有收到服务器的确认信息,那你应该一直发这条数据)。qos2同理,不过qos2我没用过,看协议等到服务器确认消息被接收后清除信息
保尔罗夫
2022-09-28
这家伙很懒,什么也没写!
针对问题一,进一步的探讨,如果我在mqtt_connect时就失败了,我想切换另一个mqtt的服务器,应该怎么办? 测试,直接替换host 和port不能实现,报如下错误: ``` [E/at.clnt] execute command (AT+CIPCLOSE=0) failed! [E/at.clnt] execute command (AT+CIPOPEN=0,"TCP","101.xxx.xxx.xxxx",xxxx) failed! [E/at.clnt] execute command (AT+CIPCLOSE=0) failed! [E/at.clnt] execute command (AT+CIPCLOSE=0) failed! ```
撰写答案
登录
注册新账号
关注者
1
被浏览
2.1k
关于作者
大话西游2018
这家伙很懒,什么也没写!
提问
36
回答
40
被采纳
1
关注TA
发私信
相关问题
1
umqtt 软件包使用后,连接上emqx服务器,过一会儿就掉线了
2
使用正点原子的 潘多拉 开发板 的例程19_iot_mqtt
3
mqtt软件包,不支持直接关闭?
4
kawaii_mqtt 申请内存崩溃
5
_signal_entry() 函数中dbg_enter在哪里定义呢?
6
start to connect mqtt server 失败
7
MQTT 在“ read 0:1, break “后断开重连
8
paho_mqtt线程相关疑问
9
RT thread studio kawaii mqtt 无法连接EMQ
10
调试bc26 ,断言错误failed at rt_thread_timeout
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【24嵌入式设计大赛】基于RT-thread 火星一号的http发送json的物联网控制程序
2
【24嵌入式设计大赛】基于RT-Thread VisionBoard开发板的多模态AI机器人------开箱篇
3
【24嵌入式设计大赛】基于rt-thread的嵌入式多设备协同控制
4
【24嵌入式设计大赛】基于HPM5300-EVK的简易嵌入式辅助调试装置
5
【24 嵌入式设计大赛】基于英飞凌 Psoc6-EvaluationKit-062S2+ WIFI模块的DMX512协议转换器
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
文件系统
DMA
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
ota在线升级
WIZnet_W5500
UART
flash
packages_软件包
cubemx
PWM
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
中断
flashDB
socket
Debug
GD32
编译报错
msh
keil_MDK
rt_mq_消息队列_msg_queue
C++_cpp
at_device
MicroPython
ulog
本月问答贡献
踩姑娘的小蘑菇
5
个答案
2
次被采纳
张世争
8
个答案
1
次被采纳
用户名由3_15位
7
个答案
1
次被采纳
rv666
7
个答案
1
次被采纳
zchong
6
个答案
1
次被采纳
本月文章贡献
Licy
3
篇文章
1
次点赞
jaffer
1
篇文章
5
次点赞
rtt_dmx
1
篇文章
5
次点赞
flytianya2010
1
篇文章
2
次点赞
BRICK PORTER
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部