3-STM32物聯網開發WIFI(ESP8266)+GPRS(Air202)系統方案升級篇(HTTP介紹,TCP實現HTTP下載文件)

http://www.javashuo.com/article/p-xqfrhsml-gm.html

 

看了好多文章.....唉,仍是本身親自動手用網絡監控軟件測試吧html

 

先看這個節安裝WEB服務器.....安裝好之後就能夠用HTTP訪問電腦文件了node

 

事先不知道HTTP,最後先看這個  http://www.javashuo.com/article/p-xqfrhsml-gm.html

 

其實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來實現,主要仍是很簡單,並且還能預防再次出現內存問題....

 

http://www.javashuo.com/article/p-gxtmsfjy-de.html

相關文章
相關標籤/搜索