查看: 4669|回复: 0

uPyCraft-micropython教程之简单多路复用(使用Poll)

[复制链接]
多路复用是什么,细节就不去介绍了,请各位自行度娘。简单的解释就是同时管理多路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会将系统时间的秒数发送到这路连接。
两个秒数相同,说明是系统同时处理的;两个秒数不同,说明是分两次处理的
此图为楼主点击连接得到的打印
poll0.png

此图为uPyCraft端的调试信息,也可清晰的看到是几路连接及连接处理情况
poll1.png

easyPoll.rar

643 Bytes, 下载次数: 22

高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2020 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail