完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我有一个 Arduino ESP8266 项目,它可以做很多事情(OneWire、MQTT),包括运行 ESP8266WebServer。然后我有大约三四个其他 ESP8266 节点使用 ESP8266HTTPClient 每五秒从上面的网络服务器获取一些数据。HTTPClients 已强制执行 http1.0(使用 HTTP10)并将超时缩短为 1500 毫秒,以防万一 Web 服务器出现问题。当在核心 v2.6.x 或 v2.7.x 上编译时,此设置过去可以正常工作多年。
使用核心 v3.0.x 编译后,此网络设置最终中断 - 三四个 HTTP 客户端开始出现错误 -1(连接失败)或 -11(超时)。有时它能工作几分钟甚至几个小时,但最后总是陷入错误状态。我试过从 lwip“低内存”切换到 lwip“高带宽”,但它没有改变任何东西。我已经尝试尽可能地简化客户端的代码 - 摆脱 JSON 流反序列化并仅使用 http.getString() 尽快获取正文并尽可能短地阻止 Web 服务器。没有帮助。还尝试将客户端降级回核心 v2.7.4,但没有帮助。有用的是将网络服务器的 Arduino 核心从 3.0.2 降级到 2.7.4。 我已经尝试分析网络服务器的处理程序 - 准备答案大约需要 2 毫秒,将其发送到客户端需要另外 2 毫秒。我怀疑这会是个问题。在分析 HTTPClient 时,通常需要 70 到 400 毫秒的时间从 Web 服务器获取和反序列化数据(有时显然需要等到服务器进行 OneWire 扫描或类似操作)。当服务器变得毛茸茸时,这个 HTTPClient 当然需要大约 1511 毫秒来超时并返回错误 -11(因为我已将超时设置为 1500 毫秒)。 当网络服务器变得如此无响应时,我尝试从我的桌面对它运行 curl。事实证明,curl 在 7、9 甚至 40 秒内得到了回复(而不是通常的 0.011 秒)。看起来是否有网络服务器试图整理的大量客户端请求队列?大多数请求当然已经被客户端超时了,但我不知道服务器对它们做了什么,如果它们确实在排队。也许 curl 一直在重新发送请求?不确定,忘记用 Wireshark 检查了。 请问您知道 Arduino 核心 v2.7.x 和 v3.0.x 之间发生了什么变化,可能会对网络服务器产生这种不利影响吗?它可以以某种方式在我自己的代码中修复/变通吗?有什么我可以做得更好来处理从 ESP8266 获取数据的三、四或几个 ESP8266 客户端?是否有某个地方需要设置网络服务器超时,以便让它快速丢弃“旧请求”而不是建立一个长长的队列(如果确实如此 - 只是从长时间猜测回复卷曲) . 请问还有什么想法吗? 我想坚持使用核心 v3.0.x,因为我喜欢获得 16 kB 额外内存的可能性,但如果我不能解决这个网络服务器的卡住问题,我将不得不回到 v2.7.4 :- / 谢谢!彼得 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
1106 浏览 1 评论
574浏览 6评论
477浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
460浏览 5评论
461浏览 4评论
435浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 15:30 , Processed in 0.845671 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号