ESP8266 真是很强大,自己作为一个wifi模块 ,同时也是一块强大的muc,是一块可编程的器件,入坑以来,各种资料,各种乱 单是搜集一些资料就有这么多,还没有带各种编译环境等等

esp8266容易掉线 esp8266稳定吗_wi-fi


今天就简单的梳理一下 。我所知道的分三种,一种AT指令,AT指令基本上仅把8266作为一块wifi模块了,用串口输入AT 命令实现wifi的接收、发射,tcp和udp的相关等等,优点是简单,易懂,很快就能入门,缺点就得外挂一个mcu实现各种控制,可玩性并不高而且内部的资源浪费。第二种是用安信可 ESP 系列一体化开发环境,这个优点可以接触底层,很锻炼人,c语言的开发语言也容易懂,缺点嘛,作为一个电信狗,Eclipse真的玩不转,但是看配置编译环境就真的很头疼!实在不爽第三就是nodemuc ,用一种新语言lua来编写,优点就是编译环境基本不用配置,一个软件完成一切。

而且提供可定制的固件,真的很是人性化可以按需下载,真的很舒服,底层都是封装好的,只要正确调用就好,在Github也提供了文档供你查阅。缺点就是你得学一门或者说用一门新语言来实现调用API.权衡了一下利弊,最终还是选择了用lua。开始以为这条路会走的很顺利,但是一路心酸!!


如果你用8266用lua来编写,这个教程相信你一定看过,

就是这个老哥,真的很是厉害,但是一直跟着他思路走,问题越来愈大。所以最后果断自己重新整理思路,果然阔然开朗。简单说一下杨哥一个client的程序

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)

ClientConnectedFlage = 0

TcpConnect = nil

tmr.alarm(1, 1000, 1, function()

if  ClientConnectedFlage == 0 then

Client = net.createConnection(net.TCP, 0)

Client:connect(8080,"192.168.1.103")

Client:on("receive", function(Client, data)

uart.write(0,data)

end)

Client:on("connection", function(sck, c)

ClientConnectedFlage = 1

TcpConnect = Client

print("Link OK")

tmr.stop(1)

Client:on("disconnection", function(sck, c)

ClientConnectedFlage = 0

TcpConnect = nil

tmr.start(1)

end)

end)

if  ClientConnectedFlage == 0 then

print("Link Error")

end

end

end)

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

if  TcpConnect ~= nil then

TcpConnect: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)

这个代码可以实现连接wifi后去连接一个tcp的协议,但是总是要出现七八次的Link Error,这我可能作为强迫症,实在接受了这种,一直在思考问题,把杨哥的代码研究了大半天发现并没什么,开始以为是因为lua底层的原因,把Github的文档反复看了好几遍还是没有有效解决,在将要放弃时终于找到问题所在了。

回到我们编程最开始的逻辑,我们先去连接一个路由器,然后再去connect一个tcp的服务器,杨哥程序在反馈link error时是连接tcp的失败的时后反馈错误连接,当时一直怀疑是 connect 的问题,可是连接tcp服务器做的三次握手时是一个很快的时间所以在怀疑2天后果断换思路,我们平常手机连接wifi的时候你可能就会发现他的时间遍比较长,出于这个我开始怀疑也许是8266在还没有连接路由器成功的时候,就去连接了客户端,所以一直就会报错,突然思路一下就开阔了!

贴上我的代码

wifi.setmode(wifi.STATIONAP)

apcfg={}
apcfg.ssid="loser2.4"
apcfg.pwd="123455443"
wifi.sta.config(apcfg)
wifi.sta.autoconnect(1)
flag=0
    wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
 print("\n\tSTA - GOT IP".."\n\tStation IP: "..T.IP.."\n\tSubnet mask: "..
 T.netmask.."\n\tGateway IP: "..T.gateway)


Client = net.createConnection(net.TCP, 0) 
    Client:connect(5001,'192.168.2.239')
  --  Client:ttl(1)

tmr.alarm(1, 1000,tmr.ALARM_AUTO, function()

     Client:on("receive", function(Client, data)
       Client:send("ack") deal_t(data)   
    end)
           Client:on("connection", function(Client, c) 

        tmr.stop(1)
    end)
     Client:on("disconnection", function(Client, data)   rep_connect()
     tmr.start(1)
    end)

 end)
 end)

 function deal_t(data) 
if data=="a0"
then gpio.write(4,0)
end
if data=="b0"
then gpio.write(4,1)
end

end
--wifi.sta.config("loser2.4", "123455443")         
function rep_connect()

  Client = net.createConnection(net.TCP, 0) 
print("connect time"..flag)
Client:connect(5001,'192.168.2.239')
   flag=flag+1

   end


也就说我们在连接服务器的时间应该是在获取了ip之后,所以这个回调就很有意思了!!

所以杨哥代码逻辑是有些小问题的,所有连接服务器相关的代码都应该在在这个函数后进行

wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)

print("\n\tSTA - GOT IP".."\n\tStation IP: "..T.IP.."\n\tSubnet mask: "..

T.netmask.."\n\tGateway IP: "..T.gateway)

--处理代码

end)

终于不再有那么多报错了!开心

最后还是很感谢@杨奉武的代码!很是厉害的大牛

就先更新到这吧,太累了

晚安

2017/11/16 by loser