我有一個小型 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
提交
取消