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

采用MQTT协议实现android消息推送

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

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

该协议的特点有:

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

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

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

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

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

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

MQTT是一项消息传递技术,由IBM再2001年发布。

总结一下,机制就是使用一个代理服务器messagebroker,

客户端client连接上这个服务器,然后告诉服务器说,我可以接收哪些类型的消息,

同时,client也可以发布自己的消息,这些消息根据协议的内容,可以被其他client获取。

只要手机客户端,连上服务器,然后就可以接收和发布消息了,不用自己写socket什么了,

低带宽,低耗电量,代码量也少,很简单吧。

package
com.pig.test.mqtt;
002
003
import
com.ibm.mqtt.MqttClient;
004
import
com.ibm.mqtt.MqttException;
005
import
com.ibm.mqtt.MqttSimpleCallback;
006
007
public
class
SubscribeClient
{
008
private
final
static
String
CONNECTION_STRING=
"tcp://192.168.1.60:1883"
;
009
private
final
static
boolean
CLEAN_START
=
true
;
010
private
final
static
short
KEEP_ALIVE
=
30
;
//低耗网络,但是又需要及时获取数据,心跳30s
011
private
final
static
String
CLIENT_ID=
"client1"
;
012
private
final
static
String[]
TOPICS={
013
"Test/TestTopics/Topic1"
,
014
"Test/TestTopics/Topic2"
,
015
"Test/TestTopics/Topic3"
,
016
"tokudu/client1"
017
};
018
private
final
static
int
[]
QOS_VALUES={
0
,
0
,
2
,
0
};
019
020
//////////////////
021
private
MqttClient
mqttClient=
null
;
022
023
public
SubscribeClient(String
i){
024
try
{
025
mqttClient
=
new
MqttClient(CONNECTION_STRING);
026
SimpleCallbackHandler
simpleCallbackHandler=
new
SimpleCallbackHandler();
027
mqttClient.registerSimpleHandler(simpleCallbackHandler);
//注册接收消息方法
028
mqttClient.connect(CLIENT_ID+i,
CLEAN_START,KEEP_ALIVE);
029
mqttClient.subscribe(TOPICS,
QOS_VALUES);
//订阅接主题
030
031
/**
032
*
完成订阅后,可以增加心跳,保持网络通畅,也可以发布自己的消息
033
*/
034
035
mqttClient.publish(PUBLISH_TOPICS,
"keepalive"
.getBytes(),
QOS_VALUES[
0
],
true
);
036
037
}
catch
(MqttException
e){
038
//
TODOAuto-generatedcatchblock
039
e.printStackTrace();
040
}
041
}
042
043
/**
044
*
简单回调函数,处理client接收到的主题消息
045
*
@authorpig
046
*
047
*/
048
class
SimpleCallbackHandler
implements
MqttSimpleCallback{
049
050
/**
051
*
当客户机和broker意外断开时触发
052
*
可以再此处理重新订阅
053
*/
054
@Override
055
public
void
connectionLost()
throws
Exception
{
056
//
TODOAuto-generatedmethodstub
057
System.out.println(
"客户机和broker已经断开"
);
058
}
059
060
/**
061
*
客户端订阅消息后,该方法负责回调接收处理消息
062
*/
063
@Override
064
public
void
publishArrived(String
topicName,
byte
[]
payload,
int
Qos,
boolean
retained)
throws
Exception
{
065
//
TODOAuto-generatedmethodstub
066
System.out.println(
"订阅主题:
"
+
topicName);
067
System.out.println(
"消息数据:
"
+
new
String(payload));
068
System.out.println(
"消息级别(0,1,2):
"
+
Qos);
069
System.out.println(
"是否是实时发送的消息(false=实时,true=服务器上保留的最后消息):
"
+
retained);
070
}
071
072
}
073
074
/**
075
*
高级回调
076
*
@authorpig
077
*
078
*/
079
class
AdvancedCallbackHandler
implements
MqttSimpleCallback{
080
081
@Override
082
public
void
connectionLost()
throws
Exception
{
083
//
TODOAuto-generatedmethodstub
084
085
}
086
087
@Override
088
public
void
publishArrived(String
arg0,
byte
[]
arg1,
int
arg2,
089
boolean
arg3)
throws
Exception
{
090
//
TODOAuto-generatedmethodstub
091
092
}
093
094
}
095
096
/**
097
*
@paramargs
098
*/
099
public
static
void
main(String[]
args){
100
//
TODOAuto-generatedmethodstub
101
new
SubscribeClient(
""
+
i);
102
103
}
104
105
}
来自:http://www.open-open.com/lib/view/open1352431806309.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: