Android MQTT连接阿里云使用Json解析数据

Android Studio 连接阿里云订阅主题然后使用JSON解析数据非常好用

导入MQTT的JAR包

这里有两种方法:

1、在项目中添加依赖然后使用Studio 去下载库

2、直接下载JAR包,然后作为库进行导入

这里先介绍第一种方法:

切换到Android 目录:
按照如下图,添加依赖即可:

bash 复制代码
  implementation("org.eclipse.paho:mqtt-client:3-1.2.0")

第二种方法:

打开Android Studio 然后切换到Android 目录找到Lib文件夹,将MQTT的JAR包复制进去即可。

然后点击project目录然后将MQTT JAR包导进去

添加完成之后作为库导入工程中

环境验证:

在MainActivity 任取一个地方输入MQTT 看是否有提示弹窗。

到这里以及成功一半了。接下来就是设置一些权限问题

给程序进行联网权限

切换到按的Android 目录

找到如下的目录:

添加如代码:

java 复制代码
 <uses-permission android:name="android.permission.INTERNET" />
    <!--允许程序获取网络状态-->
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

XML布局文件

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:background="#51CCDC"
        android:orientation="vertical"
        android:layout_height="match_parent">
        <LinearLayout
            android:layout_width="match_parent"
            android:background="#673AB7"
            android:layout_height="wrap_content">
            <TextView
                android:layout_width="match_parent"
                android:text="桂航果蔬种植基地"
                android:textSize="25sp"
                android:textColor="#060A0C"
                android:layout_height="match_parent">
            </TextView>
        </LinearLayout>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="200dp"
            android:layout_gravity="center"
            android:layout_marginTop="20dp">
            <androidx.cardview.widget.CardView
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                app:cardCornerRadius="20dp">
                <ImageView
                    android:id="@+id/m_img2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/bg3"
                    />
            </androidx.cardview.widget.CardView>
        </LinearLayout>

        <LinearLayout

            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:background="#51CCDC"
            android:orientation="vertical">
            <LinearLayout
                android:layout_marginBottom="3dp"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_width="match_parent"
                android:background="@drawable/shape_corner"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:layout_marginTop="5dp"
                android:padding="30dp">
                <!--左文字-->
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="学号:2020070230226"
                    android:textColor="@color/black"
                    android:textSize="16sp">
                </TextView>
                <!--左文字-->
                <TextView
                    android:id="@+id/m_mqtt"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text= "姓名:xiao!"
                    android:textColor="@color/black"
                    android:textSize="16sp">
                </TextView>
            </LinearLayout>
        </LinearLayout>
        <!-- vertical 竖直排列 -->
        <!-- horizontal 竖直排列 -->
        <!-- 数据解析界面 -->
        <LinearLayout
            android:layout_marginTop="10dp"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FFFF">
            <!-- 包裹其他界面-->
            <LinearLayout
                android:layout_margin="5px"
                android:padding="3dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:orientation="vertical">
                <LinearLayout
                    android:layout_width="match_parent"
                    android:gravity="center"
                    android:layout_weight="1"
                    android:orientation="horizontal"
                    android:layout_height="match_parent">
                    <!--气温-->
                    <LinearLayout
                        android:layout_width="160dp"
                        android:layout_weight="1"
                        android:gravity="center"
                        android:background="@drawable/shape_corner"
                        android:layout_height="105dp">
                        <ImageView
                            android:id="@+id/test"
                            android:layout_width="80dp"
                            android:layout_height="80dp"
                            android:layout_marginTop="10dp"
                            android:src="@drawable/air_temp"
                            android:layout_marginRight="15dp">
                        </ImageView>
                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:orientation="vertical"
                            android:layout_height="wrap_content">
                            <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="5dp"
                                android:text="温度"
                                android:textSize="25sp">
                            </TextView>
                            <!-- 数值 -->
                            <LinearLayout
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content">
                                <TextView
                                    android:id="@+id/air_temp"
                                    android:layout_width="wrap_content"
                                    android:text=" 0 "
                                    android:textSize="25sp"
                                    android:layout_height="wrap_content">
                                </TextView>
                            </LinearLayout>
                        </LinearLayout>
                    </LinearLayout>
                    <!--The End -->
                    <!-- 湿度-->
                    <LinearLayout
                        android:layout_marginLeft="25dp"
                        android:layout_width="160dp"
                        android:layout_weight="1"
                        android:gravity="center"
                        android:background="@drawable/shape_corner"
                        android:layout_height="105dp">
                        <ImageView
                            android:layout_width="80dp"
                            android:layout_height="80dp"
                            android:layout_marginTop="10dp"
                            android:src="@drawable/air_humi"
                            android:layout_marginRight="15dp">
                        </ImageView>
                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:orientation="vertical"
                            android:layout_height="wrap_content">
                            <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="5dp"
                                android:text="湿度"
                                android:textSize="20sp">
                            </TextView>
                            <!-- 数值 -->
                            <LinearLayout
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content">
                                <TextView
                                    android:id="@+id/air_humi"
                                    android:layout_width="wrap_content"
                                    android:text=" 0 "
                                    android:textSize="25sp"
                                    android:layout_height="wrap_content">
                                </TextView>
                            </LinearLayout>
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>
                <!--The End -->

            </LinearLayout>
            <!-- 2 -->
            <LinearLayout
                android:layout_width="match_parent"
                android:background="#FFFF"
                android:layout_margin="5px"
                android:padding="3dp"
                android:layout_height="wrap_content">
                <!-- Layout1-->
                <LinearLayout
                    android:layout_width="match_parent"
                    android:gravity="center"
                    android:layout_height="match_parent">
                    <!--气温-->
                    <!--Left1 -->
                    <LinearLayout
                        android:layout_width="160dp"
                        android:layout_weight="1"
                        android:gravity="center"
                        android:background="@drawable/shape_corner"
                        android:layout_height="105dp">
                        <ImageView
                            android:layout_width="80dp"
                            android:layout_height="80dp"
                            android:layout_marginTop="10dp"
                            android:src="@drawable/soil_humi"
                            android:layout_marginRight="15dp">
                        </ImageView>
                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:orientation="vertical"
                            android:layout_height="wrap_content">
                            <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="5dp"
                                android:text="土壤湿度"
                                android:textSize="20sp">
                            </TextView>
                            <!-- 数值 -->
                            <LinearLayout
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content">
                                <TextView
                                    android:id="@+id/sloi_humi"
                                    android:layout_width="wrap_content"
                                    android:text=" 0 "
                                    android:textSize="25sp"
                                    android:layout_height="wrap_content">
                                </TextView>
                            </LinearLayout>

                        </LinearLayout>
                    </LinearLayout>
                    <!--The End -->

                    <!-- 湿度-->
                    <LinearLayout
                        android:layout_width="160dp"
                        android:layout_weight="1"
                        android:gravity="center"
                        android:layout_marginLeft="25dp"
                        android:background="@drawable/shape_corner"
                        android:layout_height="105dp">
                        <ImageView
                            android:layout_width="80dp"
                            android:layout_height="80dp"
                            android:layout_marginTop="10dp"
                            android:src="@drawable/n2"
                            android:layout_marginRight="15dp">
                        </ImageView>
                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:orientation="vertical"
                            android:layout_height="wrap_content">
                            <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="5dp"
                                android:text="土壤含氮"
                                android:textSize="20sp">
                            </TextView>
                            <!-- 数值 -->
                            <LinearLayout
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content">
                                <TextView
                                    android:id="@+id/soli_n"
                                    android:layout_width="wrap_content"
                                    android:text=" 0 "
                                    android:textSize="25sp"
                                    android:layout_height="wrap_content">
                                </TextView>
                            </LinearLayout>
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>
            </LinearLayout>
            <!-- The End -->
            <!-- 3 -->
            <LinearLayout
                android:layout_margin="5px"
                android:padding="3dp"
                android:layout_width="match_parent"
                android:orientation="horizontal"
                android:gravity="center"
                android:layout_height="wrap_content">
                <LinearLayout
                    android:layout_width="160dp"
                    android:background="@drawable/shape_corner"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:layout_height="105dp">
                    <ImageView
                        android:layout_weight="1"
                        android:layout_width="80dp"
                        android:layout_height="80dp"
                        android:layout_marginTop="10dp"
                        android:src="@drawable/p2"
                        android:layout_marginRight="15dp">
                    </ImageView>
                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:orientation="vertical"
                        android:layout_height="wrap_content">
                        <TextView
                            android:layout_marginTop="5dp"
                            android:layout_marginRight="5dp"
                            android:layout_width="wrap_content"
                            android:text="土壤含磷"
                            android:textSize="20sp"
                            android:layout_height="wrap_content">
                        </TextView>
                        <TextView
                            android:id="@+id/soil_p"
                            android:layout_marginTop="5dp"
                            android:layout_width="wrap_content"
                            android:text=" 0 "
                            android:textSize="25sp"
                            android:layout_height="wrap_content">
                        </TextView>
                    </LinearLayout>
                </LinearLayout>
                <!--L1-->
                <LinearLayout
                    android:layout_marginLeft="25dp"
                    android:gravity="center"
                    android:layout_weight="1"
                    android:layout_width="160dp"
                    android:orientation="horizontal"
                    android:background="@drawable/shape_corner"
                    android:layout_height="105dp">
                    <ImageView
                        android:layout_weight="1"
                        android:layout_width="80dp"
                        android:layout_height="80dp"
                        android:layout_marginTop="10dp"
                        android:src="@drawable/k2"
                        android:layout_marginRight="15dp">
                    </ImageView>
                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:orientation="vertical"
                        android:layout_height="wrap_content">
                        <TextView
                            android:layout_marginRight="5dp"
                            android:layout_width="wrap_content"
                            android:text="土壤含钾"
                            android:textSize="20sp"
                            android:layout_height="wrap_content">
                        </TextView>
                        <TextView
                            android:id="@+id/soil_k"
                            android:layout_width="wrap_content"
                            android:text=" 0 "
                            android:textSize="25sp"
                            android:layout_height="wrap_content">
                        </TextView>
                    </LinearLayout>
                </LinearLayout>
                <!--Layout2-->
            </LinearLayout>
            <!-- The End -->
        </LinearLayout>
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

效果如下:

MainActitive.java 主要代码如下:

java 复制代码
package com.example.ks_wfs;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.net.wifi.aware.DiscoverySession;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.concurrent.ScheduledExecutorService;
public class MainActivity extends AppCompatActivity {
    private Handler handler;
    private String serverUri = "自己的IP地址";
/*    private String serverUri = "tcp://iot.qaeb.cn:1883";*/
    /*
          这里可以填上各种云平台的物联网云平的域名+1883端口号,什么阿里云腾讯云百度云天工物接入都可以,
          这里我填的是我在我的阿里云服务器上搭建的EMQ平台的地址,
          注意:前缀"tcp://"不可少,之前我没写,怎么都连不上,折腾了好久
    */
    private String userName = " ";
    private String passWord = " ";
    private String clientId = "app"+System.currentTimeMillis(); //clientId很重要,不能重复,否则就会连不上,所以我定义成 app+当前时间
    private String mqtt_sub_topic = "/iotsoil/post";          //需要订阅的主题
    private String mqtt_pub_topic = "xiao";                  //需要发布的主题
    private MqttClient mqtt_client;                         //创建一个mqtt_client对象
    MqttConnectOptions options;
    private  TextView air_temp;
    private  TextView air_humi;
    private  TextView sloi_humi;
    private  TextView soli_n;
    private  TextView soil_p;
    private  TextView soil_k;
    private ImageView test;
    private ScheduledExecutorService scheduler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*
         * xiaobai
         * 2023.10.10
         * Version V1.0
         */
        /*绑定UI文件*/
        UI_Init();/*类似单片机的初始化*/
        mqtt_init_Connect();/*初始化连接函数*/
        /*回调函数,数据会在回调函数里面*/
        mqtt_client.setCallback(new MqttCallback() {
            @Override
            public void connectionLost(Throwable throwable) {
            }
            @Override
            public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
                /*数据到这了*/
                final String msg = new String(mqttMessage.getPayload());
                Log.d("MQTTRCV", msg);//日志信息,可以查看
                System.out.println(msg);/*打印得到的数据*/
                /*更新UI线程*/
 /*               runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                            *//*开始解析数据*//*
                           *//*数据解析部分这里使用的是Json解析*//*
                           *//*为了避免闪退,使用try来处理异常情况*//*
                        try {
                            JSONObject jsonObject = new JSONObject(String.valueOf(msg));
                            String method = jsonObject.getString("method");
                            JSONObject params = jsonObject.getJSONObject("params");
                            int soilHumidity = params.getInt("soilHumidity");
                            int currentTemperature = params.getInt("CurrentTemperature");
                            int currentHumidity = params.getInt("CurrentHumidity");
                            int n = params.getInt("N");
                            int p = params.getInt("P");
                            int k = params.getInt("K");
                                    *//*更新数据到UI*//*
                            air_temp.setText(String.valueOf(currentTemperature));
                            air_humi.setText(String.valueOf(currentHumidity));
                            sloi_humi.setText(String.valueOf(soilHumidity));
                            soli_n.setText(String.valueOf(n));
                            soil_p.setText(String.valueOf(p));
                            soil_k.setText(String.valueOf(k));
                                    *//*打印日志信息*//*
                            Log.d("TAG", "method: " + method);
                            Log.d("TAG", "soilHumidity: " + soilHumidity);
                            Log.d("TAG", "currentTemperature: " + currentTemperature);
                            Log.d("TAG", "currentHumidity: " + currentHumidity);
                            Log.d("TAG", "N: " + n);
                            Log.d("TAG", "P: " + p);
                            Log.d("TAG", "K: " + k);

                        }catch (JSONException e)
                        {
                            e.printStackTrace();
                            Toast.makeText(MainActivity.this ,"数据解析异常!",Toast.LENGTH_LONG).show();
                        }
                    }
                });*/
                /*下面是带弹窗显示的代码数据已经解析完成,解开注释即可*/

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                        builder.setTitle("MQTT消息");
                        builder.setMessage(msg);
                        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                // 点击确定按钮后的操作
                             /*   开始解析数据*/
                            /*    数据解析部分这里使用的是Json解析
                                为了避免闪退,使用try来处理异常情况*/
                                try {
                                    JSONObject jsonObject = new JSONObject(String.valueOf(msg));
                                    String method = jsonObject.getString("method");
                                    JSONObject params = jsonObject.getJSONObject("params");
                                    int soilHumidity = params.getInt("soilHumidity");
                                    int currentTemperature = params.getInt("CurrentTemperature");
                                    int currentHumidity = params.getInt("CurrentHumidity");
                                    int n = params.getInt("N");
                                    int p = params.getInt("P");
                                    int k = params.getInt("K");
                               /*     更新UI*/
                                    air_temp.setText(String.valueOf(currentTemperature));
                                    air_humi.setText(String.valueOf(currentHumidity));
                                    sloi_humi.setText(String.valueOf(soilHumidity));
                                    soli_n.setText(String.valueOf(n));
                                    soil_p.setText(String.valueOf(p));
                                    soil_k.setText(String.valueOf(k));
                               /*     打印输出的信息*/
                                    Log.d("TAG", "method: " + method);
                                    Log.d("TAG", "soilHumidity: " + soilHumidity);
                                    Log.d("TAG", "currentTemperature: " + currentTemperature);
                                    Log.d("TAG", "currentHumidity: " + currentHumidity);
                                    Log.d("TAG", "N: " + n);
                                    Log.d("TAG", "P: " + p);
                                    Log.d("TAG", "K: " + k);

                                }catch (JSONException e)
                                {
                                    e.printStackTrace();
                                    Toast.makeText(MainActivity.this ,"数据解析异常!",Toast.LENGTH_LONG).show();
                                }
                            }
                        });
                        builder.show();
                    }
                });
            }
            @Override
            public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
            }
        });
        /*点击事件*/
        test.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                PublishMessage(mqtt_pub_topic,"{\"params\":{\"我是小白,你好呀\":999 } }");
            }
        });

    }
    public void mqtt_init_Connect()
    {
        try {
            //实例化mqtt_client,填入我们定义的serverUri和clientId,然后MemoryPersistence设置clientid的保存形式,默认为以内存保存
            mqtt_client = new MqttClient(serverUri,clientId,new MemoryPersistence());
            //创建并实例化一个MQTT的连接参数对象
            options = new MqttConnectOptions();
            //然后设置对应的参数
            options.setUserName(userName);                  //设置连接的用户名
            options.setPassword(passWord.toCharArray());    //设置连接的密码
            options.setConnectionTimeout(30);               // 设置超时时间,单位为秒
            options.setKeepAliveInterval(50);               //设置心跳,30s
            options.setAutomaticReconnect(true);            //是否重连
            //设置是否清空session,设置为false表示服务器会保留客户端的连接记录,设置为true表示每次连接到服务器都以新的身份连接
            options.setCleanSession(false);
            /*初始化成功之后就开始连接*/
            connect();
            Toast.makeText(MainActivity.this,"连接成功",Toast.LENGTH_LONG).show();
        }catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(MainActivity.this,"失败",Toast.LENGTH_LONG).show();
        }
    }
    public void connect(){
        //连接mqtt服务器
        try {
            mqtt_client.connect(options);
            mqtt_client.subscribe(mqtt_sub_topic);
            Toast.makeText(this ,"开始建立连接.....!",Toast.LENGTH_LONG).show();
        }catch (Exception e) {
            e.printStackTrace();
            Log.d("MQTTCon","mqtt连接失败");
            Toast.makeText(this ,"mqtt连接失败!",Toast.LENGTH_LONG).show();
        }
    }
    /*绑定各个UI控件*/
    public void UI_Init()
    {
        air_temp  =  findViewById(R.id.air_temp); //空气温度
        air_humi  =  findViewById(R.id.air_humi);//空气湿度
        sloi_humi =  findViewById(R.id.sloi_humi);//土壤湿度
        soli_n    =  findViewById(R.id.soli_n);//土壤含N量
        soil_p    =  findViewById(R.id.soil_p);//土壤含P量
        soil_k    =  findViewById(R.id.soil_k);//土壤含K量
        test      =  findViewById(R.id.test);//测试按钮
    }
    /*发布函数!*/
    private void PublishMessage(String topic,String Message2)
    {
        if(mqtt_client ==null || !mqtt_client.isConnected())
        {
            return;
        }
        MqttMessage message = new MqttMessage();
        message.setPayload(Message2.getBytes());
        try{
            mqtt_client.publish(topic,message);

        }catch (MqttException e)
        {
            e.printStackTrace();
        }
    }

}

End

完整的代码工程可以进QQ群获取!

764452437

相关推荐
zhangphil38 分钟前
Android简洁缩放Matrix实现图像马赛克,Kotlin
android·kotlin
m0_5127446438 分钟前
极客大挑战2024-web-wp(详细)
android·前端
lw向北.1 小时前
Qt For Android之环境搭建(Qt 5.12.11 Qt下载SDK的处理方案)
android·开发语言·qt
不爱学习的啊Biao1 小时前
【13】MySQL如何选择合适的索引?
android·数据库·mysql
Clockwiseee2 小时前
PHP伪协议总结
android·开发语言·php
mmsx8 小时前
android sqlite 数据库简单封装示例(java)
android·java·数据库
众拾达人11 小时前
Android自动化测试实战 Java篇 主流工具 框架 脚本
android·java·开发语言
吃着火锅x唱着歌12 小时前
PHP7内核剖析 学习笔记 第四章 内存管理(1)
android·笔记·学习
老刘莱国瑞13 小时前
STM32 与 AS608 指纹模块的调试与应用
python·物联网·阿里云
_Shirley13 小时前
鸿蒙设置app更新跳转华为市场
android·华为·kotlin·harmonyos·鸿蒙