MicroPython单线程多路IO复用select.poll TCPserver透传

参考文章:Python全栈工程师(22:Socket编程11-Select解析Socket通信)_python 详细select socket-优快云博客文章浏览阅读591次。Python中有一个select模块,其中提供了:select、poll、epoll三个方法,分别调用系统的 select,poll,epoll 从而实现IO多路复用。Windows Python: 提供: selectMac Python: 提供: selectLinux Python: 提供: select、poll、epoll注意:网络操作、文件操作、终..._python 详细select sockethttps://blog.youkuaiyun.com/Julialove102123/article/details/80175209https://blog.youkuaiyun.com/Julialove102123/article/details/80175209https://blog.youkuaiyun.com/Julialove102123/article/details/80175209https://blog.youkuaiyun.com/Julialove102123/article/details/80175209https://blog.youkuaiyun.com/Julialove102123/article/details/80175209

Modbus协议与Python_python modbus-优快云博客文章浏览阅读2.7k次,点赞28次,收藏51次。使用python建立modbus通讯,讲解modbus基本原理,如何使用python搭建从站与主站,如何进行对浮点数进行读写。_python modbushttps://blog.youkuaiyun.com/weixin_46184311/article/details/140431267https://blog.youkuaiyun.com/weixin_46184311/article/details/140431267https://blog.youkuaiyun.com/weixin_46184311/article/details/140431267https://blog.youkuaiyun.com/weixin_46184311/article/details/140431267https://blog.youkuaiyun.com/weixin_46184311/article/details/140431267

字节内的位序有2种排列选左低右高:micropython-modbus才能适配modbus poll、kepware、modscan-优快云博客文章浏览阅读665次,点赞19次,收藏12次。在Python中,你可以将字节(byte)转换为布尔数组(bool array),这通常涉及到将每个字节的每个位(bit)单独处理。一个字节有8位,你可以选择将每个位转换成布尔值,或者将整个字节转换成布尔值(例如,非零字节为True,零字节为False)。问题2:限制10个TCP连接到Slaver,连接多个TCP是没问题,但是多个Master会冲突啊,本来是一主多从的结构,现在有多个Master(例如modbus poll、kepware至少有2个Master)都想从同一个Slaver存取数据,怎么办啊?https://blog.youkuaiyun.com/iot2022/article/details/145420628https://blog.youkuaiyun.com/iot2022/article/details/145420628https://blog.youkuaiyun.com/iot2022/article/details/145420628https://blog.youkuaiyun.com/iot2022/article/details/145420628https://blog.youkuaiyun.com/iot2022/article/details/145420628

""" 
Micropython 没有 queue 请用 deque
from collections import deque
"""

import select, socket, sys, network
from collections import deque

station = network.WLAN(network.STA_IF)
local_ip = station.ifconfig()[0] # IP地址st
tcp_port = 5020 # port to listen for requests/providing data

# Create a TCP/IP socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(socket.AF_INET, socket.SOCK_STREAM)  # 2 1
server.setblocking(False)

# Bind the socket to the port
server_address = (local_ip, tcp_port)  # localhost = 127.0.0.1/192.168.1.108/
print(sys.stderr, "starting up on %s port %s" % server_address)
server.bind(server_address) # OSError: [Errno 112] EADDRINUSE 稍等退出port重试即可

# Listen for incoming connections
server.listen(5)

# Sockets from which we expect to read
# 开始只有服务端,后面进来新连接再放入监控列表inputs,此列表里面是空就会报错:监控什么?
inputs = [server]
print("初始监控列表里面只有1个服务端 =", inputs)

# Sockets to which we expect to write
outputs = []

message_queues = {}
while inputs:

    # Wait for at least one of the sockets to be ready for processing
    print("\nwaiting for the next event")
    # select接收任务和返回结果依据这3个列表
    readable, writable, exceptional = select.select(inputs, outputs, inputs)
    # Handle inputs
    for s in readable:
        # s是服务端,只负责接收新连接,接收数据是connection socket对象的事情
        if s is server:
            # A "readable" server socket is ready to accept a connection
            connection, client_address = s.accept()  # 有新连接请求
            print("new connection from", client_address)
            connection.setblocking(False)  # 必须是非阻塞的才能并发
            inputs.append(connection)  # 新连接交给select监控
            # Give the connection a queue for data we want to send
            # message_queues字典的Key=connection,Value=专用队列
            message_queues[connection] = deque([],10)
        else:
            data = s.recv(512)
            if data:
                # A readable client socket has data
                # s.getpeername() => AttributeError: 'socket' object has no attribute 'getpeername'
                print(sys.stderr, 'received "%s" from %s' % (data, s))
     
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值