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

我有一个小型 Python 服务器,我可以向它发送命令以控制我的 LIFX 灯。从邮递员那里,我可以随心所欲地发送垃圾邮件,永远不会看到错误,但我要做的是构建几个墙壁开关,使用 NodeMCU 板触发灯,从那里,我收到了 ECONNABORTED 错误大约五分之一的请求。


我到处寻找解决方案,问题实际上是服务器配置错误或客户端配置错误,但我想知道这里是否还有其他问题。我的服务器代码很简单,而且,正如我所说,它似乎在从我的 NodeMCU 板以外的任何地方触发时都能工作。


主要.py:


from machine import Pin, reset

from time import sleep

import urequests


# set these two pins as required to up/down

buttonUp = 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 seconds


def 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 分钟)后的初始按下会起作用,但有时不会。


繁花不似锦
浏览 426回答 2
2回答

12345678_0001

在尝试了所有我能想到的方法来解决这个问题后,我得出的结论是 ESP8266 无法处理来自服务器的初始握手。我相信它可能只是无法管理网络上的流量,所以它会卡住。在服务器上运行 wiresharkTCP Spurious Retransmission当我收到失败的响应时,我看到了几个s。我订购了一块 ESP32 板,这应该可以让我测试我的理论。编辑:我终于发现问题是 urequests 在所有地方都打开了套接字。因此我们需要正确关闭响应:response = urequests.post(url, ...)... response.close()这解决了我的问题,尽管我无法解释的是为什么套接字在帖子末尾没有关闭,这似乎是库的功能。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python