arduino + ENC28j60 в режиме клиента

ololoepololoe
Offline
Зарегистрирован: 04.01.2021

Всем привет, не могу разобраться с, казалось бы, простой ситуацией arduino + ENC28j60 в режиме клиента для парсинга сайта. Подключаю все по инструкции и простой скетч из примера у меня не работает

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10, 0, 0, 177 };
byte server[] = { 64, 233, 187, 99 }; // Google
EthernetClient client;
void setup()
{
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
  delay(1000);
  Serial.println("connecting...");
  if (client.connect(server, 80)) {
    Serial.println("connected");
    client.println("GET /search?q=arduino HTTP/1.0");
  } else {
    Serial.println("connection failed");
  }
}
void loop()
{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
  if (!client.connected()) {
    Serial.println("disconnecting.");
    client.stop();
    for(;;);
  }
}

Первая мысль - проверить работает ли вообще моя связка, проверил вот на таком скече:

#include <EtherCard.h>
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
byte Ethernet::buffer[700];
void setup () {
   Serial.begin(57600);
   Serial.println(F("n[testDHCP]"));
   Serial.print("MAC: ");
   for (byte i = 0; i < 6; ++i) {
      Serial.print(mymac[i], HEX);
       if (i < 5)
         Serial.print(':');
        }
     Serial.println();
    if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
        Serial.println(F("Failed to access Ethernet controller"));
    Serial.println(F("Setting up DHCP"));
    if (!ether.dhcpSetup())
        Serial.println(F("DHCP failed"));

   ether.printIp("My IP: ", ether.myip);
   ether.printIp("Netmask: ", ether.netmask);
   ether.printIp("GW IP: ", ether.gwip);
   ether.printIp("DNS IP: ", ether.dnsip);
}
void loop () {}

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Gateway IP проверить, фаерволл...

ololoepololoe
Offline
Зарегистрирован: 04.01.2021

то есть проблема, скорее всего, где-то в роутере?

Feofan
Offline
Зарегистрирован: 28.05.2017

Скорее всего в коде.
MAC'и в скетчах указаны верно?
Выведите в Serial все LAN-параметры в первом скетче и сравните с параметрами своей подсети.

ololoepololoe
Offline
Зарегистрирован: 04.01.2021

Feofan пишет:
Скорее всего в коде. MAC'и в скетчах указаны верно? Выведите в Serial все LAN-параметры в первом скетче и сравните с параметрами своей подсети.

МАС я пробовал менять, пробовал и из рабочих скечей и ip подставлял свои (тоже брал из рабочего скеча)

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

По поводу первого скетча, который не работает. Вижу там указан IP клиента при инициализации (Ethernet.begin(mac, ip)), значит предполагается статика? Тогда почему не указаны IP шлюза (GW) и маска подсети (Netmask) ?

Feofan
Offline
Зарегистрирован: 28.05.2017

"MAC-адрес уникальный идентификатор, присваиваемый каждой единице активного оборудования или некоторым их интерфейсам в компьютерных сетях Ethernet". Надо ставить тот, что есть, а не гадать.
И...:

Цитата:
Выведите в Serial все LAN-параметры в первом скетче и сравните с параметрами своей подсети.

IP, Gateway, Mask, DNS - должны быть "заточены" под вашу подсеть.

ololoepololoe
Offline
Зарегистрирован: 04.01.2021

Jeka_M пишет:

По поводу первого скетча, который не работает. Вижу там указан IP клиента при инициализации (Ethernet.begin(mac, ip)), значит предполагается статика? Тогда почему не указаны IP шлюза (GW) и маска подсети (Netmask) ?

пробовал и так

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

byte mac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
byte ip[] = { 192, 168, 1, 100 };
byte server[] = { 64, 233, 187, 99 }; // Google
EthernetClient client;
void setup()
{
  Ethernet.begin(mac);
  Serial.begin(9600);
  delay(1000);
  Serial.println("connecting...");
  if (client.connect(server, 80)) {
    Serial.println("connected");
    client.println("GET /search?q=arduino HTTP/1.0");
  } else {
    Serial.println("connection failed");
  }
}
void loop()
{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
  if (!client.connected()) {
    Serial.println("disconnecting.");
    client.stop();
    for(;;);
  }
}

думал можт уже что с роутером, пробоввал в другом дома и провайдере, та же петрушка -  в локальной сети все работает, а сервер в интернете достать не может, и даже более ардуинка не может достать 192.168.1.1.

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

 

sadman41
Offline
Зарегистрирован: 19.10.2016
#include <Ethernet.h>

Это что за библиотека такая для ENC?

Если в локалке все работает, а ко внешним ресурсам не идет то 99% - это неправильно указанный гейтвей.

Feofan
Offline
Зарегистрирован: 28.05.2017

sadman41
ТС и внутренние ресурсы не видит.

Цитата:
даже более ардуинка не может достать 192.168.1.1

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

#include <Ethernet.h>

Это что за библиотека такая для ENC?

Если в локалке все работает, а ко внешним ресурсам не идет то 99% - это неправильно указанный гейтвей.

а ничего, что ресурс - https://www.google.com/ ? это вроде 443 порт?

  if (client.connect(server, 80)) {14

ololoepololoe
Offline
Зарегистрирован: 04.01.2021

ua6em пишет:

sadman41 пишет:

#include <Ethernet.h>

Это что за библиотека такая для ENC?

Если в локалке все работает, а ко внешним ресурсам не идет то 99% - это неправильно указанный гейтвей.

а ничего, что ресурс - https://www.google.com/ ? это вроде 443 порт?

  if (client.connect(server, 80)) {14

 

не буду утверждать, но, вроде это для https, но в любом случае я попробовал и 443

ololoepololoe
Offline
Зарегистрирован: 04.01.2021

в общем, пробую я этот скеч

#include <EtherCard.h>
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
byte Ethernet::buffer[700];
void setup () {
   Serial.begin(57600);
   Serial.println(F("n[testDHCP]"));
   Serial.print("MAC: ");
   for (byte i = 0; i < 6; ++i) {
      Serial.print(mymac[i], HEX);
       if (i < 5)
         Serial.print(':');
        }
     Serial.println();
    if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
        Serial.println(F("Failed to access Ethernet controller"));
    Serial.println(F("Setting up DHCP"));
    if (!ether.dhcpSetup())
        Serial.println(F("DHCP failed"));

   ether.printIp("My IP: ", ether.myip);
   ether.printIp("Netmask: ", ether.netmask);
   ether.printIp("GW IP: ", ether.gwip);
   ether.printIp("DNS IP: ", ether.dnsip);
}
void loop () {}

получаю вот это:

n[testDHCP]
MAC: 74:69:69:2D:30:31
Setting up DHCP
My IP: 192.168.1.25
Netmask: 255.255.255.0
GW IP: 192.168.1.1
DNS IP: 192.168.1.1

 

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

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, посмотрите, какой IP в первом скетче первопоста и какой по DHCP раздается.

ololoepololoe
Offline
Зарегистрирован: 04.01.2021

в общем, вроде, я на пути решения - сайт "www.googole.com" ардуинка достает, а вот по ip, почему-то, нет

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, не знаю. Не сталкивался с такой фигнёй, когда ENC гонял. Но, вообще, она не для сложных вещей.

Feofan
Offline
Зарегистрирован: 28.05.2017

На роутере DHCP поднят. А в коде он используется? В коде запрос к DHCP есть? Покажите крайний/сегодняшний вариант кода.

ololoepololoe
Offline
Зарегистрирован: 04.01.2021

Feofan пишет:
На роутере DHCP поднят. А в коде он используется? В коде запрос к DHCP есть? Покажите крайний/сегодняшний вариант кода.

 

поднят, вот такой вариант работает:

 

#include <EtherCard.h>

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];
static uint32_t timer;

const char website[] PROGMEM = "www.google.com";

// called when the client request is complete
static void my_callback (byte status, word off, word len) {
  Serial.println(">>>");
  Ethernet::buffer[off+300] = 0;
  Serial.print((const char*) Ethernet::buffer + off);
  Serial.println("...");
}

void setup () {
  Serial.begin(9600);
  Serial.println(F("\n[webClient]"));

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println(F("Failed to access Ethernet controller"));
  if (!ether.dhcpSetup())
    Serial.println(F("DHCP failed"));

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip);  

  if (!ether.dnsLookup(website))
    Serial.println("DNS failed");
    
  ether.printIp("SRV: ", ether.hisip);
}

void loop () {
  ether.packetLoop(ether.packetReceive());
  
  if (millis() > timer) {
    timer = millis() + 5000;
    Serial.println();
    Serial.print("<<< REQ ");
    ether.browseUrl(PSTR("/foo/"), "bar", website, my_callback);
  }
}

 

ololoepololoe
Offline
Зарегистрирован: 04.01.2021

в общем сайт "www.google.com" работает а вот по ip нет

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018
C:\>nslookup www.google.com

DNS&nbsp;:     www.google.com
Addresses:  2a00:1450:4010:c0b::69
          2a00:1450:4010:c0b::6a
          2a00:1450:4010:c0b::63
          2a00:1450:4010:c0b::68
          173.194.221.104
          173.194.221.103
          173.194.221.147
          173.194.221.105
          173.194.221.99
          173.194.221.106

Вы один из этих IP используете? Если да, то я пробовал на ПК и там идет просто переадресация на www.google.com

 

Feofan
Offline
Зарегистрирован: 28.05.2017
  if (millis() > timer) {
    timer = millis() + 5000;
    ...
  }

Великое переполнение millis()

ololoepololoe
Offline
Зарегистрирован: 04.01.2021

BOOM пишет:

Вы один из этих IP используете? Если да, то я пробовал на ПК и там идет просто переадресация на www.google.com

не, я использую 64, 233, 187, 99 но это, наверно, не так важно, я в режиме клиента даже в локальной сети не могу на страницу роутера постучать, во всей видимости только по DNS

sadman41
Offline
Зарегистрирован: 19.10.2016

Невероятные истории, ей-богу.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018
ololoepololoe
Offline
Зарегистрирован: 04.01.2021

большое спасибо, правда пока не догоню что там надо сделать

- убрать вызов ether.dnslookup();
- "вручную" назначить ether.hisip (который в принципе назначается в результате работы dnslookup);
- browseUrl при этом вызывается как обычно ("website" используется как поле "Host" в http-запросе).
 
первое - просто убрать из кода?
второе и третье никак не догоню
sadman41
Offline
Зарегистрирован: 19.10.2016

Я рекомендую взять эту библиотеку, а примером Webclient из стандартного ардуиновского Ethernet: https://github.com/ntruchsess/arduino_uip/tree/fix_errata12

Только не забывайте в примере #include заменить с ethernet.h на uipethernet.h

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

ololoepololoe пишет:

большое спасибо, правда пока не догоню что там надо сделать

- убрать вызов ether.dnslookup();
- "вручную" назначить ether.hisip (который в принципе назначается в результате работы dnslookup);
- browseUrl при этом вызывается как обычно ("website" используется как поле "Host" в http-запросе).
 
первое - просто убрать из кода?
второе и третье никак не догоню

Ну Вы и капец! Там же пример есть:

const char website[] PROGMEM = "192.168.1.102";
static byte websiteip[] = { 192,168,1,102 };

void setup() {

  .......

  //if (!ether.dnsLookup(website))
  //  Serial.println("DNS failed");
  memcpy(ether.hisip, websiteip, sizeof(websiteip));
  ether.printIp("SRV: ", ether.hisip);
}

void loop() {

  ........

  ether.browseUrl(PSTR("/foo"), "bar", website, my_callback);
}

Уж куда дальше подсказывать - только самому написать. Это уже в платный раздел.

 

 

ololoepololoe
Offline
Зарегистрирован: 04.01.2021

BOOM пишет:

Ну Вы и капец! Там же пример есть:

 

const char website[] PROGMEM = "192.168.1.102";
static byte websiteip[] = { 192,168,1,102 };

void setup() {

  .......

  //if (!ether.dnsLookup(website))
  //  Serial.println("DNS failed");
  memcpy(ether.hisip, websiteip, sizeof(websiteip));
  ether.printIp("SRV: ", ether.hisip);
}

void loop() {

  ........

  ether.browseUrl(PSTR("/foo"), "bar", website, my_callback);
}

 

 

я не понял как там "вручную" назначить ether.hisip (который в принципе назначается в результате работы dnslookup), пока не могу нагуглить как это делается

ololoepololoe
Offline
Зарегистрирован: 04.01.2021

sadman41 пишет:
Я рекомендую взять эту библиотеку, а примером Webclient из стандартного ардуиновского Ethernet: https://github.com/ntruchsess/arduino_uip/tree/fix_errata12 Только не забывайте в примере #include заменить с ethernet.h на uipethernet.h

 

попробовал скачать репозиторий, при компиляции выдает

Invalid version '1.04' for library in: C:\Program Files (x86)\Arduino\libraries\UIPEthernet

попробовал установить из встроенного менеджера - так же по ip не достает 

sadman41
Offline
Зарегистрирован: 19.10.2016

Данная ошибка несущественна.

Второй фрагмент кода, закомментированные строки показывают работу с hisip: https://forum.arduino.cc/index.php?topic=617210.0

Если не справитесь, то останется только кому-то стороннему расчехлять свои модули.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

ololoepololoe пишет:

я не понял как там "вручную" назначить ether.hisip (который в принципе назначается в результате работы dnslookup), пока не могу нагуглить как это делается

Уж простите, но я перейду на "ты". Ты точно читать умеешь? Со зрением как дела? Все в примере указано (что я дополнительно продублировал)! Вместо тех данных вставляешь свои, удаляешь лишнее и профит.

Я могу казаться грубым, просто маска на плату не легла с первого раза, - повторно переделываю плату. Но делать за вас такие элементарные вещи, которые тут "каждый второй крутой захожий типа программист" делает - увольте. Закажите в платном разделе, рублей за 500 сделают....

ololoepololoe
Offline
Зарегистрирован: 04.01.2021

удалю этот пост, я ошибся, код не работает

ololoepololoe
Offline
Зарегистрирован: 04.01.2021

BOOM пишет:

ololoepololoe пишет:

я не понял как там "вручную" назначить ether.hisip (который в принципе назначается в результате работы dnslookup), пока не могу нагуглить как это делается

Уж простите, но я перейду на "ты". Ты точно читать умеешь? Со зрением как дела? Все в примере указано (что я дополнительно продублировал)! Вместо тех данных вставляешь свои, удаляешь лишнее и профит.

Я могу казаться грубым, просто маска на плату не легла с первого раза, - повторно переделываю плату. Но делать за вас такие элементарные вещи, которые тут "каждый второй крутой захожий типа программист" делает - увольте. Закажите в платном разделе, рублей за 500 сделают....

 

ну, простите, такой вот я, тупой

sadman41
Offline
Зарегистрирован: 19.10.2016

Любой залитый скетч ардуину "сбрасывает в ноль"

ololoepololoe
Offline
Зарегистрирован: 04.01.2021

sadman41 пишет:

Любой залитый скетч ардуину "сбрасывает в ноль"

благодарю

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

ololoepololoe
Offline
Зарегистрирован: 04.01.2021

в общем считерил, взял шилд на w5100 и на нем отлично заработал скеч

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte myserver[] = { 197, 166, 245, 115}; //

EthernetClient client;

void setup() {

  //Ethernet.begin(mac, ip, myDns);
  Ethernet.begin(mac);
  Serial.begin(9600);
  
}

void loop() {

  delay(3000);
 
  if (client.connect(myserver, 8081)) {  
    Serial.println("connected");
    client.println("GET /adress HTTP/1.0"); //GET request
    client.println(); //end of get request

  }
  else {
    Serial.println("connection failed"); 
    Serial.println();
  }

  while (client.connected() && !client.available()) delay(100); 
  while (client.connected() || client.available()) { 

    char webdata = client.read(); 
     // делаем с webdata то что задумывали

  }

  Serial.println();
  Serial.println("disconnecting.");
  Serial.println();
  client.stop(); //stop client

}

И так и не понял почему на enc28j60 так и не заработал скеч