描述我的问题,我试图将 Arduino UNO 连接到我在 Heroku 中创建的网站。
主要目的是在连接到Internet的 arduino 中调用了 rest api 函数,并获取了 json数据。
我的Arduino代码:
#include <ArduinoJson.h>
#include <Ethernet.h>
#include <SPI.h>
void setup() {
// Initialize Serial port
Serial.begin(9600);
while (!Serial) continue;
// Initialize Ethernet library
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
Ethernet.init(8); // use pin 53 for Ethernet CS
if (!Ethernet.begin(mac)) {
Serial.println(F("Failed to configure Ethernet"));
return;
}
delay(1000);
Serial.println(F("Connecting..."));
// Connect to HTTP server
EthernetClient client;
client.setTimeout(10000);
if (!client.connect("https://salty-cliffs-06856.herokuapp.com", 80)) {
Serial.println(F("Connection failed"));
return;
}
Serial.println(F("Connected!"));
// Send HTTP request
client.println(F("GET /api/command/ HTTP/1.1"));
client.println(F("Host: https://salty-cliffs-06856.herokuapp.com"));
client.println(F("Connection: close"));
Serial.println(F("Done"));
if (client.println() == 0) {
Serial.println(F("Failed to send request"));
return;
}
// Check HTTP status
char status[32] = {0};
client.readBytesUntil('\r', status, sizeof(status));
Serial.println(status);
if (strcmp(status, "HTTP/1.1 200 OK") != 0) {
Serial.print(F("Unexpected response: "));
Serial.println(status);
return;
}
// Skip HTTP headers
char endOfHeaders[] = "\r\n\r\n";
if (!client.find(endOfHeaders)) {
Serial.println(F("Invalid response"));
return;
}
// Allocate JsonBuffer
// Use arduinojson.org/assistant to compute the capacity.
const size_t capacity = JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2) + 60;
DynamicJsonBuffer jsonBuffer(capacity);
// Parse JSON object
JsonObject& root = jsonBuffer.parseObject(client);
if (!root.success()) {
Serial.println(F("Parsing failed!"));
return;
}
// Extract values
Serial.println(F("Response:"));
Serial.println(root["command"].as<char*>());
// Disconnect
client.stop();
当我尝试在其中放置不安全的 HTTP 地址时,所有代码都可以正常工作。在将我的网站由Heroku提供支持并置于 HTTPS 我总是遇到错误之后。
当我检查HTTP状态时,程序提示错误,并且在我的Arduino端口终端中得到响应:
Unexpected response: HTTP/1.1 400 Bad Request
我检查了我的heroku日志,但未列出来自Arduino的任何请求。 (确保我尝试从Web浏览器调用API并能正常工作)
您能帮我解决哪里出现问题吗?我当时想这可能是因为HTTPS受保护。你觉得呢?
非常感谢您的帮助:)
答案 0 :(得分:0)
首先,更改client.connect("https://salty-cliffs-06856.herokuapp.com", 80)
来自
`https`
到
`http`
因为端口80不是https
端口,并且以太网屏蔽不支持SSL。
第二,您为Host
设置了错误的http标头。 HTTP 1.1要求仅使用要使用的域名,而不能使用协议(即http://)前缀。所以换行:
client.println(F("Host: https://salty-cliffs-06856.herokuapp.com"));
收件人:
client.println(F("Host: salty-cliffs-06856.herokuapp.com"));