запись полезной нагрузки mqtt в файл spiffs

mqtt spiffs

Я пытаюсь записать полезную нагрузку сообщения MQTT в файл в файловой системе SPIFFS моей платы esp32. Я пробовал это:

if(file.print((long)payload)) {
   Serial.println("File was written");
}else {
   Serial.println("File write failed");
}

полезная нагрузка представляет собой байт*, и файл был открыт в функции setup(), например:

File file;
if(!SPIFFS.exists("/testfile")){
  file = SPIFFS.open("/testfile", "r+");
}

Я всегда получаю сообщение об ошибке при записи, говорящее мне, что запись файла не удалась. Это правильный подход к тому, что я пытаюсь выполнить?

, 👍0


2 ответа


0

Откройте файл в цикле или подпрограмме, но не в настройке, поскольку файл является локальной переменной для настройки

В вашем коде это должно быть

file = SPIFFS.open("/testfile", "a"); // а ... добавить

a Открыть для добавления (запись в конец файла). Файл создается, если он не существует. Поток располагается на конец файла.

r+ позиционирует поток в начале файла

и чтобы получить строки, которые вы можете впоследствии проанализировать, вы должны использовать

if(file){
   file.println("Your MQTT payload");
   Serial.println("File was written");
   file.close();
} else {
    Serial.println("File write failed");
}

и не забудьте закрыть после операции.
ОБНОВЛЕНО
В качестве реакции на комментарии здесь «чистое решение» как функция:

bool writeLog(const char fileName[],  char payloadMqtt[]) {
  File logFile = SPIFFS.open(fileName, "a");
  if (!logFile)  {
        Serial.println("logFile open failed");
    return false;
  }
  else {
    //Записываем данные в файл
    Serial.println("writing Data to logFile");
    logFile.print(payloadMqtt);
    logFile.close();
    return true;
  }
}

Вызываете это с помощью:

writeLog("/myfilepath", payload);

а также может использоваться как

if (writeLog("/myfilepath", payload)) Serial.println("Log save success");
else Serial.println("Log save failure");

Надеюсь, это поможет понять природу операций SPIFFS/LittleFS/SD

,

Извините, я положил файл FIle; снаружи setup(), но я открываю его внутри. И мне не имеет особого смысла открывать файл внутри цикла. Кроме того, моя проблема в том, что полезная нагрузка представляет собой массив байтов, поэтому я думаю, мне нужно приведение, чтобы записать это в файл., @Johnny

Вы должны открывать только перед записью и закрывать после записи, мы находимся на MCU, а не на полномасштабной ОС. Загляните в библиотеку spiffs_api.h/cpp, чтобы узнать, что open означает для вашей памяти (помимо нежелательных ошибок и других проблем). Если ваша полезная нагрузка представляет собой массив символов, вы просто используете file.println(payload), @Codebreaker007


1

Используйте file.write(payload, length); для массива байтов. length должно быть числом байтов полезной нагрузки, а не размером массива полезной нагрузки.

print и write возвращают количество записанных байтов. Нет смысла использовать возвращаемое значение как логическое.

,