热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MQTT无法接收消息

最近在学习android推送的实现,Client用的paho,broker用的Apollo,在写测试demo时出现了以下情况:在app中subscribe主题topic1

最近在学习android推送的实现,Client用的paho,broker用的Apollo,在写测试demo时出现了以下情况:

  1. 在app中subscribe主题topic1,broker中没有topic1,则后台publish消息到topic1后,app的connectionLost方法被回调,而messageArrived并没有被回调;

  2. 在app中subscribe主题topic1,broker中存在topic1,则app的MqttCallback中的messageArrived方法被回调。如果此时在后台再次publish消息到topic1,则app的connectionLost被回调。

可能我的表达不够清晰,请看程序代码,请问我的代码有什么问题。

Android代码

1
MainActivity.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class MainActivity extends Activity {

    private TextView tv;

    private Handler mhandler = new Handler() {

        @Override

        public void handleMessage(Message msg) {

            super.handleMessage(msg);

            String strCOntent= tv.getText().toString();

            strContent += "\n" + msg.getData().getString("content");

            //每接收一次消息,将消息内容追加到textview中显示

            tv.setText(strContent);

        }

    };



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        tv = (TextView) findViewById(R.id.tv);

        try {

            Subscribe.doTest(mhandler);

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

1
Subscribe.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class Subscribe {

    private final static String userName = "admin";

    private final static String passWord = "password";

    private final static String HOST = "tcp://10.0.2.2:61613";

    private final static String TOPIC = "t1";

    private static MqttClient client;



    public static void doTest(final Handler mhandler) throws Exception {

        client = new MqttClient(HOST, "java_client", new MemoryPersistence());

        MqttConnectOptions optiOns= new MqttConnectOptions();

        options.setCleanSession(true);

        options.setUserName(userName);

        options.setPassword(passWord.toCharArray());

        client.setCallback(new MqttCallback() {



            @Override

            public void messageArrived(String arg0, MqttMessage arg1)

                    throws Exception {

                Message msg = Message.obtain();

                Bundle bundle = new Bundle();

                bundle.putString("content", arg1.toString());

                msg.setData(bundle);

                mhandler.sendMessage(msg);

                System.out.println("Client messageArrived");

            }



            @Override

            public void deliveryComplete(IMqttDeliveryToken arg0) {

                System.out.println("Client deliveryComplete");

            }



            @Override

            public void connectionLost(Throwable arg0) {

                System.out.println("Client connectionLost");

                if (!client.isConnected()) {

                    try {

                        client.connect();

                    } catch (Exception e) {

                        e.printStackTrace();

                    }

                }

            }

        });

        client.connect(options);

        client.subscribe(TOPIC);

    }

}


后台代码:

1
PubTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class PubTest {

    private static String userName = "admin";

    private static String passWord = "password";

    private static String HOST = "tcp://127.0.0.1:61613";

    private static MqttClient client;



    public static void main(String[] args) {

        try {

            client = new MqttClient(HOST, "java_client",

                    new MemoryPersistence());

            MqttConnectOptions optiOns= new MqttConnectOptions();

            options.setCleanSession(false);

            options.setUserName(userName);

            options.setPassword(passWord.toCharArray());

            MqttTopic topic = client.getTopic("t1");

            MqttMessage message = new MqttMessage("m1".getBytes());

            message.setQos(1);

            message.setRetained(true);

            client.connect(options);

            MqttDeliveryToken token = topic.publish(message);

            while (!token.isComplete()) {

                token.waitForCompletion();

            }

            client.disconnect();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}



推荐阅读
  • Activity跳转动画 无缝衔接
    Activity跳转动画 无缝衔接 ... [详细]
  • 深入解析Android Activity生命周期
    本文详细探讨了Android中Activity的生命周期,通过实例代码和详细的步骤说明,帮助开发者更好地理解和掌握Activity各个阶段的行为。 ... [详细]
  • 本教程旨在指导开发者如何在Android应用中通过ViewPager组件实现图片轮播功能,适用于初学者和有一定经验的开发者,帮助提升应用的视觉吸引力。 ... [详细]
  • 本文详细介绍了`android.os.Binder.getCallingPid()`方法的功能和应用场景,并提供了多个实际的代码示例。通过这些示例,开发者可以更好地理解如何在不同的开发场景中使用该方法。 ... [详细]
  • 本文探讨了如何在游戏启动画面中移除广告,特别是在游戏数据加载期间(大约5-6秒)广告会短暂显示的问题。通过调整XML布局和代码逻辑,可以实现广告的延迟加载或完全移除。 ... [详细]
  • 前言:由于Android系统本身决定了其自身的单线程模型结构。在日常的开发过程中,我们又不能把所有的工作都交给主线程去处理(会造成UI卡顿现象)。因此,适当的创建子线程去处理一些耗 ... [详细]
  • 在Android应用开发中,当在MenuItem中通过app:actionLayout属性使用Switch控件时,可能会遇到空指针异常的问题。本文将探讨该问题的原因及解决方案。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • SQLite是一种轻量级的关系型数据库管理系统,尽管体积小巧,却能支持高达2TB的数据库容量,每个数据库以单个文件形式存储。本文将详细介绍SQLite在Android开发中的应用,包括其数据存储机制、事务处理方式及数据类型的动态特性。 ... [详细]
  • 本文详细介绍了一种实现PopupWindow全屏显示且能有效隐藏虚拟按键的技术方案,适用于Android开发。此方法经过实际测试,表现良好,兼容性优秀。 ... [详细]
  • 本文介绍了在解决Hive表中复杂数据结构平铺化问题后,如何通过创建视图来准确计算广告日志的曝光PV,特别是针对用户对应多个标签的情况。同时,详细探讨了UDF的使用方法及其在实际项目中的应用。 ... [详细]
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • MVC框架下使用DataGrid实现时间筛选与枚举填充
    本文介绍如何在ASP.NET MVC项目中利用DataGrid组件增强搜索功能,具体包括使用jQuery UI的DatePicker插件添加时间筛选条件,并通过枚举数据填充下拉列表。 ... [详细]
  • 基于Flutter实现风车加载组件的制作_Android
    Flutter官方提供了诸如 CircularProgressIndicator和 LinearProgressIndicator两种常见的加载指示组件,但是说实话,实在太普通,所 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
author-avatar
j7988l28
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有