七、ESP8266LUA開發之建立UDP通訊,加入空閒中斷
阿新 • • 發佈:2019-01-26
關於UDP的一些基礎知識
UDP
通訊支援一路
預設,3路
動態連線,共可連線4個
。UDP
是一種面向無連線的即時通訊方式,即時通訊意味著通訊完畢即是銷燬。模組發資料,要先設定一個預設通訊的
IP
和Port
。有
Server
和Client
之分可實現同時多個
UDP
通訊
8266
做UDP Server
init.lua
gpio.mode(4,gpio.OUTPUT)
gpio.mode(2,gpio.OUTPUT)
gpio.write(4,1)
if adc.force_init_mode(adc.INIT_ADC) then
node.restart()
return
end
tmr.alarm(0, 1000, 1, function()
gpio.write(4,1-gpio.read(4))
end)
tmr.alarm(1, 3000, 0, function()
dofile("wifi.lua")
end)
wifi.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 = 8080
UdpSocket = net.createUDPSocket()
UdpSocket:listen(ConnectPort)
UdpSocketTable={}
UdpIPTable={}
UdpPortTable={}
UdpConnectCnt = 0
UdpCanConnect = 0
UdpSocket:on("receive", function(socket, data, port, ip)
UdpCanConnect = 1
for i=0,2 do
if UdpIPTable[i] == ip and UdpPortTable[i] == port then
UdpCanConnect = 0
end
end
if ip == ConnectIP and port == ConnectPort then
UdpCanConnect = 0
end
if UdpCanConnect == 1 then
UdpSocketTable[UdpConnectCnt] = socket
UdpIPTable[UdpConnectCnt] = ip
UdpPortTable[UdpConnectCnt] = port
print("\r\n"..UdpConnectCnt.."-Connect")
UdpConnectCnt = UdpConnectCnt + 1
end
if UdpConnectCnt == 3 then
UdpConnectCnt = 0
end
uart.write(0,data)
end)
uart.on("data",0,function(data)
if UdpSocket ~= nil then
UdpSocket:send(ConnectPort,ConnectIP,data)
end
for i=0,2 do
if UdpSocketTable[i] ~= nil then
UdpSocketTable[i]:send(UdpPortTable[i],UdpIPTable[i],data)
end
end
end, 0)
printip = 0
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
printip = 0
end)
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
if printip == 0 then
print("+IP"..T.IP)
end
printip = 1
end)
UdpCanConnect
– 等於1
表示有新的連線加入!
ConnectIP
則是本機分配的IP
地址,檢視方法可移步<這裡>
socket Tool
中的 對方IP
指的是8266
分配的IP
地址!
print("\r\n"..UdpConnectCnt.."-Connect")
- 沒有回車換行會擠到一起
程式解讀
UdpSocket:on("receive", function(socket, data, port, ip)
中做了判斷8266
接收哪個UDPClient
發來的資訊,只要一個新的UDPClient
(不和預設的,不和表中的一樣)和模組建立連線,那就儲存那個UDPClient
的socket
、ip
和port
到表中,然後列印data
到串列埠。
如果經判斷表中已經有個這個udp
的資訊,那個直接就列印data
到串列埠。
uart.on
是串列埠經過8266
向已經連線的UDP Client
廣播data
。
關於為什麼會是1然後是許多個1,顯然是空閒中斷在使壞!
看下廣播的結果~
加入空閒中斷後的寫法,可同時參考<這裡>
init.lua
同上
wifi.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 = 8080
UdpSocket = net.createUDPSocket()
UdpSocket:listen(ConnectPort)
UdpSocketTable={}
UdpIPTable={}
UdpPortTable={}
UdpConnectCnt = 0
UdpCanConnect = 0
UdpSocket:on("receive", function(socket, data, port, ip)
UdpCanConnect = 1
for i=0,2 do
if UdpIPTable[i] == ip and UdpPortTable[i] == port then
UdpCanConnect = 0
end
end
if ip == ConnectIP and port == ConnectPort then
UdpCanConnect = 0
end
if UdpCanConnect == 1 then
UdpSocketTable[UdpConnectCnt] = socket
UdpIPTable[UdpConnectCnt] = ip
UdpPortTable[UdpConnectCnt] = port
print("\r\n"..UdpConnectCnt.."-Connect")
UdpConnectCnt = UdpConnectCnt + 1
end
if UdpConnectCnt == 3 then
UdpConnectCnt = 0
end
uart.write(0,data)
end)
UartReadCnt=0
UartReadCntCopy=0
UartReadData=""
UartReadDataCopy=""
uart.on("data",0,function(data)
UartReadCnt = UartReadCnt + 1
UartReadData = UartReadData..data
end, 0)
tmr.alarm(2, 5, 1, function()
if UartReadCnt ~=0 then
if UartReadCnt == UartReadCntCopy then
UartReadCnt = 0
UartReadCntCopy = 0
UartReadDataCopy = UartReadData
UartReadData=""
NetSend(UartReadDataCopy)
else
UartReadCntCopy = UartReadCnt
end
end
end)
function NetSend(data)
if UdpSocket ~= nil then
UdpSocket:send(ConnectPort,ConnectIP,data)
end
for i=0,2 do
if UdpSocketTable[i] ~= nil then
UdpSocketTable[i]:send(UdpPortTable[i],UdpIPTable[i],data)
end
end
end
printip = 0
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
printip = 0
end)
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
if printip == 0 then
print("+IP"..T.IP)
end
printip = 1
end)