3-STM32+CH395Q(以太网)基本控制篇(自建物联网平台)-编写android连接MQTT服务器程序
时间:2021-07-15
本文章向大家介绍3-STM32+CH395Q(以太网)基本控制篇(自建物联网平台)-编写android连接MQTT服务器程序,主要包括3-STM32+CH395Q(以太网)基本控制篇(自建物联网平台)-编写android连接MQTT服务器程序使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
<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
上面那样子做有可能订阅不成功,因为可能还没连接上,
建议使用下面的方式, 设置订阅成功回调,用一个定时器持续订阅
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数据,只需要按照下面的方式写上即可!
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) { } });
原文地址:https://www.cnblogs.com/yangfengwu/p/15014956.html
- 为什么 Laravel 会成为最成功的 PHP 框架?
- 【生信菜鸟经】如何系统入门Perl
- 【翻译】MongoDB指南/CRUD操作(四)
- R包终极解决方案
- Table被web编程弃用的原因
- Web安全实战
- 【翻译】MongoDB指南/聚合——聚合管道
- PHP异步高并发扩展Swoole
- TensorFlow从0到1丨 第五篇:TensorFlow轻松搞定线性回归
- 【直播】我的基因组59:把我的数据伪装成23andme或wegene的芯片数据
- asp.net web api客户端调用
- 细说WebSocket - Node篇
- TensorFlow从0到1丨 第六篇:解锁梯度下降算法
- .Net多线程编程—误用点分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 编程体系结构(03):Java集合容器
- SpringBoot2 集成日志,复杂业务下的自定义实现
- 事件统计 | performance_schema全方位介绍
- 如何理解直播APP源码开发中的音视频同步
- 在GitHub上发布一个Python项目需要注意哪些
- CS学习笔记 | 21、反向转发通道的建立
- CS学习笔记 | 22、通过SSH开通通道
- 一文搞懂 java -jar 发生了什么
- 树莓派4裸机基础教程:环境搭建
- Oh! Binlog还能这样用之Canal篇
- docker安装elasticsearch和head插件
- redis学习(十六)
- 商业鬼才教你 策略模式
- 为什么StringBuilder是线程不安全的?
- (四)Hive分区、分桶