springboot集成MQTT,生产者+消费者+MQTT.FX辅助测试

前言:项目为智能家居物联网项目,需要与嵌入式对接,通过MQTT短消息队列进行通信。
本项目为springboot+springcloud,辅助工具mqtt.fx,下载链接https://pan.baidu.com/s/130giQTKQhwSp4qeWKisrrA
//MQTT详细介绍简介稍后整理

依赖

		<dependency>
			<groupId>org.springframework.integration</groupId>
			<artifactId>spring-integration-mqtt</artifactId>
		</dependency>
		<dependency>
			<groupId>org.eclipse.paho</groupId>
			<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
			<version>1.2.0</version>
		</dependency>

mqtt生产者

@Configuration
public class MqttFunTestProducer {
	 @Value("${mqtt.producer.servers}")
	 private String servers;
	 @Value("${mqtt.producer.client-id}")
	 private String clientId;
	 @Value("${mqtt.producer.default-topic}")
	 private String defaultTopic;
	@Bean
	public MqttPahoClientFactory mqttClientFactory() {
		DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
		factory.setServerURIs(servers);
		return factory;
	}

	@Bean
	@ServiceActivator(inputChannel = "mqttOutboundChannel")
	public MessageHandler mqttOutbound() {
		MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId, mqttClientFactory());
		messageHandler.setAsync(false);
		messageHandler.setDefaultTopic(defaultTopic);
		return messageHandler;
	}

	@Bean
	public MessageChannel mqttOutboundChannel() {
		return new DirectChannel();
	}
}

mqtt调用生产者

@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface TestGateway {
 
	void sendToMqtt(String data,@Header(MqttHeaders.TOPIC) String topic);
}

测试mqtt消息发送

@RestController
@RequestMapping("/fun")
public class MqttFunController {

	@Autowired
	private TestGateway mqttGateway;
	@RequestMapping("/testMqtt")
	public String sendMqtt(@RequestParam(value = "topic") String topic, @RequestParam(value = "message") String message) {
		mqttGateway.sendToMqtt(message, topic);
		return "SUCCESS";
	}

}

mqtt.fx链接配置
mqtt.fx链接配置

mqtt.fx订阅主题

这里的主题以“FUN”为例,订阅后
订阅主题

利用postman调用消费者,发布消息
利用postman调用消费者,发布消息

这个时候我们看下mqtt.fx的订阅界面

mqtt.fx的订阅界面

下面编写mqtt消费者,来接收生产者发布的消息
mqtt消费者

@Component
@ComponentScan({ "com.hiss.service.*" })
@Configuration
public class MqttFunConsumer {
	 @Value("${mqtt.producer.servers}")
	 private String servers;
	 @Value("${mqtt.producer.client-id}")
	 private String clientId;
	 @Value("${mqtt.producer.default-topic}")
	 private String defaultTopic;

	@Bean
	public MqttPahoClientFactory mqttClientFactory() {
		DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
		factory.setServerURIs(servers);
		return factory;
	}

	@Bean
	public MessageChannel mqttTestInputChannel() {
		return new DirectChannel();
	}

	@Bean
	public MessageProducer inbound() {
		MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(clientId, mqttClientFactory(), defaultTopic);
		adapter.setCompletionTimeout(5000);
		adapter.setConverter(new DefaultPahoMessageConverter());
		adapter.setQos(1);
		adapter.setOutputChannel(mqttTestInputChannel());
		return adapter;
	}

	@Bean
	@ServiceActivator(inputChannel = "mqttTestInputChannel")
	public MessageHandler handlerTest() {
		return new MessageHandler() {

			@Override
			public void handleMessage(Message<?> message) throws MessagingException {
				try {
					//这里拿到发布的消息内容,做具体的业务逻辑处理
					String string = message.getPayload().toString();
					JsonParser jsonParser = new JsonParser();
					JsonObject object = jsonParser.parse(string).getAsJsonObject();
					String asString = object.get("game").getAsString();
				} catch (MessagingException ex) {
					logger.info(ex.getMessage());
				}
			}
		};
	}
}

** 生产配置详解**

—client-id:客户端id
—url:代理URL
—topics:适配器会接受到消息的一组以逗号分隔的主题
—qos:以逗号分隔的一组QoS值,可以是所有主题运用单一值,或者每一个主题一个值(列表必须同样长度)
—converter:MqttMessageConverter(可选项),默认DefaultPahoMessageConverter生成消息带字符串载荷(默认),携带头部包括:
mqtt_topic 接收消息主题
mqtt_duplicate 如果消息重复,值为true
mqtt_qos 业务质量
— DefaultPahoMessageConverter可配置为返回载荷原始byte[]类型,通过将其声明为一个实体类,并且设定payloadAsBytes属性
—client-factory:客户端工厂
—send-timeout: 发送超时-如果通道可能会阻塞,才会运用(例如当前已满的边界QueueChannel)
—error-channel:错误通道–如果使用的话,ErrorMessage消息下行异常会发送至该通道,载荷为MessagingException,包含错误消息与原因
—recovery-interval:恢复间隔–控制在故障之后适配器会尝试重新连接的时间间隔,默认为10000ms(10s)

消费配置详解
1) client-id:客户端id
2)url:代理URL
3)topics:适配器会接受到消息的一组以逗号分隔的主题
4)qos:以逗号分隔的一组QoS值,可以是所有主题运用单一值,或者每一个主题一个值(列表必须同样长度)
5)converter:MqttMessageConverter(可选项),默认DefaultPahoMessageConverter生成消息带字符串载荷(默认),携带头部包括:
mqtt_topic 接收消息主题
mqtt_duplicate 如果消息重复,值为true
mqtt_qos 业务质量
DefaultPahoMessageConverter可配置为返回载荷原始byte[]类型,通过将其声明为一个实体类,并且设定payloadAsBytes属性
6) client-factory:客户端工厂
7)send-timeout:发送超时-如果通道可能会阻塞,才会运用(例如当前已满的边界QueueChannel)
8)error-channel:错误通道–如果使用的话,ErrorMessage消息下行异常会发送至该通道,载荷为MessagingException,包含错误消息与原因
9)recovery-interval:恢复间隔–控制在故障之后适配器会尝试重新连接的时间间隔,默认为10000ms(10s)

发布了39 篇原创文章 · 获赞 11 · 访问量 9万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览