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.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来实现,主要还是很简单,而且还能预防再次出现内存问题....

https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.3e3b1deb80xzYz&id=569295486025

 

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

 

转载于:https://www.cnblogs.com/yangfengwu/p/10360618.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧农业是目前物联网技术应用的一个非常典型的领域,例如利用STM32F103ZE单片机作为智能物联网控制节点,以及通过ESP8266实现WiFi通信模块,这些都是农业物联网的应用案例之一。同时,借助云计算技术和物联网平台能够让农业从传统的农业向数字化的农业转型,让农业更加高效和智能。 STM32F103ZE是一款高性能、低功耗的单片机芯片,具备强大的计算、控制和通信能力。它可以实现图片处理、获取传感器数据、数据存储等各种功能,同时还可以支持WiFi、蓝牙、红外、ZigBee等不同通信方式。这使得STM32F103ZE非常适合作为智能物联网控制节点。 另外,ESP8266是一款WiFi通信模块,可以轻松实现STM32F103ZE与物联网平台的网络连接。应用ESP8266通信模块,使得节点与云平台之间的数据传递更加高效、灵活,且实现一系列远程监控、控制等功能。 物联网平台则是整个物联网系统的核心,它以数据处理、存储、分析、展示等核心功能,实现物联网系统的统一管理。腾讯云物联网平台是一款业界领先的物联网平台软件,它可以快速的实现系统的构建,包括节点与云平台的连接管理、数据获取、数据存储、数据转发等功能。 以上三种技术的应用,使得智慧农业系统可以实现对温度、湿度等参数的无线采集,通过数据传输技术将这些数据传送至物联网平台,从而实现对农场的实时监测、远程控制等一系列智能化措施。这不仅可以提高农业的生产效率和经济效益,还可以严格控制农业生态环境的质量,促进农业与科技的深度融合和升级

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值