Простой запрос GET молча терпит неудачу

Я пытаюсь сделать простой запрос GET на сервер (который имеет статический IP - адрес, но не имеет имени). Я использую библиотеку EtherCard и дешевый модуль Ethernet ENC28J60. Основные конфигурации в порядке (я могу получить назначение DHCP и поиск DNS), но когда я пытаюсь сделать простой запрос GET с помощью метода browseUrl, ничего не происходит. Я попытался вызвать страницу из браузера, и все работает нормально, так что это не проблема сервера. Код выглядит следующим образом:

#include <EtherCard.h>

// mac-адрес интерфейса ethernet, должен быть уникальным в
byte mymac[] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24 };

const char website[] PROGMEM = "http://10.10.10.10"; // мой сервер
const char dnsLook[] PROGMEM = "google.com";

byte Ethernet::buffer[700];
uint32_t timer;
Stash stash;

// вызывается, когда клиентский запрос завершен
static void requestCallback (byte status, word off, word len) {
  Serial.print(">>>");
  Serial.print(status);
  Serial.print("-");
  Serial.print(status);
  Serial.print("-");
  Serial.print(status);
  Serial.println("<<<");
}

void setup () {

  Serial.begin(9600);
  delay (10000);
  int res = ether.begin(sizeof Ethernet::buffer, mymac, 8);

  if (res == 0) 
    Serial.println( "Cannot access ethernet interface");

  const static uint8_t ip[] = {192,168,1,117};
  const static uint8_t gw[] = {192,168,1,1};
  const static uint8_t dns[] = {8,8,8,8};

  if (!ether.staticSetup(ip, gw, dns))
  {
      Serial.println("Cannot set static parameters");
  }

  // вручную установить
  ether.netmask[0] = 255;
  ether.netmask[1] = 255;
  ether.netmask[2] = 255;
  ether.netmask[3] = 0;

  // поиск dns
  if (!ether.dnsLookup(dnsLook))
    Serial.println("DNS failed");
}

void loop () {
  ether.packetLoop(ether.packetReceive());
  if (millis() > timer) {
    timer = millis() + 10000;
    ether.browseUrl(PSTR("/page.php?"), "var=value", website, requestCallback);
  }
}

, 👍1

Обсуждение

сначала запустите пример кода, @jsotola

Я рекомендую вам использовать мою библиотеку EthernetENC, @Juraj

@Juraj Я попробую, @user2959923


1 ответ


3

Я сделал это с помощью библиотеки EthernetENC, как предложил @Juraj. Чтобы установить библиотеку, просто воспользуйтесь менеджером библиотек и найдите EthernetENC. Для тех, кто в этом нуждается, ниже приведен рабочий код

#include <SPI.h>
#include <EthernetENC.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  // MAC-адрес модуля ethernet
IPAddress server(10,10,10,10);                        // IP-адрес сервера, без DNS
//char server[] = "www.site.com"; // если ваш сервер имеет DNS - имя, используйте эту переменную для подключения

// статические переменные конфигурации
IPAddress staticIp(192, 168, 1, 217);
IPAddress staticDnsServer(8, 8, 8, 8);

EthernetClient client;                                // объект клиента ethernet

void setup() {
  // настройка CS pin
  Ethernet.init(8);

  // начать последовательное соединение
  Serial.begin(9600);

  // подождите несколько секунд, чтобы позволить модулю начать
  delay(5000);

  // инициализация модуля ethernet со статической конфигурацией
  Ethernet.begin(mac, staticIp, staticDnsServer);

  // подождите, пока модуль правильно инициализируется
  delay(1000);

  // подключение к серверу
  Serial.print("Connecting to: ");
  Serial.print(server);
  Serial.println("...");

  // уведомить об успешном подключении
  if (client.connect(server, 80)) {

    Serial.print("Connected to ");
    Serial.println(client.remoteIP());

    // простой запрос GET
    client.println("GET /page.php?var=test HTTP/1.1");
    client.println("Host: 10.10.10.10");
    client.println("User-Agent: Arduino/1.0");
    client.println("Connection: close");
    client.println();

  } else {
    // уведомление о сбое соединения
    Serial.println("Connection failed");
  }
}

void loop() {

  // если я получил ответ от сервера, read and print to serial
  int len = client.available();
  if (len > 0) {
    byte buffer[80];
    if (len > 80) len = 80;
    client.read(buffer, len);
    Serial.write(buffer, len);
  }

  // отключение
  if (!client.connected()) {

    Serial.println();
    Serial.println("Disconnected");
    client.stop();

    // остановить выполнение
    while (true) {
      delay(1);
    }
  }
}

по этой ссылкевы можете увидеть, как правильно подключить этот модуль к Arduino UNO.

,

вы можете снизить использование флэш-памяти и памяти с помощью настроек в разделе "утилита/uipethernet-conf".ч` https://github.com/jandrassy/EthernetENC/wiki/Settings самая интересная настройка-UIP_CONF_UDP, @Juraj