java代码

package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
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;public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";private MqttClient mqttClient;private TextView connectionStatusTextView;private ImageView ledStatusImageView;private boolean isConnecting = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {//使用AsyncTask异步,当执行execute时会自动开辟一个线程super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);connectionStatusTextView =(TextView) findViewById(R.id.connection_status_text_view);ledStatusImageView = findViewById(R.id.ledStatusImageView);Button connectBtn = findViewById(R.id.connectBtn);connectBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (!isConnecting) {new ConnectTask().execute();}}});Button reconnectBtn = findViewById(R.id.reconnectBtn);reconnectBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (!isConnecting) {new ReconnectTask().execute();}}});Button disconnectBtn = findViewById(R.id.disconnectBtn);disconnectBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {new DisconnectTask().execute();}});Button toggleLedBtn = findViewById(R.id.toggleLED);toggleLedBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {new ToggleLedTask().execute("led1");}});Button toggleLed2Btn = findViewById(R.id.toggleLED2);toggleLed2Btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {new ToggleLedTask().execute("led2");}});}private class ConnectTask extends AsyncTask<Void, String, Boolean> {//MQTT连接线程,实现与服务器的连接、订阅、发布消息/*** 异步任务:AsyncTask<Params, Progress, Result>* 1.Params:UI线程传过来的参数。* 2.Progress:发布进度的类型。* 3.Result:返回结果的类型。耗时操作doInBackground的返回结果传给执行之后的参数类型。** 执行流程:* 1.onPreExecute()* 2.doInBackground()-->onProgressUpdate()* 3.onPostExecute()*/@Overrideprotected void onPreExecute() //执行耗时操作之前处理UI线程事件{super.onPreExecute();isConnecting = true;connectionStatusTextView.setText("Connecting...");}@Overrideprotected Boolean doInBackground(Void... voids){//在此方法执行耗时操作,耗时操作中收发MQTT服务器的数据//MQTT服务器地址String brokerUrl = "tcp://iot.eclipse.org:1883";//客户端ID,用于在MQTT服务器上String clientId = MqttClient.generateClientId();try {mqttClient = new MqttClient(brokerUrl, clientId, new MemoryPersistence());} catch (MqttException e) {throw new RuntimeException(e);}MqttConnectOptions connectOptions = new MqttConnectOptions();connectOptions.setCleanSession(true);//mqtt服务器用户名和密码connectOptions.setUserName("username");connectOptions.setPassword("password".toCharArray());try {mqttClient.connect(connectOptions);mqttClient.setCallback(new MqttCallback() {@Overridepublic void connectionLost(Throwable throwable) {Log.d(TAG, "connectionLost: " + throwable.getMessage());publishProgress("Connection lost, reconnecting...");new ReconnectTask().execute();}@Overridepublic void messageArrived(String topic, MqttMessage message) throws Exception {Log.d(TAG, "messageArrived: " + message.toString());if (topic.equals("sensors/temperature")) {// Update temperature readingpublishProgress("Temperature: " + message.toString());} else if (topic.equals("sensors/humidity")) {// Update humidity readingpublishProgress("Humidity: " + message.toString());} else if (topic.equals("leds/led1/status")) {// Update LED 1 statusif (message.toString().equals("on")) {publishProgress("LED 1 is on");ledStatusImageView.setImageResource(R.drawable.light_on_background);} else {publishProgress("LED 1 is off");ledStatusImageView.setImageResource(R.drawable.light_off_background);}} else if (topic.equals("leds/led2/status")) {// Update LED 2 statusif (message.toString().equals("on")) {publishProgress("LED 2 is on");ledStatusImageView.setImageResource(R.drawable.light_on_background);} else {publishProgress("LED 2 is off");ledStatusImageView.setImageResource(R.drawable.light_off_background);}}}@Overridepublic void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {Log.d(TAG, "deliveryComplete");}});//这里是订阅的话题mqttClient.subscribe("sensors/temperature");mqttClient.subscribe("sensors/humidity");mqttClient.subscribe("leds/led1/status");mqttClient.subscribe("leds/led2/status");} catch (MqttException e) {Log.e(TAG, "Error connecting to MQTT broker: " + e.getMessage());publishProgress("Error connecting to MQTT broker: " + e.getMessage());return false;}return true;}@Overrideprotected void onProgressUpdate(String... values) {//用于在主线程处理doInBackground()方法执行完毕后的结果,更新UI或者执行其它操作super.onProgressUpdate(values);connectionStatusTextView.setText(values[0]);}@Overrideprotected void onPostExecute(Boolean aBoolean){//用于在主线程处理doInBackground()方法执行完毕后的结果,更新UI或者执行其它操作super.onPostExecute(aBoolean);isConnecting = false;if (aBoolean) {connectionStatusTextView.setText("Connected");}}}private class ReconnectTask extends AsyncTask<Void, String, Boolean> {@Overrideprotected void onPreExecute() {super.onPreExecute();isConnecting = true;connectionStatusTextView.setText("Reconnecting...");}@Overrideprotected Boolean doInBackground(Void... voids) {if (mqttClient != null && mqttClient.isConnected()) {try {mqttClient.disconnect();} catch (MqttException e) {Log.e(TAG, "Error disconnecting from MQTT broker: " + e.getMessage());}}return new ConnectTask().doInBackground();}@Overrideprotected void onPostExecute(Boolean aBoolean) {super.onPostExecute(aBoolean);isConnecting = false;if (aBoolean) {connectionStatusTextView.setText("Connected");}}}private class DisconnectTask extends AsyncTask<Void, Void, Void> {@Overrideprotected void onPreExecute() {super.onPreExecute();connectionStatusTextView.setText("Disconnecting...");}@Overrideprotected Void doInBackground(Void... voids) {if (mqttClient != null && mqttClient.isConnected()) {try {mqttClient.disconnect();} catch (MqttException e) {Log.e(TAG, "Error disconnecting from MQTT broker: " + e.getMessage());}}return null;}@Overrideprotected void onPostExecute(Void aVoid) {super.onPostExecute(aVoid);connectionStatusTextView.setText("Disconnected");ledStatusImageView.setImageResource(R.drawable.light_off_background);}}private class ToggleLedTask extends AsyncTask<String, Void, Void> {@Overrideprotected Void doInBackground(String... strings) {if (mqttClient != null && mqttClient.isConnected()) {String topic = "leds/" + strings[0] + "/control";MqttMessage message = new MqttMessage();if (ledStatusImageView.getDrawable().getConstantState().equals(getResources().getDrawable(R.drawable.light_on_background).getConstantState())) {message.setPayload("off".getBytes());} else {message.setPayload("on".getBytes());}try {mqttClient.publish(topic, message);} catch (MqttException e) {Log.e(TAG, "Error publishing message: " + e.getMessage());}}return null;}}
}

xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><!-- 连接、重连、断开连接按钮 --><Buttonandroid:id="@+id/connectBtn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Connect"android:layout_alignParentTop="true"android:layout_centerHorizontal="true"android:layout_marginTop="16dp"/><Buttonandroid:id="@+id/reconnectBtn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Reconnect"android:layout_below="@id/connectBtn"android:layout_centerHorizontal="true"android:layout_marginTop="16dp"/><Buttonandroid:id="@+id/disconnectBtn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Disconnect"android:layout_below="@id/reconnectBtn"android:layout_centerHorizontal="true"android:layout_marginTop="16dp"/><!-- 连接状态显示 --><TextViewandroid:id="@+id/connection_status_text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Disconnected"android:layout_below="@id/disconnectBtn"android:layout_centerHorizontal="true"android:layout_marginTop="16dp"/><!-- 传感器数据显示 --><TextViewandroid:id="@+id/sensorDataTextView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Sensor Data:"android:layout_below="@id/disconnectBtn"android:layout_alignParentStart="true"android:layout_marginTop="16dp"/><TextViewandroid:id="@+id/sensorDataValueTextView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text=""android:layout_alignBaseline="@id/sensorDataTextView"android:layout_toEndOf="@id/sensorDataTextView"android:layout_marginStart="16dp"/><!-- 小灯控制按钮 --><Buttonandroid:id="@+id/toggleLED"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Toggle LED 1"android:layout_below="@id/sensorDataValueTextView"android:layout_centerHorizontal="true"android:layout_marginTop="16dp"/><Buttonandroid:id="@+id/toggleLED2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Toggle LED 2"android:layout_below="@id/toggleLED"android:layout_centerHorizontal="true"android:layout_marginTop="16dp"/><!-- 小灯状态显示 --><ImageViewandroid:id="@+id/ledStatusImageView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/light_off_background"android:layout_below="@id/toggleLED2"android:layout_centerHorizontal="true"android:layout_marginTop="16dp"/></RelativeLayout>

声明文件Manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.mqtttest"><uses-permission android:name="android.permission.INTERNET" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:name="org.eclipse.paho.android.service.MqttService" /></application></manifest>

以上程序
在onCreate()方法中,初始化UI控件和MQTT客户端。其中,connectBtn按钮用于连接MQTT服务器,disconnectBtn按钮用于断开连接,reconnectBtn按钮用于重新连接。toggleLED和toggleLED2按钮用于控制两个小灯的开关。tempTextView和humidityTextView文本框用于显示传感器的温度和湿度数据,connectionStatusTextView文本框用于显示MQTT连接状态。mqttAndroidClient是一个MQTT客户端实例,用于连接MQTT服务器和进行消息的订阅和发布。

在connectBtn的onClick()方法中,调用connect()方法连接MQTT服务器,并在连接成功后订阅主题。在连接失败时,会弹出提示框提示连接失败。

在disconnectBtn的onClick()方法中,调用disconnect()方法断开MQTT服务器的连接。

在reconnectBtn的onClick()方法中,调用reconnect()方法重新连接MQTT服务器。

在toggleLED和toggleLED2的onClick()方法中,根据按钮状态发送控制指令到MQTT服务器,控制对应的小灯的开关状态。
在connect()方法中,设置MQTT客户端的各种参数,如服务器地址、客户端ID、保持连接的时间间隔、连接超时时间、是否清除会话等。然后调用connect()方法连接MQTT服务器,并设置连接成功和连接失败的回调函数。在连接成功后,订阅主题TOPIC。

在disconnect()方法中,调用MQTT客户端的disconnect()方法断开与MQTT服务器的连接。

在reconnect()方法中,判断当前是否已连接MQTT服务器。如果已连接,则先断开连接,然后重新连接MQTT服务器。

在subscribeToTopic()方法中,订阅指定主题TOPIC。当收到对应主题的消息时,会调用messageArrived()方法进行处理。

在publishMessage()方法中,向指定主题TOPIC发布指定内容的消息。

在messageArrived()方法中,处理收到的消息,更新温度和湿度数据,并根据收到的消息更新小灯的状态。
在connect()方法中,设置MQTT客户端的各种参数,如服务器地址、客户端ID、保持连接的时间间隔、连接超时时间、是否清除会话等。然后调用connect()方法连接MQTT服务器,并设置连接成功和连接失败的回调函数。在连接成功后,订阅主题TOPIC。

在disconnect()方法中,调用MQTT客户端的disconnect()方法断开与MQTT服务器的连接。

在reconnect()方法中,判断当前是否已连接MQTT服务器。如果已连接,则先断开连接,然后重新连接MQTT服务器。

在subscribeToTopic()方法中,订阅指定主题TOPIC。当收到对应主题的消息时,会调用messageArrived()方法进行处理。

在publishMessage()方法中,向指定主题TOPIC发布指定内容的消息。

在messageArrived()方法中,处理收到的消息,更新温度和湿度数据,并根据收到的消息更新小灯的状态。

Android实现MQTT客户端相关推荐

  1. 记录每天学习的新知识:MQTT客户端

    Android - MQTT客户端 什么是MQTT Android 客户端的使用 操作1.创建新连接 - newClient 操作2.设置参数 - setClientConfig 操作3.连接 - c ...

  2. Android使用的MQTT客户端

    Android使用的MQTT客户端,支持订阅.发送消息: 支持创建连接到本地保存: 支持话题消息筛选: 使用视频:https://dwz.cn/undJFEnq 小米应用商店也有 [蘑菇IoT]~ 核 ...

  3. android paho框架,Android Mqtt 客户端paho使用心得

    Android mqtt 客户端实现一般使用以下两个库: implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1 ...

  4. Android Studio实现MQTT客户端

    初学Android Studio,在实现MQTT客户端的过程中遇到了很多坑,而在查阅博文的时候发现各个博文能提供的解决方法很零碎,我也是结合了诸多博文才最终解决了问题,于是打算做一个小总结 我用的版本 ...

  5. 「Android基于MQTT实现消息通知」

    「Android基于MQTT实现消息通知」 一.写在前面 在对接项目中IoT时,发现目前有对MQTT做了接入,这里记录一下,官方的资料比较详细,这里主要从实现细节出发:对具体的需求以及配套的技术方案进 ...

  6. 结合Amazon Cognito服务限制接入AWS IoT平台的MQTT客户端的clientId

    AWS IoT 支持使用四种身份委托人进行身份验证: X.509 证书 IAM 用户.组和角色 Amazon Cognito 身份 联合身份 通常,AWS IoT 设备使用 X.509 证书,移动应用 ...

  7. 一种MQTT客户端消息队列的设计

    MQTT 简介 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议.它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟 ...

  8. MQTT协议学习:3、MQTT客户端实例

    MQTT协议学习:3.MQTT客户端实例 文章目录 MQTT协议学习:3.MQTT客户端实例 1. 前言 2. Paho MQTT (1). Go客户端实例 (2). Python客户端实例 (3). ...

  9. paho | 支持10种语言编写mqtt客户端,总有一款适合你!

    1. 轻量级物联网协议 - MQTT MQTT全称 Message Queuing Telemetry Transport,即消息队列遥测传输协议,是一种基于发布/订阅(publish/subscri ...

最新文章

  1. 计算机设计原则,CISSP备考系列之计算机设计原则[10-39]
  2. 汪昭然:构建“元宇宙”和理论基础,让深度强化学习从虚拟走进现实
  3. Spring boot异常统一处理方法:@ControllerAdvice注解的使用、全局异常捕获、自定义异常捕获
  4. 【转】Matlab中特殊符号的写法
  5. python3 读取文本文件_python3文件的读写操作
  6. 华硕p8b75v主板说明书_我们测了22块主板 发现128GB内存不是想上就上
  7. webpack 入口文件 php,webpack的使用详解
  8. 边缘生——保研与考研到底如何抉择!
  9. Anton and Fairy Tale CodeForces - 785C(二分+思维)
  10. 安装paramiko的方法
  11. tempdb页面分配争用问题
  12. 工业互联网为湖南制造装上“智脑”
  13. redis 的 key 设计原则
  14. latex常用最要快捷键
  15. 各大主流电子地图坐标拾取系统
  16. 欧派caxa设计软件_欧派与数码大方携手,CAXA智能家居设计软件引领家居变革
  17. 防火墙的三种工作模式介绍(路由模式、透明模式(网桥)、混合模式)
  18. 用户主页个性域名技术实现
  19. AR涂涂乐项目之识别图制作制作地球仪剪影二
  20. R语言随机森林报错The response has five or fewer unique values. Are you sure you want to do regression原因及解决办法

热门文章

  1. 查询所有选修了1号课程的学生姓名
  2. dsd 转 pcm 使用arm VFP 实现
  3. oracle10G下载
  4. Nginx 代理https
  5. 上海光机所在探索光学记忆效应的本质及其应用方面取得进展
  6. VC2017编译zxing
  7. R语言绘图——小提琴图
  8. AP9193 升压恒流驱动芯片 24V 36V1A三线三色 LED大功率方案
  9. 清华大学公开课线性代数2——第10讲:傅里叶级数
  10. python 中easydict的简单使用