質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

1650閲覧

mqttClient.publish()で転送したいJSONファイルのサイズを増やしたい

Yasu0421

総合スコア37

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2022/07/28 07:13

編集2022/07/28 07:49

前提

M5StickC-Plusを使用して、AWS IoT-CoreへMQTTにより指定したTopicにPublishするシステムを作っております。
転送したいJSONの枠組みは以下の通りです。

JSON

1{ 2 "clientID": "XXXXXX_XX", 3 "date-time": "2022-07-28 13:00:10", 4 "Hexdata":"0x01,0x02,0x03" 5}

ここで、Hexdataの値を"0x01~0x32"まで変更してPublishさせると、mqttClient.publish()で失敗してしまいます

実現したいこと

・上記のJSONファイルで、Hexdataの値(文字列)を増やしたい(具体的には"0x01,0x02,0x09,0x10,......,0x30"という風にHexdataに表示される文字列を増やしたいです。
(Hexですが、確認のために10進数的に増やしています)
・転送可能なJSONファイルのサイズの上限値はどこで制限されているのかをご教示いただきたいです。

発生している問題・エラーメッセージ

エラーメッセージは表示されないのですが、mqttClient.publish()の戻り値を確認すると0となっていました、またAWS IoT-Core側で確認してもデータは届いていませんでした。

該当のソースコード

#include <M5StickCPlus.h> #include <WiFi.h> #include <WebServer.h> #include <DNSServer.h> #include <WiFiManager.h> #include <WiFiClient.h> #include <WiFiClientSecure.h> #include <PubSubClient.h> #include <esp_sleep.h> #include <ArduinoJson.h> #include <stdio.h> #include "config.h" #define NUM_OF_BYTE 256 //IoT Coreに送信するバイト数 計算アシストサイト:https://arduinojson.org/v6/assistant/ #define BUFFER_SIZE 1024 const char* pubTopic = "data/info/1"; void lcdDarkGreenReset(){ M5.Lcd.fillScreen(DARKGREEN); // 深緑に設定 M5.Axp.ScreenBreath(10); // 画面の輝度を下げる M5.Lcd.setRotation(1); // LCDの方向を変える M5.Lcd.setTextSize(2); // フォントサイズを2倍にする M5.Lcd.setTextColor(WHITE, DARKGREEN); // 文字を白 M5.Lcd.setCursor(1, 1); // カーソル位置 } void lcdBlackReset(){ M5.Lcd.fillScreen(BLACK); // 深緑に設定 M5.Axp.ScreenBreath(10); // 画面の輝度を下げる M5.Lcd.setRotation(1); // LCDの方向を変える M5.Lcd.setTextSize(2); // フォントサイズを2倍にする M5.Lcd.setTextColor(DARKGREY, BLACK); // 文字を白 M5.Lcd.setCursor(1, 1); // カーソル位置 } WiFiClientSecure httpsClient; PubSubClient mqttClient(httpsClient); void setupClient() { // AWS IoT Coreとの接続認証 const int port = 8883; httpsClient.setCACert(rootCA); httpsClient.setCertificate(deviceCert); httpsClient.setPrivateKey(privateKey); mqttClient.setServer(endpoint, port); } int connectToAWSIoT() { // AWS IoT Coreとの接続 int cnt = 0; // 接続試行回数 const int MAX_RETRY = 10; // 最大リトライ回数 while (!mqttClient.connected() and (cnt < MAX_RETRY)) { if (!mqttClient.connect(clientId)) { cnt++; delay(1000); } } if (cnt >= MAX_RETRY){ // 接続回数オーバー return 0; } else { return 1; } } void publish(String hexdata) { // JSON形式を組み立ててPublishする const int capacity = JSON_OBJECT_SIZE(NUM_OF_BYTE); configTzTime("JST-9", "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp"); // NTP Serverと同期する struct tm timeInfo; getLocalTime(&timeInfo); // 現在時刻を取得 char date_time[20]; sprintf(date_time, "%04d-%02d-%02d %02d:%02d:%02d", timeInfo.tm_year + 1900, timeInfo.tm_mon + 1, timeInfo.tm_mday, timeInfo.tm_hour, timeInfo.tm_min, timeInfo.tm_sec ); StaticJsonDocument<capacity> env_inf; // JSONファイルを組み立てる env_inf["clientId"] = clientId; // 端末ID env_inf["date_time"] = date_time; // 現在時刻 env_inf["Hex_Data"] = hexdata; // Hexデータ char jsonBuffer[BUFFER_SIZE]; serializeJson(env_inf, jsonBuffer); mqttClient.publish(pubTopic, jsonBuffer); // AWS IoT CoreにPublish } void setup() { M5.begin(); M5.Axp.ScreenBreath(9); M5.Lcd.setRotation(3); M5.Lcd.fillScreen(WHITE); M5.Lcd.setTextColor(BLACK); M5.Lcd.setTextSize(5); M5.Lcd.print("PowerOn"); Serial.begin(9600); /*---------------------------------------- * Serch for connectable registered WiFi *----------------------------------------*/ WiFiManager wifiManager; //Timeout set wifiManager.setTimeout(20); lcdDarkGreenReset(); Serial.println("Searching for connectable WiFi"); M5.Lcd.println("Searching for connectable WiFi"); wifiManager.autoConnect("AutoConnectAP"); /*------------------------------- * Connection process *-------------------------------*/ if(WiFi.status() != WL_CONNECTED){ lcdDarkGreenReset(); Serial.println("Not found connectable WiFi"); M5.Lcd.println("Not found connectable WiFi"); }else{ lcdDarkGreenReset(); IPAddress ipadr = WiFi.localIP(); Serial.println("connected"); Serial.println("local ip"); M5.Lcd.println("ip:"); Serial.println(ipadr); M5.Lcd.println(ipadr); Serial.println(WiFi.SSID()); M5.Lcd.println(WiFi.SSID()); delay(3000); //稼働表示 lcdBlackReset(); //--------------------------- //AWS 初期化設定 //--------------------------- setupClient(); // AWS-IoTCore接続認証 if(connectToAWSIoT()){ Serial.println("Connection To AWS IoT OK"); //-------------------------------- //Data送信テスト //-------------------------------- mqttClient.loop(); publish("0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32"); }else{ Serial.println("Connection To AWS IoT NG"); } } } void loop() { }

試したこと

「該当のソースコード」中の”NUM_OF_BYTE”やBUFFER_SIZE”を増やして試してみましたが、効果はありませんでした。
尚、0x01~0x31までなら、転送できています(送れる上限値はこれだけまで)
また、”NUM_OF_BYTE”やBUFFER_SIZE”をさらに増加させると(例えばNUM_OF_BYTEを512などとする)
今度は、mqttClient.publish()の実行で以下のようなパニックエラーが発生するようになりました。

Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled. Core 1 register dump: PC : 0x4008c1c7 PS : 0x00060030 A0 : 0x8008c95e A1 : 0x3ffafeb0 A2 : 0x800eacc2 A3 : 0x00000064 A4 : 0x00000000 A5 : 0x00000000 A6 : 0x00000000 A7 : 0x00000000 A8 : 0x8008c1da A9 : 0x3ffafe90 A10 : 0x00000000 A11 : 0x3ffb8058 A12 : 0x00000002 A13 : 0x00000001 A14 : 0x00060023 A15 : 0x00000000 SAR : 0x0000000a EXCCAUSE: 0x0000001c EXCVADDR: 0x800eacc2 LBEG : 0x4000c46c LEND : 0x4000c477 LCOUNT : 0x00000000

どこをどう修正すると、改善されるのでしょうか?

浅識のため、ご教示いただけますと幸いです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2022/07/28 16:23

本当に原因がファイルサイズなのかが気になります。 jsonのファイルサイズが原因とする根拠は何でしょうか?
Yasu0421

2022/07/28 22:33

変更点は、JSONの値の文字列を長くしただけですので、「文字列の増加」=>ファイルサイズ と換言させていただきました。(ファイルサイズという表現が正しくなければ申し訳ございません)
Yasu0421

2022/07/28 22:38

また、”NUM_OF_BYTE”やBUFFER_SIZE”の値を”NUM_OF_BYTE=16", BUFFER_SIZE=512と逆に小さくして確認すると、"0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22”までしかPublishすることができなくなるため、フィルサイズに関係していると考えました。
guest

回答1

0

ベストアンサー

mqttのライブラリが
https://github.com/knolleary/pubsubclient
とするとそのままでは、バッファーサイズが256しかありません。
内部?headerやtopicも含めてのサイズなので0x32付近で超えてしまいfalseでかえって来ると考えられます。
(50項目*1項目あたり約5文字=250バイトにheaderが5で255)

mqttClient.setBufferSize(1024);等、mqttライブラリ側のバッファの増やしましょう。

投稿2022/07/29 01:39

tmp

総合スコア277

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問