ESP8266 Micro python: [Errno 103] ECONNABORTED \ r \ n ') через некоторое время - PullRequest
1 голос
/ 21 марта 2020

У меня проблемы с запуском следующего скрипта в течение более длительного периода времени:

Я использую ampy для выполнения скрипта на ESP:

sudo ampy --port /dev/ttyUSB0 run photoresistor.py

photoresistor.py:

#!/usr/bin/env python3

import machine
import network
from time import sleep
from urllib.urequest import urlopen
import json

wifiap = network.WLAN(network.AP_IF)
wifiap.active(False)
routercon = network.WLAN(network.STA_IF)
routercon.active(True)
routercon.ifconfig(('10.0.0.128','255.255.255.0','10.0.0.138','10.0.0.138'))
routercon.connect('mywifi', '123')
while not routercon.isconnected():
    pass

posturl=('http://10.0.0.156:23102/rest/v2/send')

adc = machine.ADC(0)
gc.enable()

while True:
    value = adc.read()
    if value < 200:
       message = {'username': 'test', 'message': value, 'chatid': 'test', 'password': 'test', 'notifyself': 'false'}
       r = urlopen(posturl, data=json.dumps(message).encode())
       r.close()
    gc.collect()
    sleep(1)

В начале все работает как положено, но через некоторое время я получаю следующую трассировку стека:

Traceback (most recent call last):
  File "/usr/local/bin/ampy", line 11, in <module>
    sys.exit(cli())
  File "/usr/local/lib/python3.6/dist-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.6/dist-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.6/dist-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.6/dist-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/ampy/cli.py", line 337, in run
    output = board_files.run(local_file, not no_output)
  File "/usr/local/lib/python3.6/dist-packages/ampy/files.py", line 303, in run
    out = self._pyboard.execfile(filename)
  File "/usr/local/lib/python3.6/dist-packages/ampy/pyboard.py", line 273, in execfile
    return self.exec_(pyfile)
  File "/usr/local/lib/python3.6/dist-packages/ampy/pyboard.py", line 267, in exec_
    raise PyboardError('exception', ret, ret_err)
ampy.pyboard.PyboardError: ('exception', b'', b'Traceback (most recent call last):\r\n  File "<stdin>", line 28, in <module>\r\n  File "urequests.py", line 152, in post\r\n  File "urequests.py", line 89, in request\r\nOSError: [Errno 103] ECONNABORTED\r\n')

Не знаю, что делать. Я попытался поиграть со сборщиком мусора, но это не помогло.

Я подозреваю, что плата не очищает гнезда должным образом. Если доска отправляет запросы по почте быстро в l oop (каждую секунду в течение 1 минуты) и позволяет ей сидеть в течение короткого периода времени, она быстро выходит из строя с показателем выше ECONNABORTED.

Если доска отправляет почту запрашивает медленнее (например, 2 в минуту), это займет больше времени для сбоя. В заключение: я подозреваю, что ОС неправильно очищает ресурсы и все еще имеет активные соединения после r.close() или я наблюдаю что-то в коде.

Я не уверен, что еще я могу сделать, чтобы убедиться, что они сокеты закрыты.

РЕДАКТИРОВАТЬ: я обнаружил, что он не работает при подключении (https://github.com/micropython/micropython-lib/blob/master/urllib.urequest/urllib/urequest.py):

строка 28:

s.connect(ai[-1])

однако routercon.isconnected() возвращает true:

>>> routercon.isconnected()
True
>>> 

Как может случиться так, что, хотя есть активное соединение, я не могу отправить запрос http:

EDIT2:

Иногда, когда это происходит, я также не могу отправить сообщение на другую конечную точку, например, на тестовый сервер с тем же веб-сервисом

>>> r = urlopen(posturl, data=json.dumps(message).encode())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "urllib/urequest.py", line 28, in urlopen
OSError: [Errno 103] ECONNABORTED
>>> r = urlopen("http://10.0.0.8:23102/rest/v2/send", data=json.dumps(message).encode())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "urllib/urequest.py", line 28, in urlopen
OSError: [Errno 103] ECONNABORTED
>>> 

Интересно, что http get to google работает:

>>> r = urlopen("http://www.google.com")
>>>

Если я позволю Некоторое время он простаивает, http пост снова начинает работать. Может быть, ОС выполняет очистку в фоновом режиме?

...