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

基于Mqtt协议Paho项目实现Android消息推送

2016-12-07 09:44 603 查看

基于Mqtt协议Paho项目实现Android消息推送

Paho项目官方地址:

Paho项目对Mqtt协议进行了一层封装,本文通过对Paho项目的学习与修改,简单的实现Android推送功能。

服务端的部署

服务端的选择,笔者只测试过Apollo: 官网地址: 以及Mosquitto服务器: 官网地址

前者安装配置比较方便,可以在后台中直观的查看当前连接的客户端、发布、订阅的Topic以及消息,但是需要单独写一个服务端来发送消息。

后者需要安装Cygwin,相对Apollo服务器安装起来较为繁琐,但是好处之一是可以通过命令行直接发布消息。

总之,两者都是非常强大的服务器,笔者也只是刚刚入门还有很多功能需要继续探索,本文为了演示效果选择Mosquitto服务器来演示。

关于Mosquitto服务器的部署,可以参考上一篇文章,传送门

客户端的实现

客户端的实现基于Paho项目,主要使用其中的
MqttClient
类来实现与服务端的连接以及对消息的订阅。

重要的一点,在本地进行测试的时候,其中的serverURI不要使用localhost或者127.0.0.1,换成自己本机的实际i地址

因为某些原因只贴出部分关键代码进行分析:

首选需要初始化MqttClient以及MqttConnectionOptions:

初始化
MqttConnectOptions
,这里需要配置了Mosquitto服务器设置的用户的用户名与密码,并设置了连接超时时间以及心跳包发送间隔时间,这些根据自己的需求进行配置即可。

private void initMqttConnectionOptions() {
conOpt = new MqttConnectOptions();
conOpt.setCleanSession(true);
conOpt.setUserName(userName);
conOpt.setPassword(passWord.toCharArray());
conOpt.setConnectionTimeout(CONNECTION_TIMEOUT);
conOpt.setKeepAliveInterval(KEEP_ALIVE_INTERVAL);
}


初始化MqttClient,其中host即serverUri,这里是本地进行测试,但是需要注意的是需要使用实际的ip地址,而非localhost。

另外设置了回调接口,当收到订阅的消息时候通过Handler发送并进行处理。

private void initMqttClient() {
// TODO Auto-generated method stub
initMqttConnectionOptions();

try {
client = new MqttClient(host, "LHY", null);
client.setCallback(mCallBack);
// 开始连接
connect();
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private MqttCallback mCallBack = new MqttCallback() {

@Override
public void messageArrived(String topic, MqttMessage message)
throws Exception {
// TODO Auto-generated method stub
if (message != null) {
Log.d(TAG, "messageArrived, topic: " + topic + "; message: "
+ new String(message.getPayload()));

Message msg = Message.obtain();
Map<String, Object> map = new HashMap();
map.put("topic", topic);
map.put("mqttMsg", message);
msg.what = HandlerType.MESSAGEARRIVED.getType();
msg.obj = map;
handler.sendMessage(msg);
}

}

@Override
public void deliveryComplete(IMqttDeliveryToken token) {
// TODO Auto-generated method stub
if (token != null) {
try {
Log.d(TAG, "deliveryComplete: "
+ new String(token.getMessage().getPayload()));
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

@Override
public void connectionLost(Throwable cause) {
// TODO Auto-generated method stub
Log.d(TAG, "connectionLost");
// 重连机制
}
};


当连接成功之后,通过
client.subscribe()
方法来订阅主题,内部最终通过socket来完成和服务端的消息的交互,此时我们通过Mosquitto服务器发送指定Topic的消息,客户端就可以接收到了。

Log.d(TAG, getString(R.string.connect_success));
try {
client.subscribe(mqttTopic, QOS);
} catch (Exception e) {
e.printStackTrace();
}


演示Gif:



直接发布中文或者使用
utf-8
编码的时候,客户端中接收到的消息会乱码,因此需要转成
GBK
编码格式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mqtt android 推送