ESP32-WROOM-32E,MQTT使用采坑经验之transport_read() error:errno=128
配置MQTT的是 esp_mqtt_client_config_t 结构体,里面包含了MQTT的信息,可根据具体场景配置。
问题
使用MQTT建立连接后,不收发数据,每隔35秒会有如下报错:
mqtt_message_receive:transport_read() error:errno=128 mqtt_process_receive:mqtt_message_receive() returned -1
分析
百度直接搜报错内容不容易找到,还是需要找mqtt有关的内容才发现。大概操作如下:
一、设置client id:类似于IP冲突可能会导致如上报错。
二、设置保持连接:
disable_auto_reconnect = false;
结构体中这样描述:
bool disable_auto_reconnect; /*!< this mqtt client will reconnect to server (when errors/disconnect). Set disable_auto_reconnect=true to disable */
三、设置心跳间隔
keepalive = 10;
原先出现问题时观察到35秒就出现一次报错。考虑到mq要确定终端是否在线,可能有心跳来维持在线。
结构体中这样描述:
int keepalive; /*!< mqtt keepalive, default is 120 seconds */
四、设置连接协议
esp_mqtt_transport_t transport; /*!< overrides URI transport /
int out_buffer_size; /!< size of MQTT output buffer. If not defined, both output and input buffers have the same size defined as buffer_size
/
int buffer_size; /!< size of MQTT send/receive buffer, default is 1024 (only receive buffer size if out_buffer_size
defined) */
这三个是要一起写的,不然会报错。
解决
具体程序如下:
esp_mqtt_client_config_t mqtt_cfg = {.host = "icsdn", //MQTT 地址.port = 111, //MQTT端口.username = "77",//用户名字.password = "7777",//密码.client_id = client_id,//设置mqtt的client id.disable_auto_reconnect = false,//设置保持连接.keepalive = 10,//设置心跳间隔.transport = MQTT_TRANSPORT_OVER_TCP,//设置连接协议.out_buffer_size = 2048,//设置发送缓冲区大小.buffer_size = 2048, //设置接收缓冲区大小};
以上数据是随意写的。