0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

WioLTE で 大きいデータを MQTT Publish する

Last updated at Posted at 2021-08-19

次のシステムを構築するための検証です。
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
// ---------------------------------------------------------------
/*
	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 ライブラリを使用してください

テスト風景
IMG_20210819_145600.jpg

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?