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

这篇具有很好参考价值的文章主要介绍了Android+MQTT(Android APP 连接至MQTT服务器)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这段时间因为毕设的需求,接触学习了一下用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项目创建

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

android mqtt,android,服务器,运维,stm32

2、UI控制界面设计

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

模拟器界面

android mqtt,android,服务器,运维,stm32

 手机app界面

android mqtt,android,服务器,运维,stm32

 

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

<?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">

    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:background="#078307"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="78dp">
            <TextView
                android: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>

        <LinearLayout
            android:layout_width="match_parent"
            android:background="#FAF6F6"
            android:orientation="vertical"
            android:layout_height="710dp">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_marginTop="20dp"
                android:layout_height="wrap_content">
                <androidx.cardview.widget.CardView
                    android:layout_width="match_parent"
                    android:layout_height="200dp"
                    android:layout_marginLeft="10dp"
                    android:layout_marginRight="10dp"
                    app:cardCornerRadius="20dp">
                    <ImageView
                        android: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>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_marginTop="30dp"
                android:orientation="vertical"
                android:layout_height="300dp">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_marginTop="30sp"
                    android:orientation="horizontal"
                    android:layout_height="wrap_content">
                    <TextView
                        android: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"/>
                    <TextView
                        android: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>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_marginTop="50dp"
                    android:padding="30dp"
                    android:layout_height="wrap_content">
                    <TextView
                        android:layout_width="wrap_content"
                        android:text="MQTT连接状态:"
                        android:textColor="@color/black"
                        android:textSize="16sp"
                        android:layout_height="wrap_content"/>
                    <TextView
                        android: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>




        <LinearLayout
            android:layout_width="match_parent"
            android:orientation="vertical"
            android:layout_height="match_parent">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <ImageButton
                    android:layout_width="30dp"
                    android:layout_marginLeft="10dp"
                    android:layout_marginRight="10dp"
                    android:layout_weight="1"
                    android:layout_height="40dp"/>
                <ImageButton
                    android:layout_width="30dp"
                    android:layout_marginRight="10dp"
                    android:layout_weight="1"
                    android:layout_height="40dp"/>
                <ImageButton
                    android:layout_width="30dp"
                    android:layout_marginRight="10dp"
                    android:layout_weight="1"
                    android:layout_height="40dp"/>
                <ImageButton
                    android:layout_width="30dp"
                    android:layout_marginRight="10dp"
                    android:layout_weight="1"
                    android:layout_height="40dp"/>

            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:orientation="horizontal"
                android:layout_height="wrap_content">
                <TextView
                    android: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"/>
                <TextView
                    android: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"/>
                <TextView
                    android: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"/>
                <TextView
                    android: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包

android mqtt,android,服务器,运维,stm32

 

然后给粘贴至libs目录下

android mqtt,android,服务器,运维,stm32

 点击OK即可

android mqtt,android,服务器,运维,stm32

 导入

android mqtt,android,服务器,运维,stm32

 

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

android mqtt,android,服务器,运维,stm32

点击OK

android mqtt,android,服务器,运维,stm32 

等待构建完成即可.

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

android mqtt,android,服务器,运维,stm32 

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

在onCreate后面添加下列代码

android mqtt,android,服务器,运维,stm32

 添加代码

// 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() {
                @Override
                public void connectionLost(Throwable cause) {
                    //连接丢失后,一般在这里面进行重连
                    System.out.println("connectionLost----------");
                    //startReconnect();
                }
                @Override
                public void deliveryComplete(IMqttDeliveryToken token) {
                    //publish后会执行到这里
                    System.out.println("deliveryComplete---------"
                            + token.isComplete());
                }
                @Override
                public 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() {
            @Override
            public 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() {
            @Override
            public 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();
        }
    }
    /* ========================================================================================== */

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

android mqtt,android,服务器,运维,stm32

 

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

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

android mqtt,android,服务器,运维,stm32

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

android mqtt,android,服务器,运维,stm32

 

        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";

android mqtt,android,服务器,运维,stm32

 

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

4、配置联网权限

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

android mqtt,android,服务器,运维,stm32

    <!--允许程序打开网络套接字-->
    <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";

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

真机运行画面

android mqtt,android,服务器,运维,stm32

 

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

6、MQTT.fx实现联调

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

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

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

android mqtt,android,服务器,运维,stm32

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

android mqtt,android,服务器,运维,stm32

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

android mqtt,android,服务器,运维,stm32

 

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

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

android mqtt,android,服务器,运维,stm32

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

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

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

    // Json数据解析
    private void parseJsonobj(String jsonobj){
        // 解析json
        try {
            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中接收到的数据

android mqtt,android,服务器,运维,stm32

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

android mqtt,android,服务器,运维,stm32

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

嗯,那么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("关闭");
    }

最后,嗯就这样!第一次写这么长篇的学习记录,也是对自己所学内容的一种巩固,希望能帮到有需要的同志,如果有错误的地方还请多多见谅!谢谢!!!文章来源地址https://www.toymoban.com/news/detail-784309.html

到了这里,关于Android+MQTT(Android APP 连接至MQTT服务器)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 13-ESP8266连接MQTT服务器发送数据

    Author:teacherXue MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号

    2024年02月03日
    浏览(63)
  • 前端mqtt的详细使用(包含mqtt服务器部署,前端vue3使用mqtt连接、订阅主题、发布等)

    ​ MQTT(消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的通讯协议,该协议构建于TCP/IP协议上。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。MQTT 协议的应用场景包括物联网、移动应用、车联网、智能

    2024年02月08日
    浏览(66)
  • STM32通过ESP8266连接MQTT服务器

            ESP8266有多种连接MQTT方式,本文介绍使用的是AT MQTT版本固件的ESP01s,基于此固件版本进行说明。本文所需硬件:STM32F103RCT6、LED、ESP01s、DHT11,实现功能:温湿度上传和远程开关灯的基本功能。 B站视频教程:STM32+ESP8266+DHT11_哔哩哔哩_bilibili gitee: STM32_Share: STM32、DHT

    2024年02月09日
    浏览(51)
  • ESP8266入门教程11:连接MQTT服务器

    将第三方库PubSubClient下载到lib文件夹 git clone https://github.com/knolleary/pubsubclient.git 1、打开阿里云IOT官网,登录阿里云账号 https://iot.console.aliyun.com 2、创建实例 3、新建产品 4、自定义主题  5、添加设备  6、查看设备配置   1、修改PubSubClient.h头文件,否则无法连接阿里云MQTT服务

    2023年04月24日
    浏览(60)
  • 【物联网开发】-微信小程序之MQTT连接,基于MQTT实现设备-服务器-小程序的消息传输

    想要开发微信小程序,首先要有一些基础知识:html、cs、js、json等,小程序中要用到的知识框架大体相同,一个页面包括js、json、wxml、wxss格式的文件。 由于本人此前从未接触过小程序开发,本篇文章将会以新手小白的角度一步步剖析如何使用微信小程序通过MQTT服务器连接设

    2023年04月24日
    浏览(59)
  • 基于C语言从0开始手撸MQTT协议代码连接标准的MQTT服务器,完成数据上传和命令下发响应(华为云IOT服务器)

    近年来,物联网的发展如火如荼,已经渗透到我们生活的方方面面。从智能家居到工业自动化,从智慧城市到智慧农业,物联网正在以前所未有的速度改变着我们的生活。 大家现在可能已经习惯了通过手机控制家里的灯光、空调和电视,这就是物联网在智能家居领域的应用,

    2024年02月05日
    浏览(71)
  • 【STM32 x ESP8266】连接阿里云 MQTT 服务器(报文连接)

    具体如何在阿里云创建一个 MQTT 服务器我就不写出来了,可以去百度一下(主要是我忘了,不好演示)。 有关 MQTT 报文的一些标识在我前面的 一篇文章 中讲过,感兴趣的可以去看看( 有关代码部分讲解的内容也在那里 ,这里就不细讲了,主要讲如何连接的) 插一嘴,如果

    2024年02月06日
    浏览(57)
  • ESP-01S烧录及使用,连接本地MQTT服务器

    网上的教程大多无法正常烧录与使用,因此在这里进行总结。 固件烧录建议使用专用的烧录器,十分省心。 本文讨论的是使用普通的CH340串口模块进行烧写。 必须使用的工具:杜邦线、CH340串口模块、另外一块有3V3电源和GND的开发板。 CH340 TTL转USB模块的引脚数量不够,因此

    2024年02月16日
    浏览(43)
  • STM32通过esp8266连接WiFi接入MQTT服务器

    上文我们讲到如何搭建本地MQTT服务器http://t.csdn.cn/aHNcO,现在介绍如何通过stm32连接MQTT 一.首先我们初始化esp8266这里我们使用的是USART4与其通信代码如下 二.通过数据间隔时间来判断是否是一串数据如果间隔时间大于30ms则判定为不是一串数据,接收缓冲器清零。 代码如下!

    2024年02月07日
    浏览(55)
  • 联通雁飞格物云平台,单片机连接MQTT服务器

    最近疫情解封了,好多人都发烧请病假,单位也放假了,我到一直没事儿,在家空闲时间很多,自己做了一个4G边缘网关连接云平台,折腾了半个月,连接联通的燕飞格物云平台成功,现将过程和一些注意事项分享给大家,国内云服务商很多,阿里,腾讯,移动,联通都有,

    2023年04月16日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包