Android中Mqtt协议的使用

最近做了一款物联网产品,为了解决手机App于外部设备进行实时消息通信,我们经过讨论和测试后决定选择用IBM公司开源的轻量级的即时通讯协议mqtt,MQTT全称叫做Message Queuing Telemetry Transport,意为消息队列遥测传输,是IBM开发的一个即时通讯协议。.


要玩转mqtt,我们首先要搭建一个Apollo(阿波罗)服务器。windows用户请参考这个博客进行配置:
【MQTT】在Windows下搭建MQTT服务器


android 端使用可以分为6个步骤##

1.导入org.eclipse.paho.client.mqttv3-1.0.2.jar
2. 通过MqttConnectOptions进行配置
3. 调用connect(options)进行连接
4. 通过指定的topic进行订阅消息
5. 向订阅的topic中发布消息
6. 在MqttCallback的messageArrived方法中对接收到的消息结果进行处理

对于这些基本操作我自己封装了一个单例的工具类,有需要的可以copy过去根据自己业务进行修改

/**
 * @Description: MQTT管理者
 * @author jiangrongtao
 * @version V1.0
 */
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;
				}
			}
		}
	    return mqttManager;
	  }
      /**
  	 * 连接服务器
  	 */
  	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(){
  		return callBack;
  	 }
  	 /**
  	  * 断开链接
  	  */
  	 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下载


20206-6-16修改

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android应用程序使用MQTT协议可以实现与远程服务器进行实时通信。MQTT是一种轻量级的发布/订阅消息传输协议,适用于移动设备和物联网应用程序。 以下是使用MQTT协议的一般步骤: 1. 添加MQTT库:首先,您需要将MQTT库添加到您的Android项目。常用的MQTT库包括Eclipse Paho和MQTT.fx等。 2. 连接到服务器:使用MQTT库提供的API,创建一个MQTT客户端,并连接到远程MQTT服务器。您需要提供服务器的地址、端口号和连接参数(如用户名、密码等)。 3. 订阅主题:通过订阅主题,您可以接收来自服务器的特定消息。主题可以是任意字符串,可以用于区分不同类型的消息。 4. 发布消息:使用MQTT客户端发布消息到特定主题。您可以将数据发送到服务器,并通过订阅该主题的所有客户端接收。 5. 处理接收到的消息:使用订阅回调函数处理从服务器接收到的消息。您可以在回调函数解析和处理消息,并更新UI或执行其他操作。 以下是一个简单的示例,演示如何在Android应用程序使用MQTT协议: 1. 添加依赖: 在您的项目的build.gradle文件添加以下依赖: ```groovy implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' ``` 2. 连接到服务器: ```java String serverUri = "tcp://mqtt.example.com:1883"; String clientId = "android-client"; MqttClient client = new MqttClient(serverUri, clientId); MqttConnectOptions options = new MqttConnectOptions(); options.setUserName("username"); options.setPassword("password".toCharArray()); client.connect(options); ``` 3. 订阅主题: ```java String topic = "mytopic"; client.subscribe(topic, new IMqttMessageListener() { @Override public void messageArrived(String topic, MqttMessage message) throws Exception { // 处理接收到的消息 String payload = new String(message.getPayload()); Log.d(TAG, "Received message: " + payload); } }); ``` 4. 发布消息: ```java String topic = "mytopic"; String payload = "Hello, MQTT!"; client.publish(topic, payload.getBytes(), 0, false); ``` 通过以上步骤,您可以在Android应用程序使用MQTT协议进行实时通信。请注意,您需要根据实际情况配置和处理连接、订阅和发布操作,并确保在适当的时候释放和关闭MQTT客户端连接。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值