mqtt协议之mosquitto

mqtt协议之mosquitto1

场景

物联网 (IOT) 设备必须连接互联网。通过连接到互联网,设备就能相互协作,以及与后端服务协同工作。互联网的基础网络协议是 TCP/IP。MQTT(消息队列遥测传输) 是基于 TCP/IP 协议栈而构建的,已成为IOT通信的标准。2

消息订阅

import org.eclipse.paho.client.mqttv3.IMqttMessageListener;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

public class MqttSubscribeSample {
	
	public static void main(String[] args) {

        String topic        = "dw/demo";
        int qos             = 2;
        String broker       = "tcp://127.0.0.1:1883";
        String clientId     = "client1";
        MemoryPersistence persistence = new MemoryPersistence();

        try {
        	Object lock= new Object();
            MqttClient sampleClient = new MqttClient(broker, clientId, persistence);
            MqttConnectOptions connOpts = new MqttConnectOptions();
            connOpts.setCleanSession(true);
            System.out.println("Connecting to broker: "+broker);
            sampleClient.connect(connOpts);
            System.out.println("Connected");
            System.out.println("topic="+topic+" subscribed");
            sampleClient.subscribe(topic, new IMqttMessageListener() {
				@Override
				public void messageArrived(String arg0, MqttMessage arg1) throws Exception {
					System.out.println("arg0="+arg0);
					System.out.println("arg1="+new String(arg1.getPayload(),"gbk"));
				}
			});
            synchronized (lock) {
            	 try {
                     lock.wait();//主线程等待
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
			}
        } 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();
        } 
    }
}

消息发布

import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

public class MqttPublishSample {

	public static void main(String[] args) {

        String topic        = "dw/demo";
        String content      = "hello world";
        int qos             = 2;
        String broker       = "tcp://127.0.0.1:1883";
        String clientId     = "client2";
        MemoryPersistence persistence = new MemoryPersistence();

        try {
            MqttClient sampleClient = new MqttClient(broker, clientId, persistence);
            MqttConnectOptions connOpts = new MqttConnectOptions();
            connOpts.setCleanSession(true);
            System.out.println("Connecting to broker: "+broker);
            sampleClient.connect(connOpts);
            System.out.println("Connected");
            System.out.println("Publishing message: "+content);
            MqttMessage message = new MqttMessage(content.getBytes());
            message.setQos(qos);
            sampleClient.publish(topic, message);
            System.out.println("Message published");
            sampleClient.disconnect();
            System.out.println("Disconnected");
            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();
        }
    }
}

pom配置

	<repositories>
	    <repository>
	        <id>Eclipse Paho Repo</id>
	        <url>https://repo.eclipse.org/content/repositories/paho-releases</url>
	    </repository>
	</repositories>	
	...
	<dependencies>
	    <dependency>
        <groupId>org.eclipse.paho</groupId>
        <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
        <version>1.2.2</version>
    </dependency>
  </dependencies>

mosquitto

  • MQTT 开发的最简单工具是 Python mosquitto 模块
  1. 启动
    mosquitto -d
  2. 订阅消息
    mosquitto_sub -t “dw/demo”
  3. 发布消息
    mosquitto_pub -t “dw/demo” -m “hello world!”
  • 参数说明
    • 1.CONNECT 消息参数
参数说明
cleanSession此标志指定连接是否是持久性的。持久会话会将所有订阅和可能丢失的消息(具体取决于 QoS) 都存储在代理中。(请参阅 表 3 获取 QoS 的描述。)
username代理的身份验证和授权凭证。
password代理的身份验证和授权凭证。
lastWillTopic连接意外中断时,代理会自动向某个主题发送一条 “last will” 消息
keepAlive这是客户端通过 ping 代理来保持连接有效所需的时间间隔。
  • 2.CONNACK 消息参数
参数说明
sessionPresent此参数表明连接是否已有一个持久会话。也就是说,连接已订阅了主题,而且会接收丢失的消息
returnCode0 表示成功。其他值指出了失败的原因。
  • 3.SUBSCRIBE 消息参数
参数说明
qosqos(服务质量或 QoS)标志表明此主题范围内的消息传送到客户端所需的一致程度。
- 值 0:不可靠,消息基本上仅传送一次,如果当时客户端不可用,则会丢失该消息。
- 值 1:消息应传送至少 1 次。
- 值 2:消息仅传送一次。
topic要订阅的主题。一个主题可以有多个级别,级别之间用斜杠字符分隔。例如,“dw/demo” 和 “ibm/bluemix/mqtt” 是有效的主题。
  • 4.SUBACK 消息参数
参数说明
returnCodeSUBCRIBE 命令中的每个主题都有一个返回代码。返回值如下所示。
- 值 0 - 2:成功达到相应的 QoS 级别。(参阅 表 3 进一步了解 QoS。)
- 值 128:失败。
  • 5.UNSUBSCRIBE 消息参数
参数说明
topic此参数可重复用于多个主题。
  • 6.PUBLISH 消息参数
参数说明
topicName发布的消息的相关主题。
qos消息传递的服务质量水平。(请参阅 表 3 来查看 QoS 的描述。)
retainFlag此标志表明代理是否保留该消息作为针对此主题的最后一条已知消息。
payload消息中的实际数据。它可以是文本字符串或二进制大对象数据。

说明


  1. mosquitto下载链接 ↩︎

  2. 初识mqtt ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值