изменился IP
- Войдите на сайт для отправки комментариев
Пнд, 01/04/2019 - 17:00
Посоветуйте, куда смотреть...
Есть проект Мега2560, W5500 (библиотека ethernet2), библиотека MODBUS TCP (https://github.com/siamect/mudbus). IP задается статический 192.168.1.25. Вообщем modbus TCP slave устройство. Все работает, но пару раз проявился такой момент: через некоторое время (дней 7-10, примерно) беспрерывной работы устройство перестало отвечать на запросы. Адрес 192.168.1.25 не пингуется. НО, устройство стало пинговаться по адресу 192.168.1.15.
Как такое возможно? Как обойти эти грабли и куда смотреть?
Спасибо.
Само по себе у меня такое ни разу не происходило, но допускать вероятность того, что в чип полетела наводке, которая была распознана как команда переконфигурирования со случайным адресом, совпавшим до некоторой степени с оригинальным, - могу.
Что скрывается под словом"обойти" - не понимаю пока, но могу предложить раз в N секунд сличать хотя бы localIP() с заданным. Разняться - переконфигурировать.
Видимо роутер всё таки присваивает динамический IP. В роутере можно зарезервировать динамический IP адрес для конкретного устройства по MAC-адресу.
Неее, роутера нет. Сеть - это само устройство, ПЛК и ноутбук. У всех статические адреса. Что поменялся IP адрес случайно обнаружил - запустил Advanced IP scaner.
Что скрывается под словом"обойти" - не понимаю пока, но могу предложить раз в N секунд сличать хотя бы localIP() с заданным. Разняться - переконфигурировать.
В идеале найти причину
Само по себе у меня такое ни разу не происходило, но допускать вероятность того, что в чип полетела наводке, которая была распознана как команда переконфигурирования со случайным адресом, совпавшим до некоторой степени с оригинальным, - могу.
я запущу на тест устройство, понаблюдаю. Если будет тот же адрес - значит другая причина ....
Это очень вряд ли. Чтобы получить адрес от dhcp, нужно четыре чётко структурированных пакета, по два в обе стороны, это очень уж умная наводка должна быть :)
Это очень вряд ли. Чтобы получить адрес от dhcp, нужно четыре чётко структурированных пакета, по два в обе стороны, это очень уж умная наводка должна быть :)
У него нет DHCP, так что не умная, но достаточно сообразительная. А вероятность - она всегда ненулевая.
IP же в W5500 прописывается только раз, по SPI. Может всё таки была перезагрузка?
IP же в W5500 прописывается только раз, по SPI. Может всё таки была перезагрузка?
я логировал modbus, вот что в логах
Между началом ошибок по связи и моментом когда устройство полностью перестало отвечать на запросы, прошло (с 18.00 до 18.39) 39 минут.
Если была просто перезагрузка, почему адрес прописался другой ?
Устанавливается адрес сколько угодно раз... Никаких ограничений на многократную запись в регистр SIPR нет.
void W5500Class::setIPAddress(uint8_t *_addr) { writeSIPR(_addr); }Устанавливается адрес сколько угодно раз... Никаких ограничений на многократную запись в регистр SIPR нет.
void W5500Class::setIPAddress(uint8_t *_addr) { writeSIPR(_addr); }Я про то, что в данном случае он статический и прописывается один раз после подачи питания. Вот тут, помеха по SPI в момент записи вполне себе может быть.
ТС, я бы добавил задержку перед настройкой микрухи по SPI, пусть питание устаканится.
Да, так может, да :)
[/quote]
ТС, я бы добавил задержку перед настройкой микрухи по SPI, пусть питание устаканится.
[/quote]
Да, согласен, резонно... Реализую
вытащил на морду еще и Ethernet.localIP(), тестирую
и все таки IP меняется... причину понять не могу. задержку поставил перед настройкой по SPI в случае перезагрузки... пока хочу обработать сам факт изменения и принудительно переконфигурить IP адрес. Вопрос такой: как правильно обрабатывать значение Ethernet.localIP(). В конструкции display.println (Ethernet.localIP ( )) оно правильно отображается на экране в виде 192.168.1.25. А что с чем сравнивать, ведь это не строка?
В конструкции display.println (Ethernet.localIP ( )) оно правильно отображается на экране в виде 192.168.1.25. А что с чем сравнивать, ведь это не строка?
так чего проще - откройте библиотеку Ethernet и посмотрите, в каком виде отдает адрес эта самая функция localIP( ). Подозреваю, что она выводит как раз таки строку.
Сравнивать IP в виде строки не слишком эффективно - я бы покопался в библиотеке, наверняка из нее можно получить адрес и в виде 4х байт. что было бы удобнее для сравнения.
Ethernet.localIP() возвращает объект IPAddress. Его можно сравнивать с таким же IPAddress или, например, с uint32_t. С первым более наглядно, наверно - ведь он задаётся в начале скетча. Типа IPAddress hostIp(192, 168, 1, 25);
Ethernet.localIP() возвращает объект IPAddress.
а как же оно печатается функцией print() ?
Ethernet.localIP() возвращает объект IPAddress.
а как же оно печатается функцией print() ?
/** The Printable class provides a way for new classes to allow themselves to be printed. By deriving from Printable and implementing the printTo method, it will then be possible for users to print out instances of this class by passing them into the usual Print::print and Print::println methods. */ class Printable { public: virtual size_t printTo(Print& p) const = 0; // Фокус тут готовится }; ... class IPAddress : public Printable ... size_t IPAddress::printTo(Print& p) const { size_t n = 0; for (int i =0; i < 3; i++) { n += p.print(_address.bytes[i], DEC); n += p.print('.'); } n += p.print(_address.bytes[3], DEC); return n; }вот ты не ленивый :) Спасибо, понятно
Спасибо большое
вот ты не ленивый :) Спасибо, понятно
он программист докапывающийся до сути )))