MQTT入门学习

1、 MQTT介绍

MQTT 是 Message Queuing Telemetry Transport(消息队列遥测传输协议)的简称,是IBM发布的一款轻量级发布订阅模式的通信协议,可以有效地减少代码的数量和带宽的使用,在物联网和一些移动应用等方面有较广泛的应用,比如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

MQTT遵循以下设计原则:

  • 精简,不添加可有可无的功能;
  • 发布/订阅(Pub/Sub)模式,方便消息在传感器之间传递;
  • 允许用户动态创建主题,零运维成本;
  • 把传输量降到最低以提高传输效率;
  • 把低带宽、高延迟、不稳定的网络等因素考虑在内;
  • 支持连续的会话控制;
  • 理解客户端计算能力可能很低;
  • 提供服务质量管理;
  • 假设数据不可知,不强求传输数据的类型与格式,保持灵活性。

2、 简单实用

EMQ是一款开源的物联网MQTT消息服务器,以下是简单实用

2.1下载

下载链接: https://www.emqx.cn/downloads#broker

注:cpu架构我们接触的intel、amd是X86架构,我们就选amd64

选好之后按照网站上的命令进行操作即可。

安装成功后打开浏览器输入localhost:18034就打开了管理界面,默认的用户名是admin,密码是public

2.2 Java代码相关实现

2.2.1 新建一个maven项目,添加相关依赖

<dependency> 
	<groupId>org.eclipse.paho</groupId>    		 
        <artifactId>org.eclipse.paho.client.mqttv3</artifactId>  
        <version>1.2.2</version>
</dependency>

2.2.2

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
public class OnMessageCallback implements MqttCallback {   
    public void connectionLost(Throwable cause) {      
        // 连接丢失后,一般在这里面进行重连   
        System.out.println("连接断开,可以做重连");   
    } 
    public void messageArrived(String topic, MqttMessage message) throws Exception {     
        // subscribe后得到的消息会执行到这里面       
        System.out.println("接收消息主题:" + topic); 
        System.out.println("接收消息Qos:" + message.getQos());   
        System.out.println("接收消息内容:" + new String(message.getPayload())); 
    }    
    public void deliveryComplete(IMqttDeliveryToken token) {    
    System.out.println("deliveryComplete---------" + token.isComplete()); 
    }
}

3编写测试类

@org.junit.Testpublic void test() {  
    String subTopic = "testtopic/#";  
    String pubTopic = "testtopic/1";  
    String content = "Hello i am java";
    //qos有0、1、2三种,数字越大越准确但同时带宽的开销也会增加,一般在接收端设置成0就可以 
    int qos = 2;   
    String broker = "tcp://127.0.0.1:1883";//此处修改成mqtt服务端地址,1833是端口号    
    String clientId = "mqttx_0c1683hh2";
    MemoryPersistence persistence = new MemoryPersistence();   
    try {   
        MqttClient client = new MqttClient(broker, clientId, persistence);  // MQTT 连接选项
        MqttConnectOptions connOpts = new MqttConnectOptions(); 
        connOpts.setUserName("admin");   
        connOpts.setPassword("123456".toCharArray());  // 保留会话  
        connOpts.setCleanSession(true);        // 设置回调     
        client.setCallback(new OnMessageCallback());        // 建立连接
        System.out.println("Connecting to broker: " + broker);
        client.connect(connOpts);       
        System.out.println("Connected");
        System.out.println("Publishing message: " + content);        // 订阅     
        client.subscribe(subTopic);        // 消息发布所需参数        
        MqttMessage message = new MqttMessage(content.getBytes());   
        message.setQos(qos);  
        client.publish(pubTopic, message); 
        System.out.println("Message published");
        client.disconnect();     
        System.out.println("Disconnected"); 
        client.close();       
        System.exit(0); 
    } catch (MqttException me) { 
        System.out.println("reason " + me.getReasonCode());    
        System.out.println("msg " + me.getMessage());
        System.out.println("loc " + me.getLocalizedMessage());
        System.out.println("cause " + me.getCause()); 
        System.out.println("excep " + me);
        me.printStackTrace(); 
    }
}

3、 注意事项

ubantu等虚拟机启动服务端后,本机启动客户端正常,但其他机器连接会连接不上,这是虚拟机网络设置问题,

解决办法:

虚拟机的默认网络连接模式是NAT模式,将网络模式改成桥接模式,然后查看IP即可

posted @ 2021-07-05 21:38  一盏清辉  阅读(502)  评论(0)    收藏  举报