关于pyModbus异步TCP服务器收发流量监控及缓冲区访问的咨询
嘿,作为Python新手能把pyModbus服务器跑起来已经很棒啦!关于监控进出流量的需求,其实不用直接碰底层的rx/tx缓冲区——那玩意儿是异步框架底层管理的,操作起来麻烦还容易出问题。pyModbus本身就提供了更友好的方式来实现,我给你两种实用的方案:
监控pyModbus异步TCP服务器的进出流量
方法1:用内置日志系统快速获取流量信息
pyModbus自带日志模块,只要调整日志级别,就能自动帮你记录所有请求和响应的细节:
- 先配置日志为
DEBUG级别,这样就能捕获到Modbus报文的完整信息:
import logging from pymodbus.server.async import StartTcpServer from pymodbus.datastore import ModbusSequentialDataBlock, ModbusSlaveContext, ModbusServerContext # 配置日志,让pyModbus输出详细报文 logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s') log = logging.getLogger("pymodbus") log.setLevel(logging.DEBUG) # 你的数据上下文(示例,替换成你自己的) store = ModbusSlaveContext( di=ModbusSequentialDataBlock(0, [1]*100), co=ModbusSequentialDataBlock(0, [2]*100), hr=ModbusSequentialDataBlock(0, [3]*100), ir=ModbusSequentialDataBlock(0, [4]*100) ) context = ModbusServerContext(slaves=store, single=True) # 启动服务器 StartTcpServer(context, address=("0.0.0.0", 502))
运行后,控制台会打印出每一次客户端的请求(RX)和服务器的响应(TX),包括功能码、寄存器地址、传输的数据这些关键信息,足够你做基础的流量监控。
方法2:自定义回调钩子,实现定制化记录/绘图
如果需要更灵活的处理(比如把数据存到数据库、实时生成流量图表),可以用pyModbus的回调机制,在请求处理的流程中插入自己的逻辑:
- 定义一个回调函数,它会在每次请求处理完成后被调用,拿到请求和响应的完整对象:
from pymodbus.server.async import StartTcpServer from pymodbus.datastore import ModbusSequentialDataBlock, ModbusSlaveContext, ModbusServerContext from pymodbus.transaction import ModbusSocketFramer def monitor_traffic(request, response): # 解析请求信息,比如客户端IP、功能码、操作的寄存器 client_ip = request.transaction.client.address[0] print(f"[RX] 来自 {client_ip} 的请求: 功能码={request.function_code}, 寄存器范围={request.__dict__.get('address', 'N/A')}:{request.__dict__.get('count', 'N/A')}") # 解析响应信息(如果请求成功有响应的话) if response: print(f"[TX] 给 {client_ip} 的响应: 功能码={response.function_code}, 返回数据={response.__dict__.get('values', 'N/A')}") # 这里可以扩展:把数据写入CSV文件、存入数据库,或者传给绘图库实时绘制 # 比如用matplotlib动态更新图表,或者把数据推到本地的监控面板 # 创建数据上下文 store = ModbusSlaveContext( di=ModbusSequentialDataBlock(0, [1]*100), co=ModbusSequentialDataBlock(0, [2]*100), hr=ModbusSequentialDataBlock(0, [3]*100), ir=ModbusSequentialDataBlock(0, [4]*100) ) context = ModbusServerContext(slaves=store, single=True) # 启动服务器时传入回调函数 StartTcpServer( context, address=("0.0.0.0", 502), framer=ModbusSocketFramer, callback=monitor_traffic )
这个回调函数完全由你掌控,你可以从request和response对象里提取任何你需要的信息,比如客户端IP、操作的寄存器地址、传输的数据值,然后按需处理——不管是记录到文件还是实时绘图都没问题。
为啥不直接访问rx/tx缓冲区?
异步版本的pyModbus是基于Twisted(旧版)或者asyncio(新版)框架的,底层的rx/tx缓冲区是这些框架内部管理的,直接去操作不仅需要深入了解框架的底层逻辑,还很容易破坏服务器的正常运行流程。上面两种方法都是pyModbus官方推荐的扩展方式,既稳定又容易维护。
如果你的pyModbus是v2.0以上的新版本,异步服务器的启动函数可能是StartAsyncTcpServer,但日志和回调的思路完全一致,只要稍微调整一下启动代码就行。
内容的提问来源于stack exchange,提问作者marcorto
相关产品推荐
相关产品推荐

