我有一个小型 Python 服务器,我可以向它发送命令以控制我的 LIFX 灯。从邮递员那里,我可以随心所欲地发送垃圾邮件,永远不会看到错误,但我要做的是构建几个墙壁开关,使用 NodeMCU 板触发灯,从那里,我收到了 ECONNABORTED 错误大约五分之一的请求。我到处寻找解决方案,问题实际上是服务器配置错误或客户端配置错误,但我想知道这里是否还有其他问题。我的服务器代码很简单,而且,正如我所说,它似乎在从我的 NodeMCU 板以外的任何地方触发时都能工作。主要.py:from machine import Pin, resetfrom time import sleepimport urequests# set these two pins as required to up/downbuttonUp = Pin(4, Pin.IN, Pin.PULL_UP)buttonDown = Pin(5, Pin.IN, Pin.PULL_UP)light = "LightName"# button can be pressed, held or double pressed# press = 1x press, 1x release in .5 seconds# hold = 1x press, 0x release# double = 2x press, 2x release in .5 secondsdef detectPress(): pressed = False press = 0 direction = 'up' release = 0 if not buttonUp.value() or not buttonDown.value: pressed = True if not buttonDown.value(): direction = 'down' while buttonUp.value() and buttonDown.value(): sleep(.01) # wait for a button push for x in range(8): if pressed == False: if not buttonUp.value(): direction = 'up' pressed = True press += 1 if not buttonDown.value(): direction = 'down' pressed = True press += 1 else: if direction == 'up': if buttonUp.value(): pressed = False release += 1 else: if buttonDown.value(): pressed = False release += 1 sleep(.1) return press, release, direction我怀疑这是一个套接字问题,但不知道还能做些什么来调试它。在重新设置时,我几乎可以保证前 4 或 5 次传输会正常工作。我也几乎可以保证按住按钮(每秒左右触发一个命令)会在 3 或 4 次传输后失败。有时重试有效,但更多时候无效。大多数情况下,在失败后,等待 5 秒然后重试会起作用,但有时不会。大多数情况下,长时间延迟(> 1 分钟)后的初始按下会起作用,但有时不会。
2 回答
12345678_0001
TA贡献1802条经验 获得超5个赞
在尝试了所有我能想到的方法来解决这个问题后,我得出的结论是 ESP8266 无法处理来自服务器的初始握手。我相信它可能只是无法管理网络上的流量,所以它会卡住。在服务器上运行 wiresharkTCP Spurious Retransmission当我收到失败的响应时,我看到了几个s。
我订购了一块 ESP32 板,这应该可以让我测试我的理论。
编辑:我终于发现问题是 urequests 在所有地方都打开了套接字。因此我们需要正确关闭响应:
response = urequests.post(url, ...)
...
response.close()
这解决了我的问题,尽管我无法解释的是为什么套接字在帖子末尾没有关闭,这似乎是库的功能。
添加回答
举报
0/150
提交
取消