1. 程式人生 > >三、ESP8266LUA開發之建立TCP伺服器,實現socket通訊控制繼電器,串列埠,伺服器,客戶端收發資料小感悟

三、ESP8266LUA開發之建立TCP伺服器,實現socket通訊控制繼電器,串列埠,伺服器,客戶端收發資料小感悟

8266做伺服器,實現TCP通訊

,實際燒錄的時候會因為註釋過多造成燒錄不進去的情況,這個時候需要刪除註釋!

先來測試8266建立伺服器,並分得IP

燒錄時,先燒wifi.lua,然後再燒init.lua

init.lua

--小燈   gpio2 -> IO4
--繼電器 gpio4 -> IO2

gpio.mode(4, gpio.OUTPUT) 
gpio.mode(2, gpio.OUTPUT) 

gpio.write(4, 1) 

tmr.alarm(0, 1000, 1, function()
    gpio.write(4, 1-gpio.read
(4)) end) tmr.alarm(1, 2000, 0, function() dofile("wifi.lua") end)

wifi.lua

wifi.setmode(wifi.STATIONAP)

cfg = {} 
cfg.ssid = "Hello8266"
cfg.pwd = "11223344"
wifi.ap.config(cfg)

apcfg = {}
apcfg.ssid = "qqqqq"
apcfg.pwd = "11223344"
wifi.sta.config(apcfg)
wifi.sta.autoconnect(1) 

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 = 0 end)

具體的函式介紹,還是看LUAAPI<這裡>即可!

建立伺服器並分得相應IP沒問題了,就可以建立socket通訊了!

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)

TCPSever=net.createServer(net.TCP,28800) 

TCPSever:listen(8080,function(socket) 
    socket:on("receive",function(socket,data) 
          if data == "++MD610" then
             gpio.write(2,1)
             socket:send("relay=1")
          end
          if data == "++MD600" then
             gpio.write(2,0)
             socket:send("relay=0")
          end
    end) 

    socket:on("disconnection",function(sck,c) 
          socket = nil
    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)
伺服器和客戶端進行傳送接收資料的同時,讓串列埠也參與進來。

8266建立伺服器並分得IP,客戶端連線相應IP,傳送控制命令。

伺服器收到命令後,先把收到的命令通過uart.write8266的串列埠傳送到電腦端的串列埠除錯助手,(同時拷貝此時的伺服器客戶端建立的socket)
然後執行相應的命令動作,並通過socket:send實現把命令再回顯到客戶端!

uart.on是串列埠資料接收監聽函式,可以實現接收電腦端的串列埠除錯傳送的資料!
在這裡面,利用伺服器與客戶端之間的socket,實現串列埠除錯助手傳送資料到8266串列埠,再利用socket:send傳送到客戶端!

具體實現還是看下面的wifi.lua.

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)

TCPSever=net.createServer(net.TCP,28800) 

TCPSever:listen(8080,function(socket) 
    socket:on("receive",function(socket,data) 
          uartsocket = socket
          uart.write(0,data) 

          if data == "++MD610" then
             gpio.write(2,1)
             socket:send("relay=1")
          end
          if data == "++MD600" then
             gpio.write(2,0)
             socket:send("relay=0")
          end
    end) 

    socket:on("disconnection",function(sck,c) 
          socket = nil
    end)
end)

uart.on("data",0,function(data) 

        if uartsocket ~= nil then
           uartsocket:send(data)
        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)
小感悟之串列埠,伺服器,客戶端之間的收發資料

看來,伺服器向客戶端傳送訊息就是通過socket:send
客戶端向伺服器則是直接發,只需要再伺服器端進行接收監聽即可
socket:on("receive",function(socket,data)...

同樣,我們8266的串列埠和串列埠除錯助手的通訊也是如此呢!
8266的串列埠向串列埠除錯助手傳送訊息通過print或者uart.write
串列埠除錯助手向8266進行傳送訊息直接發即可,只需要註冊串列埠資料監聽即可
uart.on("data",0,function(data)