一、基本概念
MQTT 是一种比 HTTP 协议更简单的通信协议,适用于各种设备,包括手机、电脑以及智能手环等。每个设备都可以被视为一个节点。MQTT 主要由以下几个组件构成:
发布者(Publisher):负责将消息发送到指定的主题。
服务器(Broker):充当中介,接收发布者的消息并将其转发给订阅了相应主题的订阅者。
订阅者(Subscriber):注册接收某个主题的消息,当有消息发布到该主题时,就能收到相应的通知。
MQTT 的消息结构主要包括两个部分:
主题(Topic):一个字符串,发布者定义主题,订阅者通过订阅主题来接收消息。
负载(Payload):也是一个字符串,包含了实际的消息内容。
官方文档
https://www.emqx.com/zh
二、如何使用MQTT消息队列
1、搭建mqtt-broker中心服务器
登录一台作为服务器的Ununtu主机(本地主机或者云服务器)
2、连接到broker
首先建立一个新的client对象
MqttClient client = new MqttClient(broker, clientId, persistence);
client_id:客户端ID,并且需要保证同一个MQ中唯一
其次,连接broker并且判断连接是否成功
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setUserName(username);
connOpts.setPassword(password.toCharArray());
connOpts.setConnectionTimeout(connectionTimeout);
connOpts.setKeepAliveInterval(keepAliveInterval);
connOpts.setCleanSession(true);
log.info("mqtt connecting mqtt to broker: {}", broker);
client.connect(connOpts);
log.info("mqtt connected ");
3、从外面接受一个消息
消息到达时候的回调函数
public void messageArrived(String topic, MqttMessage message)
MyMqttMessage myMqttMessage = decoder.decode(message.toString(), MyMqttMessage.class);
MyMqttMessage.Info info = myMqttMessage.getInfo();
4、消息发送(回复打卡机)
// 获取要发送的主题
MqttTopic mqttTopic = mqttClient.getTopic("mqtt/face/" + deviceKey);
// 发布消息到指定主题
mqttTopic.publish(sendMsg);
5、进行数据同步
ApiUtil 工具类使用 Spring RestTemplate 发送 HTTP POST 请求,将指定的数据推送到服务器。
url 参数决定了数据的推送目标。
vo 对象包含具体推送的数据,通常序列化为 JSON 格式。
日志记录和重试机制(如果启用)帮助提高数据传输的可靠性。
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.postForObject(url, vo, String.class);
log.info("考勤机打卡返回信息: {}", result);