前提
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
どこをどう修正すると、改善されるのでしょうか?
浅識のため、ご教示いただけますと幸いです。よろしくお願いいたします。
0 コメント