安装办法,Arduino库管理直接下载。

看PubSubClient.h文件 有个缓冲区大小的定义,如果偷懒可以直接修改,就能发送和接收大文本了。但不建议这样做:

#define MQTT_MAX_PACKET_SIZE 128

1、因为这样是静态分配stack区内存给你的,实际最大可以分配也最多100k左右,这是以ESP32举例,因为可以分配的320RAM中只有一半可以分配给stack,另一个要留给heap
2、实际运行中可能会出现不稳定的情况

例程内有说明怎么发送大文本数据,但写的有些乱,现在稍微整理一下。

//拆分字符串发送
int cut = 128;  //要拆分发送的实际大小
int json_str_len = json_str.length();  //总数据长度

if (json_str_len > cut)
{
    //开始发送长文件参数分别为  主题,长度,是否持续
    client.beginPublish(MQTT_PUB_SELF, json_str_len, true);
    int count = json_str_len / cut;
    for (int i = 0; i < (count-1); i++)
    {
        client.print(json_str.substring(i * cut, (i * cut + cut)));
    }
    client.print(json_str.substring(cut * (count - 1)));
    //结束发送文本
    client.endPublish();
}
else
{
    client.publish(MQTT_PUB_SELF, json_str.c_str());
}

测试过20K左右的数据,也能顺利发出,内存随用随放,不用跟程序去抢stack区的内存分配了。

至于接收的数据长度,我就偷懒了,修改了一下缓冲区长度到256字节,这样应该足够用,毕竟控制命令都不会太长。

#define MQTT_MAX_PACKET_SIZE 256
Last modification:March 15th, 2020 at 08:13 pm
如果觉得我的文章对你有用,打赏杯咖啡吧