Android+MQTT(Android APP 连接至MQTT服务器)

article/2025/9/11 22:35:54

这段时间因为毕设的需求,接触学习了一下用Android app连接MQTT服务器,然后对下位机(STM32/ESP8266)进行数据通讯的一个小设计,本篇文章介绍app+MQTT服务器这一段。

实现原理:

这里设计的是一个监测控制智能风扇的APP,可以实时监测当前温度、湿度及下位机的传感器、控制器件的一些状态。

一、设计流程:

  1. Android app项目创建;
  2. UI控制界面设计;
  3. 导入MQTT jar包;
  4. 配置联网权限;
  5. 配置MQTT服务器连接参数;
  6. MQTT.fx实现联调;

二、设计实现

1、Android app项目创建

项目创建这里就不过多赘述了!

2、UI控制界面设计

我这里主要是以毕设的需求设计的,所以比较简单;

模拟器界面

 手机app界面

 

这个显示界面代码相对简单,有需要的可以参考一下,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:orientation="vertical"android:background="#078307"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="78dp"><TextViewandroid:layout_width="match_parent"android:layout_marginTop="10dp"android:text="智能温控风扇系统设计"android:textSize="24sp"android:layout_marginLeft="6dp"android:layout_gravity="center"android:textColor="@color/white"android:layout_height="wrap_content"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:background="#FAF6F6"android:orientation="vertical"android:layout_height="710dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_marginTop="20dp"android:layout_height="wrap_content"><androidx.cardview.widget.CardViewandroid:layout_width="match_parent"android:layout_height="200dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"app:cardCornerRadius="20dp"><ImageViewandroid:id="@+id/m_im_1"android:layout_width="wrap_content"android:src="@drawable/img_3"android:layout_height="wrap_content"/></androidx.cardview.widget.CardView></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_marginTop="30dp"android:orientation="vertical"android:layout_height="300dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_marginTop="30sp"android:orientation="horizontal"android:layout_height="wrap_content"><TextViewandroid:id="@+id/m_temp"android:layout_width="wrap_content"android:text="温度:0 ℃"android:textSize="16sp"android:layout_weight="1"android:textColor="@color/black"android:layout_marginLeft="30dp"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/m_humi"android:layout_weight="1"android:layout_width="wrap_content"android:text="湿度:0 %"android:textSize="16sp"android:textColor="@color/black"android:layout_marginLeft="30dp"android:layout_height="wrap_content"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_marginTop="50dp"android:padding="30dp"android:layout_height="wrap_content"><TextViewandroid:layout_width="wrap_content"android:text="MQTT连接状态:"android:textColor="@color/black"android:textSize="16sp"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/m_mqtt"android:layout_width="wrap_content"android:text=" "android:textColor="@color/black"android:textSize="16sp"android:layout_height="wrap_content"/></LinearLayout></LinearLayout></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:orientation="vertical"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><ImageButtonandroid:layout_width="30dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:layout_weight="1"android:layout_height="40dp"/><ImageButtonandroid:layout_width="30dp"android:layout_marginRight="10dp"android:layout_weight="1"android:layout_height="40dp"/><ImageButtonandroid:layout_width="30dp"android:layout_marginRight="10dp"android:layout_weight="1"android:layout_height="40dp"/><ImageButtonandroid:layout_width="30dp"android:layout_marginRight="10dp"android:layout_weight="1"android:layout_height="40dp"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:orientation="horizontal"android:layout_height="wrap_content"><TextViewandroid:layout_width="wrap_content"android:text="我的"android:gravity="center"android:textSize="16sp"android:layout_weight="1"android:layout_marginLeft="10dp"android:textColor="@color/white"android:layout_height="wrap_content"/><TextViewandroid:layout_width="wrap_content"android:text="我的"android:gravity="center"android:textSize="16sp"android:layout_weight="1"android:layout_marginLeft="10dp"android:textColor="@color/white"android:layout_height="wrap_content"/><TextViewandroid:layout_width="wrap_content"android:text="我的"android:gravity="center"android:textSize="16sp"android:layout_weight="1"android:layout_marginLeft="10dp"android:textColor="@color/white"android:layout_height="wrap_content"/><TextViewandroid:layout_width="wrap_content"android:text="我的"android:gravity="center"android:textSize="16sp"android:layout_weight="1"android:layout_marginRight="10dp"android:layout_marginLeft="10dp"android:textColor="@color/white"android:layout_height="wrap_content"/></LinearLayout></LinearLayout></LinearLayout></LinearLayout>

3、导入MQTT jar包

进入正题,开始导入MQTT所需要的jar包:

jar包链接 链接:https://pan.baidu.com/s/1hLt1xiL67dhbJ3v3MKfUlw 
提取码:wmmh

下载jar包后直接复制这个jar包

 

然后给粘贴至libs目录下

 点击OK即可

 导入

 

然后鼠标右键给它添加依赖

点击OK

 

等待构建完成即可.

此时我们来到java代码界面敲MQTT就可以看到很多方法

 

 好,到了这一步就可以添加MQTT的配置代码了

在onCreate后面添加下列代码

 添加代码

// MQTT初始化private void Mqtt_init(){try {//host为主机名,test为clientid即连接MQTT的客户端ID,一般以客户端唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存client = new MqttClient(host, mqtt_id,new MemoryPersistence());//MQTT的连接设置MqttConnectOptions options = new MqttConnectOptions();//设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接options.setCleanSession(false);//设置连接的用户名options.setUserName(userName);//设置连接的密码options.setPassword(passWord.toCharArray());// 设置超时时间 单位为秒options.setConnectionTimeout(10);// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制options.setKeepAliveInterval(20);//设置回调client.setCallback(new MqttCallback() {@Overridepublic void connectionLost(Throwable cause) {//连接丢失后,一般在这里面进行重连System.out.println("connectionLost----------");//startReconnect();}@Overridepublic void deliveryComplete(IMqttDeliveryToken token) {//publish后会执行到这里System.out.println("deliveryComplete---------"+ token.isComplete());}@Overridepublic void messageArrived(String topicName, MqttMessage message)throws Exception {//subscribe后得到的消息会执行到这里面System.out.println("messageArrived----------");Message msg = new Message();msg.what = 3;   //收到消息标志位
//                    msg.obj = topicName + "---" +message.toString();msg.obj = message.toString();handler.sendMessage(msg);    // hander 回传}});} catch (Exception e) {e.printStackTrace();}}// MQTT连接函数private void Mqtt_connect() {new Thread(new Runnable() {@Overridepublic void run() {try {if(!(client.isConnected()) )  //如果还未连接{MqttConnectOptions options = null;client.connect(options);Message msg = new Message();msg.what = 31;handler.sendMessage(msg);}} catch (Exception e) {e.printStackTrace();Message msg = new Message();msg.what = 30;handler.sendMessage(msg);}}}).start();}// MQTT重新连接函数private void startReconnect() {scheduler = Executors.newSingleThreadScheduledExecutor();scheduler.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {if (!client.isConnected()) {Mqtt_connect();}}}, 0*1000, 10 * 1000, TimeUnit.MILLISECONDS);}// 订阅函数    (下发任务/命令)private void publishmessageplus(String topic,String message2){if (client == null || !client.isConnected()) {return;}MqttMessage message = new MqttMessage();message.setPayload(message2.getBytes());try {client.publish(topic,message);} catch (MqttException e) {e.printStackTrace();}}/* ========================================================================================== */

不出意外,这里会出现一堆报红

 

不用慌,这是因为有一些方法还没构建,有一些参数还没声明,我们一步一步来;

光标放置后按alt+Enter后,有部分参数就会自动构建,开干

 然后把下列处理代码添加至主函数(这个位置)

 

        Mqtt_init();startReconnect();handler = new Handler(Looper.myLooper()) {@SuppressLint("SetTextI18n")public void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case 1: //开机校验更新回传break;case 2:  // 反馈回传break;case 3:  //MQTT 收到消息回传   UTF8Buffer msg=new UTF8Buffer(object.toString());System.out.println(msg.obj.toString());   // 显示MQTT数据break;case 30:  //连接失败Toast.makeText(MainActivity.this,"连接失败" ,Toast.LENGTH_SHORT).show();break;case 31:   //连接成功Toast.makeText(MainActivity.this,"连接成功" ,Toast.LENGTH_SHORT).show();try {client.subscribe(mqtt_sub_topic,1);} catch (MqttException e) {e.printStackTrace();}break;default:break;}}};/* -------------------------------------------------------------------------------------- */

好,把这个配置代码加上去

    private ScheduledExecutorService scheduler;private MqttClient client;private Handler handler;private String host = "tcp://114.132.53.92:1883";     // TCP协议private String userName = "aixin123456";private String passWord = "aixin123456";private String mqtt_id = "1353023461";private String mqtt_sub_topic = "mqtt135";private String mqtt_pub_topic = "esp135";

 

那么到达这一步就不会有报错了!  解决

4、配置联网权限

在事件清单中添加联网权限

    <!--允许程序打开网络套接字--><uses-permission android:name="android.permission.INTERNET" /><!--允许程序获取网络状态--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

5、配置服务器参数

这里的服务器连接的参数注意一定要修改,这里连接服务器地址可以填写我的服务器地址(“tcp://114.132.53.92:1883”),当然也可以使用官方公用的MQTT服务器地址或者用别人的都是可以的;然后就是用户名和密码,一定不要用这里我填写的这个,可以用自己的QQ加上一些英文,或者自定义一些内容都是可以的,注意不要用我这里填写的这个!!! 然后就是订阅和发布号可以随意起,建议不用下面这些!


    private String host = "tcp://114.132.53.92:1883";     // TCP协议
    private String userName = "aixin123456";
    private String passWord = "aixin123456";
    private String mqtt_id = "1353023461";
    private String mqtt_sub_topic = "mqtt135";
    private String mqtt_pub_topic = "esp135";

好!配置完以上步骤之后,咱们就可以下载到模拟机或者真机测试一下了,这里我用的真机测试,不用慌!直接下载运行,弹窗弹出连接成功!完美

真机运行画面

 

那么到这里我们的app已经成功连接了MQTT服务器了!

6、MQTT.fx实现联调

这里需要使用到一个测试软件 MQTT.fx

这里不提供软件安装包(我的找不到按转包在哪了),网上有教程,也可以去官网下载

这里的连接服务器地址填114.132.53.92或者是你自己app中连接的地址,端口1883,clientld_ID可以自己填

 用户名和密码也可以自己填写(需要注意的是,这里填写的这些其实是模拟你下位机的连接用户信息,也就是你STM32通过ESP8266连接MQTT服务器的信息) 

点击这里,填写发布号以及填写要发往app中的信息,点击Publish

 

然后就可以看的到Android Studio调试台下的接收到了数据,到了这里是不是就实现了下位机上传数据至MQTT服务器至客户端手机APP

这里再介绍一种简单的Json格式数据处理吧!

简单的Json数据格式模拟下位机数据

{"name":"ESP135","Temp":"26","Humi":"78"} 

这里我们就要在app中添加一个Json数据处理的函数,形参就是需要处理的字符串

    // Json数据解析private void parseJsonobj(String jsonobj){// 解析jsontry {JSONObject jsonObject = new JSONObject(jsonobj);String name = jsonObject.getString("name");String temp = jsonObject.getString("Temp");String humi = jsonObject.getString("Humi");m_temp.setText("温度: "+temp+" ℃ ");m_humi.setText("湿度: "+humi+" % ");} catch (JSONException e) {e.printStackTrace();}}

app中接收到的数据

 经过处理后就可以在我们app的控件中以指定格式显示

 这样是不是感觉就出来了!好到此那么我们上位机数据接收就差不多了

嗯,那么app向下位机发送数据呢!其实也就是订阅号与STM32+ESP的信息关联后,经过一个函数就可以下发数据了,下一篇下位机(STM32+ESP)再详细介绍吧!发送的函数已经添加在上述的代码中了;这里贴出来一个示例代码,简单介绍一下,一个按键然后下发数据 publishmessageplus(mqtt_pub_topic,"{\"set_curtain\": \"fB}");

     // 关闭控件点击事件private void button_guan(View v){if(curtain_flag == 0){curtain_flag = 1;// 发送指令让下位机关闭窗帘publishmessageplus(mqtt_pub_topic,"{\"set_curtain\": \"fB}");}mtv_1.setText("关闭");}

最后,嗯就这样!第一次写这么长篇的学习记录,也是对自己所学内容的一种巩固,希望能帮到有需要的同志,如果有错误的地方还请多多见谅!谢谢!!!


http://chatgpt.dhexx.cn/article/0utgHPsX.shtml

相关文章

MQTT:windows最简单搭建mqtt服务端及本地客户端测试

一、mqtt服务端搭建 推荐使用emq的开源服务端emqx&#xff0c;目前是使用最广泛的mqtt服务端。 github上下载地址为https://github.com/emqx/emqx/releases&#xff0c;当前最新windows版本是 emqx-windows-4.3.6.zip。 1.运行服务端 下载完解压缩出来&#xff0c;在bin目…

springboot 整合 mqtt

springboot 整合 mqtt 最近由于iot越来越火, 物联网的需求越来越多, 那么理所当然的使用mqtt的场景也就越来越多, 接下来是我使用springboot整合mqtt的过程, 以及踩过的一些坑. mqtt服务器使用的是 EMQX, 官网 : 这里 搭建的时候如果你使用的是集群 记得开放以下端口: 好了, …

Springboot实现MQTT通信

目录 一、MQTT简介1、MQTT协议2、MQTT协议特点 二、MQTT服务器搭建三、使用Springboot整合MQTT协议1、在父工程下创建一个Springboot项目作为消息的提供者1.1 导入依赖包1.2 修改配置文件1.3 消息发布者客户端配置1.4 消息发布客户端回调1.5 创建控制器测试发布信息 2、在父工程…

一步一步来:MQTT服务器搭建、MQTT客户端使用

物联网应用如火如荼&#xff0c;本文就物联网应用中最受青睐的协议 MQTT相关测试工具的使用进行简单说明。 希望此文能给需要用到的朋友一些微薄的帮助…… 一、MQTT服务器&#xff08; emqx &#xff09;搭建 1. 下载服务器MQTT Broker 从 https://www.emqx.io/cn/mqtt/public…

【MQTT基础篇(三)】连接MQTT服务端

文章目录 连接MQTT服务端1 CONNECT – 连接服务端1.1 clientId – 客户端ID1.2 cleanSession – 清除会话1.3 keepAlive – 心跳时间间隔 2 CONNACK – 确认连接请求2.1 returnCode – 连接返回码2.2 sessionPresent – 当前会话 连接MQTT服务端 MQTT客户端之间要想实现通讯&am…

MQTT介绍与使用

目录 一、MQTT简介 二、特性 三、实现方式   四、MQTT的搭建&#xff08;ubuntu&#xff09; 五、MQTT权限配置 六、MQTT实现&#xff08;Java语言&#xff09; 正文 物联网是新一代信息技术的重要组成部分&#xff0c;也是“信息化”时代的重要发展阶段。其英文名称是&am…

什么是MQTT

1、MQTT来龙去脉 1.1 什么是MQTT MQTT(英文全称Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议)是一种基于发布/订阅&#xff08;PUBLISH/SUBSCRIBE&#xff09;模式的轻量级的物联网通信协议。从这个定义中我们可以总结出四个关键词&#xff1a;消息队…

设备分配与spooling技术详解

5.4 设备分配&#xff08;重点&#xff01;&#xff01;&#xff01;&#xff09; 一、设备分配中的数据结构二、设备分配时应考虑的因素三、设备独立性四、设备独占的分配程序五、Spooling技术 一、设备分配中的数据结构 在进行设备分配时&#xff0c;通常都要借助一些表格…

SPOOLing和虚拟化

什么是虚拟化 虚拟化就是无中生有&#xff0c;就是暗度陈仓&#xff08;狗头保命&#xff09;。仔细观察整个计算机系统的设计&#xff0c;到处都体现着虚拟化的技术。当然虚拟化就是操作系统设计的要求之一。我们很好理解 CPU 的虚拟化技术&#xff0c;也就是通过进程调度实现…

操作系统 假脱机(Spooling)系统

介绍 通过多道程序技术可将一台物理CPU虚拟为多台逻辑CPU&#xff0c;从而允许多个用户共享一台主机。那么&#xff0c;假脱机技术&#xff0c;则可将一台物理I/O设备虚拟为多台逻辑I/O设备&#xff0c;这样也就允许多个用户共享一台物理I/O设备。 1. 假脱机技术 早期&#…

题目SPOOLing系统的设计与实现

最近刚刚做的一个课程设计&#xff0c;关于SPOOLing的。 一、算法或原理的实现思想 技术原理 SPOOLing技术可将一台物理I/O设备虚拟为多台逻辑I/O设备&#xff0c;同样允许多个用户共享一台物理I/O设备。SPOOLing技术把所有用户进程的输出都送入输出井&#xff0c;然后再由输出…

精确度,准确度,精密度关系

1.精确度&#xff0c;准确度&#xff0c;精密度的关系 三者得关系大体可以理解为&#xff0c;准确度精密度 精确度&#xff0c;准确度反应距离真值得偏差&#xff0c;精密度反应测量得稳定性&#xff0c;精确度反应二者之综合。 三者得主次关系&#xff1a;精密度>准确度 …

Mysql的浮点精确度

1.mysql的用于记录小数的类型有三个float ,decimal 和double他们之间的关系 先创建一个表test都用了float ,decimal 和double 插入一条数据查看发现没有发现精度丢失问题 再插入一条数据&#xff0c;发现精度损失&#xff1a; 查看三个类型的范围&#xff1a; 插入小数的位数多…

验证集精确度和损失同时上升

目录 1. 实验结果2. 分析 1. 实验结果 下图中val_acc&#xff0c;val_loss分别表示验证集精确度和损失&#xff1b;train_acc&#xff0c;train_loss分别表示训练集精确度和损失。验证集精确度一直上升&#xff0c;但是损失在第六个epoch后也开始上升&#xff0c;如何解释&…

JavaScript超大或超小数值精确度丢失解决方案

情景一 接口字段&#xff0c;Number类型数据失真&#xff0c;解决方法可直接让服务端把字段类型改成String类型即可。 情景二 某些特殊场景&#xff0c;需要保留小数点后9位(及其以上)&#xff0c;直接调用Number对象自带的toFixed()函数&#xff0c;会出现小数点后数据失真…

关于JavaScript精确度问题

一、js精确度的安全范围是 -2^53 至 2^53 一旦超过这个范围则无法精确表示 1.解决方法 使用第三方包 JSON-Bigint JSONbig.parse() //转换出来的是一个BigNubmer对象 若要使用则用toString()方法 JSONbig.stringify() 2.当axios获取响应数据时自动会将数据JSON.parse()解析为…

【机器学习】准确率、精确度、召回率和 F1 定义

一、说明 数据科学家选择目标变量后 - 例如他们希望预测电子表格中的“列”&#xff0c;并完成了转换数据和构建模型的先决条件&#xff0c;最后步骤之一是评估模型的性能。 二、混淆矩阵的模型 2.1 混淆矩阵 选择性能指标通常取决于要解决的业务问题。假设您的数据集中有 10…

Python计算分类问题的评价指标(准确率、精确度、召回率和F1值,Kappa指标)

机器学习的分类问题常用评论指标有&#xff1a;准确率、精确度、召回率和F1值&#xff0c;还有kappa指标 。 每次调包去找他们的计算代码很麻烦&#xff0c;所以这里一次性定义一个函数&#xff0c;直接计算所有的评价指标。 每次输入预测值和真实值就可以得到上面的指标值&a…

batch_size对精确度和损失的影响

1 问题 在深度学习的学习过程中&#xff0c;模型性能对batchsize虽然没有学习率那么敏感&#xff0c;但是在进一步提升模型性能时&#xff0c;batch_size就会成为一个非常关键的参数。 batch_size对精度和损失的影响研究。 batch_size [,32,64,128&#xff0c;256] 不同batch_…

准度、精度傻傻分不清?

[导读] 做电子产品&#xff0c;常常遇到测量。此时就难免会关注到精度、准度等概念&#xff0c;遇到不少朋友对这两个概念不清楚&#xff0c;今天就来分享一下这两个概念。最近很忙&#xff0c;更的不及时&#xff0c;实在抱歉。也感谢大家不离不弃&#xff01;对于更文分享这件…