转载地址: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)
- 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);
-
- }
- };
-
-
- @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();
-
-
- }
-
- 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;
- }
-
-
-
-
- @Override
- public void connectionLost() throws Exception {
-
- Log.e("test","客户机和broker已经断开");
- }
-
-
-
-
- @Override
- public void publishArrived(String topicName, byte[] payload, int Qos, boolean retained) throws Exception {
-
- 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端截图:
手机端截图: