使用请求从NodeMCU上的micropython进行开机自检时进行ECONNABORTED

时间:2018-09-20 17:16:26

标签: python python-requests nodemcu arduino-esp8266 micropython

我有一个小型的Python服务器,可以将其发布命令以控制我的LIFX灯。我可以从Postman尽可能多地发送垃圾邮件,而不会看到错误,但是我试图做的是使用NodeMCU板构建几个墙壁开关来触发灯,并且从那里得到ECONNABORTED错误大约有五分之一的请求。

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

main.py:

if(){}else{}

我怀疑这是一个套接字问题,但是不知道该如何调试。

在一次全新的重置中,我几乎可以保证前4个或5个传输将正常工作。我还可以保证在进行3或4次传输后,按住按钮(每秒左右触发命令)会失败。

有时重试工作,但往往不这样做。

大多数情况下,发生故障后,等待5秒钟然后重试都可以,但有时不会。

在大多数情况下,经过长时间的延迟(> 1分钟)后首次按下按钮的大多数时间都会起作用,但有时不会。

2 个答案:

答案 0 :(得分:1)

尝试了所有可能要解决的问题之后,我得出的结论是问题是ESP8266无法处理来自服务器的初始握手。我相信它可能无法管理网络上的流量,因此它可以抓住机会。在服务器上运行Wireshark时,收到失败响应后会看到几个TCP Spurious Retransmission

我已经订购了ESP32开发板,这应该让我测试一下我的理论。

编辑:我终于弄清楚了问题是urequests使套接字到处都是开放的。因此,我们需要正确关闭响应:

response = urequests.post(url, ...)

... 

response.close()

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

答案 1 :(得分:1)

好吧,垃圾回收解决了它。现在,我可以按该按钮,并且每次都能使用!我可能会调整延迟,以使其尽可能紧凑。可以查询urequests是否很忙,而不是只是一个短暂的延迟,但是,嘿...

这是发出请求的my循环:

gc.enable()

while True:
    time.sleep_ms(250)

    if (btn1.value() == 0):
        urequests.post(url, data=json.dumps(data_play))
        time.sleep_ms(650)
        while (btn1.value() == 0):
            time.sleep_ms(200)
            pass
        gc.collect()