MQTT接受消息数据

在初次接触MQTT协议时,由于数据对接,从rabbitMQ接收的消息是以16进制形式展示的非预期数字。经过排查,了解到这些数据需要转换为ASCII字符串。使用了相关jar包,包括hawtbuf-1.9.jar, hawtdispatch-1.22.jar, hawtdispatch-transport-1.22.jar, mqtt-client-1.15.jar进行处理。" 80693446,7355710,新浪体育直播爬取:篮球足球数据抓取与解析,"['Python爬虫', '数据抓取', '网络爬虫', 'HTML解析', '网页结构分析']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前未接触过MQTT协议,前几天因为数据对接,提供方是rabbitMQ 使用MQTT协议发布的消息,接收到消息后发现不是预期的数据,一堆数字,折腾了两三个小时发现是16进制的数据,最后转换成ascii字符串。



import java.net.URISyntaxException;

import org.apache.commons.codec.binary.Hex;
import org.fusesource.mqtt.client.Future;  
import org.fusesource.mqtt.client.FutureConnection;  
import org.fusesource.mqtt.client.MQTT;  
import org.fusesource.mqtt.client.Message;  
import org.fusesource.mqtt.client.QoS;  
import org.fusesource.mqtt.client.Topic;  
  
/** 
 * 采用Future模式 订阅主题   
 */  
public class MQTTFutureClient {  
  
    private final static String CONNECTION_STRING = "tcp://00.00.00.00:xxxx";  
    private final static boolean CLEAN_START = true;  
    private final static short KEEP_ALIVE = 30;// 低耗网络,但是又需要及时获取数据,心跳30s  
    private final static String CLIENT_ID = "22028197";  
    public static Topic[] topics = {   
        new Topic("artemis/event_face/3187675137/admin", QoS.AT_LEAST_ONCE)};  
      
    public final static long RECONNECTION_ATTEMPT_MAX = 6;  
    public final static long RECONNECTION_DELAY = 2000;  
  
    public final static int SEND_BUFFER_SIZE = 2 * 1024 * 1024;// 发送最大缓冲为2M  
  
    public static void main(String[] args) {  
        // 创建MQTT对象  
        MQTT mqtt = new MQTT();  
        try {  
            // 设置mqtt broker的ip和端口  
            mqtt.setHost(CONNECTION_STRING);  
            // 连接前清空会话信息  
            mqtt.setCleanSession(CLEAN_START);  
            // 设置重新连接的次数  
            mqtt.setReconnectAttemptsMax(RECONNECTION_ATTEMPT_MAX);  
            // 设置重连的间隔时间  
            mqtt.setReconnectDelay(RECONNECTION_DELAY);  
            // 设置心跳时间  
            mqtt.setKeepAlive(KEEP_ALIVE);  
            // 设置缓冲的大小  
            mqtt.setSendBufferSize(SEND_BUFFER_SIZE);  
            //设置客户端id  
            mqtt.setClientId(CLIENT_ID);  
            mqtt.setUserName("artemis_22028197_15BPX2S5");
            mqtt.setPassword("XT9HO0RL");
  
            // 获取mqtt的连接对象BlockingConnection  
            final FutureConnection connection = mqtt.futureConnection();  
            connection.connect();  
            connection.subscribe(topics);  
            while (true) {  
                Future<Message> futrueMessage = connection.receive();  
                Message message = futrueMessage.await(); 
                System.out.println(message.getPayloadBuffer());
                
                String msg = String.valueOf(message.getPayloadBuffer());
                String jsonStr = "";
                if(msg.substring(0, 3).equals("hex")) {
              	  msg=msg.substring(5);
                	byte[] bytes=Hex.decodeHex(msg.toCharArray());
                	jsonStr =  new String(bytes,"GBK");
                	System.out.println(jsonStr);
                }else {
                	jsonStr = msg.substring(7);
                	System.out.println(jsonStr);
                }
                
            }  
        }  catch (URISyntaxException e) {  
            e.printStackTrace();  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
        }  
    }

}  

相关的jar包如下:

hawtbuf-1.9.jar,hawtdispatch-1.22.jar,hawtdispatch-transport-1.22.jar,mqtt-client-1.15.jar

### MQTT 数据接收偏移问题解决方案 在处理 MQTT 数据接收时,偏移问题可能源于多种原因,例如网络延迟、消息重传、客户端或服务器的实现不一致等。以下是一些可能的解决方案和建议: 1. **确保底层传输协议的可靠性** 根据规范[^2],MQTT 客户端必须支持使用一个或多个底层传输协议,只要这些协议能够提供有序的、可靠的、双向字节流。如果当前使用的传输协议无法满足这些要求,可能会导致数据偏移。可以考虑更换为更可靠的传输协议(如 TCP),以减少数据偏移的可能性。 2. **启用 QoS 机制** MQTT 协议提供了三种服务质量(QoS)级别:0(至多一次)、1(至少一次)和 2(恰好一次)。为了防止数据偏移,建议使用 QoS 1 或 QoS 2。QoS 1 确保消息至少被传递一次,而 QoS 2 则确保消息恰好被传递一次。通过设置适当的 QoS 级别,可以有效减少因消息重传或丢失而导致的偏移问题。 3. **实现幂等性** 在处理接收到的消息时,可以通过实现幂等性来避免重复处理相同的消息。参考引用中的 `MemberService` 类[^3],展示了如何使用 `ConcurrentHashMap` 来存储已处理的消息 ID,从而避免对同一消息进行多次处理。这种方法可以有效地解决因消息重传或其他原因导致的数据偏移问题。 4. **优化消息确认机制** MQTT 协议依赖于消息确认机制来确保消息传递的可靠性。如果客户端未能及时发送确认消息,可能会导致服务器重新发送消息,从而引发数据偏移。可以通过以下方式优化确认机制: - 减少消息处理时间,确保在合理的时间内完成消息确认。 - 配置合适的超时时间,避免因超时导致的消息重传。 5. **监控网络状态** 网络延迟或中断可能导致消息顺序混乱或丢失,从而引发数据偏移问题。可以通过监控网络状态并调整连接参数(如心跳间隔、重连策略等)来改善这一问题。 6. **代码示例:实现幂等性** 以下是一个基于 Python 的 MQTT 客户端示例,展示如何通过存储已处理的消息 ID 来实现幂等性: ```python import paho.mqtt.client as mqtt from threading import Lock # 已处理消息 ID 的集合 processed_message_ids = set() message_id_lock = Lock() def on_message(client, userdata, message): global processed_message_ids msg_id = message.payload.decode("utf-8") with message_id_lock: if msg_id in processed_message_ids: print(f"Duplicate message detected: {msg_id}") return processed_message_ids.add(msg_id) print(f"Processing new message: {msg_id}") client = mqtt.Client() client.on_message = on_message client.connect("mqtt.example.com", 1883, 60) client.subscribe("test/topic", qos=1) client.loop_forever() ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值