【发布时间】:2021-04-15 05:06:04
【问题描述】:
我正在尝试为 ESP32 板编写一个简单的程序。 我的主程序相当简单,它必须循环运行。 另一方面,设备还需要能够以非常简单的响应来响应 HTTP 请求。
这是我的尝试(https://randomnerdtutorials.com/micropython-esp32-esp8266-bme280-web-server/ 的返工):
try:
import usocket as socket
except:
import socket
from micropython import const
import time
REFRESH_DELAY = const(60000) #millisecondi
def do_connect():
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.config(dhcp_hostname=HOST)
wlan.connect('SSID', 'PSWD')
while not wlan.isconnected():
pass
print('network config:', wlan.ifconfig())
import json
import esp
esp.osdebug(None)
import gc
gc.collect()
do_connect()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, SENSOR_SCKT_PORT))
s.listen(5)
prevRun = 0
i = 0
while True:
print("iteration #"+str(i))
i += 1
# run every 60 seconds
curRun = int(round(time.time() * 1000))
if curRun - prevRun >= REFRESH_DELAY:
prevRun = curRun
# MAIN PROGRAM
# ......
# whole bunch of code
# ....
# run continuously:
try:
if gc.mem_free() < 102000:
gc.collect()
conn, addr = s.accept()
conn.settimeout(3.0)
print('Got a connection from %s' % str(addr))
request = conn.recv(1024)
conn.settimeout(None)
request = str(request)
#print('Content = %s' % request)
measurements = 'some json stuff'
conn.send('HTTP/1.1 200 OK\n')
conn.send('Content-Type: text/html\n')
conn.send('Connection: close\n\n')
conn.send(measurements)
conn.close()
except OSError as e:
conn.close()
print('Connection closed')
我只得到迭代 #0,然后while True 循环停止。
如果我用 HTTP 请求 ping 这个服务器,我得到一个正确的响应,并且循环前进到迭代 #1 和 #2(不知道为什么它认为我用 2 个请求 ping 它)。
所以看起来 socket.listen(5) 正在停止 while 循环。
有什么办法可以避免这种情况吗? 还有其他解决方案吗? 我不认为线程在这里是一个选项。
【问题讨论】:
标签: loops sockets micropython