Arduino MQTT库PubSubClient的大文本发送与接收方法

PubSubClient个人很喜欢,简单粗暴,占用小,功能足够用。

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

需要发送大数据的可以关心一下这个,看PubSubClient.h文件 有个缓冲区大小的定义,如果偷懒可以直接修改,就能发送和接收大文本了。

#define MQTT_MAX_PACKET_SIZE 128

但我不建议这样做

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

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


String json_str = "你要发送的长文本...";

//拆分字符串发送
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左右的数据,也能顺利发出,heap内存随用随放,不用去抢stack区的内存分配了。

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

#define MQTT_MAX_PACKET_SIZE 256

有什么疑问欢迎交流

你可能感兴趣的:(Arduino,物联网)