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

  1. GET /hardware/wifi1/updata1.lua HTTP/1.1
  2. Host: 47.92.31.46
  3.  

先看get的用法

GET,一个空格,访问文件的路径,一个空格,用哪个版本的HTTP协议

Host,冒号,一个空格,访问的地址

然后咱看看发送和具体接收的数据

  1. 3:26:18 发送数据:GET /hardware/wifi1/updata1.lua HTTP/1.1
  2. Host: 47.92.31.46
  3.  
  4. [1次]
  5. 3:26:18 收到数据:HTTP/1.1 200 OK
  6. Date: Mon, 29 Apr 2019 19:26:19 GMT
  7. Server: Apache/2.4.39 (Win64)
  8. Last-Modified: Sat, 20 Apr 2019 15:48:39 GMT
  9. ETag: "7ac-586f82b4b7b40"
  10. Accept-Ranges: bytes
  11. Content-Length: 1964
  12.  
  13. local model = "wifi1" --product model
  14.  
  15. --[[Do not update the following program !!!!]]
  16. local version1 = "0.0.0";
  17. local version2 = "1.0.0";
  18.  
  19. if file.open("version2.lua", "r") then--local
  20. version2 = file.read()
  21. file.close();
  22. end
  23. print("local version:"..version2)
  24.  
  25. local JsonTable = {};
  26.  
  27. function UpdataFun(client, topic, data,jsondata)
  28. if jsondata["version"] ~= nil and jsondata["url"] ~= nil then
  29. if jsondata["version"] ~= version2 then
  30. version1 = jsondata["version"]
  31.  
  32. JsonTable["data"] = "updata";
  33. JsonTable["status"] = "unlike";
  34. JsonTable["version"] = version2;
  35.  
  36. if file.open("url.lua", "w+") then
  37. file.write((jsondata["url"]))
  38. file.close()
  39. end
  40. print(jsondata["version"],jsondata["url"])
  41. else
  42. JsonTable["data"] = "updata";
  43. JsonTable["status"] = "alike";
  44. JsonTable["version"] = version2;
  45. end
  46. client:publish(PublishTopic,sjson.encode(JsonTable), 0, 0, function(client) end)
  47. JsonTable = {}
  48. elseif jsondata["cmd"] ~= nil and jsondata["cmd"] == "start" then
  49. if file.open("version1.lua", "w+") then
  50. file.write(version1)
  51. file.close()
  52. end
  53. JsonTable["data"] = "updata";
  54. JsonTable["status"] = "start";
  55. print(data)
  56. client:publish(PublishTopic,sjson.encode(JsonTable), 0, 0, function(client) node.restart(); end)
  57. JsonTable = {}
  58. elseif jsondata["cmd"] ~= nil and jsondata["cmd"] == "model" then
  59. JsonTable["data"] = "updata";
  60. JsonTable["status"] = "model";
  61. JsonTable["model"] = model;
  62. print(data)
  63. client:publish(PublishTopic,sjson.encode(JsonTable), 0, 0, function(client) end)
  64. JsonTable = {}
  65. end
  66. end

其实就这么简单就可以用HTTP访问下载文件了

其实我学习用TCP实现HTTP功能是为了想用HTTP下载大文件,最终是为了实现远程更新单片机程序,所以我为了让程序稳定可靠,我必须深入了解HTTP

先看用WIFI模块自带的HTTP API下载大文件

  1. http.get("http://47.92.31.46/hardware/wifi1/Progect.hex", nil, function(code, data)
  2. if (code < 0) then
  3. print("HTTP request failed")
  4. else
  5. print(code, data)
  6. end
  7. end)

直接报错说数据量太大

然而我用TCP调试助手发指令下载的时候发现了个问题

第一   下载下来了

第二    我监听了一下网络数据,发现

其实Apache服务器默认就会把大文件分段传输过来

然后我就做了个WIFI用TCP实现HTTP,然后下载

  1. wifi.setmode(wifi.STATIONAP)
  2. apcfg={}
  3. apcfg.ssid="qqqqq"
  4. apcfg.pwd="11223344"
  5. wifi.sta.config(apcfg)
  6. wifi.sta.autoconnect(1)
  7.  
  8. ClientConnectedFlage = 0
  9. TcpConnect = nil
  10. tmr.alarm(1, 10000, 1, function()
  11.  
  12. if ClientConnectedFlage == 0 then
  13. Client = net.createConnection(net.TCP, 0)
  14. Client:connect(80,"47.92.31.46")
  15.  
  16. Client:on("receive", function(Client, data)
  17. uart.write(0,data)
  18. end)
  19.  
  20. Client:on("connection", function(sck, c)
  21. ClientConnectedFlage = 1
  22. TcpConnect = Client
  23. print("Link OK")
  24. tmr.stop(1)
  25.  
  26. Client:on("disconnection", function(sck, c)
  27. ClientConnectedFlage = 0
  28. TcpConnect = nil
  29. tmr.start(1)
  30. end)
  31.  
  32. TcpConnect:send("GET /hardware/wifi1/Progect.hex HTTP/1.1\r\nConnection: keep-alive\r\nHost: 47.92.31.46\r\n\r\n")
  33.  
  34. end)
  35.  
  36. if ClientConnectedFlage == 0 then
  37. print("Link Error")
  38. end
  39. end
  40. end)
  41.  
  42. uart.on("data",0,function(data)
  43.  
  44. end, 1)
  45.  
  46. printip = 0
  47. wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
  48. printip = 0
  49. end)
  50.  
  51. wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
  52. if printip == 0 then
  53. print("+IP"..T.IP)
  54. end
  55. printip = 1
  56. 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下载文件)的更多相关文章

  1. 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(视频总揽)

    1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(方案总揽) https://v.youku.com/v_show/id_XNDE0Njk3Njg2OA==. ...

  2. 1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(方案总揽)

    我的这个升级篇的代码适用于自己所有的带WIFI和GPRS模块的开发板,升级功能实质上是通过MQTT把数据发给WIFI和GPRS模块,然后模块进行保存和运行. 这个升级程序是当时自己花了两个星期的时间写 ...

  3. 7-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(TCP实现HTTP访问下载文件,明白底层如何实现的,地基稳才踏实)

    看了好多文章.....唉,还是自己亲自动手用网络监控软件测试吧 先看这个节安装WEB服务器.....安装好以后就可以用HTTP访问电脑文件了 6-STM32物联网开发WIFI(ESP8266)+GPR ...

  4. 6-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇-优化升级(安装Apache (Web服务器)软件,测试HTTP)

    为了和SDK升级保持协议一致,花了两天时间实现了用LUA开发,MQTT+HTTP方式实现远程升级 安装Apache主要是为了实现通过HTTP下载资源 升级介绍: 0,用户点击检查更新时,APP首先通过 ...

  5. 5-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(,远程升级GPRS内部程序)

    https://www.cnblogs.com/yangfengwu/p/10410202.html 与升级WIFI相同介绍的不再叙述  先看WIFI升级的: ↑ 演示视频: https://www. ...

  6. 4-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(远程升级WIFI内部程序)

    https://www.cnblogs.com/yangfengwu/p/10360618.html 演示视频: https://www.bilibili.com/video/av54894356/ ...

  7. 4-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(为域名申请SSl证书)

    3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(购买域名,域名绑定IP) 然后就是等着..... 假设可以了 咱呢是配置MQTT实现SSL安全加密通信,所以 ...

  8. 3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(购买域名,域名绑定IP)

    2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(监听Wi-Fi和APP的数据) 因为安全连接是和域名绑在一块的,所以需要申请域名 有没有不知道域名是什么的, ...

  9. 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(监听Wi-Fi和APP的数据)

    1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(来看一下怎么样监听网络数据,监听电脑上位机软件的数据) 因为那个软件只能监听咱自己电脑上的数据,所以咱就用电 ...

随机推荐

  1. 多个数据源Mongo连接

    MongoDB :https://my.oschina.net/u/3452433/blog/2999501多个数据源Mongo连接:https://juejin.im/post/5cf73090f2 ...

  2. WPF 很少人知道的科技

    原文:WPF 很少人知道的科技 本文介绍不那么常见的 WPF 相关的知识. 本文内容 在 C# 代码中创建 DataTemplate 多个数据源合并为一个列表显示 使用附加属性做缓存,避免内存泄漏 使 ...

  3. 30个关于Shell脚本的经典案例(中)

    本文目录 11.iptables自动屏蔽访问网站频繁的IP 12.判断用户输入的是否为IP地址 13.判断用户输入的是否为数字 14.给定目录找出包含关键字的文件 15.监控目录,将新创建的文件名追加 ...

  4. SpringMVC+SpringBoot+MyBatis

    一.在框架中有时候会发现dao层和service层是相同的代码,为什么会同时存在呢?(以下https://blog.csdn.net/fanjieshanghai/article/details/88 ...

  5. nepenthes用法

    安装 # apt-get install nepenthes 配置文件 # vi submit-file.conf submit-file { path "/var/lib/nepenthe ...

  6. POSIX多线程

    全文共分四部分: POSIX多线程—概述    POSIX多线程—异步编程举例    POSIX多线程—线程基本概念    POSIX多线程—互斥量概述 POSIX多线程—概述 Content 1. ...

  7. 个人项目(java实现)

    一.github地址:https://github.com/Moyjing/Moy 二.psp表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实 ...

  8. Java文件流下载并提示文件不存在

    做文件下载功能的时候,一般使用流的形式下载文件, 如果源文件不存在,下载页面可能就会没有提示,或者一片空白 用户操作之后可能一头雾水,那如何友好提示呢? 想到的有两种 1.可以尝试下载一个名称为:文件 ...

  9. sql server快捷键添加

    工具--选项--键盘 sp_table_column_info p_helpindex sp_sql

  10. CI框架扩展系统类库

    CI框架不支持像yii2框架那样,可以直接在controllers下创建CommonController并继承父类,那么我们想要做登录控制或权限控制时,直接在父类控制器操作是不合理的. 这时比较方便的 ...