多路复用是什么,细节就不去介绍了,请各位自行度娘。简单的解释就是同时管理多路IO的一种方式。
micropython提供了select和poll两种复用方式,官方推荐使用poll
实验目的:
创建两个socket,一个绑定在本机的3000端口,一个绑定在3001端口。在这两个socket上创建两个tcpServer。当任意一个tcpServer被连接后,向被连接方发送dfrobot + 系统时间的秒数。
请观众朋友们自行脑补一下,如果不用多路复用,这个功能是不是不太好实现。。。。
实验环境:
硬件:
FireBeetle-ESP32或FireBeetle-ESP8266 x1
软件
uPyCraft V0.22及以上版本
time.sleep(5) 我们在这里加入了一个五秒钟的睡眠,方面用户测试同时有多路连接的情况,真正使用在项目中的时候,这句睡眠需要被删除掉
res = poller.poll(5000)
先上代码(esayPoll.py)如果这里复制有缩进问题,请从附件中下载代码
from machine import RTC
import usocket as socket
import uselect as select
import time
import network
import os
SSID="DFROBOT_AP"
PASSWORD="12345678"
wlan=None
rtc=RTC()
def connectWifi(ssid,passwd):
global wlan
wlan=network.WLAN(network.STA_IF)
wlan.active(True)
wlan.disconnect()
wlan.connect(ssid,passwd)
while(wlan.ifconfig()[0]=='0.0.0.0'):
time.sleep(1)
return True
gs=[]
try:
connectWifi(SSID,PASSWORD)
ip=wlan.ifconfig()[0]
for i in range(2):
x = socket.socket()
x.bind((ip, 3000+i))
x.listen(2)
x.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
gs.append(x)
poller = select.poll()
for x in gs:
poller.register(x, select.POLLIN)
while True:
time.sleep(5)
res = poller.poll(5000)
if(len(res)>0):
print(res)
for x in res:
c=x[0].accept()
print(res)
c[0].send('dfrobot '+str(rtc.datetime()[6])+'\r\n')
c[0].close()
except:
for x in gs:
x.close()
wlan.disconnect()
wlan.active(True)
实验过程中,请随意点击连接按钮,ESP会将系统时间的秒数发送到这路连接。
两个秒数相同,说明是系统同时处理的;两个秒数不同,说明是分两次处理的
此图为楼主点击连接得到的打印
此图为uPyCraft端的调试信息,也可清晰的看到是几路连接及连接处理情况
|