zoukankan      html  css  js  c++  java
  • 72-STM32+ESP8266+AIR202基本控制篇-移植使用-移植Android的MQTT包到自己的工程项目

    <p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_A/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

    说明

    如果代码只是给别人乐呵一下,而不能移植使用,代码便失去了它最伟大的意义.

    为便于客户移植使用Android连接MQTT实现通信控制,这节说明下MQTT底层包的移植与使用.

    新建工程

     

     

    安装MQTT的Jar包

    1.第一种方式

    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.2'

    2.第二种,我准备好了jar包,可以直接导入 jar包

    拷贝到自己工程的libs里面

     

     

    把MyMqttClient.java 文件放到自己的工程

    1.修改MQTT信息

    2,增加网络权限

    <uses-permission android:name="android.permission.INTERNET" />

    连接MQTT

    该代码写一次即可,后期断线自动重连

    MyMqttClient.sharedCenter().setConnect();

    订阅主题

    MyMqttClient.sharedCenter().setSubscribe("1111",0);//订阅主题1111,消息等级0

    建议使用方式

    public class MainActivity extends AppCompatActivity {
        //定时器用于轮训订阅主题
        private Timer timerSubscribeTopic = null;
        private TimerTask TimerTaskSubscribeTopic = null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            MyMqttClient.sharedCenter().setConnect();
    
            /**
             * 订阅主题成功回调
             */
            MyMqttClient.sharedCenter().setOnServerSubscribeCallback(new MyMqttClient.OnServerSubscribeSuccessCallback() {
                @Override
                public void callback(String Topic, int qos) {
                    if (Topic.equals("1111")){//订阅1111成功
                        stopTimerSubscribeTopic();//订阅到主题,停止订阅
                    }
                }
            });
            startTimerSubscribeTopic();//定时订阅主题
        }
    
        /**
         * 定时器每隔1S尝试订阅主题
         */
        private void startTimerSubscribeTopic(){
            if (timerSubscribeTopic == null) {
                timerSubscribeTopic = new Timer();
            }
            if (TimerTaskSubscribeTopic == null) {
                TimerTaskSubscribeTopic = new TimerTask() {
                    @Override
                    public void run() {
                        MyMqttClient.sharedCenter().setSubscribe("1111",0);//订阅主题1111,消息等级0
                    }
                };
            }
            if(timerSubscribeTopic != null && TimerTaskSubscribeTopic != null )
                timerSubscribeTopic.schedule(TimerTaskSubscribeTopic, 0, 1000);
        }
    
        private void stopTimerSubscribeTopic(){
            if (timerSubscribeTopic != null) {
                timerSubscribeTopic.cancel();
                timerSubscribeTopic = null;
            }
            if (TimerTaskSubscribeTopic != null) {
                TimerTaskSubscribeTopic.cancel();
                TimerTaskSubscribeTopic = null;
            }
        }
    
        //当活动不再可见时调用
        @Override
        protected void onStop()
        {
            super.onStop();
            stopTimerSubscribeTopic();//停止定时器订阅
        }
    
        /**
         * 当处于停止状态的活动需要再次展现给用户的时候,触发该方法
         */
        @Override
        protected void onRestart() {
            super.onRestart();
            startTimerSubscribeTopic();//定时订阅主题
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            stopTimerSubscribeTopic();
        }
    }

    取消订阅

    MyMqttClient.sharedCenter().setUnSubscribe("1111");//取消订阅主题1111

    接收消息

    哪个文件需要获取MQTT数据,只需要按照下面的方式写上即可!

    MyMqttClient.sharedCenter().setOnServerReadStringCallback(new MyMqttClient.OnServerReadStringCallback() {
                @Override//Topic:主题  Msg.toString():接收的消息  MsgByte:16进制消息
                public void callback(String Topic, MqttMessage Msg, byte[] MsgByte) {
                    Log.e("MqttMsg", "Topic: "+Topic+" Msg"+Msg.toString() );
                }
            });

    发布消息

    1.发布字符串消息

    MyMqttClient.sharedCenter().setSendData("2222","msg",0,false);//发送字符串消息

    2222:发布的主题 msg:发布的消息 0:消息等级 false:不需要服务器记录

    2.发布16进制消息

    byte[] bytes= new byte[2];

    bytes[0] = 0x03;

    bytes[1] = 0x55;

    MyMqttClient.sharedCenter().setSendData("3333",bytes,0,false);

    监听MQTT连接状态

    /*连接上MQTT*/
            MyMqttClient.sharedCenter().setOnServerConnectedCallback(new MyMqttClient.OnServerConnectedCallback() {
                @Override
                public void callback() {
    
                }
            });
            /*和MQTT服务器断开连接*/
            MyMqttClient.sharedCenter().setOnServerDisConnectedCallback(new MyMqttClient.OnServerDisConnectedCallback() {
                @Override
                public void callback(Throwable e) {
    
                }
            });

    结语

    用户只需要在一开始运行下

    MyMqttClient.sharedCenter().setConnect();

    然后其余的API函数在各个文件夹里面调用即可!

  • 相关阅读:
    下午不想写代码了,写个shelve的模块使用(简单实用的小型数据库)。
    io,pickle,json,一把梭哈,把这三个模块都讲了。
    import 和 __import__的区别
    namedtuple工厂函数,创造一个像实例对象的元祖(感觉到了Python的奇妙与可爱之处)。
    写一下base64字节码转换工具。
    Python加密模块的hashlib,hmac模块介绍。
    简述Orderdict,defaultdcit,ChainMap以及MappingProxyType
    工作中碰到的小问题,如何对列表内的字典排序,以及operator.itemgetter介绍。
    最近在写一个虚拟币搬砖脚本,几条建议备注下。
    Python的re,正则表达式,希望这次比较能让我记住里面的80%以上。(未完成,待继续)
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/13568712.html
Copyright © 2011-2022 走看看