Android Studio 连接阿里云订阅主题然后使用JSON解析数据非常好用
- 导入MQTT的JAR包
-
- [1、在项目中添加依赖然后使用Studio 去下载库](#1、在项目中添加依赖然后使用Studio 去下载库)
- 2、直接下载JAR包,然后作为库进行导入
- 环境验证:
- 给程序进行联网权限
- XML布局文件
- [MainActitive.java 主要代码如下:](#MainActitive.java 主要代码如下:)
- End
导入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