行业知识
Android MQTT连接阿里云使用Json解析数据
2026-11-03 06:30:48
来源:互联网转载
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布局文件
效果如下:
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
下一篇:大学教室英语怎么说?