Android Studio 连接阿里云订阅主题然后使用JSON解析数据非常好用
导入MQTT的JAR包1、在项目中添加依赖然后使用Studio 去下载库2、直接下载JAR包,然后作为库进行导入
环境验证:给程序进行联网权限XML布局文件效果如下:
MainActitive.java 主要代码如下:End
导入MQTT的JAR包
这里有两种方法:
1、在项目中添加依赖然后使用Studio 去下载库
2、直接下载JAR包,然后作为库进行导入
这里先介绍第一种方法: 切换到Android 目录: 按照如下图,添加依赖即可:
implementation ("org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0")
第二种方法: 打开Android Studio 然后切换到Android 目录找到Lib文件夹,将MQTT的JAR包复制进去即可。 然后点击project目录然后将MQTT JAR包导进去 添加完成之后作为库导入工程中
环境验证:
在MainActivity 任取一个地方输入MQTT 看是否有提示弹窗。 到这里以及成功一半了。接下来就是设置一些权限问题
给程序进行联网权限
切换到按的Android 目录 找到如下的目录: 添加如代码:
XML布局文件
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"> android:layout_width="match_parent" android:background="#51CCDC" android:orientation="vertical" android:layout_height="match_parent"> android:layout_width="match_parent" android:background="#673AB7" android:layout_height="wrap_content"> android:layout_width="match_parent" android:text="桂航果蔬种植基地" android:textSize="25sp" android:textColor="#060A0C" android:layout_height="match_parent"> android:layout_width="wrap_content" android:layout_height="200dp" android:layout_gravity="center" android:layout_marginTop="20dp"> android:layout_width="wrap_content" android:layout_height="200dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" app:cardCornerRadius="20dp"> android:id="@+id/m_img2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/bg3" /> android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:background="#51CCDC" android:orientation="vertical"> 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"> android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="学号:2020070230226" android:textColor="@color/black" android:textSize="16sp"> 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"> android:layout_marginTop="10dp" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFF"> android:layout_margin="5px" android:padding="3dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:orientation="vertical"> android:layout_width="match_parent" android:gravity="center" android:layout_weight="1" android:orientation="horizontal" android:layout_height="match_parent"> android:layout_width="160dp" android:layout_weight="1" android:gravity="center" android:background="@drawable/shape_corner" android:layout_height="105dp"> 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"> android:layout_width="wrap_content" android:orientation="vertical" android:layout_height="wrap_content"> android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:text="温度" android:textSize="25sp"> android:layout_width="wrap_content" android:layout_height="wrap_content"> android:id="@+id/air_temp" android:layout_width="wrap_content" android:text=" 0 " android:textSize="25sp" android:layout_height="wrap_content"> android:layout_marginLeft="25dp" android:layout_width="160dp" android:layout_weight="1" android:gravity="center" android:background="@drawable/shape_corner" android:layout_height="105dp"> android:layout_width="80dp" android:layout_height="80dp" android:layout_marginTop="10dp" android:src="@drawable/air_humi" android:layout_marginRight="15dp"> android:layout_width="wrap_content" android:orientation="vertical" android:layout_height="wrap_content"> android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:text="湿度" android:textSize="20sp"> android:layout_width="wrap_content" android:layout_height="wrap_content"> android:id="@+id/air_humi" android:layout_width="wrap_content" android:text=" 0 " android:textSize="25sp" android:layout_height="wrap_content"> android:layout_width="match_parent" android:background="#FFFF" android:layout_margin="5px" android:padding="3dp" android:layout_height="wrap_content"> android:layout_width="match_parent" android:gravity="center" android:layout_height="match_parent"> android:layout_width="160dp" android:layout_weight="1" android:gravity="center" android:background="@drawable/shape_corner" android:layout_height="105dp"> android:layout_width="80dp" android:layout_height="80dp" android:layout_marginTop="10dp" android:src="@drawable/soil_humi" android:layout_marginRight="15dp"> android:layout_width="wrap_content" android:orientation="vertical" android:layout_height="wrap_content"> android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:text="土壤湿度" android:textSize="20sp"> android:layout_width="wrap_content" android:layout_height="wrap_content"> android:id="@+id/sloi_humi" android:layout_width="wrap_content" android:text=" 0 " android:textSize="25sp" android:layout_height="wrap_content"> android:layout_width="160dp" android:layout_weight="1" android:gravity="center" android:layout_marginLeft="25dp" android:background="@drawable/shape_corner" android:layout_height="105dp"> android:layout_width="80dp" android:layout_height="80dp" android:layout_marginTop="10dp" android:src="@drawable/n2" android:layout_marginRight="15dp"> android:layout_width="wrap_content" android:orientation="vertical" android:layout_height="wrap_content"> android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:text="土壤含氮" android:textSize="20sp"> android:layout_width="wrap_content" android:layout_height="wrap_content"> android:id="@+id/soli_n" android:layout_width="wrap_content" android:text=" 0 " android:textSize="25sp" android:layout_height="wrap_content"> android:layout_margin="5px" android:padding="3dp" android:layout_width="match_parent" android:orientation="horizontal" android:gravity="center" android:layout_height="wrap_content"> android:layout_width="160dp" android:background="@drawable/shape_corner" android:layout_weight="1" android:gravity="center" android:layout_height="105dp"> android:layout_weight="1" android:layout_width="80dp" android:layout_height="80dp" android:layout_marginTop="10dp" android:src="@drawable/p2" android:layout_marginRight="15dp"> android:layout_width="wrap_content" android:orientation="vertical" android:layout_height="wrap_content"> android:layout_marginTop="5dp" android:layout_marginRight="5dp" android:layout_width="wrap_content" android:text="土壤含磷" android:textSize="20sp" android:layout_height="wrap_content"> 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"> 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"> android:layout_weight="1" android:layout_width="80dp" android:layout_height="80dp" android:layout_marginTop="10dp" android:src="@drawable/k2" android:layout_marginRight="15dp"> android:layout_width="wrap_content" android:orientation="vertical" android:layout_height="wrap_content"> android:layout_marginRight="5dp" android:layout_width="wrap_content" android:text="土壤含钾" android:textSize="20sp" android:layout_height="wrap_content"> android:id="@+id/soil_k" android:layout_width="wrap_content" android:text=" 0 " android:textSize="25sp" android:layout_height="wrap_content">
效果如下:
MainActitive.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
推荐链接
发表评论