Browse Source

广州软件学院兼容PLC相关逻辑内容:

1、监视界面兼容PLC;
2、MQTT改成动态切换;
dev
3067418132@qq.com 21 hours ago
parent
commit
abf18e0619
  1. 2
      user-service/src/main/java/com/mh/user/controller/DeviceOperateController.java
  2. 2
      user-service/src/main/java/com/mh/user/entity/DeviceInstallEntity.java
  3. 4
      user-service/src/main/java/com/mh/user/entity/NowDataEntity.java
  4. 2
      user-service/src/main/java/com/mh/user/job/CollectionLoopRunner.java
  5. 127
      user-service/src/main/java/com/mh/user/job/S7PlcCollectionJob.java
  6. 13
      user-service/src/main/java/com/mh/user/mapper/CollectionParamsManageMapper.java
  7. 7
      user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java
  8. 2
      user-service/src/main/java/com/mh/user/mapper/GatewayManageMapper.java
  9. 72
      user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java
  10. 13
      user-service/src/main/java/com/mh/user/model/MultiControlModel.java
  11. 1
      user-service/src/main/java/com/mh/user/service/impl/CollectionParamsManageServiceImpl.java
  12. 35
      user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java
  13. 1
      user-service/src/main/java/com/mh/user/service/mqtt/config/MqttConfig.java
  14. 2
      user-service/src/main/java/com/mh/user/service/mqtt/config/MqttInboundConfig.java
  15. 2
      user-service/src/main/java/com/mh/user/service/mqtt/config/MqttMessageChannel.java
  16. 2
      user-service/src/main/java/com/mh/user/service/mqtt/config/MqttOutboundConfig.java
  17. 2
      user-service/src/main/java/com/mh/user/service/mqtt/handler/InboundMessageRouter.java
  18. 2
      user-service/src/main/java/com/mh/user/service/mqtt/service/impl/EventsServiceImpl.java
  19. 2
      user-service/src/main/java/com/mh/user/service/mqtt/service/impl/MqttGatewayServiceImpl.java
  20. 2
      user-service/src/main/java/com/mh/user/service/mqtt/service/impl/MqttManagerServiceImpl.java
  21. 2
      user-service/src/main/java/com/mh/user/service/mqtt/service/impl/MqttMsgSenderServiceImpl.java
  22. 2
      user-service/src/main/java/com/mh/user/service/mqtt/service/impl/MqttTopicServiceImpl.java
  23. 4
      user-service/src/main/resources/application-dev.yml
  24. 2
      user-service/src/main/resources/application-prod.yml
  25. 108
      user-service/src/main/resources/application-test.yml

2
user-service/src/main/java/com/mh/user/controller/DeviceOperateController.java

@ -52,7 +52,7 @@ public class DeviceOperateController {
@Value("${control.topic}")
String controlTopic;
@Autowired
@Autowired(required = false)
private IMqttGatewayService iMqttGatewayService;
@Autowired

2
user-service/src/main/java/com/mh/user/entity/DeviceInstallEntity.java

@ -40,5 +40,7 @@ public class DeviceInstallEntity {
private int isFault;
private String seat;
// 是否单箱 1:是 0:其他
private int isSingleBox;
}

4
user-service/src/main/java/com/mh/user/entity/NowDataEntity.java

@ -41,6 +41,10 @@ public class NowDataEntity {
private String pressure; // 压力
private String pressureSet; // 压力设置
private String gwState; // 网关状态
private String backControlMode; // 回水运行模式
}

2
user-service/src/main/java/com/mh/user/job/CollectionLoopRunner.java

@ -20,6 +20,7 @@ import gnu.io.SerialPortEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
@ -35,6 +36,7 @@ import java.util.Map;
* @throws
*/
@Component
@ConditionalOnProperty(prefix = "mqttSpring", name = "enabled", havingValue = "true", matchIfMissing = true)
public class CollectionLoopRunner implements ApplicationRunner {
@Resource

127
user-service/src/main/java/com/mh/user/job/S7PlcCollectionJob.java

@ -2,9 +2,12 @@ package com.mh.user.job;
import com.mh.user.constants.Constant;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.entity.GatewayManageEntity;
import com.mh.user.mapper.CollectionParamsManageMapper;
import com.mh.user.mapper.DeviceInstallMapper;
import com.mh.user.mapper.GatewayManageMapper;
import com.mh.user.mapper.NowDataMapper;
import com.mh.user.s7.S7ConnectorUtil;
import com.mh.user.utils.DateUtil;
import lombok.extern.slf4j.Slf4j;
@ -34,11 +37,15 @@ public class S7PlcCollectionJob {
// 缓存S7连接器,避免频繁创建连接
private static final Map<String, S7ConnectorUtil> connectorCache = new ConcurrentHashMap<>();
private final DeviceInstallMapper deviceInstallMapper;
private final NowDataMapper nowDataMapper;
public S7PlcCollectionJob(GatewayManageMapper gatewayManageMapper,
CollectionParamsManageMapper collectionParamsManageMapper) {
CollectionParamsManageMapper collectionParamsManageMapper, DeviceInstallMapper deviceInstallMapper, NowDataMapper nowDataMapper, NowDataMapper nowDataMapper1) {
this.gatewayManageMapper = gatewayManageMapper;
this.collectionParamsManageMapper = collectionParamsManageMapper;
this.deviceInstallMapper = deviceInstallMapper;
this.nowDataMapper = nowDataMapper1;
}
/**
@ -132,6 +139,22 @@ public class S7PlcCollectionJob {
param.getRegisterAddr(), param.getOtherName(), e);
}
}
// 遍历完全之后更新回水状态,因为有多箱和单箱电磁阀
// params遍历得出多少个buildingId分组
List<Long> buildingIds = params.stream().map(CollectionParamsManageEntity::getBuildingId).distinct().collect(Collectors.toList());
for (Long buildingId : buildingIds) {
List<Map<String, Object>> backWaterStates = collectionParamsManageMapper.selectBackWaterState(buildingId);
// map值有cur_value,cur_time,通过stream判断cur_time是否是当前时间,然后cur_value如果存在一天记录等于1的,back_water_state=运行,否则back_water_state=不运行
backWaterStates.forEach(backWaterState -> {
if (backWaterState.get("cur_time").toString().substring(0, 10).equals(dateStr.substring(0, 10))) {
if (backWaterState.get("cur_value").equals(1)) {
nowDataMapper.updateBackWaterState(buildingId, "运行");
} else {
nowDataMapper.updateBackWaterState(buildingId, "不运行");
}
}
});
}
}
/**
@ -148,8 +171,29 @@ public class S7PlcCollectionJob {
// 读取数据
Object value = connector.readData(registerAddr);
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDeviceById(param.getDeviceInstallId());
if (value == null) {
log.warn("读取数据为空: registerAddr={}", registerAddr);
// 更新deviceInstall离线
deviceInstallMapper.updateNotOnlineById(param.getDeviceInstallId());
// 更新now_data离线
nowDataMapper.updateRunState(deviceInstallEntity.getBuildingId(),
deviceInstallEntity.getDeviceAddr(),
"2", deviceInstallEntity.getDeviceName());
// 在判断设备类型,如果是供水泵,up_water_state=运行
// 如果是补水电磁阀开,use_water_state=运行,
// 如果是单箱电磁阀或者多箱电磁阀开,back_water_state=运行
if (deviceInstallEntity.getDeviceType().equals("供水泵")) {
nowDataMapper.updateUpWaterState(deviceInstallEntity.getBuildingId(),
deviceInstallEntity.getDeviceAddr(),
"2", deviceInstallEntity.getDeviceName());
} else if (deviceInstallEntity.getDeviceType().equals("补水电磁阀")) {
nowDataMapper.updateUseWaterState(deviceInstallEntity.getBuildingId(),
deviceInstallEntity.getDeviceAddr(),
"2", deviceInstallEntity.getDeviceName());
}
return;
}
@ -185,6 +229,87 @@ public class S7PlcCollectionJob {
param.getBuildingId() != null ? param.getBuildingId().toString() : null
);
// 在同步更新device_install表
deviceInstallMapper.updateLastValueByOtherParam(param.getDeviceInstallId(), curValue.toString());
if (deviceInstallEntity != null) {
// 更新设备安装表中的now_date字段,根据param.getParamTypeId()的值进行判断 // 在对now_date进行更新
// 查询当前点位是否是运行状态、压力、液位、液位设置、回水温度、故障状态
switch(param.getParamTypeId()) {
case 2: // 运行状态
nowDataMapper.updateRunState(deviceInstallEntity.getBuildingId(),
deviceInstallEntity.getDeviceAddr(),
String.valueOf(curValue.intValue()), deviceInstallEntity.getDeviceName());
// 在判断设备类型,如果是供水泵,up_water_state=运行
// 如果是补水电磁阀开,use_water_state=运行,
// 如果是单箱电磁阀或者多箱电磁阀开,back_water_state=运行
if (deviceInstallEntity.getDeviceType().equals("供水泵")) {
nowDataMapper.updateUpWaterState(deviceInstallEntity.getBuildingId(),
deviceInstallEntity.getDeviceAddr(),
String.valueOf(curValue.intValue()), deviceInstallEntity.getDeviceName());
} else if (deviceInstallEntity.getDeviceType().equals("补水电磁阀")) {
nowDataMapper.updateUseWaterState(deviceInstallEntity.getBuildingId(),
deviceInstallEntity.getDeviceAddr(),
String.valueOf(curValue.intValue()), deviceInstallEntity.getDeviceName());
}
break;
case 5: // 压力
nowDataMapper.updatePressure(deviceInstallEntity.getBuildingId(),
deviceInstallEntity.getDeviceAddr(),
curValue.toString(), deviceInstallEntity.getDeviceName());
break;
case 31: // 液位
if (param.getOtherName().contains("单箱") && deviceInstallEntity.getIsSingleBox() == 1) {
// 更新单箱液位
nowDataMapper.updateBoxLevel(deviceInstallEntity.getBuildingId(),
deviceInstallEntity.getDeviceAddr(),
curValue.toString(),
deviceInstallEntity.getDeviceName(), 1);
} else {
// 获取多箱的液位
nowDataMapper.updateBoxLevel(deviceInstallEntity.getBuildingId(),
null,
curValue.toString(),
null, 0);
}
break;
case 39: // 液位设置
if (param.getOtherName().contains("单箱") && deviceInstallEntity.getIsSingleBox() == 1) {
// 更新单箱液位
nowDataMapper.updateBoxLevelSet(deviceInstallEntity.getBuildingId(),
deviceInstallEntity.getDeviceAddr(),
curValue.toString(),
deviceInstallEntity.getDeviceName(), 1);
} else {
// 获取多箱的液位
nowDataMapper.updateBoxLevelSet(deviceInstallEntity.getBuildingId(),
null,
curValue.toString(),
null, 0);
}
break;
case 32: // 压力设置
nowDataMapper.updatePressureSet(deviceInstallEntity.getBuildingId(),
deviceInstallEntity.getDeviceAddr(),
curValue.toString(), deviceInstallEntity.getDeviceName());
break;
case 12: // 回水温度
break;
case 3: // 故障状态
nowDataMapper.updatePressureSet(deviceInstallEntity.getBuildingId(),
deviceInstallEntity.getDeviceAddr(),
curValue.intValue() == 0 ? "正常" : "故障", deviceInstallEntity.getDeviceName());
break;
case 41: // 回水阀控制模式:0单箱,1多箱
nowDataMapper.updateBackControlModel(deviceInstallEntity.getBuildingId(),
deviceInstallEntity.getDeviceAddr(),
String.valueOf(curValue.intValue()), deviceInstallEntity.getDeviceName());
break;
}
// 根据deviceInstall查询对应的deviceInstall表数据
// 根据查询出来的deviceInstall表数据,根据device_addr和device_name值进行更新
}
log.debug("采集成功: registerAddr={}, value={}, otherName={}",
registerAddr, curValue, param.getOtherName());
}

13
user-service/src/main/java/com/mh/user/mapper/CollectionParamsManageMapper.java

@ -10,6 +10,7 @@ import tk.mybatis.mapper.common.BaseMapper;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
/**
* @author LJF
@ -424,4 +425,16 @@ public interface CollectionParamsManageMapper extends BaseMapper<CollectionParam
@Param("value") String value,
@Param("dateStr") String dateStr);
@Select("SELECT " +
" cpm.cur_value, " +
" cpm.cur_time " +
"FROM " +
" collection_params_manage cpm " +
"JOIN device_install di ON " +
" cpm.device_install_id = di.id " +
"WHERE " +
" cpm.building_id = #{buildingId} " +
" AND cpm.param_type_id = 2 " +
" AND di.device_type IN ('单箱电磁阀', '多箱电磁阀');")
List<Map<String, Object>> selectBackWaterState(Long buildingId);
}

7
user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java

@ -395,4 +395,11 @@ public interface DeviceInstallMapper extends BaseMapper<DeviceInstallEntity> {
@Param("deviceAddr") String addr,
@Param("deviceType") String deviceType,
@Param("deviceName") String deviceName);
@Update("update device_install set last_value = #{lastValue}, last_date = getdate(), is_online = '在线' where id = #{deviceInstallId} ")
void updateLastValueByOtherParam(@Param("deviceInstallId") Long deviceInstallId,
@Param("lastValue") String lastValue);
@Update("update device_install set is_online = '离线' where id = #{deviceInstallId} ")
void updateNotOnlineById(Long deviceInstallId);
}

2
user-service/src/main/java/com/mh/user/mapper/GatewayManageMapper.java

@ -114,7 +114,7 @@ public interface GatewayManageMapper {
void updateGatewayManageOnlineByImei(String imei, int status);
@Select("select top 1 grade from gateway_manage where data_com = #{dataCom} ")
int queryGatewayByDataCom(@Param("dataCom") String dataCom);
Integer queryGatewayByDataCom(@Param("dataCom") String dataCom);
@Update("update gateway_manage set grade = #{grade}, connect_date = getdate() where sn = #{sn}")
void updateGatewayManageOnlineBySn(String sn, int grade);

72
user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java

@ -72,7 +72,10 @@ public interface NowDataMapper {
@Result(property ="waterLevel",column ="water_level"),
@Result(property ="tankId",column ="tank_id"),
@Result(property ="tankName",column ="tank_name"),
@Result(property ="envTemp",column ="env_temp")
@Result(property ="envTemp",column ="env_temp"),
@Result(property ="pressure",column ="pressure"),
@Result(property ="pressureSet",column ="pressure_set"),
@Result(property ="backControlMode",column ="back_control_mode"),
})
@Select("select * from now_data where building_id=#{buildingId} order by cast(pump_id as int) ")
List<NowDataEntity> queryNowData(@Param("buildingId") String buildingId);
@ -620,4 +623,71 @@ public interface NowDataMapper {
" where building_id = #{buildingId} and pump_id = #{pumpId} and pump_name = #{pumpName} " +
"</script>")
void updateMultiNowData(NowDataEntity nowDataEntity);
@Update("update now_data set pressure=#{value} where building_id=#{buildingId} and pump_id=#{deviceAddr} and pump_name=#{deviceName}")
void updatePressure(String buildingId, String deviceAddr, String value, String deviceName);
@Update("update now_data set pressure_set=#{value} where building_id=#{buildingId} and pump_id=#{deviceAddr} and pump_name=#{deviceName}")
void updatePressureSet(String buildingId, String deviceAddr, String value, String deviceName);
@Update("<script>" +
"update " +
" now_data " +
"set " +
" water_level = #{value} " +
"from " +
" device_install di " +
"where " +
" di.device_addr = now_data.pump_id " +
" and di.building_id = now_data.building_id " +
" and di.device_name = now_data.pump_name " +
" and di.building_id = #{buildingId} " +
"<if test='deviceAddr!=null and deviceAddr != \"\"'>" +
" and di.device_addr = #{deviceAddr} " +
"</if>" +
"<if test='deviceName!=null and deviceName != \"\"'>" +
" and di.device_name = #{deviceName} " +
"</if>" +
" and di.is_single_box = #{isSingleBox} " +
"</script>"
)
void updateBoxLevel(String buildingId, String deviceAddr, String value, String deviceName, int isSingleBox);
@Update("<script>" +
"update " +
" now_data " +
"set " +
" level_set = #{value} " +
"from " +
" device_install di " +
"where " +
" di.device_addr = now_data.pump_id " +
" and di.building_id = now_data.building_id " +
" and di.device_name = now_data.pump_name " +
" and di.building_id = #{buildingId} " +
"<if test='deviceAddr!=null and deviceAddr != \"\"'>" +
" and di.device_addr = #{deviceAddr} " +
"</if>" +
"<if test='deviceName!=null and deviceName != \"\"'>" +
" and di.device_name = #{deviceName} " +
"</if>" +
" and di.is_single_box = #{isSingleBox} " +
"</script>"
)
void updateBoxLevelSet(String buildingId, String deviceAddr, String value, String deviceName, int isSingleBox);
@Update("update now_data set level_set=#{value} where building_id=#{buildingId} and pump_id=#{deviceAddr} and pump_name=#{deviceName}")
void updateSingleBoxLevelSet(String buildingId, String deviceAddr, String value, String deviceName);
@Update("update now_data set up_water_state=#{value} where building_id=#{buildingId} and pump_id=#{deviceAddr} and pump_name=#{deviceName}")
void updateUpWaterState(String buildingId, String deviceAddr, String value, String deviceName);
@Update("update now_data set use_water_state=#{value} where building_id=#{buildingId} and pump_id=#{deviceAddr} and pump_name=#{deviceName}")
void updateUseWaterState(String buildingId, String deviceAddr, String value, String deviceName);
@Update("update now_data set back_water_state=#{value} where building_id=#{buildingId} ")
void updateBackWaterState(Long buildingId, String value);
@Update("update now_data set back_control_model=#{value} where building_id=#{buildingId} and pump_id=#{deviceAddr} and pump_name=#{deviceName}")
void updateBackControlModel(String buildingId, String deviceAddr, String value, String deviceName);
}

13
user-service/src/main/java/com/mh/user/model/MultiControlModel.java

@ -32,13 +32,22 @@ public class MultiControlModel {
private int upValveRunState; //补水电磁阀运行状态 1:运行;0:停止
private int backValveSingleRunState; //回水单箱电磁阀运行状态 1:运行;0:停止
private int backValveDoubleRunState; //回水双箱电磁阀运行状态 1:运行;0:停止
private int backElectricValveDoubleRunState; //回水多箱电动阀运行状态 1:运行;0:停止
private int gwRunState; // 网关运行状态 标志位(连接状态) 0:正常;1:不在线;2:异常
private int backControlMode; //回水运行模式 0:单箱,1:双箱
private String pumpName; //水泵名称
private String pumpId; //水泵编号
private String tempSet; //温度设置
private String waterTemp; //当前温度
private String waterLevel; //水位
private String waterTemp; //当前温度
private String waterLevel; //水位
private String levelSet; //水位设置
private String isFault; //是否故障
private String pumpRunState; //运行状态

1
user-service/src/main/java/com/mh/user/service/impl/CollectionParamsManageServiceImpl.java

@ -352,6 +352,7 @@ public class CollectionParamsManageServiceImpl implements CollectionParamsManage
case "回水泵":
return createBackPumpControlVO(dlEntry, dlItems, parentDto);
case "电动阀":
case "多箱电动阀":
return createElectricValveControlVO(dlEntry, dlItems, parentDto);
case "单箱电磁阀":
case "多箱电磁阀":

35
user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java

@ -105,6 +105,17 @@ public class NowDataServiceImpl implements NowDataService {
case "补水电磁阀":
multiControlModel.setUpValveRunState(Integer.parseInt(nowDataEntity.getRunState()));
break;
case "单箱电磁阀":
multiControlModel.setBackValveSingleRunState(Integer.parseInt(nowDataEntity.getRunState()));
multiControlModel.setBackControlMode(Integer.parseInt(nowDataEntity.getBackControlMode()));
break;
case "多箱电磁阀":
multiControlModel.setBackValveDoubleRunState(Integer.parseInt(nowDataEntity.getRunState()));
multiControlModel.setBackControlMode(Integer.parseInt(nowDataEntity.getBackControlMode()));
break;
case "多箱电动阀":
multiControlModel.setBackElectricValveDoubleRunState(Integer.parseInt(nowDataEntity.getRunState()));
break;
}
}
@ -112,10 +123,17 @@ public class NowDataServiceImpl implements NowDataService {
List<DeviceInstallEntity> devices = deviceInstallMapper.selectOfflineDevice(buildingId, "多路控制");
if (!devices.isEmpty()) {
DeviceInstallEntity deviceInstallEntity = devices.get(0);
int online = gatewayManageMapper.queryGatewayByDataCom(deviceInstallEntity.getDataCom());
Integer online = gatewayManageMapper.queryGatewayByDataCom(deviceInstallEntity.getDataCom());
if (online == null) {
online = 2;
}
multiControlModel.setGwRunState(online);
} else {
// list stream流遍历cur_date是否是今天
boolean isToday = list.stream()
.anyMatch(nowDataEntity -> DateUtil.isToday(DateUtil.stringToDate(nowDataEntity.getCurDate(), "yyyy-MM-dd HH:mm:ss")));
multiControlModel.setGwRunState(isToday ? 0 : 1); // 0: online, 1: offline
}
// 在进行遍历,获取包含热泵的对应数据
list.stream()
.filter(nowDataEntity -> nowDataEntity.getPumpName() != null && nowDataEntity.getPumpName().contains("热泵"))
@ -133,6 +151,11 @@ public class NowDataServiceImpl implements NowDataService {
} else {
multiControlModel1.setWaterLevel("离线");
}
if (!StringUtils.isBlank(nowDataEntity.getLevelSet())) {
multiControlModel1.setLevelSet(nowDataEntity.getLevelSet());
} else {
multiControlModel1.setLevelSet("--");
}
result.add(multiControlModel1);
});
// result再根据热泵名称的数字进行排序
@ -492,10 +515,14 @@ public class NowDataServiceImpl implements NowDataService {
.forEach(nowDataEntity -> nowDataEntity.setPressure(pressureValue));
String dataCom = pump.getDataCom();
if (!StringUtils.isBlank(dataCom)) {
int gwState = gatewayManageMapper.queryGatewayByDataCom(dataCom);
Integer gwState = gatewayManageMapper.queryGatewayByDataCom(dataCom);
if (gwState == null) {
gwState = 2;
}
Integer finalGwState = gwState;
nowDataEntities.stream()
.filter(nowDataEntity -> buildingId.equals(nowDataEntity.getBuildingId()))
.forEach(nowDataEntity -> nowDataEntity.setGwState(gwState == 0 ? "在线" : "离线"));
.forEach(nowDataEntity -> nowDataEntity.setGwState(finalGwState == 0 ? "在线" : "离线"));
}
break;
}

1
user-service/src/main/java/com/mh/user/service/mqtt/config/MqttConfig.java

@ -25,6 +25,7 @@ import java.util.Map;
@Configuration
@Data
@ConfigurationProperties
@ConditionalOnProperty(prefix = "mqttSpring", name = "enabled", havingValue = "true", matchIfMissing = true)
public class MqttConfig {
private static Map<MqttUseEnum, MqttClientOptions> mqttSpring;

2
user-service/src/main/java/com/mh/user/service/mqtt/config/MqttInboundConfig.java

@ -29,7 +29,7 @@ import javax.annotation.Resource;
@Slf4j
@Configuration
@IntegrationComponentScan
@ConditionalOnProperty(name = "mqtt.enabled", havingValue = "true", matchIfMissing = false)
@ConditionalOnProperty(prefix = "mqttSpring", name = "enabled", havingValue = "true", matchIfMissing = true)
public class MqttInboundConfig {
@Autowired

2
user-service/src/main/java/com/mh/user/service/mqtt/config/MqttMessageChannel.java

@ -2,6 +2,7 @@ package com.mh.user.service.mqtt.config;
import com.mh.user.constants.ChannelName;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.channel.DirectChannel;
@ -16,6 +17,7 @@ import org.springframework.messaging.MessageChannel;
*/
@Slf4j
@Configuration
@ConditionalOnProperty(prefix = "mqttSpring", name = "enabled", havingValue = "true", matchIfMissing = true)
public class MqttMessageChannel {
@Bean(name = ChannelName.OUTBOUND)

2
user-service/src/main/java/com/mh/user/service/mqtt/config/MqttOutboundConfig.java

@ -23,7 +23,7 @@ import org.springframework.messaging.MessageHandler;
@Slf4j
@Configuration
@IntegrationComponentScan
@ConditionalOnProperty(name = "mqtt.enabled", havingValue = "true", matchIfMissing = false)
@ConditionalOnProperty(prefix = "mqttSpring", name = "enabled", havingValue = "true", matchIfMissing = true)
public class MqttOutboundConfig {
@Autowired

2
user-service/src/main/java/com/mh/user/service/mqtt/handler/InboundMessageRouter.java

@ -6,6 +6,7 @@ import com.mh.user.constants.TopicEnum;
import com.mh.user.utils.SpringContextUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.integration.annotation.Router;
import org.springframework.integration.mqtt.support.MqttHeaders;
import org.springframework.integration.router.AbstractMessageRouter;
@ -27,6 +28,7 @@ import java.util.Objects;
*/
@Slf4j
@Component
@ConditionalOnProperty(prefix = "mqttSpring", name = "enabled", havingValue = "true", matchIfMissing = true)
public class InboundMessageRouter extends AbstractMessageRouter {
/** 系统基础配置 */

2
user-service/src/main/java/com/mh/user/service/mqtt/service/impl/EventsServiceImpl.java

@ -24,6 +24,7 @@ import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.messaging.MessageHeaders;
import org.springframework.stereotype.Service;
@ -50,6 +51,7 @@ import java.util.concurrent.atomic.AtomicInteger;
*/
@Slf4j
@Service
@ConditionalOnProperty(prefix = "mqttSpring", name = "enabled", havingValue = "true", matchIfMissing = true)
public class EventsServiceImpl implements IEventsService {
@Autowired

2
user-service/src/main/java/com/mh/user/service/mqtt/service/impl/MqttGatewayServiceImpl.java

@ -2,6 +2,7 @@ package com.mh.user.service.mqtt.service.impl;
import com.mh.user.service.mqtt.service.IMqttGatewayService;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.integration.mqtt.support.MqttHeaders;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;
@ -15,6 +16,7 @@ import org.springframework.stereotype.Service;
* @date 2025-02-07 08:44:55
*/
@Service
@ConditionalOnProperty(prefix = "mqttSpring", name = "enabled", havingValue = "true", matchIfMissing = true)
public class MqttGatewayServiceImpl implements IMqttGatewayService {
private final MessageChannel outboundChannel;

2
user-service/src/main/java/com/mh/user/service/mqtt/service/impl/MqttManagerServiceImpl.java

@ -17,7 +17,7 @@ import org.springframework.stereotype.Service;
*/
@Slf4j
@Service
@ConditionalOnProperty(name = "mqtt.enabled", havingValue = "true", matchIfMissing = false)
@ConditionalOnProperty(prefix = "mqttSpring", name = "enabled", havingValue = "true", matchIfMissing = true)
public class MqttManagerServiceImpl implements IMqttManagerService {
@Autowired

2
user-service/src/main/java/com/mh/user/service/mqtt/service/impl/MqttMsgSenderServiceImpl.java

@ -10,6 +10,7 @@ import com.mh.user.service.mqtt.service.IMqttGatewayService;
import com.mh.user.service.mqtt.service.IMqttMsgSenderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
@ -25,6 +26,7 @@ import java.util.UUID;
*/
@Slf4j
@Service
@ConditionalOnProperty(prefix = "mqttSpring", name = "enabled", havingValue = "true", matchIfMissing = true)
public class MqttMsgSenderServiceImpl implements IMqttMsgSenderService {
@Autowired

2
user-service/src/main/java/com/mh/user/service/mqtt/service/impl/MqttTopicServiceImpl.java

@ -2,6 +2,7 @@ package com.mh.user.service.mqtt.service.impl;
import com.mh.user.service.mqtt.service.IMqttTopicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
import org.springframework.stereotype.Service;
@ -15,6 +16,7 @@ import javax.annotation.Resource;
* @date 2024-10-29 17:36:31
*/
@Service
@ConditionalOnProperty(prefix = "mqttSpring", name = "enabled", havingValue = "true", matchIfMissing = true)
public class MqttTopicServiceImpl implements IMqttTopicService {
@Resource

4
user-service/src/main/resources/application-dev.yml

@ -110,10 +110,10 @@ logging:
amap:
key: 984603bf28ef94ac78765a3ea27a6c26
mqtt:
enabled: true
# mqtt服务器地址
mqttSpring:
# 是否启用MQTT,默认false
enabled: false
# BASIC parameters are required.
BASIC:
protocol: MQTT

2
user-service/src/main/resources/application-prod.yml

@ -169,6 +169,8 @@ mqtt:
enabled: true
mqttSpring:
# 是否启用MQTT,默认false
enabled: false
# BASIC parameters are required.
BASIC:
protocol: MQTT

108
user-service/src/main/resources/application-test.yml

@ -1,51 +1,39 @@
# 项目相关配置
mh:
# 名称
name: dev
# 版本
version: 1.0.0
# 版权年份
copyrightYear: 2025
# 文件路径 示例( Windows配置D:/mh/uploadPath,Linux配置 /home/mh/uploadPath)
profile: D:/mh/uploadPath
# 获取ip地址开关
addressEnabled: false
# 验证码类型 math 数字计算 char 字符验证
captchaType: math
server:
port: 8761 #8761创新、8762广商、8763华厦、广州理工
port: 8762 #8761创新、8762广商、8763华厦、广州理工
spring:
application:
name: user-service
datasource:
name: druidDataSource
type: com.alibaba.druid.pool.DruidDataSource
druid:
#添加allowMultiQueries=true 在批量更新时才不会出错
# url: jdbc:sqlserver://192.168.1.108:2012;DatabaseName=FSBG;allowMultiQueries=true
url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=chws_gr;allowMultiQueries=true;encrypt=false
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
username: sa
password: mh@803
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=chws_chx;allowMultiQueries=true;encrypt=false
# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
# username: sa
# password: mh@803
## url: jdbc:sqlserver://120.25.220.177:32012;DatabaseName=M_CHWS;allowMultiQueries=true
#阿里云服务器-广州理工
# url: jdbc:sqlserver://120.25.220.177:32012;DatabaseName=CHWS;allowMultiQueries=true
# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
# username: test
# password: minghan123456@
#华厦云服务器
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=CHWS;allowMultiQueries=true
# url: jdbc:sqlserver://119.29.33.133:2008;DatabaseName=chws_gsh;allowMultiQueries=true;encrypt=false
# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
# username: chws
# password: minghan123456@
#创新服务器
# url: jdbc:sqlserver://119.29.33.133:2008;DatabaseName=chws_chx;allowMultiQueries=true
# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
# username: chws
# password: mh@803
#广商服务器
# url: jdbc:sqlserver://119.29.33.133:2008;DatabaseName=chws_gsh;allowMultiQueries=true
# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
# username: chws
# password: mh@803
#本机
# url: jdbc:sqlserver://127.0.0.1:9956;DatabaseName=CHWS;allowMultiQueries=true
# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
# username: sa
# password: mh@803
#家里电脑
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=CHWS;allowMultiQueries=true
# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
# username: sa
# password: mh@803
# 测试
url: jdbc:sqlserver://106.55.173.225:57238;DatabaseName=test;allowMultiQueries=true
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
username: test
password: Ming@ratuo123!!
filters: stat,wall,config
max-active: 100
@ -65,8 +53,8 @@ spring:
config:
fail-fast: false
# 是否启用配置中心
enabled: ${SPRING_CLOUD_CONFIG_ENABLED:false}
# # 配置中心地址
enabled: false
# 配置中心地址
# uri: ${SPRING_CLOUD_CONFIG_URI:http://localhost:8763}
# redis:
# database: 0
@ -107,26 +95,46 @@ spring:
#files:
# path: ${file-path:d:/files}
log:
level:
root: info
my: debug
file:
maxsize: 30MB
#设置将SQL语句打印到控制台 level后面是 mybatis接口目录
logging:
# level:
# com:
# mh:
# user:
# mapper: DEBUG
level:
com:
mh:
user:
mapper: DEBUG
file:
max-size: 30
path: logs/${spring.application.name}
##软件最后更新日期20230111
amap:
key: 984603bf28ef94ac78765a3ea27a6c26
# mqtt服务器地址
mqttSpring:
# 是否启用MQTT,默认false
enabled: false
# BASIC parameters are required.
BASIC:
protocol: MQTT
host: 192.168.1.79
port: 1883
username: test
password: test123456
client-id: chws_nfxy_mqtt_dev
# If the protocol is ws/wss, this value is required.
path:
# Topics that need to be subscribed when initially connecting to mqtt, multiple topics are divided by ",".
inbound-topic: chws_nfxy_mqtt_dev/read/events_upload/devices
# 此部分是提供给后端生成token返回给前端,让前端使用websocket方式去和MQTT实现交互的,笔者此文的案例中并没有去实现
# 无人机远程控制模式(drone remote control)
DRC:
protocol: WS
host: 192.168.1.79
port: 8083
path: /mqtt
control:
topic: mh_control/events_control/devices

Loading…
Cancel
Save