在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端截图:
手机端截图:
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手机上支持消息传输协议(MQTT) Demo
- Android网络开发回顾之旅 ① 在Android手机集成使用MQTT协议 ,实现搞掂移动控制硬件端。(附带Demo)
- 手机服务器Android消息推送(二)--基于MQTT协议实现的推送功能
- android + PHP 实现消息推送(采用MQTT协议)
- 通过 WebSphere MQ 遥测传输 (MQTT) 将 Android 手机引入物联网
- ActiveMQ 5.9版将支持基于WebSocket的MQTT协议传输
- android采用IBM-MQTT协议消息推送。
- android消息推送——mqtt协议
- 采用MQTT协议实现Android消息推送
- 采用MQTT协议实现Android消息推
- 采用MQTT协议实现android消息推送
- 采用MQTT协议实现Android消息推送
- Android推送通知的实现--采用MQTT协议实现Android消息推送
- PHP+ANDROID做消息推送:基于IBM的MQTT协议的Tokudu项目测试
- Android消息推送(二)--基于MQTT协议实现的推送功能
- 采用MQTT协议实现Android消息推送
- 采用MQTT协议实现Android消息推送
- PHP+ANDROID做消息推送:基于IBM的MQTT协议的Tokudu项目测试
- 采用MQTT协议实现Android消息推送
- Android消息推送(二)--基于MQTT协议实现的推送功能