У меня проблемы с запуском следующего скрипта в течение более длительного периода времени:
Я использую 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 пост снова начинает работать. Может быть, ОС выполняет очистку в фоновом режиме?