在Android手机上支持消息传输协议(MQTT) Demo

来源:互联网 发布:中小学生出作业软件 编辑:程序博客网 时间:2024/05/21 15:00

转载地址:http://blog.csdn.net/jt6562/article/details/7314042


http://mqtt.org

MQ 遥测传输 (MQTT) 是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放、简单、轻量、易于实现。这些特点使它适用于受限环境。例如,但不仅限于此:

  • 网络代价昂贵,带宽低、不可靠。
  • 在嵌入设备中运行,处理器和内存资源有限。

该协议的特点有:

  • 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
  • 对负载内容屏蔽的消息传输。
  • 使用 TCP/IP 提供网络连接。
  • 有三种消息发布服务质量:
    • “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
    • “至少一次”,确保消息到达,但消息重复可能会发生。
    • “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。 
  • 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。
  • 使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制

MQTT最简单的使用包括两种,一种是发消息,一种是订阅消息。

发消息就是向一个固定IP地址的某个主题发送消息(publish)

订阅消息是向服务器端订阅某些主题,当其他客户端向服务器的这个主题广播消息时,那么所有订阅这个主题的客户端就都能收到了


下面的程序是一个DEMO,为了验证MQTT功能的。这个程序接收从服务器发过来的信息(主题为receive_topic),并重新转发回服务器(主题为send_topic)

[java] view plain copy
 print?
  1. package android.demo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.widget.TextView;  
  6. import android.util.Log;  
  7. import android.os.*;   
  8.   
  9.   
  10. import com.ibm.mqtt.IMqttClient;  
  11. import com.ibm.mqtt.MqttClient;  
  12. import com.ibm.mqtt.MqttException;  
  13. import com.ibm.mqtt.MqttSimpleCallback;  
  14.   
  15. public class Android_Demo1Activity extends Activity {  
  16.     private TextView send;   
  17.     private TextView recv;   
  18.     private IMqttClient client;  
  19.     private String clientID = "test";  
  20.   
  21.     private Handler mHandler = new Handler(){   
  22.          @Override   
  23.          public void handleMessage(Message msg) {   
  24.               super.handleMessage(msg);  
  25.                
  26.              String strContent = recv.getText().toString();   
  27.              strContent += "\n" + msg.getData().getString("content");   
  28.              recv.setText(strContent);   
  29.              Log.i("recv", msg.getData().getString("content"));  
  30.                
  31.              String tmp = "Redirect sending "+msg.getData().getString("content");  
  32.                      doSend(tmp);  
  33.                      send.setText(tmp);  
  34.   
  35.          }   
  36.     };    
  37.       
  38.     /** Called when the activity is first created. */  
  39.     @Override  
  40.     public void onCreate(Bundle savedInstanceState) {  
  41.         super.onCreate(savedInstanceState);  
  42.         Log.i("test","onCreate");  
  43.   
  44.         setContentView(R.layout.main);  
  45.         send = (TextView) findViewById(R.id.send);   
  46.         recv = (TextView) findViewById(R.id.recv);   
  47.         try   
  48.         {   
  49.             client = MqttClient.createMqttClient("tcp://192.168.1.103:1883"null);   
  50.             short keep = 30;  
  51.             client.connect(clientID, true, keep);   
  52.         }  
  53.         catch (MqttException e)   
  54.         {   
  55.             e.printStackTrace();   
  56.               
  57.             return;  
  58.         }  
  59.           
  60.                 Integer count = 0;  
  61.         doReceive();  
  62.   
  63.         //client.disconnect();   
  64.     }  
  65.     
  66.     private String doSend(String msg){   
  67.         try   
  68.         {   
  69.             if(false == client.isConnected())  
  70.             {  
  71.                 return "not connect";  
  72.             }  
  73.             client.publish("send_topic", msg.getBytes(), 0false);  
  74.             Log.i("send""Send msg : "+msg );  
  75.   
  76.         }   
  77.         catch (MqttException e)   
  78.         {   
  79.             e.printStackTrace();   
  80.               
  81.             return e.getMessage();   
  82.         }   
  83.         return "success";   
  84.     }  
  85.       
  86.     private String doReceive(){  
  87.         try   
  88.         {   
  89.             if(false == client.isConnected())  
  90.             {  
  91.                 return null;  
  92.             }  
  93.             SimpleCallbackHandler simpleCallbackHandler = new SimpleCallbackHandler("java_client", mHandler);  
  94.             client.registerSimpleHandler(simpleCallbackHandler);//注册接收消息方法  
  95.               
  96.             String[] Topic = {"receive_topic"};  
  97.             int[] QOS_VALUES = {0};  
  98.             client.subscribe(Topic, QOS_VALUES);  
  99.    
  100.         }   
  101.         catch (Exception e)   
  102.         {   
  103.             e.printStackTrace();   
  104.               
  105.             return e.getMessage();   
  106.         }         
  107.           
  108.         return null;   
  109.     }  
  110. }  
  111.   
  112. class SimpleCallbackHandler implements MqttSimpleCallback{  
  113.     private String instanceData = "";  
  114.     private Handler handler;   
  115.   
  116.      public SimpleCallbackHandler(String instance, Handler handler) {   
  117.          instanceData = instance;  
  118.          this.handler = handler;   
  119.      }   
  120.   /** 
  121.    * 当客户机和broker意外断开时触发 
  122.    * 可以再此处理重新订阅 
  123.    */  
  124.   @Override  
  125.   public void connectionLost() throws Exception {  
  126.    // TODO Auto-generated method stub  
  127.    Log.e("test","客户机和broker已经断开");  
  128.   }  
  129.   
  130.   /** 
  131.    * 客户端订阅消息后,该方法负责回调接收处理消息 
  132.    */  
  133.   @Override  
  134.   public void publishArrived(String topicName, byte[] payload, int Qos, boolean retained) throws Exception {  
  135.    // TODO Auto-generated method stub  
  136.    Log.i("test","订阅主题: " + topicName);  
  137.    Log.i("test","消息数据: " + new String(payload));  
  138.    Log.i("test","消息级别(0,1,2): " + Qos);  
  139.    Log.i("test","是否是实时发送的消息(false=实时,true=服务器上保留的最后消息): " + retained);  
  140.    try{  
  141.        Message msg = Message.obtain();   
  142.        Bundle bundle = new Bundle();   
  143.        bundle.putString("content""订阅主题: " + topicName + "   " + "消息数据: " + new String(payload));   
  144.        msg.setData(bundle);   
  145.        handler.sendMessage(msg);   
  146.    }  
  147.    catch (Exception e) {   
  148.        e.printStackTrace();   
  149.    }   
  150.   }  
  151.     
  152. }  

[html] view plain copy
 print?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.     <TextView  
  7.         android:id="@+id/recv"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="@string/hello" />  
  11.     <TextView  
  12.         android:id="@+id/send"  
  13.         android:layout_width="fill_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:text="@string/hello" />  
  16.   
  17. </LinearLayout>  

工程中必须包含mqtt的Java库,下载地址为:ftp://public.dhe.ibm.com/software/integration/support/supportpacs/individual/ia92.zip


还需要一个对端收发器,就是上面IP为tcp://192.168.1.103:1883的服务器,这里是一个ubuntu PC。简单一点,就安装了一个mosquitto实现的命令行工具

[plain] view plain copy
 print?
  1. sudo apt-get install mosquitto-clients  

PC端截图:



手机端截图:


0 0