采用MQTT协议实现android消息推送(4)选fusesource-mqtt-client为客户端
1.简介
一个java写的mqtt客户端。项目地址:
https://github.com/fusesource/mqtt-client
2.引入fusesource-mqtt-client库
- File--->Project Structure--->Dependencies
- 点绿色+
- 在弹出的窗口中输入“‘mqtt-client”回车搜索
- 在结果中选择org.fusesource.mqtt-client:mqtt-client:1.xxx
3.示例代码
3.1 参考代码
| activeMQ服务端软件内提供的示例代码 | apache-activemq-5.15.0/examples/mqtt/java/ |
| dzone提供的示例 | https://dzone.com/articles/android-mqtt-activemq |
| github上的示例代码 | https://github.com/fusesource/mqtt-client#using-the-callbackcontinuation-passing-based-api |
3.2 效果

3.3 源码
package com.example.tt.mqtt;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.TaskStackBuilder;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.NotificationCompat;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.ToggleButton;
import org.fusesource.hawtbuf.Buffer;
import org.fusesource.hawtbuf.UTF8Buffer;
import org.fusesource.mqtt.client.BlockingConnection;
import org.fusesource.mqtt.client.Callback;
import org.fusesource.mqtt.client.CallbackConnection;
import org.fusesource.mqtt.client.Listener;
import org.fusesource.mqtt.client.MQTT;
import org.fusesource.mqtt.client.Message;
import org.fusesource.mqtt.client.QoS;
import org.fusesource.mqtt.client.Topic;
import java.net.URISyntaxException;
public class MainActivity extends AppCompatActivity implements View.OnClickListener,CompoundButton.OnCheckedChangeListener {
final static String TAG = "MQTTClient";
//UI
ToggleButton btnConnect;
Button btnPublish, btnSubscribe;
EditText edtServer,edtMessage,edtTopic,edtClientID;
TextView received;
CheckBox cbxPersist;
//MQTT
final static String clientId = "android";
final ;
final static String host = "192.168.1.101";
final static String user = "guest";
final ;
final static String password = "admin";
MQTT mqtt ;
Listener listener ;
CallbackConnection callbackConnection ;
Callback<Void> connectCallback ;
Callback<byte[]> subscribeCallback ;
Callback<Void> publishCallback ;
Callback<Void> disconnectCallback ;
{
connectCallback = new Callback<Void>(){
@Override
public void onSuccess(Void value) {
Log.d(TAG, "connectCallback : onSuccess");
received.post(new Runnable() {
@Override
public void run() {
received.setText("connectCallback success");
}
});
}
@Override
public void onFailure(Throwable value) {
value.printStackTrace();
Log.d(TAG, "connectCallback : failure");
received.post(new Runnable() {
@Override
public void run() {
received.setText("connectCallback failure");
}
});
System.exit(-);
}
};
disconnectCallback = new Callback<Void>(){
public void onSuccess(Void value) {
received.post(new Runnable() {
@Override
public void run() {
received.setText("disconnect success");
}
});
}
public void onFailure(Throwable e) {
received.post(new Runnable() {
@Override
public void run() {
received.setText("disconnect failure");
}
});
}
};
listener = new Listener() {
@Override
public void onConnected() {
Log.d(TAG, "listener onConnected");
received.post(new Runnable() {
@Override
public void run() {
received.setText("listener onConnected");
}
});
}
@Override
public void onDisconnected() {
Log.d(TAG, "listener onDisconnected");
received.post(new Runnable() {
@Override
public void run() {
received.setText("listener onDisconnected");
}
});
}
@Override
public void onPublish(final UTF8Buffer topic, Buffer msg, Runnable ack) {
final String body = msg.utf8().toString();
Log.d(TAG, "onPublish: " + body);
received.post(new Runnable() {
@Override
public void run() {
makeNotification(topic.toString(),body);
received.append("\nreceived : " + body);
}
});
}
@Override
public void onFailure(Throwable value) {
Log.d(TAG, "listener failure");
received.post(new Runnable() {
@Override
public void run() {
received.setText("listener failure");
}
});
}
};
subscribeCallback = new Callback<byte[]>() {
public void onSuccess(byte[] qoses) {
Log.d(TAG, "subscribe : success");
received.post(new Runnable() {
@Override
public void run() {
received.setText("subscribe " + edtTopic.getText().toString() + ": success");
}
});
}
public void onFailure(Throwable value) {
value.printStackTrace();
Log.d(TAG, "subscribe : failure");
received.post(new Runnable() {
@Override
public void run() {
received.setText("subscribe " + edtTopic.getText().toString() + ": failure");
}
});
System.exit(-);
}
};
publishCallback = new Callback<Void>() {
@Override
public void onSuccess(Void value) {
Log.d(TAG, "onSuccess: ");
}
@Override
public void onFailure(Throwable value) {
Log.d(TAG, "onFailure: ");
}
};
}
void connect(){
callbackConnection.connect(connectCallback);
}
void disconnect(){
callbackConnection.disconnect(disconnectCallback);
}
void subscribe(){
String topicName = edtTopic.getText().toString().trim();
Topic topics[] = new Topic[]{new Topic(topicName,QoS.AT_LEAST_ONCE)};
callbackConnection.subscribe(topics,subscribeCallback);
}
void publish(){
String data = edtMessage.getText().toString();
String topicName = edtTopic.getText().toString().trim();
callbackConnection.publish(topicName,data.getBytes(),QoS.AT_LEAST_ONCE,false,publishCallback);
}
void initMqtt(){
mqtt = new MQTT();
try {
mqtt.setHost(host, port);
mqtt.setUserName(user);
mqtt.setPassword(password);
mqtt.setKeepAlive(keepAlive);
mqtt.getClientId();
callbackConnection = mqtt.callbackConnection();
callbackConnection.listener(listener);
} catch (URISyntaxException e) {
e.printStackTrace();
Log.e(TAG,"-=-=-=-=-=-=------------====\n initMqtt exception : " + e.getMessage());
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
received = (TextView) findViewById(R.id.txt_received);
btnSubscribe= (Button) findViewById(R.id.btn_subscribe);
btnConnect = (ToggleButton)findViewById(R.id.btn_connect);
btnPublish = (Button) findViewById(R.id.btn_publish);
edtServer = (EditText) findViewById(R.id.edt_server);
edtTopic = (EditText) findViewById(R.id.edt_topic);
edtMessage = (EditText) findViewById(R.id.edt_message);
edtClientID = (EditText) findViewById(R.id.edt_clientID);
cbxPersist = (CheckBox) findViewById(R.id.cbx_persist);
btnConnect .setOnClickListener(this);
btnConnect .setOnCheckedChangeListener(this);
cbxPersist .setOnCheckedChangeListener(this);
btnSubscribe.setOnClickListener(this);
btnPublish .setOnClickListener(this);
initMqtt();
}
void makeNotification(final String title,final String content){
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
mBuilder.setSmallIcon(R.drawable.mail_3_small);//must
mBuilder.setContentTitle(title);
mBuilder.setContentText(content);
// Creates an explicit intent for an Activity in your app
Intent resultIntent = new Intent(this, MainActivity.class);
// The stack builder object will contain an artificial back stack for the
// started Activity.
// This ensures that navigating backward from the Activity leads out of
// your app to the Home screen.
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack for the Intent (but not the Intent itself)
stackBuilder.addParentStack(MainActivity.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(,PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// mNotificationId is a unique integer your app uses to identify the
// notification. For example, to cancel the notification, you can pass its ID
// number to NotificationManager.cancel().
mNotificationManager.notify(R.string.app_name, mBuilder.build());
}
void blocking(){
BlockingConnection connection = mqtt.blockingConnection();
try {
connection.connect();
//publish
connection.publish("foo", "Hello".getBytes(), QoS.AT_LEAST_ONCE, false);
//subscribe
Topic[] topics = {new Topic("foo", QoS.AT_LEAST_ONCE)};
byte[] qoses = connection.subscribe(topics);
//receive message
Message message = connection.receive();
System.out.println(message.getTopic());
byte[] payload = message.getPayload();
// process the message then:
message.ack();
//disconnect
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_publish : publish(); break;
case R.id.btn_subscribe : subscribe(); break;
}
}
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
switch (compoundButton.getId()){
case R.id.btn_connect:
if (!b){
connect();
}else{
disconnect();
}
break;
case R.id.cbx_persist:
if (mqtt != null) {
mqtt.setClientId(edtClientID.getText().toString().trim());
mqtt.setCleanSession(!b);
}
break;
}
}
}
3.4 完整下载地址
https://git.oschina.net/xi/mqtt-client-demo.git
4.MQTT 常用方法介绍
| setClientId |
Use to set the client Id of the session. This is what an MQTT server uses to identify a session where The id must be 23 characters or less. Defaults to auto generated id (based on your socket address, port and timestamp). 每个客户端id不要相同 指定id后,才可以调用setCleanSession,持久保存订阅的会话,哪个客户端订阅了哪个主题就保存在某个会话中。 |
| setCleanSession | Set to false if you want the MQTT server to persist topic subscriptions and ack positions across client sessions. Defaults to true.
设置false时,服务端将不清除会话,这样就可以持久保存订阅关系。 |
| setKeepAlive |
Configures the Keep Alive timer in seconds. Defines the maximum time interval between messages received from a client. It enables the server to detect that the network connection to a client has dropped, without having to wait for the long TCP/IP timeout. 设置保活时间,单位是秒,默认为tpc连接时间。 |
| setUserName | Sets the user name used to authenticate against the server.
设置服务端验证的用户名 |
| setPassword | Sets the password used to authenticate against the server.
设置验证用户的密码 |
| setWillTopic |
If set the server will publish the client's Will message to the specified topics if the client has an unexpected disconnection. 当客户端异常断开时,服务器按这里指定的主题发意愿消息。 |
| setWillMessage | The Will message to send. Defaults to a zero length message.
意愿消息 |
| setWillQos | Sets the quality of service to use for the Will message. Defaults to QoS.AT_MOST_ONCE.
意愿消息的QoS |
| setWillRetain | Set to true if you want the Will to be published with the retain option. |
| setVersion | Set to "3.1.1" to use MQTT version 3.1.1. Otherwise defaults to the 3.1 protocol version.
设置MQTT协议版本 |
采用MQTT协议实现android消息推送(4)选fusesource-mqtt-client为客户端的更多相关文章
- 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表
1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...
- 采用MQTT协议实现android消息推送(1)MQTT 协议简介
1.资料 mqtt官网 http://mqtt.org/ 服务端程序列表 https://github.com/mqtt/mqtt.github.io/wiki/servers 客户端库列表 http ...
- 采用MQTT协议实现android消息推送(3)选ActiveMQ当服务端
官网: http://activemq.apache.org/ 1.简介 强壮.快速.客户端支持多种语言的mqtt服务端软件. 2.特性 MQTT v3.1.AMQP v1.0.Stomp .Open ...
- Android消息推送(二)--基于MQTT协议实现的推送功能
国内的Android设备,不能稳定的使用Google GCM(Google Cloud Messageing)消息推送服务. 1. 国内的Android设备,基本上从操作系统底层开始就去掉了Googl ...
- Android消息推送完美方案[转]
转自 Android消息推送完美方案 推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原因,Android消息推送我们不得不大费周折.本文就是用来 ...
- Android消息推送完美方案
转自:http://bbs.hiapk.com/thread-4652657-1-1.html 推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原 ...
- Android消息推送完美解决方案全析
推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原因,Android消息推送我们不得不大费周折.本文就是用来和大家共同探讨一种Android消息推 ...
- 使用GCM服务(Google Cloud Messaging)实现Android消息推送
最近在网上查了关于很多Android消息推送的资料,其中主要有四种方法. 1) 使用GCM服务(Google Cloud Messaging) 2) 使用XMPP协议(Openfire + Spark ...
- Android消息推送的服务端
2.Android消息推送 MQTT服务器采用mosquito http://mosquitto.org/ PHP管理包采用phpmqttclient:https://github.com/toku ...
随机推荐
- 实践作业3:白盒测试---细化明确任务DAY5
收到老师给我写的评论,感觉老师真的太认真,每个博客都有仔细的,参考了老师发给我的博客,我才明白老师想要的博客内容原来是具体实际的进展记录.我们组其实这些东西早就确定了,会议也开了,但是我之前不明白博客 ...
- iPhone的home键进果汁了,按起来粘粘的感觉
解决办法是按住home键转动一下,再用棉签蘸点水或者酒精都行(注意:水不要太多,不能让水渗进去),用棉签按压home 键多转几圈就好了.
- Oracle数据库之单表查询
接着上一篇的分享,今天主要给大家分享的是关于数据中的单表查询,单表查询很基础,也很重要,但是任何一个初学者必须要掌握的姿势,单表查询就是对单个表进行操作,查询我们想要的数据.单表查询里面的内容也是比较 ...
- 20145218PC平台逆向破解
20145218PC平台逆向破解 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同 ...
- Android Butterknife框架 注解攻略
一.原理. 最近发现一个很好用的开源框架,蛮不错的,可以简化你的代码,是关于注解的.不多说直接进入使用步骤讲解. 二.步骤. 1.准备阶段,先到官网( http://jakewharton.githu ...
- Android getDimension,getDimensionPixelOffset,getDimensionPixelSize
1.例如在onMeasure(int , int)方法中可能要获取自定义属性的值.如: TypedArray a = context.obtainStyledAttributes(attrs, R.s ...
- C语言中无符号与有符号问题
unsigned char a[5] = { 12,36,96,128,182 }; a[]范围为0~256. 数组中数都有效. char a[5] = { 12,36,96,128,182 }; a ...
- hbase0.92 数据修复
现有集群环境:8台region server.1台master server 早晨重启某一region server后,该server的region全部下线未恢复. 重启前 hbase(main):0 ...
- 金庸笔下的"程序员" | 附金庸武侠全集
金庸 飞雪连天射白鹿,笑书神侠倚碧鸳当您八十高龄取得牛津大学唐朝史学博士学位,我还以为这是另一部史诗开始的信号,然而没有后续了.我的高中到大学,是十遍<笑傲江湖>的距离,我的整个青春,是大 ...
- 在请求中存取属性setAttribute&getAttribute方法
在请求中保存属性: public void setAttribute(String name,Object o) request.setAttribute("mess"," ...