Http-клиент Arduino не подключается - PullRequest
0 голосов
/ 03 февраля 2020

Я скопировал из нескольких мест части кода и написал эту программу, которая должна подключаться к серверу, который, на 100% уверен, работает, IP-адрес и порт верны, однако client.connect (server, 8000) возвращает false, я новичок в сети, так что, вероятно, из-за чего-то базового c

#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte server[] = { 192, 168, 1, 100 };
IPAddress ip(192,168,1,127);

EthernetClient client;

void setup() {

  Serial.begin(9600);

  Ethernet.begin(mac, ip);
  Serial.print("client is at ");
  Serial.println(Ethernet.localIP());

  if (client.connect(server, 8000)) {    //false returned here, of course then it doesn't work
    Serial.println("connected");
    client.println("GET /search?q=arduino HTTP/1.0");
    client.println();
  } else {
    Serial.println("connection failed");
  }
}


void loop() {

  if (client.available()) {
      char c = client.read();
      Serial.print(c);
    }
    if (!client.connected()) {
      Serial.println();
      Serial.println("disconnecting.");
      client.stop();
      for(;;)
        ;
    }

  client.stop();
}

1 Ответ

0 голосов
/ 16 апреля 2020

После того, как я сделал это, я забыл о том, что спросил это здесь, но вот как я это сделал, понятия не имел, что было не так раньше.

Конечно, обязательно отключите брандмауэр, поэтому для систем на основе Debian:

sudo ufw disable

sudo ufw reload

Затем я испортил код, пока мне не удалось выполнить запрос POST, я знаю, что запросил GET, но ошибка, упомянутая в вопросе, теперь исчезла (я заметил, что порт изменился, но это потому что я тоже изменил его на сервере, прежде чем заставить его работать):

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress server(192,168,1,100);

IPAddress ip(192,168,1,104);
IPAddress gateway(192,168,1,1);
IPAddress DNSServer(192,168,1,1);
IPAddress subnet(255, 255, 255, 0);

EthernetClient client;

void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac, ip, gateway, DNSServer, subnet);
  delay(5000);
  Serial.println("connecting..."); 
}

void loop()
{
   int correctValue;
   String PostData = "foo";

  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    if (client.connect(server, 5000)) {
        Serial.println("connected");
        client.println("POST / HTTP/1.1");
        // Works either with or without any of the commented lines
        // guess it's a great idea to un-comment them though
        //client.println("Host: 192.168.1.100");
        //client.println("User-Agent: Arduino/1.0");
        //client.println("Connection: close");
        client.print("Content-Length: ");
        client.println(PostData.length());
        client.println();
        client.println(PostData);
        client.println();
     }
     else {
       Serial.println("connection failed");
     }
     delay(10000);
  }
}

Если вы хотите получить GET, ЭТО ДОЛЖНО изменить клиента

. println ("POST / HTTP / 1.1");

с

client.println ("GET / HTTP / 1.1");

затем удалите все client.println (), блок с

if (client.available()) {
  char c = client.read();
  Serial.print(c);
}

должен выполнить работу по его печати, так как я не уверен в этом и не могу подтвердить это, я буду более чем рад обновить код, если кто-то узнает правильный способ сделать это

...