为了账号安全,请及时绑定邮箱和手机立即绑定

使用请求从 NodeMCU 上的 micropython POST 时 ECONNABORTED

使用请求从 NodeMCU 上的 micropython POST 时 ECONNABORTED

繁花不似锦 2021-06-16 18:01:37
我有一个小型 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()

这解决了我的问题,尽管我无法解释的是为什么套接字在帖子末尾没有关闭,这似乎是库的功能。


查看完整回答
反对 回复 2021-06-22
  • 2 回答
  • 0 关注
  • 425 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信