看了好多文章.....唉,仍是本身親自動手用網絡監控軟件測試吧html
先看這個節安裝WEB服務器.....安裝好之後就能夠用HTTP訪問電腦文件了node
其實HTTP就是創建在TCP通訊上,而後本身又封裝了一套協議罷了,不過協議也不算多,協議內容都是用字符串發送的,也好理解json
感受要比我之前本身用TCP實現MQTT協議簡單多了,MQTT規定的協議就是複雜點,所有用16進制組合......麻煩死了...數組
http://www.javashuo.com/article/p-wvodheue-ho.html服務器
你們學了這個文章,只要本身的模塊支持TCP,那麼就能夠實現用HTTP訪問下載文件,網絡
廢話少說,我就下載我本身雲端的這個文件學習
https://blog.csdn.net/runner_diego/article/details/51379116 (這個是我在網上找的介紹http協議的)測試
啓動個TCP客戶端lua
鏈接的ip地址選擇本身的哈 我測試用的是 47.92.31.46 端口號80 url
GET /hardware/wifi1/updata1.lua HTTP/1.1 Host: 47.92.31.46
先看get的用法
GET,一個空格,訪問文件的路徑,一個空格,用哪一個版本的HTTP協議
Host,冒號,一個空格,訪問的地址
而後咱看看發送和具體接收的數據
3:26:18 發送數據:GET /hardware/wifi1/updata1.lua HTTP/1.1 Host: 47.92.31.46 [1次] 3:26:18 收到數據: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訪問下載文件了
其實我學習用TCP實現HTTP功能是爲了想用HTTP下載大文件,最終是爲了實現遠程更新單片機程序,因此我爲了讓程序穩定可靠,我必須深刻了解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)
直接報錯說數據量太大
然而我用TCP調試助手發指令下載的時候發現了個問題
第一 下載下來了
第二 我監聽了一下網絡數據,發現
其實Apache服務器默認就會把大文件分段傳輸過來
而後我就作了個WIFI用TCP實現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是把全部分段過來的數據所有接收到一個數組裏面再調用回調....然而就會形成內存不足
用TCP實現HTTP的時候是接收一段打印出來一段,並非把全部的數據所有放到一個數組裏面,而後打印.....
通過這一次,我感受我之後用HTTP的時候仍是直接用TCP來實現,主要仍是很簡單,並且還能預防再次出現內存問題....