在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)
工程中必须包含mqtt的java库,下载地址为:ftp://public.dhe.ibm.com/software/integration/support/supportpacs/individual/ia92.zip
还需要一个对端收发器,就是上面IP为tcp://192.168.1.103:1883的服务器,这里是一个ubuntu PC。简单一点,就安装了一个mosquitto实现的命令行工具
PC端截图:
手机端截图:
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端截图:
手机端截图:
相关文章推荐
- 在Android手机上支持消息传输协议(MQTT) Demo
- 手机服务器Android消息推送(二)--基于MQTT协议实现的推送功能
- Android网络开发回顾之旅 ① 在Android手机集成使用MQTT协议 ,实现搞掂移动控制硬件端。(附带Demo)
- PHP+ANDROID做消息推送:基于IBM的MQTT协议的Tokudu项目测试
- 采用MQTT协议实现Android消息推送
- 通过 WebSphere MQ 遥测传输 (MQTT) 将 Android 手机引入物联网
- 采用MQTT协议实现Android消息推送
- 采用MQTT协议实现Android消息推
- 基于Mqtt协议Paho项目实现Android消息推送
- Android消息推送(二)--基于MQTT协议实现的推送功能
- 采用MQTT协议实现Android消息推送
- 采用MQTT协议实现Android消息推送
- 基于MQTT协议的消息传输
- 如何采用MQTT协议实现android消息推送
- 采用MQTT协议实现Android消息推送1
- 通过 WebSphere MQ 遥测传输 (MQTT) 将 Android 手机引入物联网 地址
- 采用MQTT协议实现Android消息推送
- 通过 WebSphere MQ 遥测传输 (MQTT) 将 Android 手机引入物联网
- ActiveMQ 5.9版将支持基于WebSocket的MQTT协议传输
- 通过 WebSphere MQ 遥测传输 (MQTT) 将 Android 手机引入物联网