3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(HTTP介绍,TCP实现HTTP下载文件)

https://www.cnblogs.com/yangfengwu/p/10357564.html


看了好多文章.....唉,还是自己亲自动手用网络监控软件测试吧


先看这个节安装WEB服务器.....安装好以后就可以用HTTP访问电脑文件了


事先不知道HTTP,最后先看这个https://www.cnblogs.com/yangfengwu/p/10357564.html


其实HTTP就是建立在TCP通信上,然后自己又封装了一套协议罢了,不过协议也不算多,协议内容都是用字符串发送的,也好理解


感觉要比我以前自己用TCP实现MQTT协议简单多了,MQTT规定的协议就是复杂点,全部用16进制组合......麻烦死了...


https://www.cnblogs.com/yangfengwu/p/9124299.html


大家学了这个文章,只要自己的模块支持TCP,那么就可以实现用HTTP访问下载文件,


废话少说,我就下载我自己云端的这个文件















https://blog.csdn.net/runner_diego/article/details/51379116(这个是我在网上找的介绍http协议的)




 启动个TCP客户端


连接的ip地址选择自己的哈  我测试用的是  47.92.31.46    端口号80     




GET /hardware/wifi1/updata1.lua HTTP/1.1Host: 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来实现,主要还是很简单,而且还能预防再次出现内存问题....


https://www.cnblogs.com/yangfengwu/p/10410202.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,302评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,563评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,433评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,628评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,467评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,354评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,777评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,419评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,725评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,768评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,543评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,387评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,794评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,032评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,305评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,741评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,946评论 2 336

推荐阅读更多精彩内容