作者 钟来

U渔设备的档位bug修改

正在显示 16 个修改的文件 包含 417 行增加79 行删除
... ... @@ -53,7 +53,7 @@ public class ProtocolParserAndPurificationFactory<T> {
Topic topic = protocolParserFactory.analysisTopic(topicStr);
//通过解析服务器将数据解析成键值对的形式存储到json对象里面,方便清洗
AnalysisResult analysisResult = protocolParserFactory.analysisPayload(topic,payload);
if(null == analysisResult.getJsonObject())
if(null == analysisResult || null == analysisResult.getJsonObject())
{
return null;
}
... ...
... ... @@ -17,6 +17,7 @@ import com.zhonglai.luhui.device.protocol.factory.dto.DeviceCommand;
import com.zhonglai.luhui.device.protocol.factory.dto.NoticeMessageDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.service.IotThingsModelService;
import com.zhonglai.luhui.device.protocol.factory.service.MqttSubscribeService;
import com.zhonglai.luhui.device.protocol.factory.service.PersistenceDBService;
import net.jodah.expiringmap.ExpirationListener;
import net.jodah.expiringmap.ExpirationPolicy;
... ... @@ -34,7 +35,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
... ... @@ -65,6 +68,9 @@ public class DeviceCommandListenService implements RocketMQReplyListener<Message
@Autowired
private IotThingsModelService iotThingsModelService;
@Autowired
private MqttSubscribeService mqttSubscribeService;
@Value("${mqtt.client.operationTime}")
private long operationTime; //客户端操作时间
... ... @@ -101,14 +107,14 @@ public class DeviceCommandListenService implements RocketMQReplyListener<Message
NoticeMessageDto noticeMessageDomain = deviceCommandServiceFactory.read(deviceCommand.getDeviceId(), deviceCommand.getData());
if(null == noticeMessageDomain)
{
new Message(MessageCode.DEFAULT_FAIL_CODE,"该设备不支持读取功能");
return new Message(MessageCode.DEFAULT_FAIL_CODE,"该设备不支持读取功能");
}
return sendMessage(noticeMessageDomain);
case write:
noticeMessageDomain = deviceCommandServiceFactory.write(deviceCommand.getDeviceId(), deviceCommand.getData());
if(null == noticeMessageDomain)
{
new Message(MessageCode.DEFAULT_FAIL_CODE,"该设备不支持写入功能");
return new Message(MessageCode.DEFAULT_FAIL_CODE,"该设备不支持写入功能");
}
return sendMessage(noticeMessageDomain);
case notice:
... ... @@ -130,6 +136,13 @@ public class DeviceCommandListenService implements RocketMQReplyListener<Message
case upIotThingsModelTranslate:
iotThingsModelService.upIotThingsModelTranslate(deviceCommand.getData().get("product_id").getAsInt());
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,"指令发送成功");
case addSubscribe:
Set<Integer> okProduct = mqttSubscribeService.assignIpAddSubscribe(deviceCommand.getData().get("ip").getAsString(),deviceCommand.getData().get("product_ids").getAsString());
if (null == okProduct || okProduct.size() ==0)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"订阅为成功请检查原因");
}
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,"订阅成功", Arrays.toString(okProduct.toArray()));
default:
return new Message(MessageCode.DEFAULT_FAIL_CODE,"指令类型不存在,请联系管理员");
}
... ... @@ -195,14 +208,14 @@ public class DeviceCommandListenService implements RocketMQReplyListener<Message
*/
public void replySendMessage(String clientid, ApiClientRePlyDto apiClientRePlyDto)
{
log.info("开始通知{},数据:{}",clientid,apiClientRePlyDto);
log.info("开始通知{},数据:{}",clientid,GsonConstructor.get().toJson(apiClientRePlyDto));
//判断有没有需要回复的客户端,如果有就回复
ClienConnection clienConnection = getClienConnection(clientid);
if(null != clienConnection)
{
synchronized(clienConnection)
{
log.info("正在通知{},通知结果{}",clientid,apiClientRePlyDto);
log.info("正在通知{},通知结果{}",clientid,GsonConstructor.get().toJson(apiClientRePlyDto));
clienConnection.reply(apiClientRePlyDto);
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.dto;
public enum CommandType {
/**
* 读
*/
read,
/**
* 写
*/
write,
/**
* 通知
*/
notice,
/**
* 清除网关缓存
*/
cleanDeviceHost,
/**
* 清除终端缓存
*/
cleanDeviceInfo,
/**
* 更新数据模型
*/
upIotThingsModel,
upIotThingsModelTranslate
/**
* 更新数据翻译模型
*/
upIotThingsModelTranslate,
/**
* 添加订阅
*/
addSubscribe
}
... ...
package com.zhonglai.luhui.device.protocol.factory.dto;
import lombok.Data;
@Data
public class ProtocolSubTopics {
private Integer productid;
private Integer type;
private String sub_topics;
private Integer role_id;
private String mqtt_username;
}
... ...
package com.zhonglai.luhui.device.protocol.factory.dto;
import java.util.Set;
public class SubTopicsAndproductDto {
private Set<String> tlist;
private Set<Integer> plist;
private Set<String> untlist;
private boolean isUp;
public Set<String> getUntlist() {
return untlist;
}
public void setUntlist(Set<String> untlist) {
this.untlist = untlist;
}
public Set<String> getTlist() {
return tlist;
}
public void setTlist(Set<String> tlist) {
this.tlist = tlist;
}
public Set<Integer> getPlist() {
return plist;
}
public void setPlist(Set<Integer> plist) {
this.plist = plist;
}
public boolean isUp() {
return isUp;
}
public void setUp(boolean up) {
isUp = up;
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.service;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.device.analysis.comm.config.SysParameter;
import com.zhonglai.luhui.device.domain.IotProduct;
import com.zhonglai.luhui.device.domain.IotProtocolClass;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolSubTopics;
import com.zhonglai.luhui.device.protocol.factory.dto.SubTopicsAndproductDto;
import com.zhonglai.luhui.device.protocol.factory.service.impl.DefaultDbService;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Service
public class MqttSubscribeService {
private final Logger log = LoggerFactory.getLogger(this.getClass());
private static Set<String> topics = new HashSet<>();
private MqttClient mqttclient;
@Autowired
private PersistenceDBService persistenceDBService;
@Value("${mqtt.productids:#{null}}")
private String productids;
public Set<Integer> subscribe(MqttClient mqttclient) throws MqttException
{
return subscribe(mqttclient,productids);
}
public Set<Integer> subscribe(MqttClient mqttclient,String productids) throws MqttException {
this.mqttclient = mqttclient;
return addSubscribe(productids);
}
/**
* 根据产品id订阅
* 如果产品id为空,就根据ip订阅
* @param productids
* @return
* @throws MqttException
*/
public Set<Integer> addSubscribe(String productids) throws MqttException
{
if(null == mqttclient || !mqttclient.isConnected())
{
return null;
}
if (StringUtils.isEmpty(productids))
{
List<ProtocolSubTopics> list = persistenceDBService.getProtocolSubTopicsFromIp(SysParameter.service_ip);
SubTopicsAndproductDto subTopicsAndproductDto = getSubTopicsFromProtocolSubTopics(list);
return subscribeForProductids(subTopicsAndproductDto);
}
List<ProtocolSubTopics> list = persistenceDBService.getProtocolSubTopicsFromProductids(productids,"1".equals(System.getProperty("RunInIDEA"))?false:true); //如果是本地环境就不需要ip的null,因为后面也不会修改ip
SubTopicsAndproductDto subTopicsAndproductDto = getSubTopicsFromProtocolSubTopics(list);
return subscribeForProductids(subTopicsAndproductDto);
}
private Set<Integer> subscribeForProductids(SubTopicsAndproductDto subTopicsAndproductDto) throws MqttException {
//如果卸载topic是存在的就先卸载
Set<String> untlist = subTopicsAndproductDto.getUntlist();
if(null != untlist && untlist.size()>0)
{
String[] sts = new String[untlist.size()];
int i=0;
for (String s:untlist)
{
sts[i++] = s;
}
mqttclient.unsubscribe(sts);
}
if(subTopicsAndproductDto.isUp())
{
Set<String> ts = subTopicsAndproductDto.getTlist();
String[] sts = new String[ts.size()];
int i=0;
for (String s:ts)
{
sts[i++] = s;
}
mqttclient.subscribe(sts);
log.info("-----------topic【{}】订阅成功--------------------",sts);
if (!"1".equals(System.getProperty("RunInIDEA"))) //如果是本地环境不需要跟新服务器地址
{
//订阅成功,跟新订阅服务器地址
persistenceDBService.upSubscribeServiceIp(subTopicsAndproductDto.getPlist(), SysParameter.service_ip);
}
}
return subTopicsAndproductDto.getPlist();
}
/**
* 指定ip订阅产品id
* 如果产品已经被订阅就先取消订阅
* @param ip
* @param productids
* @return
*/
public Set<Integer> assignIpAddSubscribe(String ip,String productids)
{
if(SysParameter.service_ip.equals(ip))
{
try {
List<ProtocolSubTopics> list = persistenceDBService.getProtocolSubTopicsFromProductids(productids,false);
SubTopicsAndproductDto subTopicsAndproductDto = getSubTopicsFromProtocolSubTopicsAndIp(list,ip);
return subscribeForProductids(subTopicsAndproductDto);
} catch (MqttException e) {
return null;
}
}
return null;
}
/**
* 根据产品订阅信息和ip,生成topic
* ip用户来判断是否和当前服务器ip一直,如果不一直就卸载topic,一致就订阅topic
* @param list
* @return
*/
private SubTopicsAndproductDto getSubTopicsFromProtocolSubTopicsAndIp(List<ProtocolSubTopics> list,String ip)
{
SubTopicsAndproductDto subTopicsAndproductDto= new SubTopicsAndproductDto();
if(null != list && list.size()!=0)
{
Set<String> tlist = new HashSet<>();
Set<Integer> plist = new HashSet<>();
Set<String> untlist = new HashSet<>();
for (ProtocolSubTopics protocolSubTopics:list)
{
if (StringUtils.isNotEmpty(protocolSubTopics.getSub_topics()))
{
String[] ps = protocolSubTopics.getSub_topics().split(",");
for (String p:ps)
{
String topic = generateTopicFromSub_topics(protocolSubTopics.getRole_id(),protocolSubTopics.getMqtt_username(),p);
if(topics.contains(topic))
{
untlist.add(topic);
}
if(SysParameter.service_ip.equals(ip))
{
plist.add(protocolSubTopics.getProductid());
tlist.add(topic);
topics.add(topic);
subTopicsAndproductDto.setUp(true);
}
}
}
}
subTopicsAndproductDto.setPlist(plist);
subTopicsAndproductDto.setTlist(tlist);
subTopicsAndproductDto.setUntlist(untlist);
}
return subTopicsAndproductDto;
}
/**
* 根据产品订阅信息,生成topic
* @param list
* @return
*/
private SubTopicsAndproductDto getSubTopicsFromProtocolSubTopics(List<ProtocolSubTopics> list)
{
SubTopicsAndproductDto subTopicsAndproductDto= new SubTopicsAndproductDto();
if(null != list && list.size()!=0)
{
Set<String> tlist = new HashSet<>();
Set<Integer> plist = new HashSet<>();
for (ProtocolSubTopics protocolSubTopics:list)
{
if (StringUtils.isNotEmpty(protocolSubTopics.getSub_topics()))
{
String[] ps = protocolSubTopics.getSub_topics().split(",");
for (String p:ps)
{
String topic = generateTopicFromSub_topics(protocolSubTopics.getRole_id(),protocolSubTopics.getMqtt_username(),p);
if(!topics.contains(topic))
{
plist.add(protocolSubTopics.getProductid());
tlist.add(topic);
topics.add(topic);
subTopicsAndproductDto.setUp(true);
}
}
}
}
subTopicsAndproductDto.setPlist(plist);
subTopicsAndproductDto.setTlist(tlist);
}
return subTopicsAndproductDto;
}
private String generateTopicFromSub_topics(Integer roleid,String mqtt_username,String topicType)
{
StringBuffer topicStringBuffer = new StringBuffer("/");
topicStringBuffer.append(roleid);
topicStringBuffer.append("/");
topicStringBuffer.append(mqtt_username);
topicStringBuffer.append("/");
topicStringBuffer.append("+");
topicStringBuffer.append("/");
topicStringBuffer.append("+");
topicStringBuffer.append("/");
topicStringBuffer.append(topicType);
String topic = topicStringBuffer.toString();
return topic;
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.service;
import cn.hutool.core.bean.BeanUtil;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.StringUtils;
... ... @@ -12,14 +13,13 @@ import com.zhonglai.luhui.device.protocol.factory.config.DeviceCach;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceInfoDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolSubTopics;
import com.zhonglai.luhui.device.protocol.factory.service.impl.DefaultDbService;
import com.zhonglai.luhui.device.protocol.factory.sync.ProtocolSyncFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 和数据库有个的操作都在这里
... ... @@ -128,6 +128,34 @@ public class PersistenceDBService {
return defaultDbService.getIotProductById(id);
}
/**
* 获取产品订阅列表
* @param productids
* @return
*/
public List<ProtocolSubTopics> getProtocolSubTopicsFromProductids(String productids,boolean isNotIp)
{
List<ProtocolSubTopics> list = defaultDbService.getSubTopicsFromProtocolClassToProductids(productids,isNotIp);
return list;
}
/**
* 同一个ip监听的产品列表
* @param ip
* @return
*/
public List<ProtocolSubTopics> getProtocolSubTopicsFromIp(String ip)
{
List<ProtocolSubTopics> list = defaultDbService.getProtocolSubTopicsFromIp(ip);
return list;
}
public int upSubscribeServiceIp(Set<Integer> ids, String ip) {
String is = Arrays.toString(ids.toArray());
return defaultDbService.upSubscribeServiceIp(is,ip);
}
public Map<String,IotThingsModel> getIotThingsModelMap(Integer product_id)
{
List<IotThingsModel> list = defaultDbService.getIotThingsModelList(product_id);
... ...
... ... @@ -11,6 +11,7 @@ import com.zhonglai.luhui.device.analysis.comm.dto.TableGenerateSqlEnum;
import com.zhonglai.luhui.device.domain.*;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceInfoDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolSubTopics;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
... ... @@ -206,4 +207,37 @@ public class DefaultDbService {
return 0;
}
/**
* 根据产品id查询订阅信息
* @param productids
* @param isNotIp 是否需要subscribe_service_ip为空
* @return
*/
public List<ProtocolSubTopics> getSubTopicsFromProtocolClassToProductids(String productids,boolean isNotIp)
{
StringBuffer stringBuffer = new StringBuffer("SELECT b.id productid,a.`type`,a.sub_topics,b.`role_id`,b.`mqtt_username` FROM `iot_protocol_class` a LEFT JOIN `iot_product` b ON b.`analysis_clas`=a.`id` WHERE a.`type`=1 "+(isNotIp?"AND b.`subscribe_service_ip` is null":"")+" AND b.`id` IN(");
stringBuffer.append(productids);
stringBuffer.append(")");
return baseDao.findBysql(stringBuffer.toString(), ProtocolSubTopics.class);
}
public List<ProtocolSubTopics> getProtocolSubTopicsFromIp(String ip)
{
StringBuffer stringBuffer = new StringBuffer("SELECT b.id productid,a.`type`,a.sub_topics,b.`role_id`,b.`mqtt_username` FROM `iot_protocol_class` a LEFT JOIN `iot_product` b ON b.`analysis_clas`=a.`id` WHERE a.`type`=1 AND b.`subscribe_service_ip` = ?");
return baseDao.findBysql(stringBuffer.toString(), ProtocolSubTopics.class,ip);
}
/**
* 跟新订阅服务地址
* @param ids
* @param ip
* @return
*/
public int upSubscribeServiceIp(String ids,String ip) {
return baseDao.updateBySql("UPDATE `iot_product` SET subscribe_service_ip=? WHERE id in ("+ids+")",ip);
}
public String getProductIdsByIp(String ip)
{
return baseDao.findBysql("SELECT GROUP_CONCAT(id) ids FROM `iot_product` WHERE subscribe_service_ip = ? GROUP BY subscribe_service_ip",String.class,ip);
}
}
... ...
... ... @@ -12,7 +12,7 @@ import com.zhonglai.luhui.device.protocol.uyu.analysis.topic.CkaDtSndR;
import com.zhonglai.luhui.device.protocol.uyu.analysis.topic.CkaDtSndS;
public class UyuProtocolParserFactoryImpl implements ProtocolParserFactory<byte[]> {
private static final String topicModel = "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{topicType}}/{{sorclientid}}";
private static final String topicModel = "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{topicType}}";
@Override
public Topic analysisTopic(String topicStr) {
Topic topic = TopicUtil.initTopicFromModelStr(topicStr,topicModel);
... ...
package com.zhonglai.luhui.device.protocol.uyu.analysis.topic;
import cn.hutool.core.map.MapUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonObject;
import com.ruoyi.common.constant.GenConstants;
import com.ruoyi.common.utils.ByteUtil;
... ... @@ -60,7 +63,7 @@ public class CkaDtSndS {
JsonObject senserData = new JsonObject();
jsonObject.add(addres+"",senserData);
byte b5 = payload[4];
int dangwei = ByteUtil.getBitsValue(b5,0,3);
int dangwei = ByteUtil.getBitsValue(b5,0,3)+1;
int kaiguan = ByteUtil.getBitValue(b5,7);
int zhuanshu = new Long(ByteUtil.bytesToLongDESC(payload,5,2)).intValue();
... ... @@ -93,7 +96,7 @@ public class CkaDtSndS {
@Override
public void setReplyMessage(Message message) {
message.setCode(MessageCode.DEFAULT_SUCCESS_CODE);
message.setData(GsonConstructor.get().fromJson(jsonObject.toString(), HashMap.class));
message.setData(JSONObject.parseObject(jsonObject.toString(),HashMap.class));
}
});
}
... ...
... ... @@ -56,13 +56,7 @@ public class DeviceCommandListenServiceImpl implements DeviceCommandServiceFacto
private Topic getWriteTopic(String deviceId, IotProduct iotProduct)
{
Topic topic = new Topic();
if (deviceId.indexOf("_")>0)
{
topic.setTopicType("CKA-DT-SND_R/"+deviceId.split("_")[1]);
}else{
topic.setTopicType("CKA-DT-SND_R/"+deviceId);
}
topic.setTopicType("CKA-DT-SND_R");
topic.setClientid(deviceId);
topic.setRoleid(iotProduct.getRole_id()+"");
topic.setUsername(iotProduct.getMqtt_username());
... ...
... ... @@ -31,7 +31,7 @@ public class MqttServiceListenApplication {
public static void main(String[] args) {
log.info("启动服务");
// System.setProperty("RunInIDEA",checkRunInIDEA());
System.setProperty("RunInIDEA",checkRunInIDEA());
SpringApplicationBuilder builder = new SpringApplicationBuilder(MqttServiceListenApplication.class);
builder.run( args);
... ...
... ... @@ -6,29 +6,32 @@ import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.protocol.factory.comm.DataLogType;
import com.zhonglai.luhui.device.protocol.factory.comm.DeviceDataLog;
import com.zhonglai.luhui.device.protocol.factory.service.BaseCallback;
import com.zhonglai.luhui.device.protocol.factory.service.MqttSubscribeService;
import lombok.SneakyThrows;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Set;
@Component
public class MqttCallback extends BaseCallback implements MqttCallbackExtended {
private static final String topicOnlineModel = "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{topicType}}";
private MqttClient mqttclient;
@Autowired
private TerminalService terminalService; //客户端服务
private MqttSubscribeService mqttSubscribeService;
@SneakyThrows
@Override
public void connectComplete(boolean b, String s) {
// 连接成功
log.info("连接成功");
terminalService.subscribe();
Set<Integer> topics = mqttSubscribeService.subscribe(mqttclient);
log.info("-----------产品id{}订阅成功--------------------",topics);
}
@Override
... ... @@ -46,16 +49,7 @@ public class MqttCallback extends BaseCallback implements MqttCallbackExtended {
DeviceDataLog.info(baseTopic.getClientid(), DataLogType.发来数据,s,mqttMessage.toString().replaceAll("\\n","").replaceAll("\\s", ""));
try {
//过滤在线消息
// if (s.endsWith("online"))
// {
// String state = new String(mqttMessage.getPayload());
// deviceCashUpService.upOnline(state);
// return ;
// }
messageArrived(baseTopic.getClientid(),s,mqttMessage.getPayload());
}catch (Exception e)
{
log.error(s+"解析失败",e);
... ... @@ -72,9 +66,9 @@ public class MqttCallback extends BaseCallback implements MqttCallbackExtended {
}
}
public MqttCallback binldTerminalService(TerminalService terminalService)
public MqttCallback binldTerminalService(MqttClient mqttclient)
{
this.terminalService = terminalService;
this.mqttclient = mqttclient;
return this;
}
... ...
package com.zhonglai.luhui.mqtt.service.proxy.comm.service;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.device.analysis.dto.MessageCodeType;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.protocol.factory.control.ClienNoticeServiceFactory;
import com.zhonglai.luhui.device.protocol.factory.dto.NoticeMessageDto;
... ... @@ -18,7 +14,7 @@ import org.springframework.stereotype.Service;
public class MqttClienNoticeServiceImpl implements ClienNoticeServiceFactory {
private static final Logger log = LoggerFactory.getLogger(MqttClienNoticeServiceImpl.class);
@Autowired
private TerminalService terminalService;
private TerminalServiceImpl terminalServiceImpl;
@Override
public boolean sendMessage( NoticeMessageDto noticeMessageDomain) {
if(null == noticeMessageDomain || null == noticeMessageDomain.getCommd())
... ... @@ -28,7 +24,7 @@ public class MqttClienNoticeServiceImpl implements ClienNoticeServiceFactory {
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setPayload(noticeMessageDomain.getCommd());
try {
terminalService.publish(TopicUtil.generateSendMessageTopic(noticeMessageDomain.getTopic(),noticeMessageDomain.getTopicconfig()),mqttMessage);
terminalServiceImpl.publish(TopicUtil.generateSendMessageTopic(noticeMessageDomain.getTopic(),noticeMessageDomain.getTopicconfig()),mqttMessage);
return true;
} catch (MqttException e) {
log.error("转发消息异常",e);
... ...
package com.zhonglai.luhui.mqtt.service.proxy.comm.service;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.device.analysis.comm.config.SysParameter;
import com.zhonglai.luhui.device.analysis.comm.util.ByteUtil;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.protocol.factory.comm.DataLogType;
import com.zhonglai.luhui.device.protocol.factory.comm.DeviceDataLog;
import com.zhonglai.luhui.device.protocol.factory.plugins.FileChangeListener;
import com.zhonglai.luhui.device.protocol.factory.service.impl.DefaultDbService;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
... ... @@ -22,19 +20,14 @@ import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 终端服务
*/
@Service
public class TerminalService {
private static final Logger log = LoggerFactory.getLogger(TerminalService.class);
public class TerminalServiceImpl {
private static final Logger log = LoggerFactory.getLogger(TerminalServiceImpl.class);
@Autowired
private MqttCallback mqttCallback;
... ... @@ -52,8 +45,6 @@ public class TerminalService {
private String username;
@Value("${mqtt.password}")
private String password;
@Value("${mqtt.topics}")
private List<String> topics;
private MqttClient mqttclient;
... ... @@ -69,7 +60,7 @@ public class TerminalService {
options.setConnectionTimeout(15);
//设置断开后重新连接
options.setAutomaticReconnect(true);
mqttclient.setCallback(mqttCallback.binldTerminalService(this));
mqttclient.setCallback(mqttCallback.binldTerminalService(mqttclient));
}
private void connect() throws MqttException {
... ... @@ -78,26 +69,6 @@ public class TerminalService {
mqttclient.connect(options);
}
public List<String> subscribe() throws MqttException {
List<String> ts = getCompletionTopics();
if(null != ts && ts.size() !=0)
{
mqttclient.subscribe(ts.toArray(new String[ts.size()]));
}
return ts;
}
public List<String> getCompletionTopics()
{
// if ("1".equals(System.getProperty("RunInIDEA")) && StringUtils.isNotEmpty(textTopic))
// {
// List<String> list = new ArrayList<>();
// list.add(textTopic);
// return list;
// }
return topics;
}
@PostConstruct
public void startMqttListenerService() throws MqttException, IOException {
fileChangeListener.onApplicationEvent();
... ... @@ -107,8 +78,6 @@ public class TerminalService {
sysParameter.inittopicconfig();
connect();
log.info("-----------mqtt连接服务器成功--------------------");
List<String> topics = subscribe();
log.info("-----------订阅{}成功--------------------",topics);
}
... ...
... ... @@ -28,7 +28,7 @@ mqtt:
client:
#客户端操作时间
operationTime: 10
topics: /2/UY_ZYJ_V001/#
productids: 23
#rocketmq配置信息
rocketmq:
... ...