формат json в esp32 с arduino json
Я использую модуль ESP32 для подключения по Bluetooth и сканирования сети Wi-Fi. Но я не могу отформатировать json с помощью библиотеки arduinojson так, как хочу.
void scanWifiNetworks() {
//creating json
DynamicJsonDocument jsonDoc(1024);
char jsonBuffer[512];
JsonObject wifiJsonObject = jsonDoc.createNestedObject("wifiList");
wifiJsonObject["ssid"];
Serial.println("scan start");
// WiFi.scanNetworks will return the number of networks found
int n = WiFi.scanNetworks();
Serial.println("scan done");
if (n == 0) {
Serial.println("no networks found");
} else {
Serial.print(n);
Serial.println(" networks found");
for (int i = 0; i < n; ++i) {
// Print SSID and RSSI for each network found
// Serial.print(i + 1);
// Serial.print(": ");
// Serial.print(WiFi.SSID(i));
// Serial.print(" (");
// Serial.print(WiFi.RSSI(i));
// Serial.print(")");
// Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*");
wifiJsonObject["ssid"] = WiFi.SSID(i);
serializeJsonPretty(jsonDoc, SerialBT);
serializeJsonPretty(jsonDoc, Serial);
delay(10);
}
}
Serial.println("");
// Wait a bit before scanning again
delay(60000);
}
Выход такой
scan start
scan done
5 networks found
{
"wifiList": {
"ssid": "quark"
}
}{
"wifiList": {
"ssid": "Airtel_Zerotouch"
}
}{
"wifiList": {
"ssid": "NETGEAR77"
}
}{
"wifiList": {
"ssid": "Itobuz-technologies"
}
}{
"wifiList": {
"ssid": "Nokia 6.1"
}
}
я хочу что-то в этом роде
{ "список вайфай": { "ssid1": "кварк1", "ssid2": "кварк2" }
Я знаю, что неправильно зацикливаюсь, но не могу понять. если возможно, укажите правильное направление, это очень поможет.
@sdebarun, 👍1
Обсуждение1 ответ
Вы постоянно перезаписываете свойство ssid
одного и того же объекта.
Вместо этого вы хотите написать разные свойства, например
wifiJsonObject["ssid" + String(i+1)] = WiFi.SSID(i);
Затем сериализуйте документ только один раз, когда он будет готов.
При этом я полностью согласен с Юраем в том, что правильный способ
представлять список в формате JSON (и wifiList
явно предназначен для списка)
с помощью массива:
void scanWifiNetworks() {
DynamicJsonDocument jsonDoc(1024);
JsonArray wifiList = jsonDoc.createNestedArray("wifiList");
int n = WiFi.scanNetworks();
for (int i = 0; i < n; ++i) {
JsonObject wifiNet = wifiList.createNestedObject();
wifiNet["ssid"] = WiFi.SSID(i);
}
serializeJsonPretty(jsonDoc, SerialBT);
serializeJsonPretty(jsonDoc, Serial);
}
Это должно создать документ JSON, который выглядит следующим образом:
{ "список вайфай": [ { "ssid": "кварк" }, { "ssid": "Airtel_Zerotouch" }, { "ssid": "NETGEAR77" }, { "ssid": "Итобуз-технологии" }, { "ssid": "Нокиа 6.1" } ] }
Обновление: обратите внимание, что если это ясно из контекста (например, URL-адрес запроса) что вы передаете список сетей WiFi, то вы можете избавиться внешнего объекта и метки "wifiList" и использовать массив в качестве Документ JSON:
[ { "ssid": "кварк" }, { "ssid": "Airtel_Zerotouch" }, { "ssid": "NETGEAR77" }, { "ssid": "Итобуз-технологии" }, { "ssid": "Нокиа 6.1" } ]
Как предложил Яроманда X, если вы никогда не собираетесь расширять внутреннюю объекты с дополнительной информацией, вы можете еще больше упростить документ, удаление этих объектов и просто перечисление SSID в массиве:
[ "кварк", "Эртел_Зеротач", "NETGEAR77", «Итобуз-технологии», "Нокиа 6.1" ]
Спасибо. Концепция массива была мне непонятна., @sdebarun
поскольку все объекты в массиве являются *ssid* - вы можете еще больше упростить (и уменьшить) вывод, изменив wifiList
на массив только строк ssid, @Jaromanda X
@JaromandaX: Действительно - отредактировал ответ. Сначала я предположил, что ОП может позже добавить к записям другие свойства (мощность сигнала, канал...)., @Edgar Bonet
- Пример кода для ESP32 в качестве медиа-контроллера для Android/iPhone Media Apps
- Публиковать данные json в mqtt
- Библиотека ардуино или код для ESP32 для сканирования устройств Bluetooth?
- Имена синтаксического анализа обнаружения Bluetooth ESP32
- Веб-страница с использованием Bluetooth?
- Ошибка Guru Meditation: Core 1 panic'ed (Interrupt wdt timeout on CPU1)
- Можно ли использовать WiFi и Bluetooth/BLE в одном проекте ESP32?
- ESP32 запускает BLE после глубокого сна
массив ящиков, а не объект.
создатьNestedArray("wifiList")
, @Juraj