запись полезной нагрузки 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+");
}
Я всегда получаю сообщение об ошибке при записи, говорящее мне, что запись файла не удалась. Это правильный подход к тому, что я пытаюсь выполнить?
@Johnny, 👍0
2 ответа
Откройте файл в цикле или подпрограмме, но не в настройке, поскольку файл является локальной переменной для настройки
В вашем коде это должно быть
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.write(payload, length);
для массива байтов. length
должно быть числом байтов полезной нагрузки, а не размером массива полезной нагрузки.
print
и write
возвращают количество записанных байтов. Нет смысла использовать возвращаемое значение как логическое.
- Как подключиться к MQTT брокеру с помощью TLS?
- Преобразование byte* в int в Arduino
- esp32-cam публикует изображение в mqtt
- MQTT через serial
- Загрузка данных SPIFFS в Arduino IDE 2.0.0-rc3 (ESP32 & TTGO) - Ubuntu
- ESP8266 глубокий сон и MQTT
- ESP-01 неправильно просыпается после глубокого сна
- Приведение от 'char*' к 'char' теряет точность
Извините, я положил файл FIle; снаружи setup(), но я открываю его внутри. И мне не имеет особого смысла открывать файл внутри цикла. Кроме того, моя проблема в том, что полезная нагрузка представляет собой массив байтов, поэтому я думаю, мне нужно приведение, чтобы записать это в файл., @Johnny
Вы должны открывать только перед записью и закрывать после записи, мы находимся на MCU, а не на полномасштабной ОС. Загляните в библиотеку spiffs_api.h/cpp, чтобы узнать, что open означает для вашей памяти (помимо нежелательных ошибок и других проблем). Если ваша полезная нагрузка представляет собой массив символов, вы просто используете file.println(payload), @Codebreaker007