Чтение строки из Firebase и сохранение ее в виде CString
У меня есть мобильное приложение (сделанное с помощью MIT App Inventor), хранящее некоторые значения в базе данных Firebase. App inventor хранит все значения в виде строк (т.Е. в кавычках, а строки имеют кавычки, заключенные в кавычки, например "\"hello\""
).
Я использую эту библиотеку для извлечения данных из Firebase в ESP8266. Я использую String
var для хранения полученного значения, а затем изменяю его на CString (попытка сохранить его напрямую не работает), как показано ниже:
Это не работает:
Firebase.get(firebaseData, "/SCHEDULE DETAILS/SCHEDULE1/FREQ FR");
Serial.print("node -- schedule1 /FREQ FR -- type: ");
Serial.println(firebaseData.dataType());
char * cstr1 = new char [33];
cstr1 = firebaseData.stringData();
Serial.print(" -- data: ");
Serial.println(cstr1);
Это работает:
Firebase.get(firebaseData, "/SCHEDULE DETAILS/SCHEDULE1/WEIGHT");
Serial.print("node -- schedule1/WEIGHT -- type: ");
Serial.println(firebaseData.dataType() ) ;
String dummy = firebaseData.stringData();
Serial.print(" -- data: ");
Serial.print(dummy);
char * cstr = new char [dummy.length()+1];
strcpy (cstr, dummy.c_str());
Serial.print(" -- data int type: ");
Serial.println(atoi(cstr)) ;
У меня есть еще несколько узлов для получения данных, и я читал, что большое количество строк
- плохая практика. Пытаясь узнать больше, я увидел исходный код, и сама функция StringData возвращает CString:
Я чувствую, что делаю на один шаг больше, чем требуется! Любые предложения о том, как это сделать, были бы очень полезны!
Try1 Основываясь на ответе @Majenko, я попробовал это перед добавлением в библиотеку:
const char* get_cstring() {
String str = "will it work" ;
return str.c_str();
}
void setup() {
Serial.begin(9600);
}
void loop() {
const char *new_c = get_cstring();
int len = strlen(new_c);
for (int i = 0; i < len; i++) {
Serial.println(new_c[i]);
delay(1000);
}
Serial.println("----------");
}
Но как мне получить доступ к содержимому, потому что он просто печатает значения мусора; strlen(new_c)
дает 2 (я предполагаю, что это объем памяти, необходимый в байтах !?)
Спасибо!
1 ответ
Лучший ответ:
Возвращая строковый
объект, Firebase сначала генерирует этот строковый
объект и копирует в него строковые данные C.
Если вы хотите получить необработанные строковые данные C, вам придется добавить новый "геттер" в библиотеку, чтобы вернуть указатель на эти строковые данные C:
Я бы написал это для вас, но поскольку вы опубликовали скриншот функции Firebase, и изменение этого кода на новый код очень незначительно (просто измените имя функции и тип возвращаемого значения), я не могу скопировать и вставить его. И я не собираюсь всматриваться в это маленькое изображение и набирать его снова.
Кстати, внутренне библиотека Firebase фактически использует std::string
, что является лучшей реализацией того же, что и String
. String
был создан потому, что компилятор Arduino не имеет STL и, следовательно, не имеет std::string
. В любом случае они оба используют динамическое распределение.
Проблема в том, что ваша переменная str
является локальной для функции. Он и выделенная в нем память уничтожаются при возврате функции. Итак, то, что у вас есть в "new_c", - это указатель ни на что особенное. Этого не должно быть в случае Firebase, поскольку _data - это "std::string", которая является переменной-членом, а не локальной переменной., @Majenko
Я попробовал с глобальным String
var; это работает! Но когда я пытаюсь использовать new_c.atoi()
с целочисленным значением в качестве входных данных, он терпит неудачу; так как же должен быть объявлен возвращаемый тип!? или где должны быть внесены изменения для выполнения этих преобразований типов !?, @Somasundharam Sampath
@SomasundharamSampath Используйте atoi (new_c)
, @Majenko
это было очень глупо с моей стороны!!! Большое спасибо! Похоже , мне нужен еще один букварь по Си ., @Somasundharam Sampath
- Есть ли объяснение такому поведению?
- Как заменить объекты String массивами символов, продолжая использовать строковые методы
- форматирование строк в Arduino для вывода
- Простой запрос GET с ESP8266HTTPClient
- Проблемы с преобразованием byte[] в String
- Преобразование строки в IP-адрес
- Чтение строки, разделенной запятыми
- Как составить URL-адрес HTTP-запроса GET с параметрами ключ/значение
Не могли бы вы опубликовать решение, чтобы другие могли воспользоваться., @mariano proietti