2016-04-21 2 views
1

Я использую NodeMCU (с ESP8266-E) с обновленной прошивкой. Все основные команды работают отлично, но есть одна проблема.ESP8266, NodeMCU, soft AP - UDP-серверная мягкая AP, независимая точка доступа

Я хотел создать независимую точку доступа, которая может иметь поведение, такое как UDP-сервер. Это означает, что без прямого подключения к другим точкам доступа. Простой UDP-сервер, такой как soft AP.

Я последовал за следующие действия:

  1. Я загрузил новую прошивку на NodeMCU.
  2. Я загрузил ESPlorer для лучшей работы с NodeMCU.
  3. Я загрузил исходный код ниже.
  4. Я подключился к точке доступа NodeMCU на своем рабочем столе.
  5. Я отправил некоторые строки в NodeMCU с помощью клиентской программы Java UDP.
  6. Я просмотрел сообщения на ESPlorer.
  7. NodeMCU не получил таких строк.

-

print("ESP8266 Server") 
wifi.setmode(wifi.STATIONAP); 
wifi.ap.config({ssid="test",pwd="12345678"}); 
print("Server IP Address:",wifi.ap.getip()) 

-- 30s timeout for an inactive client 
srv = net.createServer(net.UDP, 30) 
-- server listens on 5000, if data received, print data to console 
srv:listen(5000, function(sk) 
    sk:on("receive", function(sck, data) 
    print("received: " .. data) 
    end) 
    sk:on("connection", function(s) 
    print("connection established") 
    end) 
end) 

Когда я попытался отправить сообщение с помощью приложения Java, не было никаких изменений в ESPlorer. Даже когда я пытался отправить сообщение с помощью программы Hercules (отличная программа для TCP, UDP-связи).

Возможно, это будет неправильный IP-адрес. Я использую IP-адрес AP, а не IP-адрес станции.

Другими словами, я использую этот адрес: wifi.ap.getip(), а не этот адрес wifi.sta.getip() для подключения к UDP-серверу. Но sta.getip() возвращает нулевой объект. На самом деле я не знаю.

Буду рад за любой совет.

спасибо.

ответ

2

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

UDP - без установления связи и, поэтому, там, конечно, нет s:on("connection"). Как следствие, вы не можете зарегистрировать свои обратные вызовы в сокете, но на самом сервере. Он находится в the documentation, но его легко пропустить.

Это должно вас происходит:

wifi.setmode(wifi.STATIONAP) 
wifi.ap.config({ ssid = "test", pwd = "12345678" }) 
print("Server IP Address:", wifi.ap.getip()) 

srv = net.createServer(net.UDP) 
srv:listen(5000) 
srv:on("receive", function(s, data) 
    print("received: " .. data) 
    s:send("echo: " .. data) 
end) 

Я побежал это против прошивкой от dev ветви и проходят из командной строки, как так

$ echo "foo" | nc -w1 -u 192.168.4.1 5000 
echo: foo 

ESPlorer затем также правильно напечатанной «получил: Foo».

+0

Я исправил свой вопрос. Спасибо – Luke

+0

Большое спасибо. Я узнал, что, наконец, он отлично работает. Причина, по которой это не работает, было неправильным пониманием протокола UDP. Когда я пытался отправить строку, используя Hercules, ничего не получилось. Но после отправки большего количества строк/сообщений я узнал, что UDP-сервер получил все правильно. Другими словами, протокол UDP является ненадежным протоколом: – Luke

+0

«Протокол UDP - ненадежный протокол» - о да, [очень сильно] (https://en.wikipedia.org/wiki/User_Datagram_Protocol#Reliability_and_congestion_control_solutions). –

1

Эта строка недействительна. Код Lua. connected здесь. вы не можете просто поместить одно слово после вызова функции.

print(wifi.ap.getip()) connected 

Я предполагаю, что вы хотели сделать что-то вроде печати (wifi.ap.getip() .. «подключен») Хотя я думаю, вы должны добавить сом обработки ошибок здесь, в случае wifi.ap.getip () не возвращает IP.

Здесь вы не закончите определение функции. Ни вы завершить srv:on вызов

srv:on("receive", function(srv, pl) 
print("Strings received") 
srv:listen(port) 

Я предполагаю, что вы просто не копировать/вставить полный код.

+0

Я исправил свой вопрос. Спасибо – Luke

+0

Большое спасибо. Я узнал, что, наконец, он отлично работает. Причина, по которой это не работает, было неправильным пониманием протокола UDP. Когда я пытался отправить строку, используя Hercules, ничего не получилось. Но после отправки большего количества строк/сообщений я узнал, что UDP-сервер получил все правильно. Другими словами, протокол UDP является ненадежным протоколом :) – Luke

Смежные вопросы