我想将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()'
任何建议都会很有帮助。
答案 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);
}