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

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

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

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

Arduino

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

AWS(Amazon Web Services)

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

解決済

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

Yasu0421
Yasu0421

総合スコア35

M5Stack

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

Arduino

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

AWS(Amazon Web Services)

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

1回答

0リアクション

0クリップ

239閲覧

投稿2022/07/28 07:13

編集2022/07/28 07:49

前提

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

JSON

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

ここで、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

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

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

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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することができなくなるため、フィルサイズに関係していると考えました。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

M5Stack

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

Arduino

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

AWS(Amazon Web Services)

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