想問(wèn)一件事情--簡(jiǎn)書(shū),,,代碼有沒(méi)有專(zhuān)門(mén)的顯示的..比如說(shuō)插入代碼什么的????
一些時(shí)間去準(zhǔn)備朋友的元器件了...
接著寫(xiě),,爭(zhēng)取今天寫(xiě)完所有的文章,,因?yàn)榇饝?yīng)了朋友下周5之前要做好朋友的東西
對(duì)于TCP大家在玩AT指令的時(shí)候有沒(méi)有發(fā)現(xiàn)客戶端最多連接5個(gè),,,再連接就不行了??
所以在用AT指令開(kāi)發(fā)的時(shí)候單片機(jī)程序一定要記得清除多余的連接
現(xiàn)在看用LUA語(yǔ)言怎么做
直接先上菜
Init.lua
gpio.mode(4,gpio.OUTPUT)
gpio.mode(2,gpio.OUTPUT)
gpio.write(4,1)
tmr.alarm(0,1000,1, function()
gpio.write(4,1-gpio.read(4))
end)
tmr.alarm(1,1000,0, function()
dofile("wifi.lua")
end)
wifi.lua
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.connect()
TCPSever=net.createServer(net.TCP,28800)
TcpConnectCnt=0TcpSocketTable={}
TCPSever:listen(8080,function(socket)ifTcpConnectCnt ==4thenifTcpSocketTable[0] ~=nil then
TcpSocketTable[0]:close()
TcpSocketTable[0] =nil
endelseifTcpSocketTable[TcpConnectCnt+1] ~=nil then
TcpSocketTable[TcpConnectCnt+1]:close()
TcpSocketTable[TcpConnectCnt+1] =nil
end
end
TcpSocketTable[TcpConnectCnt]=socket
print(TcpConnectCnt.."-Connect")
TcpConnectCnt= TcpConnectCnt +1ifTcpConnectCnt ==5then
TcpConnectCnt=0end
socket:on("receive",function(socket,data)
uart.write(0,data)
end)
socket:on("disconnection",function(sck,c)fori=0,4doifTcpSocketTable[i] ==sck then
TcpSocketTable[i]=nil
print(i.."-Disconnect")
end
end
end)
end)
uart.on("data",0,function(data)fori=0,5doifTcpSocketTable[i] ~=nil then
TcpSocketTable[i]:send(data)
end
end
end,0)
printip=0wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
printip=0end)
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)ifprintip ==0then
print("+IP"..T.IP)
end
printip=1end)
下面看解釋.............
wifi.setmode(wifi.STATIONAP)--模式AP+STATION就不說(shuō)了
cfg={}
cfg.ssid="Hellow8266"cfg.pwd="11223344"wifi.ap.config(cfg)--設(shè)置模塊的無(wú)線和密碼
apcfg={}
apcfg.ssid="qqqqq"apcfg.pwd="11223344"wifi.sta.config(apcfg)--設(shè)置模塊連接路由器的無(wú)線和密碼--wifi.sta.connect()連接路由器,斷開(kāi)后可能就不自動(dòng)連接了,可以用下面的
wifi.sta.autoconnect(1)可以用這個(gè)斷開(kāi)后自動(dòng)連接路由器
TCPSever=net.createServer(net.TCP,28800) --創(chuàng)建服務(wù)器超過(guò)28800S不通信斷開(kāi)已有的連接
TcpConnectCnt=0--連接個(gè)數(shù)計(jì)數(shù)
TcpSocketTable={}--存儲(chǔ)socket
TCPSever:listen(8080,function(socket)
如果0號(hào)連接就把1號(hào)關(guān)掉,,,1號(hào)連接就把2號(hào)關(guān)掉....4號(hào)連接就把0號(hào)關(guān)掉,這樣子循環(huán),
當(dāng)然您會(huì)問(wèn)可以連接5個(gè),,這樣子只可以連接四個(gè)了,,,為什么....因?yàn)槿绻B接了5個(gè)就進(jìn)不
來(lái)這個(gè)監(jiān)聽(tīng)函數(shù)了.......所以必須留下一個(gè)空位ifTcpConnectCnt ==4thenifTcpSocketTable[0] ~=nil then
TcpSocketTable[0]:close()
TcpSocketTable[0] =nil
endelseifTcpSocketTable[TcpConnectCnt+1] ~=nil then
TcpSocketTable[TcpConnectCnt+1]:close()
TcpSocketTable[TcpConnectCnt+1] =nil
end
end
TcpSocketTable[TcpConnectCnt]= socket--把連接的socket存到數(shù)組
print(TcpConnectCnt.."-Connect")--打印幾號(hào)連接了? 對(duì)了 .. 是連接符
TcpConnectCnt= TcpConnectCnt +1--連接個(gè)數(shù)加一ifTcpConnectCnt ==5then --歸零
TcpConnectCnt=0end
socket:on("receive",function(socket,data)
uart.write(0,data) --把接收到的數(shù)據(jù)發(fā)到串口
end)
socket:on("disconnection",function(sck,c)fori=0,4do--判斷是哪個(gè)斷開(kāi)了連接,,就把對(duì)應(yīng)的socket變量置為 nilifTcpSocketTable[i] ==sck then
TcpSocketTable[i]=nil
print(i.."-Disconnect")
end
end
end)
end)
uart.on("data",0,function(data)fori=0,4do--把串口的數(shù)據(jù)發(fā)向不為 nil 的連接ifTcpSocketTable[i] ~=nil then
TcpSocketTable[i]:send(data)
end
end
end,0)--下面是連接路由器和沒(méi)有連接路由器的監(jiān)聽(tīng)函數(shù),,好像是1S檢測(cè)一次
printip=0wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
printip=0end)
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)ifprintip ==0then
print("+IP"..T.IP)
end
printip=1end)
現(xiàn)在把程序下進(jìn)去
測(cè)試軟件呢在這里下載--也可以自己下載個(gè)網(wǎng)絡(luò)調(diào)試助手
https://item.taobao.com/item.htm?spm=686.1000925.0.0.4a155084jlU4Rd&id=558508797404
連接了路由器了....
第一個(gè)連接
測(cè)試數(shù)據(jù)
再來(lái)幾個(gè)連接
現(xiàn)在再連接一個(gè)
我現(xiàn)在隨意斷開(kāi)一個(gè),看一看串口應(yīng)該打印哪一個(gè)斷開(kāi)了連接
現(xiàn)在發(fā)數(shù)據(jù)
好現(xiàn)在呢控制就用多個(gè)客戶端控制繼電器
http://www.cnblogs.com/yangfengwu/p/7513097.html
這篇文章最后的指令,,畢竟最終咱們就要做成那樣子.....這樣的話8266就應(yīng)該使用的非常順手和輕松了
對(duì)了在
http://www.cnblogs.com/yangfengwu/p/7520260.html
和http://www.cnblogs.com/yangfengwu/p/7524326.html
這篇兩文章中有提及......這次是用多個(gè)TCP客戶端控制,,還會(huì)加上CRC校驗(yàn)
可以直接用軟件上的這兩個(gè)按鈕控制
先寫(xiě)不帶CRC校驗(yàn)數(shù)據(jù)的
為了是程序好瀏覽,,就定義一個(gè)函數(shù),,然后調(diào)用
現(xiàn)在的wifi.lua
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.connect()
TCPSever=net.createServer(net.TCP,28800)
TcpConnectCnt=0TcpSocketTable={}
TCPSever:listen(8080,function(socket)ifTcpConnectCnt ==4thenifTcpSocketTable[0] ~=nil then
TcpSocketTable[0]:close()
TcpSocketTable[0] =nil
endelseifTcpSocketTable[TcpConnectCnt+1] ~=nil then
TcpSocketTable[TcpConnectCnt+1]:close()
TcpSocketTable[TcpConnectCnt+1] =nil
end
end
TcpSocketTable[TcpConnectCnt]=socket
print(TcpConnectCnt.."-Connect")
TcpConnectCnt= TcpConnectCnt +1ifTcpConnectCnt ==5then
TcpConnectCnt=0end
socket:on("receive",function(socket,data)
uart.write(0,data)
control(data)
end)
socket:on("disconnection",function(sck,c)fori=0,4doifTcpSocketTable[i] ==sck then
TcpSocketTable[i]=nil
print(i.."-Disconnect")
end
end
end)
end)
function control(data)ifdata =="++MD610"then
gpio.write(2,1)
print("Relay=1")
endifdata =="++MD600"then
gpio.write(2,0)
print("Relay=0")
end
end
uart.on("data",0,function(data)fori=0,4doifTcpSocketTable[i] ~=nil then
TcpSocketTable[i]:send(data)
end
end
end,0)
printip=0wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
printip=0end)
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)ifprintip ==0then
print("+IP"..T.IP)
end
printip=1end)
好現(xiàn)在控制一下
現(xiàn)在用另一個(gè)斷開(kāi)
對(duì)了最好把信息發(fā)給網(wǎng)絡(luò)對(duì)不對(duì),,,控制一下最好通過(guò)網(wǎng)絡(luò)有一個(gè)回復(fù)
現(xiàn)在的wifi.lua
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.connect()
TCPSever=net.createServer(net.TCP,28800)
TcpConnectCnt=0TcpSocketTable={}
NowSocket=nil
TCPSever:listen(8080,function(socket)ifTcpConnectCnt ==4thenifTcpSocketTable[0] ~=nil then
TcpSocketTable[0]:close()
TcpSocketTable[0] =nil
endelseifTcpSocketTable[TcpConnectCnt+1] ~=nil then
TcpSocketTable[TcpConnectCnt+1]:close()
TcpSocketTable[TcpConnectCnt+1] =nil
end
end
TcpSocketTable[TcpConnectCnt]=socket
print(TcpConnectCnt.."-Connect")
TcpConnectCnt= TcpConnectCnt +1ifTcpConnectCnt ==5then
TcpConnectCnt=0end
socket:on("receive",function(socket,data)
NowSocket=socket
uart.write(0,data)
control(data)
end)
socket:on("disconnection",function(sck,c)fori=0,4doifTcpSocketTable[i] ==sck then
TcpSocketTable[i]=nil
print(i.."-Disconnect")
end
end
end)
end)
function control(data)ifdata =="++MD610"then
gpio.write(2,1)
print("Relay=1")ifNowSocket ~=nil then
NowSocket:send("Relay=1")
NowSocket=nil
end
endifdata =="++MD600"then
gpio.write(2,0)
print("Relay=0")ifNowSocket ~=nil then
NowSocket:send("Relay=0")
NowSocket=nil
end
end
end
uart.on("data",0,function(data)fori=0,4doifTcpSocketTable[i] ~=nil then
TcpSocketTable[i]:send(data)
end
end
end,0)
printip=0wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
printip=0end)
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)ifprintip ==0then
print("+IP"..T.IP)
end
printip=1end)
好了現(xiàn)在加入CRC16校驗(yàn)數(shù)據(jù)
現(xiàn)在的wifi.lua
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.connect()
TCPSever=net.createServer(net.TCP,28800)
TcpConnectCnt=0TcpSocketTable={}
NowSocket=nil
TCPSever:listen(8080,function(socket)ifTcpConnectCnt ==4thenifTcpSocketTable[0] ~=nil then
TcpSocketTable[0]:close()
TcpSocketTable[0] =nil
endelseifTcpSocketTable[TcpConnectCnt+1] ~=nil then
TcpSocketTable[TcpConnectCnt+1]:close()
TcpSocketTable[TcpConnectCnt+1] =nil
end
end
TcpSocketTable[TcpConnectCnt]=socket
print(TcpConnectCnt.."-Connect")
TcpConnectCnt= TcpConnectCnt +1ifTcpConnectCnt ==5then
TcpConnectCnt=0end
socket:on("receive",function(socket,data)
NowSocket=socket
uart.write(0,data)
control(data)
end)
socket:on("disconnection",function(sck,c)fori=0,4doifTcpSocketTable[i] ==sck then
TcpSocketTable[i]=nil
print(i.."-Disconnect")
end
end
end)
end)
function control(data)
local RevLen=string.len (data)
local crc= ow.crc16(string.sub(data,1,RevLen-2))
local recrc= data:byte(RevLen)
local recrc= recrc*256local recrc= recrc + data:byte(RevLen-1)ifcrc ==recrc thenifstring.sub(data,1,7) =="++MD610"then
gpio.write(2,1)
print("Relay=1")ifNowSocket ~=nil then
NowSocket:send("Relay=1")
NowSocket=nil
end
endifstring.sub(data,1,7) =="++MD600"then
gpio.write(2,0)
print("Relay=0")ifNowSocket ~=nil then
NowSocket:send("Relay=0")
NowSocket=nil
end
endelseifNowSocket ~=nil then
NowSocket:send("CRC16 Faild")
NowSocket=nil
end
end
end
uart.on("data",0,function(data)fori=0,4doifTcpSocketTable[i] ~=nil then
TcpSocketTable[i]:send(data)
end
end
end,0)
printip=0wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
printip=0end)
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)ifprintip ==0then
print("+IP"..T.IP)
end
printip=1end)
他呢,,參數(shù)要填寫(xiě)字符串
上位機(jī)的CRC計(jì)算函數(shù)
//////////////////privateintcrc16_modbus(byte[] modbusdata,intlength)
{inti, j;intcrc =0x0;try{for(i =0; i < length; i++)
{
crc^=modbusdata[i];for(j =0; j <8; j++)
{if((crc &0x01) ==1)
{
crc= (crc >>1) ^0xa001;
}else{
crc>>=1;
}
}
}
}catch(Exception)
{throw;
}returncrc;
}
我的置高繼電器函數(shù)
privatevoidbutton7_Click_1(objectsender, EventArgs e)
{byte[] sendbyte =newbyte[7];
sendbyte[0] = (byte)'+';//2Bsendbyte[1] = (byte)'+';
sendbyte[2] = (byte)'M';//4Dsendbyte[3] = (byte)'D';//44sendbyte[4] = (byte)'6';//6sendbyte[5] = (byte)'1';//1if(comboBox3.Text=="繼電器")//pin2{
sendbyte[6] = (byte)'0';
}elseif(comboBox3.Text =="CS")//pin8{
sendbyte[6] = (byte)'1';
}elseif(comboBox3.Text =="MOSI")//pin7{
sendbyte[6] = (byte)'2';
}elseif(comboBox3.Text =="MISO")//pin6{
sendbyte[6] = (byte)'3';
}elseif(comboBox3.Text =="CLK")//pin5{
sendbyte[6] = (byte)'4';
}if(radioButtonNetCon.Checked)//網(wǎng)絡(luò)發(fā)送{
TcpSendDataMethod(sendbyte);
}elseif(radioButtonSerialCon.Checked)//串口發(fā)送{
SerialSend(sendbyte);
}
}////////////privatevoidTcpSendDataMethod(byte[] byt)
{intcrc =0;byte[] sendbyte =newbyte[byt.Length +2];for(inti =0; i < byt.Length; i++)
{
sendbyte[i]=byt[i];
}
crc= crc16_modbus(byt, byt.Length);//計(jì)算CRCbyte[] Crcbyte = System.BitConverter.GetBytes(crc);//得到CRCsendbyte[sendbyte.Length-2] = Crcbyte[0];
sendbyte[sendbyte.Length-1] = Crcbyte[1];try{ networkstrem.Write(sendbyte,0, sendbyte.Length); }catch(Exception) { MessageBox.Show("請(qǐng)檢查連接","提示!"); }
}
還要說(shuō)一點(diǎn)讓8266計(jì)算CRC,發(fā)現(xiàn)8266存儲(chǔ)數(shù)據(jù)是大端模式......
好了現(xiàn)在測(cè)試一下用軟件的按鈕控制
好啦終于這完這一篇了....累..真心的累.............