OpenEdv-开源电子网

标题: stm32 lwip 如何访问网页下载文件 [打印本页]

作者: fangchenyi    时间: 2016-2-1 10:29
标题: stm32 lwip 如何访问网页下载文件
请教大神,现在用stm32f107实现了tcp客户端,并可以与服务器实时通信,但是现在有一个访问网页下载升级文件的需求,想问下是用http 客服端来实现吗???有没有已经实现的方案?还请赐教。

作者: 象牙塔    时间: 2016-2-1 10:29
用HFS建立一个本地服务器,
POST /net_device/auth.htm HTTP/1.1
Host: apipublic.ihealthlabs.eu
User_Agent: NetDevice-HS6
Content-Type: application/x-www-form-urlencoded
Connection: close
Content-Length:486

研究研究这些
作者: 正点原子    时间: 2016-2-1 11:21
没搞过,帮顶
作者: fangchenyi    时间: 2016-2-1 12:52
正点原子 发表于 2016-2-1 11:21
没搞过,帮顶

谢过原子哥
作者: zc123    时间: 2016-2-1 13:09
http://www.cnblogs.com/zc110747/p/4668245.html
之前做的服务器在线升级的,你可以参考下
作者: fangchenyi    时间: 2016-2-1 13:43
zc123 发表于 2016-2-1 13:09
http://www.cnblogs.com/zc110747/p/4668245.html
之前做的服务器在线升级的,你可以参考下

前辈这个是以stm32作为http server来实现的吧,我想知道stm32作为tcpclient能否实现下载升级文件??还请不吝赐教。
作者: fangchenyi    时间: 2016-2-1 15:30
yklstudent 发表于 2016-2-1 14:10
客户端连接服务器端下载文件到本地(TF卡、U盘等),然后校验文件是否完整,然后就IAP升级;
关键这个需要服 ...

需要服务器如何配合呢,如果是文件一段一段的传输,那是没有问题的,我想知道的是stm32作为客户端直接去下载服务端的文件,比如给定一个网址,浏览器直接访问的话会直接下载,然而stm32 如何去访问这个网址之后下载这个文件??
作者: fangchenyi    时间: 2016-2-3 09:23
顶一下
作者: 象牙塔    时间: 2016-2-3 09:55
fangchenyi 发表于 2016-2-1 15:30
需要服务器如何配合呢,如果是文件一段一段的传输,那是没有问题的,我想知道的是stm32作为客户端直接去 ...

断点续传,用http 请求去做,
作者: fangchenyi    时间: 2016-2-3 13:44
象牙塔 发表于 2016-2-3 09:55
断点续传,用http 请求去做,

大神能否指导一下如何发送http请求,我用网络调试助手连接百度发送get请求,什么都收不到。。。
作者: fangchenyi    时间: 2016-2-3 15:22
象牙塔 发表于 2016-2-3 14:01
用HFS建立一个本地服务器,
POST /net_device/auth.htm HTTP/1.1
Host: apipublic.ihealthlabs.eu

好的= =感谢!
作者: fangchenyi    时间: 2016-2-5 08:23
象牙塔 发表于 2016-2-1 10:29
用HFS建立一个本地服务器,
POST /net_device/auth.htm HTTP/1.1
Host: apipublic.ihealthlabs.eu

请求到服务器的文件了,关于断点续传大神有何指示么?
作者: 象牙塔    时间: 2016-2-16 08:37
post属性里设置一下需要下载的字节比如0-1024,不要太大,
作者: jermy_z    时间: 2016-2-16 08:41
象牙塔 发表于 2016-2-16 08:37
post属性里设置一下需要下载的字节比如0-1024,不要太大,

牛人啊,mark下,以后也许用得到
作者: pjzmj2012    时间: 2020-9-3 09:40
象牙塔 发表于 2016-2-1 10:29
用HFS建立一个本地服务器,
POST /net_device/auth.htm HTTP/1.1
Host: apipublic.ihealthlabs.eu

有代码吗?高人
作者: pjzmj2012    时间: 2020-9-3 14:53
fangchenyi 发表于 2016-2-5 08:23
请求到服务器的文件了,关于断点续传大神有何指示么?

你是怎么请求到的。能指点一下吗
作者: pjzmj2012    时间: 2020-9-3 16:42
本帖最后由 pjzmj2012 于 2020-9-3 17:17 编辑
象牙塔 发表于 2016-2-16 08:37
post属性里设置一下需要下载的字节比如0-1024,不要太大,

请问get、post怎么设置下载字节啊是Content-Length:486吗?我设置了怎么不起作用
试了Range:bytes=0-499也不对

作者: 象牙塔    时间: 2020-9-3 20:10
pjzmj2012 发表于 2020-9-3 16:42
请问get、post怎么设置下载字节啊是Content-Length:486吗?我设置了怎么不起作用
试了Range:bytes=0-499 ...

#define SEND_DATA "POST /virtualserver/STM32F107LwIPUart.bin HTTP/1.1\r\nHost:192.168.95.95:80\r\nUser-Agent: MyBrowser\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 0\r\nRange: bytes=0-2047\r\nConnection: KeepAlive\r\n\r\n"
#define GET_INFORMATION "POST /virtualserver/Information.bin HTTP/1.1\r\nHost:192.168.95.95:80\r\nUser-Agent: MyBrowser\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: KeepAlive\r\n\r\n"
#define SEND_DATA_TAIL "\r\nConnection: KeepAlive\r\n\r\n"//

// #define SSL_SERVER_NAME "EuGateWay.iHealthLabs.com"
//  #define SSL_SERVER_NAME "api.ihealthlabs.com" /* Server address */
#ifdef USE_DNS
        #define SSL_SERVER_NAME "EuGateWay.iHealthLabs.com"
//         #define SSL_SERVER_NAME "www.baidu.com"
// // #define SSL_SERVER_NAME "192.168.95.95"
#else
        #define SSL_SERVER_NAME "192.168.95.95"
#endif

#define TCP_TASK_PRIO   ( tskIDLE_PRIORITY + 4 )  

/**********************************************/

        struct SendCmd Cmdstruct;
        char SEND_DATA_HEAD[250] = "POST /virtualserver/STM32F107LwIPUart.bin HTTP/1.1\r\nHost:192.168.95.95:80\r\nUser-Agent: MyBrowser\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 0\r\nRange: bytes=";
        char SEND_DATA_NUM[50] = {0};
作者: 象牙塔    时间: 2020-9-3 20:11
#define SEND_DATA "POST /virtualserver/STM32F107LwIPUart.bin HTTP/1.1\r\nHost:192.168.95.95:80\r\nUser-Agent: MyBrowser\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 0\r\nRange: bytes=0-2047\r\nConnection: KeepAlive\r\n\r\n"
作者: 象牙塔    时间: 2020-9-3 20:12
象牙塔 发表于 2020-9-3 20:11
#define SEND_DATA "POST /virtualserver/STM32F107LwIPUart.bin HTTP/1.1\r\nHost:192.168.95.95:80\r\nUs ...

逻辑自己设计,这是请求的命令
作者: 象牙塔    时间: 2020-9-3 20:12
象牙塔 发表于 2020-9-3 20:12
逻辑自己设计,这是请求的命令

0-2047数据。。。。。
作者: 象牙塔    时间: 2020-9-3 20:13
两个重要函数直接调用
  1. int BIN_currentlen_left ( char * recv_data )
  2. {
  3.         int  len ;
  4.         char data_buf[60];/*缓存*/
  5.         char cache_buf[20];/*缓存*/
  6.         /*1、在接收到服务器的数据后,查找"Content-Range: bytes"字段,并返回数据地址*/
  7.         /*2、在接收到服务器的数据后,查找"\r\n"字段,并返回数据地址*/
  8.         /*3、获取长度*/
  9.         len = strstr(strstr(recv_data,"Content-Range: bytes"),"\r\n") - strstr(recv_data,"Content-Range: bytes");
  10.         /*4、减去 "Content-Range: bytes"字段的长度,即为我们需要获取字段的长度 */
  11.         /*5、对字段分割,一般获取数据格式为0-2048/6540*/
  12.         /*6、用strstr函数,获得”/6540“字段,之后地址加一,字符转换即可*/
  13.         strncpy(data_buf, strstr(recv_data,"Content-Range: bytes")+strlen("Content-Range: bytes"),len-strlen("Content-Range: bytes"));
  14.         /*7、0-2048/6540 其中0 = 拷贝 0-2048/6540,长度为len 减去-2048/6540字段*/
  15.         strncpy(cache_buf, data_buf,len-strlen(strstr(data_buf,"-")));         
  16.         return          atoi(cache_buf);  
  17. }
  18. int BIN_currentlen_right ( char * recv_data )
  19. {
  20.         int  len ;
  21.         char data_buf[60];/*缓存*/
  22.         char cache_buf[20];/*缓存*/
  23.         /*1、在接收到服务器的数据后,查找"Content-Range: bytes"字段,并返回数据地址*/
  24.         /*2、在接收到服务器的数据后,查找"\r\n"字段,并返回数据地址*/
  25.         /*3、获取长度*/
  26.         len = strstr(strstr(recv_data,"Content-Range: bytes"),"\r\n") - strstr(recv_data,"Content-Range: bytes");
  27.         /*4、减去 "Content-Range: bytes"字段的长度,即为我们需要获取字段的长度 */
  28.         /*5、对字段分割,一般获取数据格式为0-2048/6540*/
  29.         /*6、用strstr函数,获得”/6540“字段,之后地址加一,字符转换即可*/
  30.         strncpy(data_buf, strstr(recv_data,"Content-Range: bytes")+strlen("Content-Range: bytes"),len-strlen("Content-Range: bytes"));
  31.         /*7、0-2048/6540 其中0 = 拷贝 0-2048/6540,长度为len 减去-2048/6540字段*/
  32.         strncpy(cache_buf, strstr(data_buf,"-")+1,strlen(strstr(data_buf,"-")) - strlen(strstr(data_buf,"/")));         
  33.         return          atoi(cache_buf);  
  34. }
复制代码


作者: pjzmj2012    时间: 2020-9-4 08:42
本帖最后由 pjzmj2012 于 2020-9-4 15:47 编辑
象牙塔 发表于 2020-9-3 20:11
#define SEND_DATA "POST /virtualserver/STM32F107LwIPUart.bin HTTP/1.1\r\nHost:192.168.95.95:80\r\nUs ...

不知道这张图片怎么编辑不掉。

作者: 象牙塔    时间: 2020-9-4 20:26
pjzmj2012 发表于 2020-9-4 08:42
不知道这张图片怎么编辑不掉。

你这个图不已经下载下来了么
作者: 象牙塔    时间: 2020-9-4 20:27
pjzmj2012 发表于 2020-9-4 08:42
不知道这张图片怎么编辑不掉。

hex显示就是2048个字节数据,可比较下
作者: pjzmj2012    时间: 2020-9-5 11:18
本帖最后由 pjzmj2012 于 2020-9-5 17:14 编辑
象牙塔 发表于 2020-9-4 20:27
hex显示就是2048个字节数据,可比较下

请问校验怎么做呢,hfs有校验功能吗?现在发现烧录的数据有些地方不对每次出错的地方还不一样。

发现用jflash去读stm32的flash,每次读出来的文件都不一样,晕菜了,这是怎么回事,难道硬件有问题吗?

作者: 象牙塔    时间: 2020-9-6 09:30
pjzmj2012 发表于 2020-9-5 11:18
请问校验怎么做呢,hfs有校验功能吗?现在发现烧录的数据有些地方不对每次出错的地方还不一样。

发现 ...

HFS这个是测试的,你要是改校验的话,自己写服务器吧,还有http下载成功,基本不会错,如果你烧写失败,检验错误,应该是别的地方出错了,
或者你可以在bin文件最后四个字节加校验码,读取最后四字节判断
作者: pjzmj2012    时间: 2020-9-6 17:23
象牙塔 发表于 2020-9-6 09:30
HFS这个是测试的,你要是改校验的话,自己写服务器吧,还有http下载成功,基本不会错,如果你烧写失败, ...

感谢你的热心回复。




欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/) Powered by Discuz! X3.4