Каков наилучший способ инициализации 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...
Спасибо за каждый совет/мнение.
@Petr Marek, 👍2
Обсуждение1 ответ
Один из них является сервером, а другой-клиентом. Серверу не обязательно знать IP-адрес клиента, но клиенту необходимо знать IP-адрес сервера. Подробнее см. в разделе Связь между двумя Arduino
Но когда серверу (RPi) потребуется контролировать клиентов? (Например, выключатель лампы...), @Petr Marek
@RozonaZoro Сервер автоматически узнает IP-адрес клиента, когда поступит первый запрос от клиента. Это просто должно было бы спасти его. Но вопрос, похоже, сосредоточен на шаге перед этим. Когда клиент не знает IP-адрес сервера, как он может автоматически получить IP-адрес?, @chrisl
Да, самая большая проблема-это ваш последний вопрос. Вероятно, я решу эту проблему с помощью отправки широковещательного сообщения из RPi, как предложил @chrisl., @Petr Marek
Это может быть возможно, если сервер поддерживает mDNS (многоадресный DNS)., @Rozona Zoro
- Как разрешить междоменные запросы на ESP8266 WebServer
- Обнаружение ESP8266 в сети
- Ошибка при загрузке кода в esp8266 через arduino (FatalError('Failed to connect to %s: %s' % (self.CHIP_NAME, last_error)))
- Достаточно ли 1 МБ флэш-памяти для загрузки OTA в ESP-01?
- ESP8266 — Как получить многоадресный пакет UDP?
- Невозможно установить связь между модулем ESP-12E и мобильным устройством через маршрутизатор ESP-12E.
- ESP8266 Одноранговая сеть с AP и STA — кэширование клиентов AP, очистка их запросов?
- Мобильная точка доступа с wemos d1 mini
Это кажется мне слишком сложным. Не зная, как именно вы бы реализовали это на 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