Wiznet 5500 не имеет закрепленного за чипом MAC-адреса.
https://en.wikipedia.org/wiki/MAC_address
...
If the bit is 0, the address is universally administered, which is why this bit is 0 in all OUIs. If it is 1, the address is locally administered. In the example address 06-00-00-00-00-00 the first octet is 06 (hexadecimal), the binary form of which is 00000110, where the second-least-significant bit is 1. Therefore, it is a locally administered address
...
Что непонятно про IPAddress? Это объемная тема, не для двух строк.
Для Ethernet.h нужен адрес в виде класса (синтаксического сахара). Но в сущности, на низком уровне адрес - 4 бита/октета. Так что в зависимости от сферы применения нужно соотв. представление.
//IPAddress server(74,125,232,128); // numeric IP for Google (no DNS)
char server[] = "www.google.com"; // name address for Google (using DNS)
IPAddress ip(192, 168, 0, 177);
IPAddress myDns(192, 168, 0, 1);
Получается нужно делать так?
IPAddress ip (192, 168, 1, 12);
IPAddress gateway (192, 168, 1, 1);
IPAddress subnet (255, 255, 255, 0);
IPAddress server (192, 168, 1, 10);
IPAddress dns (192, 168, 1, 1);
Ну, захотели авторы и поместили в массив. Другие поместили адрес в экземпляр IPAddress, избежав лишней писанины.
При работе с Etherner.h все сводится к преобразованию byte[4] или uint32 в IPAddress и передаче его в begin(), connect() и т.п. Но в чип все равно уйдут 4 байта, вытащенные из IPAddress. Так написана библиотека.
4 байта/октета проще сохранить в EEPROM, передать по UART, засунуть в PROGMEM и пр. Если адрес прибит к скетчу и относительно неизменен, то можно не заморачиваться и объявлять сразу экземпляр класса.
Вобщем, нет тут однозначного правила применения - все зависит от общей идеи в алгоритме.
IP aдрес это уникальная идентификация устройства в сети. Даётся один раз, если конечно какие-нибудь отжимальщики не придут и не отнимут. Если на весь мир, то денег стоит. Но к счастью придумали частные сети и дали им IP адреса 168.192.ХХХ.ХХХ, 10.ХХХ.ХХХ.ХХХ и ещё немножко из серии 172. , но их совсем чуть чуть. Вот из из этих адресов и состоят сети пользователей за всякими роутерами с NAT и прочими. Их не видно из мира и точно такиеже могут быть у соседа. Мораль сего спича такова. Если включаешь устройство в свою локальную сеть, то должна сама(!) выбрать IP адрес из свободных в твоей сети, а не брать из примеров. Самый простой путь узнать свободный адрес - войти в панель своего роутера и посмотреть занятые. Будут например заняты до 192.168.0.105 то можно брать 192.168.0. 106 и подставлять в программу. Но это ты должна сделать сама! Выбрать адрес и подставить в программу. И маску можно подсмотреть в настройках IP адресов роутера. Адрес роутера - адрес гейта. Его тоже программа потребует.
А про POST, Disconnecting не происходит потому что в запросе нет Connection: close ?
Скорее всего не отрабатывает stop(). Зря усложнили исходник раньше времени.
Заголовок (HTTP Header) "Connection: close" - это лишь просьба к удаленной стороне закрыть сессию. Но та сторона может иметь свой взгляд на обмен данными по POST и ждать обработки (помещения в SQL DB или тп) перед реальным закрытием. Это может затянуться. Единственный способ гарантировано завершить сессию - самостоятельно перевести сокет в CLOSE, чем и занимается stop(). Хидер не помешает - он декларирует намерения, но гарантия - самостоятельное терминирование.
Из-за таких непрогнозируемых случаев поведения удаленной стороны, реализация обмена данными часто становится очень громоздкой. А тем более в рамках МК и мелкочипов.
Вот у 5500 только 8 сессий можно открыть. Если каждую секунду делать connect() и POST не дожидаясь правильного закрытия сессии, то через 8 сек система встанет раком. Потом, по таймауту какие-то сессии закроются. МК опять немножко позапрашивает и подвиснет. Аккуратно надо, вобщем, действовать.
При проверке скетча выдаёт ошибку, при повторной проверке скетча ошибки нет, а лог выглядит так
In file included from C:\Program Files (x86)\Arduino\libraries\Ethernet\src\Dns.cpp:8:0:
C:\Program Files (x86)\Arduino\libraries\Ethernet\src\Dns.cpp: In member function 'uint16_t DNSClient::BuildRequest(const char*)':
C:\Program Files (x86)\Arduino\libraries\Ethernet\src\utility/w5100.h:457:25: warning: result of '(256 << 8)' requires 18 bits to represent, but 'int' only has 16 bits [-Wshift-overflow=]
#define htons(x) ( (((x)<<8)&0xFF00) | (((x)>>8)&0xFF) )
~~~^~~
C:\Program Files (x86)\Arduino\libraries\Ethernet\src\Dns.cpp:164:18: note: in expansion of macro 'htons'
twoByteBuffer = htons(QUERY_FLAG | OPCODE_STANDARD_QUERY | RECURSION_DESIRED_FLAG);
Время на изучение устаревших шилдов прошло давно, с приходом новых технологий с ESP32. Изучайте именно этот контроллер, и вы будете очень рады, что вложили свой труд на перспективу. Я не настаиваю, но по доброму советую.
Так, и ещё вопрос появился, я при поступлении данных в контроллер отправляю данные через W5500 на сервер и смотрю что в ответе, всё. Нужна ли для таких целей плата на W5500, или вполне хватит ENC28J60 ? ()
Давным давно я попробовал это гумно (ENC) с тех пор зарекся.
с w5100-5500 все просто прекрасно.
единственный глюк за все время наступил не далее, чем вчера. Долго ловил этот глюк, пока не обнаружил, что плата ( стоит чипом от меня) греется почти как утюг. Поменял на другую- нагрев чуть теплее пальца и никаких глюков. Причем система с греющейся платой странно вела себя с самого начала. Теперь просто небо/земля.
Я бы 8266 посоветовал для начала. Он, хотя бы, 5V терпит на входе.
а ESP32 нет толерантен к 5V?
Производитель такой информации не даёт (я не встречал), поэтому пока считаю, что нет.
Проверенно лично, не терпит ESP32 5 вольт по входу. Недавно подключал диспенсер (5 вльтовая логика) напрямую по COM порту к ESP32 работал некоторое время, но при очередном включении устройства ESP именно по Rx ушла в кз. Пришлось заменить на новую и поставить обыкновенный делитель килоомом в землю и 510 Ом на вход. Работает уже месяц всё норм.
Wiznet 5500 не имеет закрепленного за чипом MAC-адреса.
https://en.wikipedia.org/wiki/MAC_address
...
If the bit is 0, the address is universally administered, which is why this bit is 0 in all OUIs. If it is 1, the address is locally administered. In the example address 06-00-00-00-00-00 the first octet is 06 (hexadecimal), the binary form of which is 00000110, where the second-least-significant bit is 1. Therefore, it is a locally administered address
...
Что непонятно про IPAddress? Это объемная тема, не для двух строк.
Для Ethernet.h нужен адрес в виде класса (синтаксического сахара). Но в сущности, на низком уровне адрес - 4 бита/октета. Так что в зависимости от сферы применения нужно соотв. представление.
Непонятно почему в каких-то примерах
IPAddress ip (192, 168, 1, 10);
а в каких-то
uint8_t ip[] = {192, 168, 1, 12};
в стандартном" примере
Получается нужно делать так?
Ну, захотели авторы и поместили в массив. Другие поместили адрес в экземпляр IPAddress, избежав лишней писанины.
При работе с Etherner.h все сводится к преобразованию byte[4] или uint32 в IPAddress и передаче его в begin(), connect() и т.п. Но в чип все равно уйдут 4 байта, вытащенные из IPAddress. Так написана библиотека.
4 байта/октета проще сохранить в EEPROM, передать по UART, засунуть в PROGMEM и пр. Если адрес прибит к скетчу и относительно неизменен, то можно не заморачиваться и объявлять сразу экземпляр класса.
Вобщем, нет тут однозначного правила применения - все зависит от общей идеи в алгоритме.
Значит использую IPAddress server(192, 168, 1, 42);, как Вы говорите писанины меньше.
А про POST, Disconnecting не происходит потому что в запросе нет Connection: close ?
IP aдрес это уникальная идентификация устройства в сети. Даётся один раз, если конечно какие-нибудь отжимальщики не придут и не отнимут. Если на весь мир, то денег стоит. Но к счастью придумали частные сети и дали им IP адреса 168.192.ХХХ.ХХХ, 10.ХХХ.ХХХ.ХХХ и ещё немножко из серии 172. , но их совсем чуть чуть. Вот из из этих адресов и состоят сети пользователей за всякими роутерами с NAT и прочими. Их не видно из мира и точно такиеже могут быть у соседа. Мораль сего спича такова. Если включаешь устройство в свою локальную сеть, то должна сама(!) выбрать IP адрес из свободных в твоей сети, а не брать из примеров. Самый простой путь узнать свободный адрес - войти в панель своего роутера и посмотреть занятые. Будут например заняты до 192.168.0.105 то можно брать 192.168.0. 106 и подставлять в программу. Но это ты должна сделать сама! Выбрать адрес и подставить в программу. И маску можно подсмотреть в настройках IP адресов роутера. Адрес роутера - адрес гейта. Его тоже программа потребует.
А про POST, Disconnecting не происходит потому что в запросе нет Connection: close ?
Скорее всего не отрабатывает stop(). Зря усложнили исходник раньше времени.
Заголовок (HTTP Header) "Connection: close" - это лишь просьба к удаленной стороне закрыть сессию. Но та сторона может иметь свой взгляд на обмен данными по POST и ждать обработки (помещения в SQL DB или тп) перед реальным закрытием. Это может затянуться. Единственный способ гарантировано завершить сессию - самостоятельно перевести сокет в CLOSE, чем и занимается stop(). Хидер не помешает - он декларирует намерения, но гарантия - самостоятельное терминирование.
Из-за таких непрогнозируемых случаев поведения удаленной стороны, реализация обмена данными часто становится очень громоздкой. А тем более в рамках МК и мелкочипов.
Вот у 5500 только 8 сессий можно открыть. Если каждую секунду делать connect() и POST не дожидаясь правильного закрытия сессии, то через 8 сек система встанет раком. Потом, по таймауту какие-то сессии закроются. МК опять немножко позапрашивает и подвиснет. Аккуратно надо, вобщем, действовать.
я бы MAC тогда склонировал, с того что на картинке в надежде что на маршрутизаторах не пересечётся
Ну да, зря усложнила.
А если я останавливаю сразу после отправки, то ответа не приходит, попробую остановить через время после отправки
время жизни пакета TCP/IP в сети - 5 секунд
Запрос не выполняется (точнее client.available() ничего не получает)
Если останавливать клиент через 100 мс (не использую паузу) то клиент останавливается)))))))))))))
Вот такой код
Получаю, соответственно, следующее:
php
Здравствуйте.
После чего-то, может после обновлений, началась вот такая беда
При проверке скетча выдаёт ошибку, при повторной проверке скетча ошибки нет, а лог выглядит так
Даже если не использую DNS
Аааа, это предупреждение ...
Аааа, это предупреждение ...
в IDE 1.8.19 предупреждений еще больше
А исправлять не нужно?
C:\Program Files (x86)\Arduino\libraries\Ethernet\src\utility\w5100.h
строчку
заменить на
C:\Program Files (x86)\Arduino\libraries\Ethernet\src\utility\w5100.h
строчку
заменить на
Вы такая дотошная прямо как ДЕВА (по знаку рождения) )))
Время на изучение устаревших шилдов прошло давно, с приходом новых технологий с ESP32. Изучайте именно этот контроллер, и вы будете очень рады, что вложили свой труд на перспективу. Я не настаиваю, но по доброму советую.
Давно на него смотрела, заказала вот, попробовать.
А что посоветуете? Arduino IDE, Espressif IDF, Lua RTOS
Arduino IDE самое простое для начала хватит
Я бы 8266 посоветовал для начала. Он, хотя бы, 5V терпит на входе.
а ESP32 нет толерантен к 5V?
а ESP32 нет толерантен к 5V?
Производитель такой информации не даёт (я не встречал), поэтому пока считаю, что нет.
Arduino IDE самое простое для начала хватит
Вы же понимаете...что в скором времени будет куча вопросов по этим устройствам XDD
(а может раздел создадим? ммм?)
Так, и ещё вопрос появился, я при поступлении данных в контроллер отправляю данные через W5500 на сервер и смотрю что в ответе, всё. Нужна ли для таких целей плата на W5500, или вполне хватит ENC28J60 ? ()
Хватит, если нервная система хорошая и запас по памяти есть у МК.
Давным давно я попробовал это гумно (ENC) с тех пор зарекся.
с w5100-5500 все просто прекрасно.
единственный глюк за все время наступил не далее, чем вчера. Долго ловил этот глюк, пока не обнаружил, что плата ( стоит чипом от меня) греется почти как утюг. Поменял на другую- нагрев чуть теплее пальца и никаких глюков. Причем система с греющейся платой странно вела себя с самого начала. Теперь просто небо/земля.
а ESP32 нет толерантен к 5V?
Производитель такой информации не даёт (я не встречал), поэтому пока считаю, что нет.
Проверенно лично, не терпит ESP32 5 вольт по входу. Недавно подключал диспенсер (5 вльтовая логика) напрямую по COM порту к ESP32 работал некоторое время, но при очередном включении устройства ESP именно по Rx ушла в кз. Пришлось заменить на новую и поставить обыкновенный делитель килоомом в землю и 510 Ом на вход. Работает уже месяц всё норм.
Добрый день.
Про soft переинициализацию w5100/w5500 никто ничего не может подсказать?
Переинициализировать командой можно.
А какой?
Не знаю, как это поможет, но: в регистр MR записать 0x80