DynamicJsonBuffer jsonBuffer(16*1024);
JsonObject& parsed = jsonBuffer.parseObject(json);
if (parsed.success()) {
JsonArray& items = parsed["items"];
if (items.size()> 0) {
JsonObject& statistics = items[0]["statistics"];
long subscriberCount = statistics["subscriberCount"];
Serial.print("Number of subscribers: ");
Serial.println(subscriberCount);
}
} else {
Serial.println("Json parsing error");
}
Мы создаем объект типа JsonArray, и если он не пуст, обращаемся к элементу с первым номером (в Си массивы нумеруются с нуля, items[0] это первый элемент).
Задача решена! Код полностью выглядит так:
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* ssid = "TP-LINK_AB11";
const char* password = "12345678";
void setup() {
Serial.begin(115200);
Serial.print("Connecting to ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
WiFi.begin(ssid, password);
}
Serial.println("");
Serial.println("WiFi connected!");
}
void loop() {
const char *url = "https://www.googleapis.com/youtube/v3/channels?id=UCzz4CoEgSgWNs9ZAvRMhW2A&part=statistics&key=XXXXXXXXXX";
Serial.println("Connecting to www.googleapis.com");
HTTPClient http;
http.begin(url);
int httpCode = http.GET();
if (httpCode > 0) {
Serial.print("httpCode: "); Serial.println(httpCode);
String json = http.getString();
// Парсинг Json
DynamicJsonBuffer jsonBuffer(16*1024);
JsonObject& parsed = jsonBuffer.parseObject(json);
if (parsed.success()) {
JsonArray& items = parsed["items"];
if (items.size()> 0) {
JsonObject& statistics = items[0]["statistics"];
long subscriberCount = statistics["subscriberCount"];
Serial.print("Number of subscribers: ");
Serial.println(subscriberCount);
}
} else {
Serial.println("Json parsing error");
}
} else {
Serial.println("HTTP request error");
Serial.println(httpCode);
}
http.end();
// Пауза
delay(120000);
}
Для использования этого кода будет необходимо заменить имя и пароль WiFi-сети, а также вставить идентификатор канала и правильный ключ для доступа к Google API.
При запуске программы данные будут выведены в Serial Monitor:
Самостоятельная работа: По аналогии с вышенаписанным, получить число просмотров для видеоролика на youtube. Для этого воспользоваться следующей функцией из Google API:
https://www.googleapis.com/youtube/v3/videos?part=statistics&id=ID&key=XXXX
(здесь ID - это идентификатор видеоролика, XXXX - Google API Key)
Функция вернет json, который выглядит примерно так:
{
"kind": "youtube#videoListResponse",
"etag": "\"_gJQceDMxJ8gP-8T2HLXUoURK8c/mISbZAYZi79hOI4WFXbLXPUphmg\"",
"items": [
{
"kind": "youtube#video",
"etag": "\"_gJQceDMxJ8gP-8T2HLXUoURK8c/PoZyfbkQEtIkGNfjDsAafjr_R08\"",
"id": "CizKnuwvXXg",
"statistics": {
"viewCount": "184277",
"likeCount": "8585",
"dislikeCount": "212",
"favoriteCount": "0",
"commentCount": "1349"
}
}
]
}
Необходимо исправить в коде обработку json, чтобы получить интересующие нас поля.
При желании можно вывести данные на OLED-дисплей, сделав автономно работающее устройство.
3.8 Запускаем собственный Web-серверМы уже умеем получать и обрабатывать данные с различных серверов. Настала пора двигаться дальше - мы запустим на ESP32 собственный сервер. Его можно будет открыть в браузере, введя IP-адрес платы, подключенной к WiFi-сети. А если настроить статический IP-адрес и перенаправление портов на маршрутизаторе, то можно будет получить доступ к нашему серверу через Интернет, с любой точки земного шара!
Итак, приступим. Для использования ESP32 в качестве сервера мы будем использовать уже готовый класс WiFiServer. Он “слушает” входящие соединения, а его единственным параметром является номер порта (мы будем использовать порт 8000).
Код сервера приведен ниже.
#include <WiFi.h>
const char* ssid = "TP-LINK_AB11";
const char* password = "12345678";
WiFiServer server(8000);
void setup()
{
Serial.begin(115200);
delay(10);
// We start by connecting to a WiFi network
Serial.print("Connecting to "); Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
WiFi.begin(ssid, password);
Serial.print(".");
}
Serial.println("");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
}
void loop() {
WiFiClient client = server.available(); // Получение входящего “клиента”
if (client) {
Serial.println("New Client.");
String currentLine = "";
while (client.connected()) {
if (client.available()) { // Есть непрочитанные данные
char c = client.read(); // читаем 1 байт
Serial.write(c);
if (c == '\n') { // Символ перевода строки
// 2 пустые строки - признак конца запроса, посылаем ответ
if (currentLine.length() == 0) {
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
client.print("<html><head> <title>ESP32 Server</title> </head>”);
client.print("<body>Hello world</body> </html>");
client.println();
break;
} else {
// Очистить строку
currentLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage return character,
currentLine += c; // add it to the end of the