Каков наилучший способ инициализации Wi-Fi-связи между двумя устройствами (получить IP-адрес)?

как лучше всего подключить Wi-Fi связь между двумя устройствами, не зная IP второго устройства, скажем, Raspberry Pi и ESP8266?

Я хочу построить простую систему домашней автоматизации для своей цели. Там будет Raspberry Pi, как сердце системы и ESP8266 как управляемые устройства. Как лучше всего заставить их общаться? Я думаю, что самое сложное - это как получить их IP-адрес. Тогда будет легко общаться через розетки.

В следующем тексте под RPi я имею в виду Raspberry Pi и программу в RPi будет на python (но с использованием вызова терминальных команд при необходимости).

Моя идея такова: на ESP8266 будет запущена программа, которая создаст точку доступа WiFi при запуске (при первом запуске в сети). Имя (SSID) этого AP будет конкретным (скажем, начиная с префикса ESP-AUTOMATION), поэтому Raspberry Pi будет знать, когда будет включено новое устройство ESP (Raspberry Pi будет повторно искать доступные сети). Когда появится новый ESP, RPi сохранит собственный IP в переменную и подключится к новой сети поиска (скажем, ESP-AUTOMATION-abcd). Затем RPi отправит на AP (ESP) IP-адрес (RPi) и SSID и пароль локальной сети. Затем он отключится и снова подключится к локальной сети (и получит "старый" IP-адрес, который он ранее сохранил в переменной). Затем ESP подключается к локальной сети со статическим IP-адресом, и после успешного подключения он отправит RPi свой IP-адрес через сокет (потому что IP-адрес RPi уже известен, потому что RPi отправил его, когда он служил AP). Затем RPi сохранит этот IP-адрес. И поскольку IP-адреса (RPi, а также ESP) будут настроены как статические, они не должны меняться со временем.

Это хорошая идея? Или что-то из этого нереально (я в начале всего этого)?

PS: Я очень хочу полностью автономную систему, поэтому для меня не решение что-то вроде подключения ESP к ПК и печати его IP на последовательный, а затем его запись в RPi...

Спасибо за каждый совет/мнение.

, 👍2

Обсуждение

Это кажется мне слишком сложным. Не зная, как именно вы бы реализовали это на ESP и Pi, вы могли бы позволить Pi транслировать специальное сообщение по сети, которое идентифицирует его как ваш сервер приложений автоматизации. Все клиенты в сети получат это специальное сообщение. Неавтоматизированные устройства не будут знать, что делать с этим сообщением, поэтому они будут его игнорировать. ESP может ждать этого сообщения, и когда оно приходит, он может сохранить IP, что сообщение пришло от (исходный IP). Затем ESP может связаться с Pi по IP., @chrisl

@chrisl Oh, кажется очень хорошим и "простым" одновременно (y). Вероятно, я так и поступлю. СПАСИБО!, @Petr Marek

Один из механизмов, который вы могли бы использовать для этого, называется ["multicast DNS (mDNS)"]. (https://en.wikipedia.org/wiki/Multicast_DNS). Это поддерживается как Raspberry Pi, так и ESP8266. См. Также [разрешение адреса Raspberry Pi через MDNS с помощью NodeMCU](https://stackoverflow.com/questions/44187924/nodemcu-resolving-raspberrys-local-dns-through-mdns), @StarCat

вы даете rpi фиксированный IP-адрес, и при загрузке ESPS отправляют этому IP-адресу регистрационный http-запрос, который покажет их IP-адрес pi., @dandavis


1 ответ


1

Один из них является сервером, а другой-клиентом. Серверу не обязательно знать IP-адрес клиента, но клиенту необходимо знать IP-адрес сервера. Подробнее см. в разделе Связь между двумя Arduino

,

Но когда серверу (RPi) потребуется контролировать клиентов? (Например, выключатель лампы...), @Petr Marek

@RozonaZoro Сервер автоматически узнает IP-адрес клиента, когда поступит первый запрос от клиента. Это просто должно было бы спасти его. Но вопрос, похоже, сосредоточен на шаге перед этим. Когда клиент не знает IP-адрес сервера, как он может автоматически получить IP-адрес?, @chrisl

Да, самая большая проблема-это ваш последний вопрос. Вероятно, я решу эту проблему с помощью отправки широковещательного сообщения из RPi, как предложил @chrisl., @Petr Marek

Это может быть возможно, если сервер поддерживает mDNS (многоадресный DNS)., @Rozona Zoro