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
3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(HTTP介绍,TCP实现HTTP下载文件)的更多相关文章
- 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(视频总揽)
1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(方案总揽) https://v.youku.com/v_show/id_XNDE0Njk3Njg2OA==. ...
- 1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(方案总揽)
我的这个升级篇的代码适用于自己所有的带WIFI和GPRS模块的开发板,升级功能实质上是通过MQTT把数据发给WIFI和GPRS模块,然后模块进行保存和运行. 这个升级程序是当时自己花了两个星期的时间写 ...
- 7-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(TCP实现HTTP访问下载文件,明白底层如何实现的,地基稳才踏实)
看了好多文章.....唉,还是自己亲自动手用网络监控软件测试吧 先看这个节安装WEB服务器.....安装好以后就可以用HTTP访问电脑文件了 6-STM32物联网开发WIFI(ESP8266)+GPR ...
- 6-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇-优化升级(安装Apache (Web服务器)软件,测试HTTP)
为了和SDK升级保持协议一致,花了两天时间实现了用LUA开发,MQTT+HTTP方式实现远程升级 安装Apache主要是为了实现通过HTTP下载资源 升级介绍: 0,用户点击检查更新时,APP首先通过 ...
- 5-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(,远程升级GPRS内部程序)
https://www.cnblogs.com/yangfengwu/p/10410202.html 与升级WIFI相同介绍的不再叙述 先看WIFI升级的: ↑ 演示视频: https://www. ...
- 4-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(远程升级WIFI内部程序)
https://www.cnblogs.com/yangfengwu/p/10360618.html 演示视频: https://www.bilibili.com/video/av54894356/ ...
- 4-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(为域名申请SSl证书)
3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(购买域名,域名绑定IP) 然后就是等着..... 假设可以了 咱呢是配置MQTT实现SSL安全加密通信,所以 ...
- 3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(购买域名,域名绑定IP)
2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(监听Wi-Fi和APP的数据) 因为安全连接是和域名绑在一块的,所以需要申请域名 有没有不知道域名是什么的, ...
- 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(监听Wi-Fi和APP的数据)
1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(来看一下怎么样监听网络数据,监听电脑上位机软件的数据) 因为那个软件只能监听咱自己电脑上的数据,所以咱就用电 ...
随机推荐
- Hive学习笔记(一)——概述
1.Hive是个什么玩意? Hive:由Facebook开源用于解决海量结构化日志的数据统计. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据(有规律的数据)文件映射为一张表,并提供 ...
- Hive学习笔记(二)—— 安装配置
Hive安装配置及基本操作 1. Hive安装及配置 (1). 上传文件到Hadoop102节点,解压到/opt/moudle (2). 修改/opt/module/hive/conf目录下的hive ...
- C# vb .net实现轮廓特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的轮廓特效呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...
- 关于.Net使用企业库访问MySql数据库
关于.Net使用企业库访问MySql数据库 在网上看了很多又重写又加WebConfig中的内容,其实不用那么麻烦 企业库5.0访问MySql数据库只需要在Web服务器安装mysql-connector ...
- 要想获取select的值,使用ng-modle,否则无法获取select 的值
ng-bind是从$scope -> view的单向绑定 ng-modle是$scope <-> view的双向绑定 <form role="form" c ...
- Web网站实现Google登录
一.打开谷歌控制台:https://console.developers.google.com/apis 二.点击创建凭据,如下图,填写项目地址等 三.创建好客户端ID和秘钥后,填写对应的项目网址和登 ...
- 如何统一管理单个任务下所有API的同步情况?
1. 一分钟完成单个API配置 单个API的配置包含:API名称.URL地址.请求方式.参数设置.自定义高级设置. 参数允许用户填写:Text.WebService.Timestamp.DependO ...
- 如何在SAP gateway系统配置路由到后台系统的OData服务路径
看这张架构图,SAP Gateway系统也叫frontend系统,通过RFC远程调用SAP后台系统的OData服务实现. 以SAP CRM Fiori应用My Opportunity为例,使用事务码/ ...
- JavaScript笔记02_对象
目录 1. 函数 1. 函数创建 2. 函数的参数 2. return.break.continue 3. 立即执行函数 4. 对象 5. 枚举对象中的属性 6. 声明提前 1.变量的声明提前 2. ...
- JavaScript 解决 url 中的中文乱码问题
页面传值过程中,通过 url 传值,发现中文会乱码. 以下是解决方法: 1.传的页面: encodeURI(url + "?userName=" + userName); //en ...