您的位置:首页 > 移动开发 > Android开发

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

2016-12-25 11:31 369 查看
转载地址: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?

package android.demo;  

  

import android.app.Activity;  

import android.os.Bundle;  

import android.widget.TextView;  

import android.util.Log;  

import android.os.*;   

  

  

import com.ibm.mqtt.IMqttClient;  

import com.ibm.mqtt.MqttClient;  

import com.ibm.mqtt.MqttException;  

import com.ibm.mqtt.MqttSimpleCallback;  

  

public class Android_Demo1Activity extends Activity {  

    private TextView send;   

    private TextView recv;   

    private IMqttClient client;  

    private String clientID = "test";  

  

    private Handler mHandler = new Handler(){   

         @Override   

         public void handleMessage(Message msg) {   

              super.handleMessage(msg);  

               

             String strContent = recv.getText().toString();   

             strContent += "\n" + msg.getData().getString("content");   

             recv.setText(strContent);   

             Log.i("recv", msg.getData().getString("content"));  

               

             String tmp = "Redirect sending "+msg.getData().getString("content");  

                     doSend(tmp);  

                     send.setText(tmp);  

  

         }   

    };    

      

    /** Called when the activity is first created. */  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        Log.i("test","onCreate");  

  

        setContentView(R.layout.main);  

        send = (TextView) findViewById(R.id.send);   

        recv = (TextView) findViewById(R.id.recv);   

        try   

        {   

            client = MqttClient.createMqttClient("tcp://192.168.1.103:1883", null);   

            short keep = 30;  

            client.connect(clientID, true, keep);   

        }  

        catch (MqttException e)   

        {   

            e.printStackTrace();   

              

            return;  

        }  

          

                Integer count = 0;  

        doReceive();  

  

        //client.disconnect();   

    }  

    

    private String doSend(String msg){   

        try   

        {   

            if(false == client.isConnected())  

            {  

                return "not connect";  

            }  

            client.publish("send_topic", msg.getBytes(), 0, false);  

            Log.i("send", "Send msg : "+msg );  

  

        }   

        catch (MqttException e)   

        {   

            e.printStackTrace();   

              

            return e.getMessage();   

        }   

        return "success";   

    }  

      

    private String doReceive(){  

        try   

        {   

            if(false == client.isConnected())  

            {  

                return null;  

            }  

            SimpleCallbackHandler simpleCallbackHandler = new SimpleCallbackHandler("java_client", mHandler);  

            client.registerSimpleHandler(simpleCallbackHandler);//注册接收消息方法  

              

            String[] Topic = {"receive_topic"};  

            int[] QOS_VALUES = {0};  

            client.subscribe(Topic, QOS_VALUES);  

   

        }   

        catch (Exception e)   

        {   

            e.printStackTrace();   

              

            return e.getMessage();   

        }         

          

        return null;   

    }  

}  

  

class SimpleCallbackHandler implements MqttSimpleCallback{  

    private String instanceData = "";  

    private Handler handler;   

  

     public SimpleCallbackHandler(String instance, Handler handler) {   

         instanceData = instance;  

         this.handler = handler;   

     }   

  /** 

   * 当客户机和broker意外断开时触发 

   * 可以再此处理重新订阅 

   */  

  @Override  

  public void connectionLost() throws Exception {  

   // TODO Auto-generated method stub  

   Log.e("test","客户机和broker已经断开");  

  }  

  

  /** 

   * 客户端订阅消息后,该方法负责回调接收处理消息 

   */  

  @Override  

  public void publishArrived(String topicName, byte[] payload, int Qos, boolean retained) throws Exception {  

   // TODO Auto-generated method stub  

   Log.i("test","订阅主题: " + topicName);  

   Log.i("test","消息数据: " + new String(payload));  

   Log.i("test","消息级别(0,1,2): " + Qos);  

   Log.i("test","是否是实时发送的消息(false=实时,true=服务器上保留的最后消息): " + retained);  

   try{  

       Message msg = Message.obtain();   

       Bundle bundle = new Bundle();   

       bundle.putString("content", "订阅主题: " + topicName + "   " + "消息数据: " + new String(payload));   

       msg.setData(bundle);   

       handler.sendMessage(msg);   

   }  

   catch (Exception e) {   

       e.printStackTrace();   

   }   

  }  

    

}  

[html] view
plain copy

 print?

<?xml version="1.0" encoding="utf-8"?>  

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  

    android:layout_width="fill_parent"  

    android:layout_height="fill_parent"  

    android:orientation="vertical" >  

    <TextView  

        android:id="@+id/recv"  

        android:layout_width="fill_parent"  

        android:layout_height="wrap_content"  

        android:text="@string/hello" />  

    <TextView  

        android:id="@+id/send"  

        android:layout_width="fill_parent"  

        android:layout_height="wrap_content"  

        android:text="@string/hello" />  

  

</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?

sudo apt-get install mosquitto-clients  

PC端截图:



手机端截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android