Android中Mqtt协议的使用
2017-07-08 14:39
309 查看
最近做了一款物联网产品,为了解决手机App于外部设备进行实时消息通信,我们经过讨论和测试后决定选择用IBM公司开源的轻量级的即时通讯协议mqtt,MQTT全称叫做Message Queuing Telemetry Transport,意为消息队列遥测传输,是IBM开发的一个即时通讯协议。.
要玩转mqtt,我们首先要搭建一个Apollo(阿波罗)服务器。windows用户请参考这个博客进行配置:
【MQTT】在Windows下搭建MQTT服务器
2. 通过MqttConnectOptions进行配置
3. 调用connect(options)进行连接
4. 通过指定的topic进行订阅消息
5. 向订阅的topic中发布消息
6. 在MqttCallback的messageArrived方法中对接收到的消息结果进行处理
关于topic和qos可以参考
MQTT协议详解,非常易懂
如果真要对mqtt做深入了解的我推荐这个:
MQTT协议中文版
org.eclipse.paho.client.mqttv3-1.0.2.jar下载
要玩转mqtt,我们首先要搭建一个Apollo(阿波罗)服务器。windows用户请参考这个博客进行配置:
【MQTT】在Windows下搭建MQTT服务器
android 端使用可以分为6个步骤
1.导入org.eclipse.paho.client.mqttv3-1.0.2.jar2. 通过MqttConnectOptions进行配置
3. 调用connect(options)进行连接
4. 通过指定的topic进行订阅消息
5. 向订阅的topic中发布消息
6. 在MqttCallback的messageArrived方法中对接收到的消息结果进行处理
对于这些基本操作我自己封装了一个单例的工具类,有需要的可以copy过去根据自己业务进行修改
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.MqttCallback; 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.MqttPersistenceException; import org.eclipse.paho.client.mqttv3.MqttTopic; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; import android.R.integer; import android.content.Context; import android.os.Looper; import com.commons.log.Logger; /** * @Description: MQTT管理者 * @author jiangrongtao * @version V1.0 * Copyright: Copyright (c) 2017 */ public class MQTTManager { public static final String SERVER_HOST = "tcp://127.0.0.1:61613"; private String clientid = ""; private static MQTTManager mqttManager=null; private MqttClient client; private MqttConnectOptions options; private MessageHandlerCallBack callBack; private MQTTManager(Context context){ clientid+=MqttClient.generateClientId(); } /** * 获取一个MQTTManager单例 * @param context * @return 返回一个MQTTManager的实例对象 */ public static MQTTManager getInstance(Context context) { Logger.d("mqttManager="+mqttManager); if (mqttManager==null) { mqttManager=new MQTTManager(context); synchronized (Object.class) { Logger.d("synchronized mqttManager="+mqttManager); if (mqttManager!=null) { return mqttManager; } } }else { Logger.d("else mqttManager="+mqttManager); return mqttManager; } return null; } /** * 连接服务器 */ public void connect(){ Logger.d("开始连接MQtt"); try { // host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存 client = new MqttClient(SERVER_HOST, clientid, new MemoryPersistence()); // MQTT的连接设置 options = new MqttConnectOptions(); // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接 // options.setCleanSession(true); // 设置连接的用户名 options.setUserName("admin"); // 设置连接的密码 options.setPassword("password".toCharArray()); // 设置超时时间 单位为秒 // options.setConnectionTimeout(30); // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制 // options.setKeepAliveInterval(30); // 设置回调 // MqttTopic topic = client.getTopic(TOPIC); //setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息 // options.setWill(topic, "close".getBytes(), 2, true); client.setCallback(new PushCallback()); client.connect(options); Logger.d("ClientId="+client.getClientId()); } catch (MqttException e) { e.printStackTrace(); } } /** * 订阅消息 * @param topic 订阅消息的主题 */ public void subscribeMsg(String topic,int qos){ if (client!=null) { int[] Qos = {qos}; String[] topic1 = {topic}; try { client.subscribe(topic1, Qos); Logger.d("开始订阅topic="+topic); } catch (MqttException e) { e.printStackTrace(); } } } /** * 发布消息 * @param topic 发布消息主题 * @param msg 消息体 * @param isRetained 是否为保留消息 */ public void publish(String topic,String msg,boolean isRetained,qos) { try { if (client!=null) { MqttMessage message = new MqttMessage(); message.setQos(qos); message.setRetained(isRetained); message.setPayload(msg.getBytes()); client.publish(topic, message); Logger.d("topic="+topic+"--msg="+msg+"--isRetained"+isRetained); } } catch (MqttPersistenceException e) { e.printStackTrace(); } catch (MqttException e) { e.printStackTrace(); } } int count=0; /** * 发布和订阅消息的回调 * */ public class PushCallback implements MqttCallback { public void connectionLost(Throwable cause) { /*if (count<5) { count++;//5次重连 Logger.d("断开连接,重新连接"+count+"次"+cause); try { client.close(); connect(); } catch (MqttException e) { e.printStackTrace(); } }*/ } /** * 发布消息的回调 */ @Override public void deliveryComplete(IMqttDeliveryToken token) { //publish后会执行到这里 Logger.d("发布消息成功的回调"+token.isComplete()); } /** * 接收消息的回调方法 */ @Override public void messageArrived(final String topicName, final MqttMessage message) throws Exception { //subscribe后得到的消息会执行到这里面 Logger.d("接收消息=="+new String(message.getPayload())); if (callBack!=null) { callBack.messageSuccess(topicName,new String(message.getPayload())); } } } /** * 设置接收消息的回调方法 * @param callBack */ public void setMessageHandlerCallBack(MessageHandlerCallBack callBack){ this.callBack = callBack; } public MessageHandlerCallBack getMessageHandlerCallBack(){ if (callBack!=null) { return callBack; } return null; } /** * 断开链接 */ public void disconnect(){ if (client!=null&&client.isConnected()) { try { client.disconnect(); mqttManager=null; } catch (MqttException e) { e.printStackTrace(); } } } /** * 释放资源 */ public void release(){ if (mqttManager!=null) { mqttManager=null; } } /** * 判断服务是否连接 * @return */ public boolean isConnected(){ if (client!=null) { return client.isConnected(); } return false; } }
关于topic和qos可以参考
MQTT协议详解,非常易懂
如果真要对mqtt做深入了解的我推荐这个:
MQTT协议中文版
org.eclipse.paho.client.mqttv3-1.0.2.jar下载
相关文章推荐
- Android网络开发回顾之旅 ① 在Android手机集成使用MQTT协议 ,实现搞掂移动控制硬件端。(附带Demo)
- Android开发:同意协议CheckBox的使用
- 使用MQTT做为android的云推送
- Android消息推送(二)--基于MQTT协议实现的推送功能
- Android消息推送(二)--基于MQTT协议实现的推送功能
- 用MQTT协议实现android消息推送
- Android深入浅出系列之实例应用—同意协议CheckBox的使用
- (转)采用MQTT协议实现Android消息推送
- 采用MQTT协议实现Android消息推送
- 采用MQTT协议实现Android消息推送
- Android推送通知的实现--采用MQTT协议实现Android消息推送
- 采用MQTT协议实现Android消息推送
- android采用IBM-MQTT协议消息推送。
- android使用MediaPlayer类播放流媒体RTSP(实时流协议)
- 采用MQTT协议实现Android消息推送
- 采用MQTT协议实现Android推送
- Android使用wifi通过UDP协议发送广播数据包给PC接收不到问题解决方法
- Android推送通知的实现--采用MQTT协议实现Android消息推送
- 手机服务器Android消息推送(二)--基于MQTT协议实现的推送功能
- PHP+ANDROID做消息推送:基于IBM的MQTT协议的Tokudu项目测试