1. 程式人生 > >七、ESP8266LUA開發之建立UDP通訊,加入空閒中斷

七、ESP8266LUA開發之建立UDP通訊,加入空閒中斷

關於UDP的一些基礎知識

  • UDP通訊支援一路預設,3路動態連線,共可連線4個

  • UDP是一種面向無連線的即時通訊方式,即時通訊意味著通訊完畢即是銷燬。

  • 模組發資料,要先設定一個預設通訊的IPPort

  • ServerClient之分

  • 可實現同時多個UDP通訊

8266UDP 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(不和預設的,不和表中的一樣)和模組建立連線,那就儲存那個UDPClientsocketipport到表中,然後列印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)

這裡寫圖片描述