前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3-STM32+CH395Q(以太网)基本控制篇(自建物联网平台)-编写android连接MQTT服务器程序 这一节编写android连接MQTT服务器程序提示:为

3-STM32+CH395Q(以太网)基本控制篇(自建物联网平台)-编写android连接MQTT服务器程序 这一节编写android连接MQTT服务器程序提示:为

作者头像
杨奉武
发布2021-07-19 16:03:09
5280
发布2021-07-19 16:03:09
举报
文章被收录于专栏:知识分享

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

说明

这一节编写android连接MQTT服务器程序

提示:为了便于移植扩展使用,我封装了下MQTT.这节只说明在MyMqttClint.java的移植使用

新建工程

安装MQTT的Jar包

1.第一种方式

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

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

拷贝到自己工程的libs里面

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

1.根据自己的MQTT服务器修改MQTT信息

2,增加网络权限

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

连接MQTT

1.把以下代码在初始化的时候调用一次,该代码写一次即可,后期断线自动重连

MyMqttClient.sharedCenter().setConnect();

2.安装运行APP

订阅主题

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

上面那样子做有可能订阅不成功,因为可能还没连接上,

建议使用下面的方式, 设置订阅成功回调,用一个定时器持续订阅

代码语言:javascript
复制
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();

        //MQTT连接成功回调
        MyMqttClient.sharedCenter().setOnServerConnectedCallback(new MyMqttClient.OnServerConnectedCallback() {
            @Override
            public void callback() {
                startTimerSubscribeTopic();//定时订阅主题
            }
        });

        //订阅主题成功回调
        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();
    }
}

注意:这两个地方不可省略,只要进入页面就启动定时器订阅,如果在运行过程中MQTT断线重连了,则接着重新订阅

取消订阅

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

接收消息

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

代码语言:javascript
复制
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连接状态

代码语言:javascript
复制
/*连接上MQTT*/
        MyMqttClient.sharedCenter().setOnServerConnectedCallback(new MyMqttClient.OnServerConnectedCallback() {
            @Override
            public void callback() {

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

            }
        });
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
    • 这一节编写android连接MQTT服务器程序
      • 提示:为了便于移植扩展使用,我封装了下MQTT.这节只说明在MyMqttClint.java的移植使用
      • 新建工程
      • 安装MQTT的Jar包
        • 1.第一种方式
          • implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'
        • 2.第二种,我准备好了jar包,可以直接导入 jar包
          • 拷贝到自己工程的libs里面
      • 把MyMqttClient.java 文件放到自己的工程
        • 1.根据自己的MQTT服务器修改MQTT信息
          • 2,增加网络权限
            • <uses-permission android:name="android.permission.INTERNET" />
        • 连接MQTT
          • 1.把以下代码在初始化的时候调用一次,该代码写一次即可,后期断线自动重连
            • MyMqttClient.sharedCenter().setConnect();
              • 2.安装运行APP
                • MyMqttClient.sharedCenter().setSubscribe("1111",0);//订阅主题1111,消息等级0
                • 上面那样子做有可能订阅不成功,因为可能还没连接上,
                • 建议使用下面的方式, 设置订阅成功回调,用一个定时器持续订阅
                • 注意:这两个地方不可省略,只要进入页面就启动定时器订阅,如果在运行过程中MQTT断线重连了,则接着重新订阅
                • MyMqttClient.sharedCenter().setUnSubscribe("1111");//取消订阅主题1111
                • 哪个文件需要获取MQTT数据,只需要按照下面的方式写上即可!
            • 订阅主题
            • 取消订阅
            • 接收消息
            • 发布消息
              • 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连接状态
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档