Разбор 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

, 👍0


1 ответ


Лучший ответ:

0

Вместо того, чтобы пытаться отправить собственный запрос GET/POST вручную, используйте https://github.com/arduino- library/ArduinoHttpClient, который сделает все за вас.

,

Используйте метод sendBasicAuth для отправки аутентификации. данные., @Gerben

Спасибо за ваш ответ. Я использовал его, вы можете увидеть его в моем коде [ String contentType = "update.cgi"; Строка postData = "output=netdev"; клиент.beginRequest(); client.post("/",contentType , postData); client.sendBasicAuth("admin", "admin"); // отправляем логин и пароль для аутентификации клиент.endRequest(); ] и все еще у меня проблема с методом POST. Есть идеи, @LinkCoder

Пожалуйста, проголосуйте за мой ответ и отметьте его как принятый., @Dougie