完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
下面是之前出现的问题 最近在做 F107 的 IAP 程序,参考的官方“STM32F107 通过以太网实现在应用中编程 (IAP)”AN3226 应用笔记,程序也是官方的。 TFTP 升级没有问题,但是 HTTP 在使用时发现了问题: 用 Mozilla Firefox 下载程序时,可以正常下载(下载文件170KB左右)。 用 Google Chrome 下载程序时,出现 TCP ZeroWindow 等警告,导致下载程序不成功。 用 Wireshark 抓包,左边为 Mozilla Firefox 抓包,右边为 Google Chrome 抓包 官方文档只提到了“注: 请注意,该软件已用下列 web 客户端测试:MSIE6, MSIE8 和 Mozilla Firefox 3.6。” 本人不太懂浏览器的差异,只发现了 Firefox 和 Chrome 发送的第一个包有差异 Firefox 发送的第一个包有 1460 bytes: POST /upload.cgi HTTP/1.1 Host: 192.168.6.80 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: http://192.168.6.80/checklogin.cgi Content-Type: multipart/form-data; boundary=---------------------------120212674612530 Content-Length: 175008 Connection: keep-alive Upgrade-Insecure-Requests: 1 -----------------------------120212674612530 Content-Disposition: form-data; name="datafile"; filename="XXXX_XXXXX-XXXX_V1.0.1D1.img" Content-Type: application/octet-stream `hE0HF|P e$9}`GIEQJ}RUJ!qHGP HGHGIQrpGpG L M%`O LO%pLOU%`b0LOU%`0pG0LOU%`0pGr ( 8I h`HG]HI xp HI h`h 0 NbpG ^ d 5S T l @ *;;RpG+IpG"F FFF FFx;IR FB)pG"R Chrome 发送的第一个包有 593 bytes,第二个包才有 1460 bytes: POST /upload.cgi HTTP/1.1 Host: 192.168.6.80 Connection: keep-alive Content-Length: 175000 Cache-Control: max-age=0 Origin: http://192.168.6.80 Upgrade-Insecure-Requests: 1 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryqus0XTxRI7M3Lx3S User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Referer: http://192.168.6.80/checklogin.cgi Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 /* 上面是第一个包,下面是第二个包 */ ------WebKitFormBoundaryD9iR35Ndh4OOGeNI Content-Disposition: form-data; name="datafile"; filename="XXXX_XXXXX-XXXX_V1.0.1D1.img" Content-Type: application/octet-stream `hE0HF|P e$9}`GIEQJ}RUJ!qHGP HGHGIQrpGpG L M%`O LO%pLOU%`b0LOU%`0pG0LOU%`0pGr ( 8I h`HG]HI xp HI h`h 0 NbpG ^ d 5S T l @ *;;RpG+IpG"F FFF FFx;IR FB)pG"R\B+@0F F[B\@0F++*FpG0F F[B\ ,0BAFFFJB R -5ARB *AD_#-P OBR<@pPp@pI IAqP@PaB"ApGA@C@"JaVV@B 9@P@@I@@* ) C0E0B!@ A@}4BdI,0 pGO#BC@OAQBOAOoP(D0-OFF!A#EA@F!FF 后来在查找原因时,发现火狐浏览器升级也不成功!!! 分析抓到的包发现原来是浏览器正准备发数据时,设备回复了一个断开连接的 FIN 包!Google Chrome 也是同样的问题! 查到原因是:浏览器发了一个“GET /favicon.ico”的请求,这个请求是加载网页左上角的小图标的,这样就对“GET /”请求的程序产生影响,程序判断为接收异常从而断开连接。这个可以具体去看代码,不再详细指出。 enum htmlpage { LoginPage, FileUploadPage, UploadDonePage, ResetDonePage, } htmlpage; 上面这个枚举类型表明了页面加载顺序 主要是收到“GET /favicon.ico”的请求会打乱加载从而导致断开连接 /* process HTTP GET requests*/ if (strncmp(data, "GET /", 5) == 0) { if ((strncmp(data, "GET /resetmcu.cgi", 17) ==0)&&(htmlpage == UploadDonePage)) { htmlpage = ResetDonePage; fs_open("/reset.html", &file); hs->file = file.data; hs->left = file.len; pbuf_free(p); /* send reset.html page */ send_data(PCB, hs); resetpage = 1; /* Tell TCP that we wish be to informed of data that has been successfully sent by a call to the http_sent() function. */ tcp_sent(pcb, http_sent); } else { /*send the login page (which is the index page) */ htmlpage = LoginPage; fs_open("/index.html", &file); hs->file = file.data; hs->left = file.len; pbuf_free(p); /* send index.html page */ send_data(pcb, hs); /* Tell TCP that we wish be to informed of data that has been successfully sent by a call to the http_sent() function. */ tcp_sent(pcb, http_sent); } } else { pbuf_free(p); close_conn(pcb, hs); // 罪魁祸首在这里!!! } 程序要加上判断“GET /favicon.ico”请求的处理。具体怎么处理我就不拿出来献丑了。。。 结果测试,支持的浏览器:IE10+/Firefox/Chrome/Opera |
|
相关推荐
9个回答
|
|
有小伙伴在其他的浏览器上做过测试吗?
|
|
|
|
在IE10+和火狐测试没问题,在谷歌和 Opera 上不行...
|
|
|
|
都没人回复,失望。。。
还是自己顶吧: 修改了官方例程一个地方 /* process POST request for file upload and incoming data packets after POST request*/ else if (((strncmp(data, "POST /upload.cgi",16)==0)||(DataFlag >=1))&&(htmlpage == FileUploadPage)) { DataOffset =0; /* POST Packet received */ if (DataFlag ==0) { BrowserFlag=0; TotalReceived =0; /* parse packet for Content-length field */ size = Parse_Content_Length(data, p->tot_len); /* parse packet for the octet-stream field */ for (i=0;i if (strncmp ((char*)(data+i), octet_stream, 13)==0) { DataOffset = i+16; break; } } /* case of MSIE8 : we do not receive data in the POST packet*/ if (DataOffset==0) { DataFlag++; BrowserFlag = 1; pbuf_free(p); return ERR_OK; } /* case of Mozilla Firefox v3.6 : we receive data in the POST packet*/ else { TotalReceived = len - (ContentLengthOffset + 4) - 0x5D; } } 这里官方区分了 IE 和 Firefox,经过测试,支持的浏览器:IE10+/Firefox/Chrome/Opera,Safari测试没通过。。。 希望能对以后遇到相同问题的人有帮助 |
|
|
|
感谢分享
|
|
|
|
|
|
|
|
本帖最后由 maxtch 于 2017-12-9 18:38 编辑
其实你要把所有包按照序号全部接在一起再考虑上层协议。TCP 到了电脑端 OS 会被视作没有“包”这个概念的连续数据流,不同的浏览器不同的操作系统每次发出的数据量(TCP 窗口大小)不一样,包大小也会不一样。建议你什么时候看一下电脑端 TCP/IP 编程的过程,这样对设备端编程也会有更好地理解。至于测试,您可能必须要考虑所有主流平台和主流浏览器(Windows+IE、Windows+Edge、Chrome、Firefox、macOS+Safari、iOS+Safari)甚至要考虑 wget 和 curl。 顺带一提,如果内存允许的话建议容许接受最大 9000 字节的数据包。这是很多网络系统中 Jumbo Frame 的尺寸。Jumbo Frame 是一种相当常见的提升网络性能的方法。 |
|
|
|
wang222221 发表于 2018-12-14 13:56 我现在使用 官网提供的 lwip_iap 历程,目前可以使用 http 进行固件升级了,但是升级后不能够跳转到用户程序运行,目前比较纠结啊, 单独运行 用户程序是没有问题的 |
|
|
|
7vyydyfwef 发表于 2018-12-14 14:13 更新完成后单步运行看看程序跑到那里了,官方程序是可以的 |
|
|
|
你好,现在最新进展情况,貌似执行了第 52 行的代码后就出现 什么 The stack pointer for stack 'CSTACK' (currently 0x20022CD8) is outside the stack range (0x200003B0 to 0x200043B0) 这个是怎么回事啊 ??????????? 是不是我 的 iap 程序分的太大了啊 ? 我目前分配的是 512KB。 我 的 app 的程序是从 0x0808 0000 开始的 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1129 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1075 浏览 2 评论
2175 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1269 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1693 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 06:30 , Processed in 0.851225 second(s), Total 89, Slave 72 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号