一、简介
MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。
此处不再引入官方文字描述,以个人开发认识浅谈一下
本文分为两部分:
1、MQTT基于window服务端的建立;
2、 MQTT Android客户端的实现。
二、 Android客户端搭建
以我在github上的[MQTT] https://github.com/alanjuster/MQTT做详解,
在app下的build.gradle dependencies 下引入依赖资源
compile'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'
compile'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
同时在AndroidMainfest.xml 中注册依赖Service及必要的权限
创建mqttservice对象实例:
mqttService =new MyMqttService.Builder()
//设置自动重连
.autoReconnect(true)
//设置清除回话session true(false) 不收(收)到服务器之前发出的推送消息
.cleanSession(true)
//唯一标示 保证每个设备都唯一就可以 建议 imei
.clientId(imei)
.userName("admin")
.passWord("password")
//mqtt服务器地址 格式例如:
// tcp://iot.eclipse.org:1883
.serverUrl("tcp://192.168.1.31:61613")
//心跳包默认的发送间隔
.keepAliveInterval(20)
.timeOut(10)
//构建出EasyMqttService 建议用application的context
.bulid(this.getApplicationContext());
发起连接 ,在连接成功后[订阅主题](订阅)
/**
* 连接Mqtt服务器
*/
private void connect() {
mqttService.connect(new IEasyMqttCallBack() {
@Override
public void messageArrived(String topic, String message, int qos) {
//推送消息到达
Log.e(TAG, "message= " + message);
rece.setText("收到消息:" + message +'\n' +"主题--> " + topic);
}
@Override
public void connectionLost(Throwable arg0) {
//连接断开
try {
Log.e(TAG + "connectionLost", arg0.toString());
Toast.makeText(MainActivity.this, "connectionLost", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
} finally {
}
}
@Override
public void deliveryComplete(IMqttDeliveryToken arg0) {
Log.e(TAG + "@deliveryComplete", "发送完毕" + arg0.toString());
Toast.makeText(MainActivity.this, "deliveryComplete", Toast.LENGTH_SHORT).show();
}
@Override
public void connectSuccess(IMqttToken arg0) {
Toast.makeText(MainActivity.this, "connectSuccess", Toast.LENGTH_SHORT).show();
Log.e(TAG + "@@@@@connectSuccess", "success");
subscribe();
}
@Override
public void connectFailed(IMqttToken arg0, Throwable arg1) {
//连接失败
Log.e(TAG + "@@@@@connectFailed", "fail" + arg1.getMessage());
Toast.makeText(MainActivity.this, "connectFailed", Toast.LENGTH_SHORT).show();
}
});
}
主题订阅
/**
* 订阅主题
*/
private void subscribe() {
String[] topics = new String[]{"test"};
//主题对应的推送策略 分别是0, 1, 2 建议服务端和客户端配置的主题一致
// 0 表示只会发送一次推送消息 收到不收到都不关心
// 1 保证能收到消息,但不一定只收到一条
// 2 保证收到切只能收到一条消息
int[] qoss = new int[]{0};
mqttService.subscribe(topics, qoss);
}
发布消息:
/**
* 发布消息
*/
private void publish(String msg, String topic, int qos, boolean retained) {
mqttService.publish(msg, topic, qos, retained);
}
从MQTT服务端建立到客户端连接过程就是这样,其实在应用过程中都是客户端之间的通讯,服务端也就是一个类似数据转发的功能。