Android MQTT调试助手开发

        在Android开发中,与远程服务器进行通信是一个常见的需求。MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的消息传输协议,广泛应用于物联网(IoT)场景中。在阿里云物联网平台中,物联网设备与APP之间的交互是通过云产品消息转发实现,所以需要讲APP通过mqtt方式接入平台。本文将介绍Android Studio中开MQTT调试助手,以接入阿里云平台为例。

一、构建MqttService工具类

1. 添加依赖

app/build.gradle文件中添加Eclipse Paho MQTT Android Client的依赖:

dependencies { implementation ("org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5")implementation ("org.eclipse.paho:org.eclipse.paho.android.service:1.1.1") 
}

2. 打开对应权限

AndroidManifest.xml中添加了必要的网络权限。

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

3. 创建MqttService类

import android.content.Context;
import android.content.Intent;
import android.util.Log;import org.eclipse.paho.client.mqttv3.IMqttClient;
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;public class MqttService {private Context context;private static final String TAG = "MqttService";private IMqttClient client;private String brokerUrl;private String clientId;private String username;private String password;public MqttService(Context context, String brokerUrl, String clientId, String username, String password) {this.context = context;this.brokerUrl = brokerUrl;this.clientId = clientId;this.username = username;this.password = password;}/*** 连接*/public void connect() {try {client = new MqttClient(brokerUrl, clientId, new MemoryPersistence());MqttConnectOptions options = new MqttConnectOptions();options.setUserName(username);options.setPassword(password.toCharArray());options.setCleanSession(true);client.setCallback(new MqttCallback() {@Overridepublic void connectionLost(Throwable cause) {Log.e(TAG, "Connection lost: " + cause.getMessage());}@Overridepublic void messageArrived(String topic, MqttMessage message) throws Exception {Intent MSGintent = new Intent();MSGintent.setAction("com.example.aliyuniot.MainActivity");MSGintent.putExtra("message", new String(message.getPayload()));//接收的数据context.sendBroadcast(MSGintent);//广播接受到的数据Log.d(TAG, "Message arrived. Topic: " + topic + " Message: " + new String(message.getPayload()));}@Overridepublic void deliveryComplete(IMqttDeliveryToken token) {Log.d(TAG, "Delivery complete.");}});client.connect(options);Log.d(TAG, "Connected to broker: " + brokerUrl);} catch (MqttException e) {e.printStackTrace();Log.e(TAG, "Failed to connect to broker: " + e.getMessage());}}/*** 订阅消息* @param topic 订阅主题*/public void subscribe(String topic) {try {client.subscribe(topic);Log.d(TAG, "Subscribed to topic: " + topic);} catch (MqttException e) {e.printStackTrace();Log.e(TAG, "Failed to subscribe to topic: " + e.getMessage());}}/*** 发布信息* @param topic 主题* @param payload 发布内容*/public void publish(String topic, String payload) {try {MqttMessage message = new MqttMessage(payload.getBytes());client.publish(topic, message);Log.d(TAG, "Published message to topic: " + topic + " Message: " + payload);} catch (MqttException e) {e.printStackTrace();Log.e(TAG, "Failed to publish message: " + e.getMessage());}}/*** 断开连接*/public void disconnect() {try {client.disconnect();Log.d(TAG, "Disconnected from broker: " + brokerUrl);} catch (MqttException e) {e.printStackTrace();Log.e(TAG, "Failed to disconnect from broker: " + e.getMessage());}}/*** 连接状态反馈* @return true连接,false断开*/public boolean isConnect() {if (client.isConnected()) {Log.i(TAG, "MQTT连接成功");return true;} else {Log.i(TAG, "MQTT连接断开");return false;}}}

二、调用工具类实现通信

1. 连接

String brokerUrl,clientId,username,password;
//相关参数赋值
mqttService = new MqttService(this, brokerUrl, clientId, username, password);
// 连接MQTT
mqttService.connect();

2. 订阅

String subTopic = "订阅的主题";
mqttService.subscribe(subTopic);

3. 发布

String payload = "发布内容";
String Topic = "发布主题";
mqttService.publish(Topic, payload);

4. 订阅消息接收

接收消息采用广播的方式进行接收

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//接收广播消息IntentFilter filter = new IntentFilter("com.example.aliyuniot.MainActivity");registerReceiver(myReceiver, filter);}private BroadcastReceiver myReceiver = new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals("com.example.aliyuniot.MainActivity")) {String message = intent.getStringExtra("message");tev_subrecv.setText(message);}}};

三、测试——以阿里云物联网平台为例

1. 连接断开

2. 订阅

采用云产品消息流转,用MQTT.fx模拟设备上报属性。

3. 发布

四、下载地址

apk安装包:https://download.csdn.net/download/LJ_96/89879415

源码地址:https://download.csdn.net/download/LJ_96/89879421

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/448484.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

张雪峰谈网络安全专业前景广阔,现状惨不忍睹

张雪峰在谈论网络安全专业时&#xff0c;主要强调了该专业的就业前景、适应岗位、以及部分高校在此领域的优势。以下是他的观点归纳&#xff1a; 张雪峰对网络安全专业的观点 就业前景广阔 网络空间安全专业的就业前景非常广阔。随着信息时代的到来&#xff0c;各类企业和组织…

Q2=17.8和w=0.6198情况

&#xff08;个人学习笔记&#xff0c;仅供参考&#xff09; import numpy as np from scipy.special import kv, erfc from scipy.integrate import dblquad import matplotlib.pyplot as plt import scipy.integrate as spiw 0.6198 g0_sq 21.5989 rho 0.782908 Q2 17.8…

KubeSphere v4 安装指南

日前&#xff0c;KubeSphere v4 发布&#xff0c;相较于之前的版本&#xff0c;新版本在架构上有了颠覆性的变化。为了让社区的各位小伙伴能够丝滑的从旧版本过渡到新版本&#xff0c;我们特别推出本篇安装指南文章&#xff0c;以供参考。 关于 KubeSphere v4 的介绍&#xff…

一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景

文章目录 一、常用数据库概览1.1 关系型数据库1.2 非关系型数据库1.2.1 KV数据库1.2.2 文档型数据库1.2.3 列式存储数据库1.2.4 图数据库 1.3 SQL与NoSQL区别1.3.1 结构化与非结构化1.3.2 关联和非关联1.3.3 查询方式1.3.4 事务1.3.5 总结 二、MySQL三、PostgreSQL3.1 特点、适…

基本计算器 II

文章目录 题目解析解题小结 题目解析 给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。 注意&#xff1a;不允许使用任何将字符…

应急实战(10):Linux后门帐号

目录 1. Prepare 1.1 部署安全设备 2. Detect 2.1 设备产生告警 3. Contain 4. Eradicate 4.1 删除后门帐号 4.2 加固弱口令帐号 5. Recover 5.1 恢复帐号登录 6. Follow-Up 6.1 修改登录端口 6.2 开启命令记录 1. Prepare 1.1 部署安全设备 部署主机安全产品&#xff1a;牧云H…

Openlayer实现矢量图层点击高亮

概述 本文主要介绍如何在 Openlayers 矢量图层上实现点击高亮效果。 效果演示 具体实现 数据准备 矢量数据可点击下载 加载矢量图层 矢量数据是通过调用Openlayers的new GeoJSON()实例去加载读取。 let style = new Style({fill: new Fill({color: "rgba(255, 255,…

SldWorks问题 2. 矩阵相关接口使用上的失误

问题 在计算三维点在图纸&#xff08;DrawingDoc&#xff09;中的位置时&#xff0c;就是算不对&#xff0c;明明就4、5行代码&#xff0c;怎么看都是很“哇塞”的&#xff0c;毫无问题的。 但结果就是不对。 那就调试一下吧&#xff0c;调试后发现生成的矩阵很不对劲&#…

MySQL启动失败解决方案

目录 引言 一、查看/启动mysql服务的两种方式 方法一&#xff1a; 方法二&#xff1a; 二、修改mysql服务启动路径的地址 三、"my.ini"文件的使用 设置my.ini文件的路径 给出一个使用my.ini文件的小例子 引言 造成启动闪退\失败的原因我仅仅以个人查询的一下博…

社招高频面试题

1.单例模式 面试突击50&#xff1a;单例模式有几种写法&#xff1f; 2.Mybatis缓存机制 MyBatis的一、二级缓存查询关系 一级缓存是SqlSession级别&#xff0c;不能跨SqlSession共享&#xff0c;默认开启。 二级缓存是基于mapper namespace级别的&#xff0c;可以跨SqlSessi…

如何从零开始做自动化测试?

自动化测试是使用软件工具在应用程序上自动运行测试的过程&#xff0c;无需任何人为干预。这可以通过减少手动测试的需要来保存时间并提高软件开发过程的效率。由于人为错误或不一致性&#xff0c;手动测试可能容易出错&#xff0c;这可能导致错误未被检测到。自动化测试通过提…

Flutter SVG 图片加载速度提升 98% 的技巧

Flutter SVG 图片加载速度提升 98% 的技巧 视频 https://youtu.be/0HYtX5c6oOw https://www.bilibili.com/video/BV14ixXeJEKy/ 前言 原文 Flutter SVG 图片加载速度提升 98% 的技巧 作为许多 Flutter 开发者中的一员&#xff0c;我最初在项目中依赖 flutter_svg 包来显示 S…

Djang学习- URL反转

代码中url书写规范&#xff1a; 、 url反向解析 urls: path(test/url, views.test_url),path(test_result/<int:age>, views.test_result, name"rl") views: def test_url(request):return render(request, test_url.html)def test_result(request,age):re…

HR软件新方法,企业降本增效7大策略

ZohoPeople助力企业HR降本增效&#xff0c;通过自动化HR流程、自助服务门户、工时管理、绩效管理、轮班安排、远程工作支持及决策分析&#xff0c;提升管理效率&#xff0c;优化员工体验&#xff0c;推动企业发展。 1、自动化HR流程 对于用于大量员工的企业来说&#xff0c;HR…

【时时三省】(C语言基础)函数介绍strcat

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 strcat 字符串追加 示例&#xff1a; 比如我要把world加到hello后面去 就可以用这个 还有一种方法是这样 这两个代码的意思是一样的 只是写法不一样 写的时候要注意这些 •源字符串必须…

通俗易懂的入门 Axure RP文章 ,速学

目录 1. Axure RP简介&#xff1f; 2. Axure RP基本操作 &#xff08;1&#xff09;入门理解 &#xff08;2&#xff09;插入形状 &#xff08;3&#xff09;位置对齐、 &#xff08;4&#xff09;资源库 3. Axure RP基本交互 &#xff08;1&#xff09;切换不同的页面 …

Linux命令进阶

grep 从文件中搜索字符串 grep "字符串" 文件 参数&#xff1a; -n 显示行号 -R 递归及子目录例如 grep "hello" log.c grep "main" * -nRfind 在指定路径下搜索文件 find 路径 -name 文件名find /home/linux -name hello.c //在/home/linux…

Win10 安装 Redis 数据库

一、Redis 数据库介绍 Redis 是一个开源的高性能键值对&#xff08;key-value&#xff09;的非关系型数据库。它通常用作数据结构服务器&#xff0c;支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xff09;、列表&a…

【大事件】国产软件出头,Web版数据库管理工具

SQLynx在今年口碑大火&#xff0c;成为数据库管理工具市场的一匹黑马。那么&#xff0c;SQLynx究竟如何&#xff1f;它究竟有哪些引人注目的优点呢&#xff1f; 首先&#xff0c;SQLynx完全免费&#xff0c;这无疑为众多用户带来了福音。在这个追求性价比的时代&#xff0c;谁…

【MySQL基础刷题】总结题型(二)

最多10题&#xff0c;再多不消化了 1.至少有5名直接下属的经理2.销售员3.订单最多的客户4.计算布尔表达式的值5.查询球队积分6.苹果和桔子7.两人之间的通话次数8.确认率9.各赛事的用户注册率 1.至少有5名直接下属的经理 注意左连接的使用 select e1.name from Employee e1 lef…