次のシステムを構築するための検証です。
Grove IoT スターターキット for SORACOM で作るリモートカメラシステム
次のような記述がありました。
SeeedJP / pubsubclient
The maximum message size, including header, is 128 bytes by default. This is configurable via MQTT_MAX_PACKET_SIZE in PubSubClient.h.
そこで、次のようなプログラムを作成して検証しました。
このプログラムはこちらを改造しました。
MQTT で温度と湿度を publish する
// ---------------------------------------------------------------
/*
mqtt_temp_humi.ino
Aug/19/2021
*/
// ---------------------------------------------------------------
#include <WioLTEforArduino.h>
#include <WioLTEClient.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <stdio.h>
#define MQTT_SERVER_HOST "example.com"
#define MQTT_SERVER_PORT (1883)
#define ID "WioLTE"
#define OUT_TOPIC "sample/imageTopic"
#define IN_TOPIC "sample/imageTopic"
// #define INTERVAL (60000)
#define INTERVAL (5000)
#define SENSOR_PIN (WIOLTE_D38)
WioLTE Wio;
WioLTEClient WioClient(&Wio);
PubSubClient MqttClient;
int TemperatureAndHumidityPin;
int count = 0;
// ---------------------------------------------------------------
void callback(char* topic, byte* payload, unsigned int length)
{
SerialUSB.println("");
payload[length] = '\0';
String msg = String((char*) payload);
SerialUSB.println(msg);
}
// ---------------------------------------------------------------
void setup()
{
setupLTE();
SerialUSB.println("### Connecting to MQTT server \""MQTT_SERVER_HOST"\"");
MqttClient.setServer(MQTT_SERVER_HOST, MQTT_SERVER_PORT);
MqttClient.setCallback(callback);
MqttClient.setClient(WioClient);
if (!MqttClient.connect(ID)) {
SerialUSB.println("### ERROR! connect() ###");
}
else
{
MqttClient.subscribe(IN_TOPIC);
TemperatureAndHumidityBegin(SENSOR_PIN);
}
SerialUSB.println("*** Setup completed *** Aug/19/2021 PM 14:00 ***");
}
// ---------------------------------------------------------------
void loop()
{
Wio.LedSetRGB(1, 1, 0);
MqttClient.loop();
SerialUSB.println("*** check *** " + String(count));
mqtt_temp_humi_send_proc(count);
Wio.LedSetRGB(0, 0, 1);
delay(INTERVAL / 4);
Wio.LedSetRGB(0, 1, 0);
delay(INTERVAL / 4);
Wio.LedSetRGB(1, 1, 1);
delay(INTERVAL / 4);
Wio.LedSetRGB(0, 0, 0);
delay(INTERVAL / 4);
count++;
}
// ---------------------------------------------------------------
void mqtt_temp_humi_send_proc(int count)
{
DynamicJsonDocument doc(1024);
char data_json[1024];
float temp;
float humi;
if (!TemperatureAndHumidityRead(&temp, &humi))
{
SerialUSB.println("ERROR! *** TemperatureAndHumidityRead");
}
else
{
SerialUSB.print("count = ");
SerialUSB.print(count);
SerialUSB.print(" temperature = ");
SerialUSB.print(temp);
SerialUSB.print("C ");
SerialUSB.print("Current humidity = ");
SerialUSB.print(humi);
SerialUSB.println("% ");
doc["count"] = count;
doc["temp"] = temp;
doc["humi"] = humi;
doc["aa"] = "01234567890123456789012345678901234567890123456789";
doc["bb"] = "01234567890123456789012345678901234567890123456789";
doc["cc"] = "01234567890123456789012345678901234567890123456789";
doc["dd"] = "01234567890123456789012345678901234567890123456789";
doc["ee"] = "01234567890123456789012345678901234567890123456789";
doc["ff"] = "01234567890123456789012345678901234567890123456789";
doc["gg"] = "01234567890123456789012345678901234567890123456789";
doc["hh"] = "01234567890123456789012345678901234567890123456789";
doc["ii"] = "01234567890123456789012345678901234567890123456789";
doc["jj"] = "01234567890123456789012345678901234567890123456789";
serializeJson(doc, data_json);
SerialUSB.println(data_json);
SerialUSB.println(strlen(data_json));
SerialUSB.println(MQTT_MAX_PACKET_SIZE);
MqttClient.publish(OUT_TOPIC, data_json);
}
}
// を---------------------------------------------------------------
テスト方法
~/Arduino/libraries/PubSubClient/src/PubSubClient.h
の MQTT_MAX_PACKET_SIZE を編集します。
json ストリングは 613 バイト程です。(大きさは温度、湿度でちょっと変わります。)
テスト結果
次では publish できませんでした。
#define MQTT_MAX_PACKET_SIZE 512
次では publish できました。
#define MQTT_MAX_PACKET_SIZE 1024
この結果、MQTT_MAX_PACKET_SIZE を大きくすることにより、画像の JSON も publish できそうです。
続報
次の条件でテストしたところ
#define MQTT_MAX_PACKET_SIZE 4096
strlen が 1381 publish できた。
strlen が 1439 publish できない。
続報 その2
こんな記述を見つけました。
【作業】3-1: SORACOM Beam を用いた MQTT Pub/Sub 双方向通信※ 公式の PubSubClient では、パケットサイズが小さいため若干不都合が発生することが確認されています。 そのため、ハンズオン側で準備した fork ライブラリを使用してください