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

2017-07-281.2万
AI 快速预览详细 收起
本教程介绍了如何使用micropython的poll进行多路复用。通过创建两个socket并绑定在3000和3001端口,当任意一个tcpServer被连接后,向被连接方发送dfrobot + 系统时间的秒数。实验中通过点击连接按钮,可以观察到系统同时处理多路连接的情况。此方法适用于FireBeetle-ESP32或FireBeetle-ESP8266硬件。
多路复用是什么,细节就不去介绍了,请各位自行度娘。简单的解释就是同时管理多路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-micropython教程之简单多路复用(使用Poll)图1

此图为uPyCraft端的调试信息,也可清晰的看到是几路连接及连接处理情况
uPyCraft-micropython教程之简单多路复用(使用Poll)图2

easyPoll.rar

643 Bytes, 下载次数: 3777

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(0)
- 没有更多了 -