arduino可以发送重复的http请求并获取并解析响应中的数据

时间:2019-05-29 07:25:39

标签: php http arduino

我想将Arduino用于项目。我想要的是arduino应该向服务器发送重复的http请求(例如每分钟)以及一些数据(最有可能是IP地址)。服务器将以JSON格式返回包含一些数据的响应,而arduino应该解析该数据并将其写入文本文件。数据是数据库中的一些配置参数。我可以用Arduino吗?我看到一些帖子说重复的http请求是不可能的?有什么帮助吗?示例代码将非常有帮助。我正在使用带以太网屏蔽的Arduino Mega。

#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 :(得分:0)

发送重复的请求没有任何限制,但每个请求的时间除外。您的代码很好,除了发出HTTP请求的部分。默认的Arduino库在处理HTTP请求方面有些复杂(例如,没有HttpClient.GET)。

有许多高级API可以为您处理请求,还可以设置各种标头类型。

例如ArduinoHTTPClient是一个很好的例子。只需获取库并查看示例。我据此重写您的代码,您将获得JSON响应正文。然后,您可以简单地使用ArduinoJSON之类的JSON解析器之一来解析结果。

#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);
}