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