我想在一个项目中使用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()”
任何建议都会很有帮助。
发布于 2019-05-30 00:18:35
除了每次请求的时间之外,您对发送重复请求没有任何限制。您的代码很好,除了发出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);
}https://stackoverflow.com/questions/56355164
复制相似问题