此工作模式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的图片,没办法更好的记录学习了,持续学习中.........