MQTT协议实现Android消息推送

本文介绍MQTT协议的基础概念,并通过mosquitto演示如何实现消息的订阅与发布。包括安装配置mosquitto、命令行测试服务、以及在Android平台上的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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) {

        }
    }

详细代码







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值