может arduino отправлять повторные запросы HTTP и получать и анализировать данные из ответа - PullRequest
0 голосов
/ 29 мая 2019

Я хочу использовать Arduino для проекта.Я хочу, чтобы arduino отправлял повторный http-запрос (скажем, каждую минуту) с некоторыми данными (скорее всего, с IP-адресом) на сервер.И сервер вернет ответ с некоторыми данными в формате JSON, а arduino должен проанализировать данные и записать их в текстовый файл.Данные являются некоторыми параметрами конфигурации из базы данных.Могу ли я сделать это с Arduino?Я видел некоторые сообщения о том, что повторный http-запрос невозможен?любая помощь?Пример кода будет действительно полезным.Я использую Arduino Mega с Ethernet-экраном.

#include <SPI.h>
#include <Ethernet.h>
#include <HttpClient.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 0, 177);
IPAddress myDns(192, 168, 0, 1);

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;
void setup(){
// Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
 // start the Ethernet connection:
  Serial.println("Initialize Ethernet with DHCP:");
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
  // Check for Ethernet hardware present
    if (Ethernet.hardwareStatus() == EthernetNoHardware) {
      Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
      while (true) {
        delay(1); // do nothing, no point running without Ethernet hardware
      }
    }
    if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
    }
// try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip, myDns);
  } else {
    Serial.print("  DHCP assigned IP ");
    Serial.println(Ethernet.localIP());
  }

// give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.print("connecting... ");
}


void loop(){

  if (Ethernet.begin(mac) !=0){
    HttpClient http; 
    http.begin("http://jsonplaceholder.typicode.com/comments?id=10"); //Specify the URL
    int httpCode = http.GET();                                        //Make the request
    if (httpCode > 0) { //Check for the returning code
        String payload = http.getString();
        Serial.println(httpCode);
        Serial.println(payload);
      } 
    else {
      Serial.println("Error on HTTP request");
    }
    http.end(); //Free the resources
  }
  delay(10000);  

    }

Я попытался с помощью приведенного выше кода отправить запрос http.Но при получении сообщения об ошибке отсутствует соответствующая функция для вызова 'HttpClient :: HttpClient ()'

любые предложения будут действительно полезны.

1 Ответ

0 голосов
/ 29 мая 2019

У вас нет ограничений на отправку повторных запросов, кроме времени для каждого запроса. Ваш код в порядке, за исключением части, которая делает HTTP-запрос. Библиотека Arduino по умолчанию немного сложна для обработки HTTP-запросов (например, нет HttpClient.GET).

Существует много высокоуровневых API, которые обрабатывают запросы для вас, а также могут устанавливать различные типы заголовков.

Например, ArduinoHTTPClient хороший. Просто возьмите библиотеку и посмотрите примеры. Я переписываю ваш код на основе этого, и вы получите ваше тело ответа JSON. Затем вы можете просто использовать один из синтаксических анализаторов JSON, например ArduinoJSON , для анализа результатов.

#include <ArduinoHttpClient.h>
#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 0, 177);
IPAddress myDns(192, 168, 0, 1);

char serverAddress[] = "http://jsonplaceholder.typicode.com"; // server address
int port = 80;

EthernetClient EthClient;
HttpClient client = HttpClient(EthClient, serverAddress, port);

void setup()
{
    Serial.begin(9600);

    // start the Ethernet connection:
    Serial.println("Initialize Ethernet with DHCP:");
    if (Ethernet.begin(mac) == 0)
    {
        Serial.println("Failed to configure Ethernet using DHCP");
        // Check for Ethernet hardware present
        if (Ethernet.hardwareStatus() == EthernetNoHardware)
        {
            Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
            while (true)
            {
                delay(1); // do nothing, no point running without Ethernet hardware
            }
        }
        if (Ethernet.linkStatus() == LinkOFF)
        {
            Serial.println("Ethernet cable is not connected.");
        }
        // try to congifure using IP address instead of DHCP:
        Ethernet.begin(mac, ip, myDns);
    }
    else
    {
        Serial.print("  DHCP assigned IP ");
        Serial.println(Ethernet.localIP());
    }
}
void loop()
{
    Serial.println("making GET request");
    client.get("/comments?id=10");

    // read the status code and body of the response
    int statusCode = client.responseStatusCode();
    String response = client.responseBody();

    Serial.print("Status code: ");
    Serial.println(statusCode);
    Serial.print("Response: ");
    Serial.println(response);
    Serial.println("Wait five seconds");
    delay(5000);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...