完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我制作了一个自定义固件来连接到 TCP 套接字服务器,一切正常,直到 WIFI 失去连接并再次重新连接。我将尝试解释:
1. ESP8266EX启动,当它连接到我的 AP 时(我在 wifi_station_get_connect_status() == STATION_GOT_IP时签入计时器,因为没有 WIFI CONNECTION CALLBACK),然后我通过调用我的自定义函数创建一个 TCP 连接,如下所示: 结构体 espconn *ctrlConn;全局变量保持连接 创建 TCP 连接并开始连接 静态空隙ICACHE_FLASH_ATTR tcp_connection_create(void) { enum espconn_type linkType = ESPCONN_TCP; ctrlConn = (struct espconn *)os_zalloc(sizeof(struct espconn)); ctrlConn->type = linkType; ctrlConn->state = ESPCONN_NONE; ctrlConn->proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp)); ctrlConn->proto.tcp->local_port = espconn_port(); ctrlConn->proto.tcp->remote_port = ctrlSetup.serverPort; os_memcpy(ctrlConn->proto.tcp->remote_ip, ctrlSetup.serverIp, 4); ctrlConn->reverse = NULL; // I don't need this, right? espconn_regist_connectcb(ctrlConn, tcpclient_connect_cb); espconn_regist_reconcb(ctrlConn, tcpclient_recon_cb); espconn_connect(ctrlConn); uart0_sendStr("TCP connection created.rn"); } 当回调函数 tcpclient_connect_cb() 执行时,我开始与服务器通信,一切正常,没有问题。 2. Now, when I turn my AP off, the ESP8266EX detects the connection break and calls a callback function tcpclient_recon_cb(). That function gets parameters: sint8 errType which has value -11 (ESPCONN_CONN), and the state of espconn (arg->State is 6 ... ESPCONN_CLOSE). In that function I call my other function to destroy the connection because I will create it again when AP gets connected again: 关闭并破坏当前连接 静态空隙ICACHE_FLASH_ATTR tcp_connection_destroy(void) { uart0_sendStr("tcp_connection_destroy()rn"); ctrlState &= ~CTRL_STATE_AUTHENTICATED; // my custom variables connState = CTRL_TCP_DISCONNECTED; // my custom variables espconn_disconnect(ctrlconn); // this will os_free() my ctrlConn so I can create it again by calling tcp_connection_create(); when WIFI gets IP again } 3. 当我重新打开我的 AP 时,几秒钟后,ESP8266EX会自动连接并获得 IP。我的计时器将检测到它再次获得 IP,并开始连接 TCP 客户端的过程。现在它成功连接到 TCP,并且通信工作正常,但在 ~30 秒后,我意外地遇到 TCP 连接中断并调用我的 tcpclient_recon_cb() 函数。 Again, it gets parameters sint8 errType which has value -11 (ESPCONN_CONN), and the state of espconn (arg->State is 6 ... ESPCONN_CLOSE). After that I destroy the current connection and recreate it again but from then it just hangs and doesn't work. 发生了什么,为什么ESP8266EX再次从 WIFI AP 获取 IP 时,它会在几秒钟后断开 TCP 客户端连接? My TCP Client code is in "user/ctrl_platform.c". 我使用 lubuntu 和 SDK v0.9.2 来编译所有内容。 |
|
相关推荐
1个回答
|
|
ESP8266EX在重新连接WIFI AP后断开TCP客户端连接的原因可能有以下几点:
1. **IP地址变化**:当ESP8266EX重新连接到WIFI AP时,它可能会获得一个新的IP地址。这可能导致TCP连接中断,因为服务器端可能无法识别新的IP地址。 2. **DNS解析问题**:如果你的TCP连接依赖于域名解析,那么在重新连接WIFI AP后,DNS解析可能需要时间来更新。这可能导致连接中断。 3. **TCP连接超时**:TCP连接可能存在超时设置。当ESP8266EX重新连接WIFI AP时,如果连接超时设置较短,可能会导致连接断开。 4. **网络不稳定**:重新连接WIFI AP可能会导致网络不稳定,从而导致TCP连接断开。 5. **固件问题**:你提到的自定义固件可能存在一些问题,导致在重新连接WIFI AP时无法正确处理TCP连接。 为了解决这个问题,你可以尝试以下方法: 1. **确保IP地址不变**:在重新连接WIFI AP时,尝试使用静态IP地址,以避免IP地址变化导致的连接中断。 2. **优化DNS解析**:在重新连接WIFI AP后,确保DNS解析能够快速更新,以避免连接中断。 3. **调整TCP连接超时设置**:根据你的应用需求,适当增加TCP连接超时时间,以减少因超时而断开的连接。 4. **优化网络稳定性**:检查你的WIFI网络设置,确保网络稳定,以减少因网络不稳定导致的连接中断。 5. **检查自定义固件**:仔细检查你的自定义固件代码,确保在重新连接WIFI AP时能够正确处理TCP连接。如果可能,尝试使用官方固件或其他可靠的第三方固件进行测试。 6. **使用WIFI连接回调**:考虑使用ESP8266的WIFI连接回调功能,以便在WIFI连接状态发生变化时能够及时处理TCP连接。 通过以上方法,你可能会减少ESP8266EX在重新连接WIFI AP后断开TCP客户端连接的问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
988 浏览 1 评论
554浏览 6评论
463浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
447浏览 5评论
448浏览 4评论
422浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-29 11:04 , Processed in 0.709072 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号