Строка JSON для Arduino WiFi версии 2

Я пытался использовать библиотеку WifiNINA для доступа к выходным данным JSON из после API с использованием библиотеки WifiNINA и Arduino Wifi Rev2.

Это код, который я использовал (это отредактированный пример из библиотеки):

/*
Веб-клиент

Этот скетч подключается к веб-сайту (https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=MSFT&interval=5min&apikey=demo)
с помощью WiFi-модуля.

Этот пример написан для сети, использующей шифрование WPA. Для
WEP или WPA, соответственно измените вызов Wifi.begin().

Этот пример написан для сети, использующей шифрование WPA. Для
WEP или WPA, соответственно измените вызов Wifi.begin().

Схема:
* Плата с модулем NINA (Arduino MKR WiFi 1010, MKR VIDOR 4000 и UNO WiFi Rev.2)

создано 13 июля 2010 г.
от dlf (Metodo2 srl)
изменено 31 мая 2012 г.
Том Айгоу
*/


#include <SPI.h>
#include <WiFiNINA.h>

#include "arduino_secrets.h" 
///////пожалуйста, введите свои конфиденциальные данные на вкладке «Секрет»/arduino_secrets.h
char ssid[] = SECRET_SSID;        // SSID вашей сети (имя)
char pass[] = SECRET_PASS;    // ваш сетевой пароль (используйте для WPA или используйте в качестве ключа для WEP)
int keyIndex = 0;            // индекс вашего сетевого ключа (необходим только для WEP)

int status = WL_IDLE_STATUS;
// если вы не хотите использовать DNS (и уменьшить размер скетча)
// используем числовой IP вместо имени сервера:
// IP-адрес сервера (74 125 232 128); // числовой IP для Google (без DNS)
char server[] = "www.alphavantage.co";    // адрес имени для Google (используя DNS)

// Инициализируем клиентскую библиотеку Ethernet
// с IP-адресом и портом сервера
// к которому вы хотите подключиться (порт 80 по умолчанию для HTTP):
WiFiClient client;

void setup() {
  //Инициализируем серийный номер и ждем открытия порта:
  Serial.begin(9600);
  while (!Serial) {
    ; // ждем подключения последовательного порта. Требуется только для родного порта USB
  }

  // проверяем модуль WiFi:
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // не продолжать
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < "1.0.0") {
    Serial.println("Please upgrade the firmware");
  }

  // попытка подключения к сети Wi-Fi:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Подключиться к сети WPA/WPA2. Измените эту строку, если используете открытую сеть или сеть WEP:
    status = WiFi.begin(ssid, pass);

    // ждем 10 секунд для соединения:
    delay(10000);
  }
  Serial.println("Connected to wifi");
  printWifiStatus();

  Serial.println("\nStarting connection to server...");
  // если вы установили соединение, сообщите об этом через последовательный порт:
  if (client.connect(server, 80)) {
    Serial.println("connected to server");
    // Делаем HTTP-запрос:
    client.println("GET /query?function=TIME_SERIES_INTRADAY&symbol=MSFT&interval=5min&apikey=demo HTTP/1.1");
    client.println("Host: https://www.alphavantage.co");
    client.println("Connection: close");
    client.println();
  }
}

void loop() {
  // если есть доступные входящие байты
  // с сервера, прочитать их и распечатать:
  while (client.available()) {
    char c = client.read();
    Serial.write(c);
  }

  // если сервер отключен, останавливаем клиент:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting from server.");
    client.stop();

    // ничего не делать навсегда:
    while (true);
  }
}


void printWifiStatus() {
  // вывести SSID сети, к которой вы подключены:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // напечатать IP-адрес вашей платы:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // вывести мощность принятого сигнала:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

Однако, когда я запускаю библиотеку, все, что возвращает последовательный монитор:

Attempting to connect to SSID: HIDDEN
Connected to wifi
SSID: HIDDEN
IP Address: HIDDEN
signal strength (RSSI):-40 dBm

Starting connection to server...
connected to server
HTTP/1.1 301 Moved Permanently
Connection: close
Server: gunicorn/19.7.0
Date: Sun, 07 Apr 2019 15:02:16 GMT
Transfer-Encoding: chunked
Location: https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=MSFT&interval=5min&outputsize=full&datatype=json&apikey=8UV48KKJJM1JW700
Content-Type: text/html; charset=utf-8
Via: 1.1 vegur

0


disconnecting from server.

Я хочу, чтобы код возвращал строку из ссылки. Вывод должен выглядеть так (вместо 0). Мне пришлось сократить приведенный ниже пример из-за ограничений по размеру, но это должна быть полная веб-страница.

{
    "Meta Data": {
        "1. Information": "Intraday (5min) open, high, low, close prices and volume",
        "2. Symbol": "MSFT",
        "3. Last Refreshed": "2019-04-05 16:00:00",
        "4. Interval": "5min",
        "5. Output Size": "Compact",
        "6. Time Zone": "US/Eastern"
    },
    "Time Series (5min)": {
        "2019-04-05 16:00:00": {
            "1. open": "119.8100",
            "2. high": "119.9100",
            "3. low": "119.7350",
            "4. close": "119.8800",
            "5. volume": "728814"
        },
        "2019-04-05 15:55:00": {
            "1. open": "119.9200",
            "2. high": "119.9200",
            "3. low": "119.7800",
            "4. close": "119.8000",
            "5. volume": "307126"
        },
        "2019-04-05 15:50:00": {
            "1. open": "119.9300",
            "2. high": "119.9300",
            "3. low": "119.8800",
            "4. close": "119.9200",
            "5. volume": "235238"
        }
    }
}

, 👍1

Обсуждение

А если вместо этого вы используете перенаправленный URL...?, @Majenko

@Majenko Спасибо за ваше предложение. Я только что проверил, и URL-адрес, указанный в качестве пункта назначения (https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=MSFT&interval=5min&outputsize=full&datatype=json&apikey=8UV48KKJJM1JW700), является конечным пунктом назначения. Он не перенаправляет., @Jackson V

Но это не тот URL, который вы используете. Вы используете URL-адрес A. Веб-сайт отправляет вам сообщение о перенаправлении (301) с URL-адресом B. Затем вам нужно взять заголовок Location: и выполнить GET этого нового URL-адреса. По сути, это заполнение отсутствующих параметров по умолчанию для вас и предоставление вам полного URL-адреса для использования. Если вы просто используете этот новый URL-адрес вместо текущего (т. е. добавляете все недостающие параметры), то он должен работать., @Majenko

Еще раз спасибо. Я только что отредактировал URL-адрес, который использует Arduino (https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=MSFT&interval=5min&outputsize=compact&datatype=json&apikey=8UV48KKJJM1JW700), и он выдает тот же вывод на последовательном монитор (с новым пунктом назначения)., @Jackson V


2 ответа


Лучший ответ:

0

Дело не в том, что API несовместим с Arduino, а в том, что инструмент обновления прошивки Arduino, используемый для добавления необходимого сертификата SSL в модуль Wi-Fi, не может этого сделать, потому что сертификат SSL для www.alphavantage.co не существует по адресу их домен.

Это можно проверить:

openssl s_client -showcerts -connect www.alphavantage.co:443

,

Я не понимаю вашего ответа. Веб-браузеры не имеют проблем с безопасностью этого сайта. и ваша команда возвращает публичные сертификаты сайта, @Juraj


0

Целевой сайт использует HTTPS. Если вы подключаетесь к порту 80, он перенаправляется на HTTPS через порт 443.

Используйте WiFiSSLClient библиотеки. См. пример WiFiSSLClient. В основном это то же самое, что и пример, который вы использовали. Есть два отличия. Он использует WiFiSSLClient вместо WiFiClient и подключается к стандартному https-порту 443.

,

Спасибо за предложение. Я только что попробовал внести изменения, и вот что появилось на мониторе последовательного порта: Попытка подключения к SSID: ЗАБЛОКИРОВАНО. Подключено к Wi-Fi SSID: ЗАБЛОКИРОВАНО IP-адрес: ЗАБЛОКИРОВАН Уровень сигнала (RSSI): -46 дБм Начинаем подключение к серверу... отключаюсь от сервера., @Jackson V

это не проблема, пока он не подключится, но это должен быть client.println("Хост: www.alphavantage.co"); без https://, @Juraj

Я тоже только что внес это изменение, и оно все еще не работает., @Jackson V

у вас последняя версия прошивки и библиотеки?, @Juraj

Спасибо за помощь, но после дальнейшего расследования я обнаружил, что этот конкретный API несовместим с Arduino., @Jackson V

Arduino может обрабатывать JSON, @Juraj