ESP8266 真是很強大臼隔,自己作為一個wifi模塊 沉填,同時也是一塊強大的muc,是一塊可編程的器件,入坑以來霞扬,各種資料糕韧,各種亂 單是搜集一些資料就有這么多拾给,還沒有帶個各種編譯環(huán)境等等
今天就簡單的梳理一下 。我所知道的分三種兔沃,一種AT指令,AT指令基本上僅把8266作為一塊wifi模塊了级及,用串口輸入AT 命令實現wifi的連接發(fā)射乒疏,tcp和udp的相關等等,優(yōu)點是簡單饮焦,易懂怕吴,很塊就能入門,的缺點就得外掛一個mcu實現各種控制县踢,可玩性并不高而且內部的資源就浪費转绷。第二種是用安信可 ESP 系列一體化開發(fā)環(huán)境,這個優(yōu)點可以接觸底層硼啤,很鍛煉人议经,c語言的開發(fā)語言也容易懂,缺點嘛谴返,作為一個電信狗煞肾,Eclipse真的玩不轉,但是看配置編譯環(huán)境就真的很頭疼嗓袱!實在不爽第三就是nodemuc ,用一種新語言lua來編寫籍救,優(yōu)點就是編譯環(huán)境基本不用配置,一個軟件完成一切渠抹。
而且提供可定制的固件蝙昙,真的很是人性化可以按需下載,真的很舒服
github也提供了文檔供你查閱梧却。缺點就是你得學一門或者說用一門新語言來實現調用API.權衡了一下利弊奇颠,最終還是選擇了用lua。開始以為這條路會走的很順利篮幢,但是一路心酸4罂!
? ? 如果你用8266用lua來編寫三椿,http://www.cnblogs.com/yangfengwu/p/7513097.html這個教程相信你一定看過缺菌,而且這個作者也在簡述里邊發(fā)過相同的文章http://www.reibang.com/p/8cec04ee90e6
就是這個老哥,真的很是厲害搜锰,但是一直跟著他思路走伴郁,問題越來愈大。所以最后果斷自己重新整理思路蛋叼,果然闊然開朗焊傅。
簡單說一下楊哥一個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的協(xié)議剂陡,但是總是要出現七八次的Link Error,這我可能作為強迫癥狐胎,實在接受了這種鸭栖,一直在思考問題,把楊哥的代碼研究了大半天發(fā)現并沒什么握巢,開始以為是因為lua底層的原因晕鹊,把github的文檔反復看了好幾遍還是沒有有效解決,在將要放棄時終于找到問題所在了暴浦。
回到我們編程最開始的邏輯溅话,我們先去連接一個路由器,然后再去connect一個tcp的服務器歌焦,楊哥程序在反饋link error時是連接tcp的失敗的時后反饋錯誤連接飞几,當時一直懷疑是 connect 的問題,可是連接tcp服務器做的三次握手時是一個很快的時間所以在懷疑2天后果斷換思路独撇,我們平常手機連接wifi的時候你可能就會發(fā)現他的時間遍比較長屑墨,出于這個我開始懷疑也許是8266在還沒有連接路由器成功的時候,就去連接了客戶端纷铣,所以一直就會報錯绪钥,突然思路一下就開闊了!
貼上我的代碼
wifi.setmode(wifi.STATION)
apcfg={}
apcfg.ssid="loser2.4"
apcfg.pwd="password"
wifi.sta.config(apcfg)
--wifi.sta.autoconnect(1)
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)
print(wifi.sta.getip())
Client = net.createConnection(net.TCP, 0)
print("start")
Client:connect(5001,'192.168.2.239')
Client:ttl(1)
Client:on("receive", function(Client, data)
Client:send("ack") deal_t(data)
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
也就說我們在連接服務器的時間應該是在獲取了ip之后关炼,所以這個回調就很有意思了3谈埂!
所以楊哥代碼邏輯是有些小問題的儒拂,所有連接服務器相關的代碼都應該在在這個函數后進行
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/12 by loser