之前未接触过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