Разбор HTTP с аутентификацией в Arduino + Ethernet Shield
Я пытаюсь разобрать страницу маршрута с помощью Arduino + Ethernet Shield. перед тестированием Ардуино. Я протестировал свой код с помощью Python, как показано ниже. из этого кода я могу получить данные по своему желанию, где нам нужно аутентифицировать имя пользователя и пароль для доступа к маршрутизатору, как вы видите, здесь (admin, admin) в то же время я должен использовать выходную переменную, чтобы получить только требуются данные. Код Python делает это.
Код Python:
My_url = "http://192.168.8.1/update.cgi"
r = requests.post (My_url, auth=('admin', 'admin'),data = 'output=netdev' )
print(r.status_code)
print(r.headers['content-type'])
print(r.encoding)
print(r.text)
Вывод:
200
text/javascript
ISO-8859-1
netdev = {
'WIRED':{rx:0x84154,tx:0x5a0cba}
,'BRIDGE':{rx:0x7e680,tx:0x59d98a}
,'WIRELESS0':{rx:0x0,tx:0x0}
,'WIRELESS1':{rx:0x0,tx:0x0}
}
Теперь я пытаюсь сделать это, используя Arduino + Ethernet Shield, и я хотел бы распечатать вывод на последовательном порту, как показано ниже. Здесь маршрутизатор является сервером, а Arduino — клиентом.
Моя проблема — это запрос POST с аутентификацией. Как я могу это сделать (POST с аутентификацией + 'output=netdev', как в коде Python). Пожалуйста, любая идея .. Большое спасибо в заранее
Код Arduino:
#include <Ethernet.h>
#include <SPI.h>
// Введите MAC-адрес вашего контроллера ниже.
// Более новые экраны Ethernet имеют MAC-адрес, напечатанный на наклейке на экране.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// если вы не хотите использовать DNS (и уменьшить размер скетча)
// используем числовой IP вместо имени сервера:
IPAddress server(192,168,8,1); // числовой IP для Google (без DNS)
//char server[] = "jsonplaceholder.typicode.com"; // адрес имени для Google (используя DNS)
// Установите статический IP-адрес, который будет использоваться, если DHCP не сможет назначить
IPAddress ip(192, 168, 8, 100);
IPAddress myDns( 8, 8, 8, 8);
// Инициализируем клиентскую библиотеку Ethernet
// с IP-адресом и портом сервера
// к которому вы хотите подключиться (порт 80 по умолчанию для HTTP):
EthernetClient client;
void setup()
{
// Открытие последовательной связи и ожидание открытия порта:
Serial.begin(9600);
while (!Serial) {
; // ждем подключения последовательного порта. Требуется только для родного порта USB
}
// запускаем соединение Ethernet:
Serial.println("Initialize Ethernet with DHCP:");
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet using DHCP");
// Проверяем наличие оборудования Ethernet
if (Ethernet.hardwareStatus() == EthernetNoHardware) {
Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :(");
while (true) {
delay(1); // ничего не делать, нет смысла работать без оборудования Ethernet
}
}
if (Ethernet.linkStatus() == LinkOFF) {
Serial.println("Ethernet cable is not connected.");
}
// попробуйте настроить с использованием IP-адреса вместо DHCP:
Ethernet.begin(mac, ip, myDns);
} else {
Serial.print(" DHCP assigned IP ");
Serial.println(Ethernet.localIP());
}
delay(1000);
Serial.println("connecting...");
if (client.connect(server, 80)) {
Serial.print("connected to ");
Serial.println(client.remoteIP());
// Делаем HTTP-запрос:
client.println("POST /update.cgi HTTP/1.0");
client.println("Host: 192.168.8.1");
client.println("Connection: close");
client.println();
} else {
Serial.println("connection failed");
}
}
void loop()
{
//если (клиент.доступно()) {
while (client.available()) {
char c = client.read();
Serial.print(c);
}
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
for(;;)
;
}
}
Выход Arduino
Initialize Ethernet with DHCP:
DHCP assigned IP 192.168.8.107
connecting...
connected to 192.168.8.1
HTTP/1.0 401 Unauthorized
Server: httpd
Date: Sat, 01 Jan 2011 00:27:00 GMT
WWW-Authenticate: Basic realm="DR3800"
Content-Type: text/html
Connection: close
<HTML><HEAD><TITLE>401 Unauthorized</TITLE></HEAD>
<BODY BGCOLOR="#cc9999"><H4>401 Unauthorized</H4>
Authorization required.
</BODY></HTML>
disconnecting.
Спасибо, Дуги, за ответ. Я использовал его, пожалуйста, вы можете увидеть это в моем коде ниже, где я использовал эту библиотеку, она не дает ошибок для запроса GET, но когда я использую ее для запроса POST, она дает ту же проблему аутентификации, что и вы видите. где запрос POST важен для получения данных со страницы .cgi. Может быть, я использую это неправильно .. любой совет? спасибо
void loop() {
Serial.println("making GET request with HTTP basic authentication");
String contentType = "update.cgi";
String postData = "output=netdev";
client.beginRequest();
client.get("/"+contentType);
client.sendBasicAuth("admin", "admin"); // отправляем логин и пароль для аутентификации
client.endRequest();
// прочитать код состояния и тело ответа
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);
}
Вывод в порядке
making GET request with HTTP basic authentication
Status code: 200
Response:
Wait five seconds
Но для POST следующим образом:
void loop() {
Serial.println("making GET request with HTTP basic authentication");
String contentType = "update.cgi";
String postData = "output=netdev";
client.beginRequest();
client.post("/",contentType , postData);
client.sendBasicAuth("admin", "admin"); // отправляем логин и пароль для аутентификации
client.endRequest();
// прочитать код состояния и тело ответа
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);
}
вывод:
making GET request with HTTP basic authentication
Status code: 401
Response: <HTML><HEAD><TITLE>401 Unauthorized</TITLE></HEAD>
<BODY BGCOLOR="#cc9999"><H4>401 Unauthorized</H4>
Authorization required.
</BODY></HTML>
Wait five seconds
@LinkCoder, 👍0
1 ответ
Лучший ответ:
Вместо того, чтобы пытаться отправить собственный запрос GET/POST вручную, используйте https://github.com/arduino- library/ArduinoHttpClient, который сделает все за вас.
- Ethernet Shield не работает с TFT-экраном
- связь между двумя arduino с помощью ENC28J60?
- Отключить экран Ethernet
- Ограничения подключения ко многим ардуино через Ethernet?
- DF Robot W5200 Ethernet Shield для Arduino Uno не работает?
- Ethernet Shield не подключается
- Разъем Ethernet препятствует добавлению экранов
- Arduino Ethernet Shield отключается через несколько секунд
Используйте метод sendBasicAuth для отправки аутентификации. данные., @Gerben
Спасибо за ваш ответ. Я использовал его, вы можете увидеть его в моем коде [ String contentType = "update.cgi"; Строка postData = "output=netdev"; клиент.beginRequest(); client.post("/",contentType , postData); client.sendBasicAuth("admin", "admin"); // отправляем логин и пароль для аутентификации клиент.endRequest(); ] и все еще у меня проблема с методом POST. Есть идеи, @LinkCoder
Пожалуйста, проголосуйте за мой ответ и отметьте его как принятый., @Dougie