package cn.iocoder.yudao.module.iot.gateway.protocol.modbus.tcpclient.manager; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.iocoder.yudao.module.iot.core.biz.dto.IotModbusDeviceConfigRespDTO; import cn.iocoder.yudao.module.iot.core.biz.dto.IotModbusPointRespDTO; import cn.iocoder.yudao.module.iot.gateway.protocol.modbus.common.manager.AbstractIotModbusPollScheduler; import cn.iocoder.yudao.module.iot.gateway.protocol.modbus.common.utils.IotModbusCommonUtils; import cn.iocoder.yudao.module.iot.gateway.protocol.modbus.common.utils.IotModbusTcpClientUtils; import cn.iocoder.yudao.module.iot.gateway.protocol.modbus.tcpclient.handler.upstream.IotModbusTcpClientUpstreamHandler; import io.vertx.core.Vertx; import lombok.extern.slf4j.Slf4j; /** * IoT Modbus TCP Client 轮询调度器:管理点位的轮询定时器,调度读取任务并上报结果 * * @author 芋道源码 */ @Slf4j public class IotModbusTcpClientPollScheduler extends AbstractIotModbusPollScheduler { private final IotModbusTcpClientConnectionManager connectionManager; private final IotModbusTcpClientUpstreamHandler upstreamHandler; private final IotModbusTcpClientConfigCacheService configCacheService; public IotModbusTcpClientPollScheduler(Vertx vertx, IotModbusTcpClientConnectionManager connectionManager, IotModbusTcpClientUpstreamHandler upstreamHandler, IotModbusTcpClientConfigCacheService configCacheService) { super(vertx); this.connectionManager = connectionManager; this.upstreamHandler = upstreamHandler; this.configCacheService = configCacheService; } // ========== 轮询执行 ========== /** * 轮询单个点位 */ @Override protected void pollPoint(Long deviceId, Long pointId) { // 1.1 从 configCache 获取最新配置 IotModbusDeviceConfigRespDTO config = configCacheService.getConfig(deviceId); if (config == null || CollUtil.isEmpty(config.getPoints())) { log.warn("[pollPoint][设备 {} 没有配置]", deviceId); return; } // 1.2 查找点位 IotModbusPointRespDTO point = IotModbusCommonUtils.findPointById(config, pointId); if (point == null) { log.warn("[pollPoint][设备 {} 点位 {} 未找到]", deviceId, pointId); return; } // 2.1 获取连接 IotModbusTcpClientConnectionManager.ModbusConnection connection = connectionManager.getConnection(deviceId); if (connection == null) { log.warn("[pollPoint][设备 {} 没有连接]", deviceId); return; } // 2.2 获取 slave ID Integer slaveId = connectionManager.getSlaveId(deviceId); Assert.notNull(slaveId, "设备 {} 没有配置 slaveId", deviceId); // 3. 执行 Modbus 读取 IotModbusTcpClientUtils.read(connection, slaveId, point) .onSuccess(rawValue -> upstreamHandler.handleReadResult(config, point, rawValue)) .onFailure(e -> log.error("[pollPoint][读取点位失败, deviceId={}, identifier={}]", deviceId, point.getIdentifier(), e)); } }