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

MQTT协议实现Android消息推送

2017-03-07 10:30 183 查看
MQTT协议是订阅/发布协议,使用中间件将消息转发,中间件服务器有很多,这里我们使用mosquitto

1、下载安装mosquitto

双击安装程序,安装一般安装过程安装即可,安装完成后可以测试服务。

2、测试服务   简单使用mosquitto

2.1启动服务       打开命令行窗口,进入到mosquitto的安装目录,执行mosquitto.exe启动服务

2.2订阅主题    执行 mosquitto_sub -v -t test

    【-t】指定主题,此处为test

    【-v】打印更多的调试信息

2.3发布内容  另外打开一个命令行窗口 执行 mosquitto_pub -t

test  -m helloworld

    【-t】指定主题            test

    【-m】指定消息内容   helloworld

在发布窗口回车之后就会在订阅窗口接收到消息,sensor 12  这就是mosquitto的简单使用

3.代码实现消息推送

在Android Studio中创建测试Module

导入jar包org.eclipse.paho.client.mqttv3-1.0.1.jar

创建布局文件,有两个按钮,一个发布一个接受,一个文本框填写发布内容

主要代码:

private EditText content;
private MqttClient sampleClient = null;
private String[] topicFilters = {"test1", "test2"};//发布或订阅主题,(我要发布或订阅什么消息)
private String broker = "tcp://172.19.137.140:1883";//服务器地址及端口 就是自己的IP(我要去哪里订阅消息)
private String clientId = "paho1352798577649702";//客户端ID 就是用这个来标识客户端在服务器上的唯一(是谁在服务器上发布或订阅消息)
private MemoryPersistence persistence = new MemoryPersistence();
private MqttConnectOptions connOpts = new MqttConnectOptions();//连接配置
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button publish = (Button) findViewById(R.id.publish);
Button receive = (Button) findViewById(R.id.receive);
content = (EditText) findViewById(R.id.content);
try {
//创建客户端
sampleClient = new MqttClient(broker, clientId, persistence);
connOpts.setCleanSession(false);
//连接服务器
sampleClient.connect(connOpts);
} catch (MqttException e) {
e.printStackTrace();
}
publish.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
//创建要发布的消息
MqttMessage message = new MqttMessage(content.getText().toString().trim().getBytes());
message.setQos(1);
//发布消息
sampleClient.publish("test1", message);
} catch (MqttException me) {
System.out.println("reason " + me.getReasonCode());
System.out.println("msg " + me.getMessage());
System.out.println("loc " + me.getLocalizedMessage());
System.out.println("cause " + me.getCause());
System.out.println("excep " + me);
me.printStackTrace();
}
}
});
receive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
//获取消息回调
sampleClient.setCallback(new MyCallBack());
//订阅消息
sampleClient.subscribe(topicFilters, new int[]{1, 1});
} catch (MqttException me) {
System.out.println("reason " + me.getReasonCode());
System.out.println("msg " + me.getMessage());
System.out.println("loc " + me.getLocalizedMessage());
System.out.println("cause " + me.getCause());
System.out.println("excep " + me);
me.printStackTrace();
}
}
});
}回调消息的处理:
class MyCallBack implements MqttCallback{

@Override
public void messageArrived(String arg0, MqttMessage arg1) throws Exception {
System.out.println("MqttMessage:" + arg1.toString());
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putString("content", arg1.toString());
message.setData(bundle);
handler.sendMessage(message);
}
@Override
public void deliveryComplete(IMqttDeliveryToken arg0) {
}
@Override
public void connectionLost(Throwable arg0) {

}
}
详细代码

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: