You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于pyModbus异步TCP服务器收发流量监控及缓冲区访问的咨询

嘿,作为Python新手能把pyModbus服务器跑起来已经很棒啦!关于监控进出流量的需求,其实不用直接碰底层的rx/tx缓冲区——那玩意儿是异步框架底层管理的,操作起来麻烦还容易出问题。pyModbus本身就提供了更友好的方式来实现,我给你两种实用的方案:

监控pyModbus异步TCP服务器的进出流量

方法1:用内置日志系统快速获取流量信息

pyModbus自带日志模块,只要调整日志级别,就能自动帮你记录所有请求和响应的细节:

  1. 先配置日志为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的回调机制,在请求处理的流程中插入自己的逻辑:

  1. 定义一个回调函数,它会在每次请求处理完成后被调用,拿到请求和响应的完整对象:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:16:46