Arduino|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()); }

【Arduino|Arduino MQTT库PubSubClient的大文本发送与接收方法】测试过20K左右的数据,也能顺利发出,heap内存随用随放,不用去抢stack区的内存分配了。
至于接收的数据长度,我就偷懒了,修改了一下缓冲区长度到256字节,这样应该足够用,毕竟控制命令都不会太长。
#define MQTT_MAX_PACKET_SIZE 256

有什么疑问欢迎交流

    推荐阅读