https://www.cnblogs.com/yangfengwu/p/10357564.html
看了好多文章.....唉,還是自己親自動手用網(wǎng)絡(luò)監(jiān)控軟件測試吧
先看這個節(jié)安裝WEB服務(wù)器.....安裝好以后就可以用HTTP訪問電腦文件了
事先不知道HTTP,最后先看這個https://www.cnblogs.com/yangfengwu/p/10357564.html
其實HTTP就是建立在TCP通信上,然后自己又封裝了一套協(xié)議罷了,不過協(xié)議也不算多,協(xié)議內(nèi)容都是用字符串發(fā)送的,也好理解
感覺要比我以前自己用TCP實現(xiàn)MQTT協(xié)議簡單多了,MQTT規(guī)定的協(xié)議就是復(fù)雜點,全部用16進制組合......麻煩死了...
https://www.cnblogs.com/yangfengwu/p/9124299.html
大家學(xué)了這個文章,只要自己的模塊支持TCP,那么就可以實現(xiàn)用HTTP訪問下載文件,
廢話少說,我就下載我自己云端的這個文件
https://blog.csdn.net/runner_diego/article/details/51379116(這個是我在網(wǎng)上找的介紹http協(xié)議的)
?啟動個TCP客戶端
連接的ip地址選擇自己的哈? 我測試用的是??47.92.31.46? ? 端口號80? ? ?
GET /hardware/wifi1/updata1.lua HTTP/1.1Host: 47.92.31.46
?先看get的用法
GET,一個空格,訪問文件的路徑,一個空格,用哪個版本的HTTP協(xié)議
Host,冒號,一個空格,訪問的地址
然后咱看看發(fā)送和具體接收的數(shù)據(jù)
3:26:18 發(fā)送數(shù)據(jù):GET /hardware/wifi1/updata1.lua HTTP/1.1
Host: 47.92.31.46
[1次]
3:26:18 收到數(shù)據(jù):HTTP/1.1 200 OK
Date: Mon, 29 Apr 2019 19:26:19 GMT
Server: Apache/2.4.39 (Win64)
Last-Modified: Sat, 20 Apr 2019 15:48:39 GMT
ETag: "7ac-586f82b4b7b40"
Accept-Ranges: bytes
Content-Length: 1964
local model = "wifi1"? --product model
--[[Do not update the following program !!!!]]
local version1 = "0.0.0";
local version2 = "1.0.0";
if? file.open("version2.lua", "r") then--local
? ? version2 = file.read()
? ? file.close();
end
print("local version:"..version2)
local JsonTable = {};
function UpdataFun(client, topic, data,jsondata)
? ? if? jsondata["version"] ~= nil and jsondata["url"] ~= nil? then
? ? ? ? if? jsondata["version"] ~= version2? then
? ? ? ? ? ? version1 = jsondata["version"]
? ? ? ? ? ? JsonTable["data"] = "updata";
? ? ? ? ? ? JsonTable["status"] = "unlike";
? ? ? ? ? ? JsonTable["version"] = version2;
? ? ? ? ? ? if? file.open("url.lua", "w+") then
? ? ? ? ? ? ? ? file.write((jsondata["url"]))
? ? ? ? ? ? ? ? file.close()
? ? ? ? ? ? end
? ? ? ? ? ? print(jsondata["version"],jsondata["url"])
? ? ? ? else
? ? ? ? ? ? JsonTable["data"] = "updata";
? ? ? ? ? ? JsonTable["status"] = "alike";
? ? ? ? ? ? JsonTable["version"] = version2;? ?
? ? ? ? end
? ? ? ? client:publish(PublishTopic,sjson.encode(JsonTable), 0, 0, function(client) end)?
? ? ? ? JsonTable = {}?
? ? elseif? jsondata["cmd"] ~= nil and jsondata["cmd"] == "start" then
? ? ? ? ? ? if? file.open("version1.lua", "w+") then
? ? ? ? ? ? ? ? file.write(version1)
? ? ? ? ? ? ? ? file.close()
? ? ? ? ? ? end
? ? ? ? ? ? JsonTable["data"] = "updata";
? ? ? ? ? ? JsonTable["status"] = "start";
? ? ? ? ? ? print(data)
? ? ? ? ? ? client:publish(PublishTopic,sjson.encode(JsonTable), 0, 0, function(client) node.restart(); end)?
? ? ? ? ? ? JsonTable = {}
? ? elseif? jsondata["cmd"] ~= nil and jsondata["cmd"] == "model" then? ? ? ? ? ? ? ? ?
? ? ? ? ? ? JsonTable["data"] = "updata";
? ? ? ? ? ? JsonTable["status"] = "model";
? ? ? ? ? ? JsonTable["model"] = model;
? ? ? ? ? ? print(data)
? ? ? ? ? ? client:publish(PublishTopic,sjson.encode(JsonTable), 0, 0, function(client) end)?
? ? ? ? ? ? JsonTable = {}? ? ? ?
? ? end
end
其實就這么簡單就可以用HTTP訪問下載文件了
其實我學(xué)習(xí)用TCP實現(xiàn)HTTP功能是為了想用HTTP下載大文件,最終是為了實現(xiàn)遠程更新單片機程序,所以我為了讓程序穩(wěn)定可靠,我必須深入了解HTTP
先看用WIFI模塊自帶的HTTP API下載大文件
http.get("http://47.92.31.46/hardware/wifi1/Progect.hex", nil, function(code, data)
? ? if (code < 0) then
? ? ? print("HTTP request failed")
? ? else
? ? ? print(code, data)
? ? end
end)
?直接報錯說數(shù)據(jù)量太大
然而我用TCP調(diào)試助手發(fā)指令下載的時候發(fā)現(xiàn)了個問題
?第一 ? 下載下來了
第二 ? ?我監(jiān)聽了一下網(wǎng)絡(luò)數(shù)據(jù),發(fā)現(xiàn)
?其實Apache服務(wù)器默認(rèn)就會把大文件分段傳輸過來
然后我就做了個WIFI用TCP實現(xiàn)HTTP,然后下載
wifi.setmode(wifi.STATIONAP)
apcfg={}
apcfg.ssid="qqqqq"
apcfg.pwd="11223344"
wifi.sta.config(apcfg)
wifi.sta.autoconnect(1)
ClientConnectedFlage = 0
TcpConnect = nil
tmr.alarm(1, 10000, 1, function()
? ? if? ClientConnectedFlage == 0 then
? ? ? ? Client = net.createConnection(net.TCP, 0)
? ? ? ? Client:connect(80,"47.92.31.46")
? ? ? ? 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)
? ? ? ? ? ? TcpConnect:send("GET /hardware/wifi1/Progect.hex HTTP/1.1\r\nConnection: keep-alive\r\nHost: 47.92.31.46\r\n\r\n")
? ? ? ? end)
? ? ? ? if? ClientConnectedFlage == 0 then
? ? ? ? ? ? print("Link Error")
? ? ? ? end
? ? end
end)
uart.on("data",0,function(data)
end, 1)
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模塊里面寫的HTTP是把所有分段過來的數(shù)據(jù)全部接收到一個數(shù)組里面再調(diào)用回調(diào)....然而就會造成內(nèi)存不足
用TCP實現(xiàn)HTTP的時候是接收一段打印出來一段,并不是把所有的數(shù)據(jù)全部放到一個數(shù)組里面,然后打印.....
經(jīng)過這一次,我感覺我以后用HTTP的時候還是直接用TCP來實現(xiàn),主要還是很簡單,而且還能預(yù)防再次出現(xiàn)內(nèi)存問題....