七,ESP8266-UDP(基于Lua脚本语言)

那天朋友问我为什么有UDP Sever 和 UDP Client  ,,我说:每个人想的不一样,设计上不一样......

既然是面向无连接的,那么模块发数据就指定IP和端口号,,,为了能和多个UDP进行通信,我们知道模块的Ip和监听的端口号,,就向这个模块发数据,

模块通过数据里面的IP,和端口信息就知道了是谁发给的,,模块把Ip和端口号记录下来就能同时和好几个UDP通信了

还有一点,我们设置一个模块默认发数据的IP和端口号,,,,剩下的是记录了谁就发给谁

init.lua

gpio.mode(4,gpio.OUTPUT)

gpio.mode(2,gpio.OUTPUT)

gpio.write(4,1)ifadc.force_init_mode(adc.INIT_ADC) then

node.restart()returnend

tmr.alarm(0,1000,1, function()

gpio.write(4,1-gpio.read(4))

end)

tmr.alarm(1,3000,0, function()

dofile("UDP.lua")

end)

UDP.lua

wifi.setmode(wifi.STATIONAP)

cfg={}

cfg.ssid="Hellow8266"cfg.pwd="11223344"wifi.ap.config(cfg)

apcfg={}

apcfg.ssid="qqqqq"apcfg.pwd="11223344"wifi.sta.config(apcfg)

wifi.sta.autoconnect(1)

ConnectIP="192.168.1.103"ConnectPort=8080UdpSocket=net.createUDPSocket()

UdpSocket:listen(ConnectPort)

UdpSocketTable={}

UdpIPTable={}

UdpPortTable={}

UdpConnectCnt=0UdpCanConnect=0UdpSocket:on("receive", function(socket, data, port, ip)

UdpCanConnect=0fori=0,2doifUdpIPTable[i] ~= ip or UdpPortTable[i] ~=port  thenifip ~= ConnectIP or port ~=ConnectPort  then

UdpCanConnect=1end

end

endifUdpCanConnect ==1then

UdpSocketTable[UdpConnectCnt]=socket

UdpIPTable[UdpConnectCnt]=ip

UdpPortTable[UdpConnectCnt]=port

print("\r\n"..UdpConnectCnt.."-Connect")

end

UdpConnectCnt= UdpConnectCnt +1ifUdpConnectCnt ==3then

UdpConnectCnt=0end

uart.write(0,data)

end)

uart.on("data",0,function(data)ifUdpSocket ~=nil then

UdpSocket:send(ConnectPort,ConnectIP,data)

endfori=0,2doifUdpSocketTable[i] ~=nil then

UdpSocketTable[i]:send(UdpPortTable[i],UdpIPTable[i],data)

end

end

end,0)

printip=0wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)

printip=0end)

wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)ifprintip ==0then

print("+IP"..T.IP)

end

printip=1end)

需要修改一下:写的匆忙写错了.......

这样

UDP.lua

wifi.setmode(wifi.STATIONAP)

cfg={}

cfg.ssid="Hellow8266"cfg.pwd="11223344"wifi.ap.config(cfg)

apcfg={}

apcfg.ssid="qqqqq"apcfg.pwd="11223344"wifi.sta.config(apcfg)

wifi.sta.autoconnect(1)

ConnectIP="192.168.1.103"ConnectPort=8080UdpSocket=net.createUDPSocket()

UdpSocket:listen(ConnectPort)

UdpSocketTable={}

UdpIPTable={}

UdpPortTable={}

UdpConnectCnt=0UdpCanConnect=0UdpSocket:on("receive", function(socket, data, port, ip)

UdpCanConnect=1fori=0,2doifUdpIPTable[i] == ip and UdpPortTable[i] ==port  then

UdpCanConnect=0end

endifip == ConnectIP and port ==ConnectPort  then

UdpCanConnect=0endifUdpCanConnect ==1then

UdpSocketTable[UdpConnectCnt]=socket

UdpIPTable[UdpConnectCnt]=ip

UdpPortTable[UdpConnectCnt]=port

print("\r\n"..UdpConnectCnt.."-Connect")

UdpConnectCnt= UdpConnectCnt +1endifUdpConnectCnt ==3then

UdpConnectCnt=0end

uart.write(0,data)

end)

uart.on("data",0,function(data)ifUdpSocket ~=nil then

UdpSocket:send(ConnectPort,ConnectIP,data)

endfori=0,2doifUdpSocketTable[i] ~=nil then

UdpSocketTable[i]:send(UdpPortTable[i],UdpIPTable[i],data)

end

end

end,0)

printip=0wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)

printip=0end)

wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)ifprintip ==0then

print("+IP"..T.IP)

end

printip=1end)

七,ESP8266-UDP(基于Lua脚本语言)_第1张图片
七,ESP8266-UDP(基于Lua脚本语言)_第2张图片
七,ESP8266-UDP(基于Lua脚本语言)_第3张图片
七,ESP8266-UDP(基于Lua脚本语言)_第4张图片
七,ESP8266-UDP(基于Lua脚本语言)_第5张图片

串口事件函数里面

七,ESP8266-UDP(基于Lua脚本语言)_第6张图片

这样的话一个默认的,3个后期连接的,,一共同时可以通信4个

测试一下

七,ESP8266-UDP(基于Lua脚本语言)_第7张图片
七,ESP8266-UDP(基于Lua脚本语言)_第8张图片
七,ESP8266-UDP(基于Lua脚本语言)_第9张图片

看一下是不是发给默认的

七,ESP8266-UDP(基于Lua脚本语言)_第10张图片

关于为什么会是1然后是许多个1,,,因为串口默认的有一个数据就会进入中断...

想统一发过去...解决方法可以参考(空闲中断)

http://www.cnblogs.com/yangfengwu/p/7520260.html

二,ESP8266 GPIO和SPI和定时器和串口

现在让其余的连接上

七,ESP8266-UDP(基于Lua脚本语言)_第11张图片

现在向串口写数据

七,ESP8266-UDP(基于Lua脚本语言)_第12张图片
七,ESP8266-UDP(基于Lua脚本语言)_第13张图片
七,ESP8266-UDP(基于Lua脚本语言)_第14张图片
七,ESP8266-UDP(基于Lua脚本语言)_第15张图片
七,ESP8266-UDP(基于Lua脚本语言)_第16张图片

看一下模块其余的一些函数

七,ESP8266-UDP(基于Lua脚本语言)_第17张图片

我们就设置模块启动的时候查看一下设置的wifi.ap.config      和 wifi.sta.config

如果有就设置原来保存的,,没有设置才设置成程序中的

UDP.lua修改为

wifi.setmode(wifi.STATIONAP)

cfg={}

cfg= wifi.ap.getconfig(true)ifcfg.ssid ==nil then

cfg.ssid="Hellow8266"cfg.pwd="11223344"end

print("APssid:"..cfg.ssid)ifcfg.pwd ==nil then

print("APpwd: nil")elseprint("APpwd:"..cfg.pwd)

end

wifi.ap.config(cfg)

apcfg={}

apcfg= wifi.sta.getconfig(true)ifapcfg.ssid ==nil then

apcfg.ssid="qqqqq"apcfg.pwd="11223344"end

print("APssid:"..apcfg.ssid)ifapcfg.pwd ==nil then

print("Stationpwd: nil")elseprint("Stationpwd:"..apcfg.pwd)

end

wifi.sta.config(apcfg)

wifi.sta.autoconnect(1)

ConnectIP="192.168.1.103"ConnectPort=8080UdpSocket=net.createUDPSocket()

UdpSocket:listen(ConnectPort)

UdpSocketTable={}

UdpIPTable={}

UdpPortTable={}

UdpConnectCnt=0UdpCanConnect=0UdpSocket:on("receive", function(socket, data, port, ip)

UdpCanConnect=0fori=0,2doifUdpIPTable[i] ~= ip or UdpPortTable[i] ~=port  thenifip ~= ConnectIP or port ~=ConnectPort  then

UdpCanConnect=1end

end

endifUdpCanConnect ==1then

UdpSocketTable[UdpConnectCnt]=socket

UdpIPTable[UdpConnectCnt]=ip

UdpPortTable[UdpConnectCnt]=port

print("\r\n"..UdpConnectCnt.."-Connect")

end

UdpConnectCnt= UdpConnectCnt +1ifUdpConnectCnt ==3then

UdpConnectCnt=0end

uart.write(0,data)

end)

uart.on("data",0,function(data)ifUdpSocket ~=nil then

UdpSocket:send(ConnectPort,ConnectIP,data)

endfori=0,2doifUdpSocketTable[i] ~=nil then

UdpSocketTable[i]:send(UdpPortTable[i],UdpIPTable[i],data)

end

end

end,0)

printip=0wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)

printip=0end)

wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)ifprintip ==0then

print("+IP"..T.IP)

end

printip=1end)

七,ESP8266-UDP(基于Lua脚本语言)_第18张图片

Station 模式的路由器的ssid和pwd一样的道理

完成一篇..................

你可能感兴趣的:(七,ESP8266-UDP(基于Lua脚本语言))