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即可


浙公网安备 33010602011771号