|
|
|
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;
|
|
|
|
}
|
|
|
|
} |
...
|
...
|
|