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

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

2012-03-02 23:46 411 查看
http://mqtt.org

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

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

该协议的特点有:

使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
对负载内容屏蔽的消息传输。
使用 TCP/IP 提供网络连接。
有三种消息发布服务质量:

“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
“至少一次”,确保消息到达,但消息重复可能会发生。
“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。
使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制

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

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

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

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

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();
}
}

}


<?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实现的命令行工具

sudo apt-get install mosquitto-clients


PC端截图:



手机端截图:

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