ESP8266 真是很强大,自己作为一个wifi模块 ,同时也是一块强大的muc,是一块可编程的器件,入坑以来,各种资料,各种乱 单是搜集一些资料就有这么多,还没有带各种编译环境等等
今天就简单的梳理一下 。我所知道的分三种,一种AT指令,AT指令基本上仅把8266作为一块wifi模块了,用串口输入AT 命令实现wifi的接收、发射,tcp和udp的相关等等,优点是简单,易懂,很快就能入门,缺点就得外挂一个mcu实现各种控制,可玩性并不高而且内部的资源浪费。第二种是用安信可 ESP 系列一体化开发环境,这个优点可以接触底层,很锻炼人,c语言的开发语言也容易懂,缺点嘛,作为一个电信狗,Eclipse真的玩不转,但是看配置编译环境就真的很头疼!实在不爽第三就是nodemuc ,用一种新语言lua来编写,优点就是编译环境基本不用配置,一个软件完成一切。
而且提供可定制的固件,真的很是人性化可以按需下载,真的很舒服,底层都是封装好的,只要正确调用就好,在Github也提供了文档供你查阅。缺点就是你得学一门或者说用一门新语言来实现调用API.权衡了一下利弊,最终还是选择了用lua。开始以为这条路会走的很顺利,但是一路心酸!!
如果你用8266用lua来编写,http://www.cnblogs.com/yangfengwu/p/7513097.html这个教程相信你一定看过,
就是这个老哥,真的很是厉害,但是一直跟着他思路走,问题越来愈大。所以最后果断自己重新整理思路,果然阔然开朗。简单说一下杨哥一个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