ESP8266 -- lua开发学习之路 六 (TCP服务器透传)

此工作模式ESP8266模块作为TCP服务器等待客户端的连接 

操作步骤;

1.首先,模块应工作在AP模式下 ,开启WIFI信号 让客户端连接模块的WIFI信号后连接TCP服务器

2.模块创建一个TCP服务器 调用函数: Server = net.createServer(net.TCP,28800)   超时时间是28800s 超时这断开与客户端的连接

3.模块开启服务器后监听相应的端口:  Server:listen(8080,function(socket) end)          服务器监测到有客户端连接时会创建一个       socket  作为客户端与服务器之间通信的通道

4.模块作为服务器只能连接5个客户端

例子一.

下面这个例子虽然没有提示连接了几个客户端,但是仍可以连接多个客户端,只是多个连接与服务器通信上存在问题, 服务器只能和一个客户端通信但是可以接收到,所有客户端的信息

init.lua文件

gpio.mode(4,gpio.OUTPUT)
gpio.write(4,1)

tmr.alarm(1, 3000, 0, function()
    dofile("tcpserver.lua")
end)

tcpserver.lua文件


wifi.setmode(wifi.STATIONAP) 


local apcfg = {
    ssid="ESP8266open",    
    pwd="12345678"    
}
wifi.ap.config(apcfg) --设置模块AP 模式参数


local ClientSocket = nil   --定义客户端连接的socket

Server = net.createServer(net.TCP,28800) --创建TCP服务器

--服务器接收回调函数 接收到数据后 通过串口发送出去 ,并回发数据给客户端 "Receive Success"
local function receiver(sck, data)
              uart.write(0,data)
              ClientSocket:send("Receive Success") 
end

--服务器监听端口
Server:listen(8080,function(socket)
                        ClientSocket=socket 
                        ClientSocket:on("receive",receiver)--注册服务器与客户端通信接收函数
                        ClientSocket:on("disconnection",function() ClientSocket=nil 
                            print("Disconnec")
                        end)--注册服务器与客户端断开连接函数 断开连接时 串口提示
                   end
)

--串口接收数据函数,把串口接收的数据 通过服务器发送给客户端
uart.on("data",0,function(data)
                    if ClientSocket ~=nil then
                     ClientSocket:send(data) --发送数据给客户端
                    end 
                 end
,0)  

           

例子二.

TCP服务器多连接数据处理

init.lua文件:

gpio.mode(4,gpio.OUTPUT) 
gpio.write(4,1)  --关闭LED显示

tmr.alarm(1, 1000, 0, function() 
    dofile("tcpserver.lua")
end)

tcpserver.lua文件:

wifi.setmode(wifi.STATIONAP) --设置ESP8266工作在ap+sttion模式

APcfg={}
APcfg.ssid="ESP8266open"
APcfg.pwd="12345678"
wifi.ap.config(APcfg) --设置ap模式参数

StationCfg={}
StationCfg.ssid="TP-Link"
StationCfg.pwd="12345678"
wifi.sta.config(StationCfg)--配置station模式参数
wifi.sta.autoconnect(1) --启动,模块自动连接WIFI

TCPSever=net.createServer(net.TCP,28800) --创建TCP服务器 超时时间28800s 断开连接
 
TcpClientCnt = 0  --定义存储客户端连接的个数
TcpSocketList={}  --记录每个客户端的socket信息

--[[
服务器开启监听后只要有客户端连接就把连接的socket记录在TcpSocketList表中
服务器可以接收任意客户端发送的信息,当服务器发送数据时让每个连接的客户端都接收到
]]
TCPSever:listen(8080,function(socket) --服务器开启监听

    if  TcpClientCnt == 5 then  --8266模块最多支持5个客户端连接  太多flash不够用 --当等于5时说明已经连接到第六个了关闭第一个连接并清除TcpSocketList表相应的信息
        if  TcpSocketList[0] ~= nil then 
            TcpSocketList[0]:close()	 
            TcpSocketList[0] = nil 	 
        end    
    end

    TcpSocketList[TcpClientCnt] = socket --记录客户端连接的socket

    print(TcpClientCnt.."-Connect") --串口打印第几个连接 从0开始

    TcpClientCnt = TcpClientCnt + 1 --再有连接加一计数

    if  TcpClientCnt == 5 then --超过5个客户端连接,客户端个数计数清零
        TcpClientCnt = 0
    end

    socket:on("receive",function(socket,data) --服务器接收的数据通过串口发送出去
          uart.write(0,data) 
    end) 


    socket:on("disconnection",function(sck,c)  --断开连接事件
        for i=0,5 do                --循环清空连接信息
            if  TcpSocketList[i] == sck then 
                TcpSocketList[i] = nil
                print(i.."-Disconnect") --串口打印断开连接号
            end
        end
    end)

end)


--[[
串口接收数据事件
]]
uart.on("data",0,function(data) 

    for i=0,5 do --通过服务器循环发送模块串口接收到的数据给客户端
        if  TcpSocketList[i] ~= nil then  确保客户端有链接的才发送
            TcpSocketList[i]:send(data)
        end
    end

end, 0)


两个例子对比 发现第一个 只有一个客户端能接收到服务器的数据, 因服务器发送数据时只记录了最近连接的客户端信息,所以只有一个客户端接收到信息, 在第二个例子中 通过一个数组记录所有客户端的连接信息, 服务器发送数据时也是循环发送所有连接的客户端 . 当服务器处理一些更复杂的数据交互时 可以更清晰

不知道怎么上传视频或者GIF的图片,没办法更好的记录学习了,持续学习中.........

猜你喜欢

转载自blog.csdn.net/dianzishi123/article/details/82588029