牛逼话不多,直接上代码
接收
import com.chunxiao.dao.AlrmLogMapper;
import com.chunxiao.dao.DevicePointDataLogMapper;
import com.chunxiao.dao.EquipmentLevelTopicMapper;
import com.chunxiao.domain.AlrmLog;
import com.chunxiao.domain.DevicePointDataLog;
import com.chunxiao.domain.EquipmentLevelTopic;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.IntegrationComponentScan;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.core.MessageProducer;
import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
import org.springframework.messaging.MessagingException;
/**
* @since 1.0.0
*/
@Configuration
@IntegrationComponentScan
public class MqttReceiveConfig {
@Autowired //自己的Mapper不要误会
private DevicePointDataLogMapper devicePointDataLogMapper;
@Autowired //自己的Mapper不要误会
private EquipmentLevelTopicMapper equipmentLevelTopicMapper;
@Autowired //自己的Mapper不要误会
private AlrmLogMapper alrmLogMapper;
@Value("${spring.mqtt.username}")
private String username;
@Value("${spring.mqtt.password}")
private String password;
// @Value("${spring.mqtt.url}")
// private String hostUrl;
@Value("${spring.mqtt.client.id}")
private String clientId;
@Value("${spring.mqtt.default.topic}")
private String defaultTopic;
@Value("${spring.mqtt.completionTimeout}")
private int completionTimeout; //连接超时
@Bean
public MqttConnectOptions getMqttConnectOptions() {
MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
mqttConnectOptions.setUserName(username);
mqttConnectOptions.setPassword(password.toCharArray());
mqttConnectOptions.setServerURIs(new String[]{"tcp://59.111.56.184:1883"});
mqttConnectOptions.setKeepAliveInterval(2);
return mqttConnectOptions;
}
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
factory.setConnectionOptions(getMqttConnectOptions());
return factory;
}
//接收通道
@Bean
public MessageChannel mqttInputChannel() {
return new DirectChannel();
}
//配置client,监听的topic
@Bean
public MessageProducer inbound() {
//从本地数据库查询所有的topic
String[] strings = equipmentLevelTopicMapper.fandAll();
StringBuffer str = new StringBuffer();
String strs = null;
for (int i = 0; i < strings.length; i++) {
strs = str.append(strings[i] + ",").toString();
}
String topic = strs.substring(0, strs.length() - 1);
MqttPahoMessageDrivenChannelAdapter adapter =
new MqttPahoMessageDrivenChannelAdapter(clientId + "_inbound", mqttClientFactory(),
//此为设置topic,可以为多个
topic);
adapter.setCompletionTimeout(completionTimeout);
adapter.setConverter(new DefaultPahoMessageConverter());
adapter.setQos(1);
adapter.setOutputChannel(mqttInputChannel());
return adapter;
}
//通过通道获取数据
@Bean
@ServiceActivator(inputChannel = "mqttInputChannel")
public MessageHandler handler() {
return new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws MessagingException {
//获取发送消息的topic
String topic = message.getHeaders().get("mqtt_receivedTopic").toString();
String type = topic.substring(topic.lastIndexOf("/") + 1, topic.length());
// 持久化到数据库
EquipmentLevelTopic equipmentLevelTopic = equipmentLevelTopicMapper.selectAll(topic);
DevicePointDataLog devicePointDataLog = new DevicePointDataLog();
devicePointDataLog.setEquipmentId(equipmentLevelTopic.getEquipmentId());
devicePointDataLog.setEquipmentLevelTypeId(equipmentLevelTopic.getEquipmentLevelTypeId());
devicePointDataLog.setPointValues(message.getPayload().toString());
devicePointDataLogMapper.insertSelective(devicePointDataLog);
}
};
}
//通道2
@Bean
public MessageChannel mqttInputChannelTwo() {
return new DirectChannel();
}
//配置client2,监听的topic:hell2,hello3
@Bean
public MessageProducer inbound1() {
String[] strings = equipmentLevelTopicMapper.fandAllAblam();
StringBuffer str = new StringBuffer();
String strs = null;
for (int i = 0; i < strings.length; i++) {
strs = str.append(strings[i] + ",").toString();
}
String topic = strs.substring(0, strs.length() - 1);
MqttPahoMessageDrivenChannelAdapter adapter =
new MqttPahoMessageDrivenChannelAdapter(clientId + "_inboundTwo", mqttClientFactory(),
topic);
adapter.setCompletionTimeout(completionTimeout);
adapter.setConverter(new DefaultPahoMessageConverter());
adapter.setQos(1);
adapter.setOutputChannel(mqttInputChannelTwo());
return adapter;
}
//通过通道2获取数据
@Bean
@ServiceActivator(inputChannel = "mqttInputChannelTwo")
public MessageHandler handlerTwo() {
return new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws MessagingException {
//获取发送消息的topic
String topic = message.getHeaders().get("mqtt_receivedTopic").toString();
String type = topic.substring(topic.lastIndexOf("/") + 1, topic.length());
// 持久化到数据库
EquipmentLevelTopic equipmentLevelTopic = equipmentLevelTopicMapper.selectAll(topic);
AlrmLog alrmLog = new AlrmLog();
alrmLog.setEquipmentId(equipmentLevelTopic.getEquipmentId());
alrmLog.setEquipmentLevelTypeId(equipmentLevelTopic.getEquipmentLevelTypeId() + "");
alrmLog.setAlrmValue(message.getPayload().toString());
alrmLogMapper.insertSelective(alrmLog);
}
};
}
}
里边的代码格式我有所改动,耐下心看,寻找适合你自己的
发送
import org.springframework.integration.annotation.MessagingGateway;
import org.springframework.integration.mqtt.support.MqttHeaders;
import org.springframework.messaging.handler.annotation.Header;
/**
* @data 2019/4/4 0004 -下午 4:39
*/
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface MqttGateway {
void sendToMqtt(String data,@Header(MqttHeaders.TOPIC) String topic);
}
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.IntegrationComponentScan;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
/**
* 〈一句话功能简述〉<br>
* 〈MQTT发送消息配置〉
*
* @author AnswerChang
* @create 2018/6/4
* @since 1.0.0
*/
@Configuration
@IntegrationComponentScan
public class MqttSenderConfig {
@Value("${spring.mqtt.username}")
private String username;
@Value("${spring.mqtt.password}")
private String password;
@Value("${spring.mqtt.url}")
private String hostUrl;
@Value("${spring.mqtt.client.id}")
private String clientId;
@Value("${spring.mqtt.default.topic}")
private String defaultTopic;
@Bean
public MqttConnectOptions getMqttConnectOptions(){
MqttConnectOptions mqttConnectOptions=new MqttConnectOptions();
mqttConnectOptions.setUserName(username);
mqttConnectOptions.setPassword(password.toCharArray());
mqttConnectOptions.setServerURIs(new String[]{hostUrl});
mqttConnectOptions.setKeepAliveInterval(2);
return mqttConnectOptions;
}
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
factory.setConnectionOptions(getMqttConnectOptions());
return factory;
}
@Bean
@ServiceActivator(inputChannel = "mqttOutboundChannel")
public MessageHandler mqttOutbound() {
MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId, mqttClientFactory());
messageHandler.setAsync(true);
messageHandler.setDefaultTopic(defaultTopic);
return messageHandler;
}
@Bean
public MessageChannel mqttOutboundChannel() {
return new DirectChannel();
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
-
@author changwensong
-
@data 2019/4/4 0004 -下午 4:39
*/
@RestController
@RequestMapping("/test")
public class TestController {@Autowired
private MqttGateway mqttGateway;@PostMapping("/sendMqtt")
public String sendMqtt(@RequestParam(“sendData”) String sendData){
mqttGateway.sendToMqtt(sendData,“hello”);
return “OK”;
}
}
结束