AndroidStudio配置MQTT连接云平台EMQX

news2024/11/24 15:57:26

引言

        本篇博客主要介绍mqtt和emqx配置连接实现数据收发,我会从基础的本机连接到手机和本机连接再到手机实现mqtt连接云平台,大家可以根据需要自行选择观看(后面两个教程都建立在mqtt和emqx下载完成的基础上,若没有下载完成,请不要跳过第一个教程)。

一、电脑本机实现连接

 1.EMQX下载

        首先,我们要先下载emqx,Directory listing for EMQX: /v5.3.2/ | EMQ,挑选适合版本即可,我这里使用的是emqx5.3.2版本,如下点击链接,下载Windows版本。

 

         下载完成后解压该文件在D盘,注意在英文路径中。然后win+R输入cmd打开终端,进入刚刚解压的文件内容。

        或者直接进入该文件夹bin下,在搜索位置输入cmd

        (必须以管理员身份) 执行该指令  .\emqx.cmd install  出现下图状态表示该服务成功。该操作执行一次即可。

        然后启动emqx:  .\emqx.cmd console  出现 EMQX 5.3.2 is running now!证明启动成功。

         大家可能会出现无法连接的问题,如该问题为端口号(4370)被占,可以用以下方法解决。(我这里占用4370的程序代号为17080,大家看自己情况写自己查询出来的程序:代码第一行为查询,第二行为执行终止操作。)

        若无法终止,则以管理员身份运行再次执行该操作。

//若显示无法连接端口号被占:(终止占用端口4370的程序17080 )
netstat -aon | findstr 4370
taskkill /PID 17080 /F

        浏览器输入  localhost:18083   进入EMQX的控制台界面,初始登录账号密码均为:账号:admin,密码:public 。成功登录后,界面会出现让你修改密码的情况,成功修改后进入以下界面。

 2.MQTT下载

        下载mqttx客户端,Directory listing for MQTTX: /v1.9.7/ | EMQ (emqx.com)

        得到安装包后,双击安装mqttx客户端,位置放在D盘,其余默认即可。打开该软件,我们先找到设置,将语言改为中文。

3.mqtt和emqx通信收发信息

        打开mqttx,点击 “ + ” 新建连接,名称随便输入,Client ID默认即可,服务器地址为刚才创建的MQTT本地服务器,因为客户端在同一台电脑上,所以地址为127.0.0.1,端口号默认1883,然后点击右上角连接。

        我们可以发现emqx终端显示了我们的连接。

         然后我们回到mqttx,我们在刚刚创建连接下面添加订阅,主题自定义即可。

 

        添加主题后我们可以在emqx订阅管理中查看到你的主题。

        然后回到mqtt,创建成功后我们可以先给这个主题发送消息,看一下是否能收到,如下,在发送消息行输入主题名:mk123(大家输入自己创建的即可)。

 

         OK,我们打开emqx中webSocket部分,点击连接。

         订阅主题,自定义即可。

         我们向mqtt订阅的主题发送消息,我这里是mk123,可以看到已发送部分出现发送内容,回到mqtt可以看到发送过来的信息 123。

        然后我们在mqtt发送,主题为mk456,如下,然后我们回到emqx就能发现emqx已接收部分出现提示收到了456。

         综上所述,我们完成了简单的本机mqtt和emqx数据收发!

二、AndroidStudio连接本机电脑

        1. 我们首先下载相关jar包---mqttv3和service(可以从Maven库中下载)。

 1.下载jar包---mqttv3和service

Central Repository: org/eclipse/paho/org.eclipse.paho.client.mqttv3/1.2.0 (maven.org)

Central Repository: org/eclipse/paho/org.eclipse.paho.android.service/1.1.1 (maven.org)

     2. 将下载好的jar包加入到AndroidStudio中。(我们先新建一个project)

 创建一个新项目--New Project

选择空视图

进行相关配置选择如下,点击ok即可创建一个新工程。

切换视图——Android --> Project

new一个文件命名为 lib 用来存放 jar 包。

将两个jar包复制到 lib 文件下。

右击 jar 包,选择Add As Library将包添加到配置中。

两个文件全部添加(完成后如下所示)

切换回Android视图,build.gradle可以看到自动添加的依赖,如下图。

         打开manifest,添加允许

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

        在下面位置再添加一行代码。

<service android:name="org.eclipse.paho.android.service.MqttService" />

        到这里配置就结束了,接下来就是mqtt及连接收发数据代码实现。

AndriodStudio代码实现

WebSocket客户端新建一个连接,修改主机名。

 MQTTX建立连接

 结果展示

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    android:layout_gravity="center"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Exqm  Mqtt"
        android:textSize="30dp"
        android:layout_gravity="center"
        android:layout_margin="60dp" />

    <TextView
        android:id="@+id/test1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:layout_gravity="center"
        android:layout_margin="60dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/bt0"
        android:text="按钮"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:orientation="vertical" />

</LinearLayout>
package com.example.connect;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
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 java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity {

    // 按照自己的写就行
    private String host = "tcp://broker.emqx.io:1883";
    private String userName = "mk";
    private String passWord = "123456";
    private String mqtt_id = "mqttx_a687ae08";
    private String mqtt_sub_topic = "mk123";  
    private String mqtt_pub_topic = "mk123";
   

    private int i = 1;
    private Handler handler;
    private MqttClient client;
    private MqttConnectOptions options;
    private ScheduledExecutorService scheduler;
    private static final String TAG = "MQTT";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView text1 = findViewById(R.id.test1);
        @SuppressLint({"MissingInflatedId", "LocalSuppress"})
        Button btn = findViewById(R.id.bt0);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                i++;
                publishMessagePlus(mqtt_pub_topic, "第一个客户端发送的信息 " + i); // Publish message
                btn.setText(String.valueOf(i));
            }
        });

        init();
        startReconnect();

        handler = new Handler() {
            @SuppressLint({"SetTextI18n", "HandlerLeak"})
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                    case 1: // Example case
                        break;
                    case 2: // Example case
                        break;
                    case 3: // MQTT message received
                        text1.setText(msg.obj.toString());
                        break;
                    case 30: // Connection failure
                        Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();
                        break;
                    case 31: // Connection success
                        Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();
                        try {
                            Log.d(TAG, "Subscribing to topic: " + mqtt_sub_topic);
                            client.subscribe(mqtt_sub_topic, 1); // Subscribe with QoS 1
                        } catch (MqttException e) {
                            Log.e(TAG, "Subscription failed", e);
                        }
                        publishMessagePlus(mqtt_pub_topic, "第一个客户端发送的信息");
                        break;
                    default:
                        break;
                }
            }
        };
    }

    private void init() {
        try {
            client = new MqttClient(host, mqtt_id, new MemoryPersistence());
            options = new MqttConnectOptions();
            options.setCleanSession(true);
            options.setUserName(userName);
            options.setPassword(passWord.toCharArray());
            options.setConnectionTimeout(10);
            options.setKeepAliveInterval(20);

            client.setCallback(new MqttCallback() {
                @Override
                public void connectionLost(Throwable cause) {
                    Log.e(TAG, "Connection lost", cause);
                }

                @Override
                public void deliveryComplete(IMqttDeliveryToken token) {
                    Log.d(TAG, "Delivery complete: " + token.isComplete());
                }

                @Override
                public void messageArrived(String topicName, MqttMessage message) {
                    Log.d(TAG, "Message arrived: " + topicName + " - " + message.toString());
                    Message msg = new Message();
                    msg.what = 3;
                    msg.obj = topicName + "---" + message.toString();
                    handler.sendMessage(msg);
                }
            });
        } catch (MqttException e) {
            Log.e(TAG, "MQTT initialization error", e);
        }
    }

    private void Mqtt_connect() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    if (!client.isConnected()) {
                        Log.d(TAG, "Connecting to MQTT broker...");
                        client.connect(options);
                        Message msg = new Message();
                        msg.what = 31; // Connection success
                        handler.sendMessage(msg);
                    }
                } catch (MqttException e) {
                    Log.e(TAG, "MQTT connection failed", e);
                    Message msg = new Message();
                    msg.what = 30; // Connection failed
                    handler.sendMessage(msg);
                }
            }
        }).start();
    }

    private void startReconnect() {
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                if (!client.isConnected()) {
                    Mqtt_connect();
                }
            }
        }, 0 * 1000, 10 * 1000, TimeUnit.MILLISECONDS);
    }

    private void publishMessagePlus(String topic, String message2) {
        if (client == null || !client.isConnected()) {
            Log.e(TAG, "Client is not connected. Cannot publish.");
            return;
        }
        try {
            MqttMessage message = new MqttMessage();
            message.setPayload(message2.getBytes());
            client.publish(topic, message);
            Log.d(TAG, "Message published to topic: " + topic);
        } catch (MqttException e) {
            Log.e(TAG, "Error publishing message", e);
        }
    }
}

 以上代码参考了别的大佬的教程。

三、AndroidStudio连接腾讯云

        连接云只需要我们在云端配置emqx环境,然后将上面 AndroidStudio 中ip改成云服务器ip即可。

下载emqx相关配置 

我们先单独建立一个包

mkdir app/soft/mqtt

在mqtt目录下下载emqx

wget https://www.emqx.com/en/downloads/broker/3.1.2/emqx-centos7-v3.1.2.zip

下载好后解压 

unzip emqx-centos7-v3.1.2.zip.1

 启动emqx:./bin/emqx start

修改配置文件

emqx/etc/emqx.conf

允许匿名:allow_anonymous = true

我们还是像之前一样的操作订阅主题,只不过ip为:

private String host = "tcp://云平台ip:1883";

下面的emqx客户端为云平台配置的客户端,链接为:

云平台公网ip:1808

默认登录账号:admin,密码:public。

        OK,到这里一个简单的使用mqtt连接emqx进行通信就基本完成了,大家可以自行丰富内容,比如和单片机通信等。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文介绍SQL标准1986~2023的演变

SQL标准1986年制定第一版&#xff0c;到最新的2023版&#xff0c;已经有38年的历史&#xff0c;现在依然是计算机非常活跃的语言&#xff0c;50%的程序员都能掌握SQL&#xff0c;数据分析师也是SQL的主要使用人员之一。 从早期的基本语法&#xff0c;到融合了XML、JSON等复杂数…

vue-组件通信

组件通信是什么 组件通信就是组件与组件之间的数据传递 组件的数据是独立的&#xff0c;无法直接访问其他组件的数据 组件关系 组件关系的两大类&#xff1a; 组件A和B是非父子关系&#xff0c;组件C对于A和B是父子关系 父子通信 父组件通过props将数据传递给子组件 子组件利…

sed awk 第二版学习(六)—— 编写 awk 脚本

目录 一、awk 程序设计模型 二、模式匹配 三、记录和字段 1. 字段的引用和分离 2. 字段的划分 四、表达式 五、系统变量 1. FS、OFS、RS、ORS 2. NF 3. NR、FILENAME、FNR 4. CONVFMT、OFMT 5. 两个例子 &#xff08;1&#xff09;处理多行记录 &#xff08;2&am…

Alas配置更新器自动更新

之前我的部署方法有些问题&#xff0c;不应该下载源码再上传到服务器&#xff0c;这样会导致无法使用更新器&#xff0c;只能手动更新&#xff0c;比较麻烦&#xff0c;最近改用git方式获取源码&#xff0c;解决了无法使用更新器的问题&#xff0c;亲测有效 以下操作均基于雨云…

探索未知,惊喜连连 —— 盲盒小程序开发文案

在这个充满惊喜与好奇的时代&#xff0c;盲盒已经成为了一种独特的文化现象&#xff0c;它不仅仅是一种商品&#xff0c;更是一种心灵的慰藉和乐趣的源泉。为了满足广大盲盒爱好者的需求&#xff0c;我们精心打造了一款盲盒小程序&#xff0c;让惊喜触手可及&#xff0c;随时随…

数据库——创立表和库

数据库&#xff08;Database&#xff09;是一个用于存储、管理和检索数据的系统。它可以组织结构化数据&#xff0c;支持高效的存取和操作。数据库通常由一个数据库管理系统&#xff08;DBMS&#xff09;来支持&#xff0c;常见的DBMS包括&#xff1a; 关系数据库&#xff08;R…

如何正确的用引用作返回值?

错误一&#xff1a;引用作函数返回值&#xff0c;但函数中没用static修饰 下面代码输出什么结果&#xff1f; 输出结果&#xff1a; Q&#xff1a;ret应该是3&#xff0c;为什么再调用一次Add函数后&#xff0c;ret变成了7&#xff1f; 解释&#xff1a; ①&#xff1a;在第二…

steam上传游戏问题汇总

问题 首先是Library Logo 必须是png图片&#xff0c;还必须带上游戏名字你的宣传图不能使用游戏内部的截图。Library_Hero必须是空白的&#xff0c;不能有任何文字。他是和Library_logo合并在一起的。这个法律其实没必要填写。然后我错误的把EULA填写在这里了也报错了 如果你在…

《Linux从小白到高手》综合应用篇:详解Linux系统调优之服务器硬件优化

List item 本篇介绍Linux服务器硬件调优。硬件调优主要包括CPU、内存、磁盘、网络等关键硬件组。 1. CPU优化 选择适合的CPU&#xff1a; –根据应用需求选择多核、高频的CPU&#xff0c;以满足高并发和计算密集型任务的需求。CPU缓存优化&#xff1a; –确保CPU缓存&#x…

电容补偿功率因数不标准会怎样

电容补偿功率因数如果不符合标准&#xff0c;可能会对电力系统和设备运行造成多种负面影响。以下是功率因数补偿不当可能引发的问题&#xff1a; 1、欠补偿或不足补偿的影响 功率因数偏低&#xff1a;如果补偿量不足&#xff0c;功率因数未达到预期值&#xff08;通常在0.9至…

【C++】C++入门基础

一. 第一个C程序 #include<iostream> using namespace std;int main() {cout << "hello world" << endl;return 0; } 二.命名空间 1.namespace的价值 在C/C中&#xff0c;变量、函数和后⾯要学到的类都是⼤量存在的&#xff0c;这些变量、函数…

数据结构修炼——栈和队列是什么?如何实现?从入门到实战

目录 一、栈1 栈的概念及结构2 栈的实现 二、队列1 队列的概念及结构2 队列的实现 三、栈和队列OJ题1 有效的括号2 用队列实现栈3 用栈实现队列4 循环队列 四、概念选择题 一、栈 1 栈的概念及结构 栈&#xff1a;一种特殊的线性表。栈只允许在固定端进行插入和删除操作。进行…

专业的客服话术快捷回复软件

在当今快节奏的工作环境中&#xff0c;客服行业面临着前所未有的挑战。尤其是对于刚入行的新手小白来说&#xff0c;如何快速提升响应速度、保证回复质量&#xff0c;成为了他们亟待解决的问题。而今天&#xff0c;我要向大家推荐的这款“客服宝”快捷回复软件&#xff0c;就非…

advanced skeleton绑定模型无法返回修改按钮

有时候出现问题 adv插件没有Toggle Fit返回修改部分的按钮&#xff0c;这个通常是命名造成的 解决方式&#xff0c;把骨骼模型最上层的组名重改为Group&#xff0c;然后重开插件就行了 参考https://www.reddit.com/r/Maya/comments/xcgvcq/does_anyone_know_why_advanced_ske…

美畅物联丨破解养老难题:视频汇聚平台助力银发经济蓬勃发展

​一、引言 今天是重阳佳节&#xff0c;我们就来聊一聊视频汇聚平台在智慧养老中的应用与前景。 近年来&#xff0c;中国老龄化态势愈发严峻&#xff0c;已成为社会各界高度关注的重大课题。随着时间的推移&#xff0c;老年人口数量呈现出大规模增长的趋势&#xff0c;且独居老…

HE染色:揭示细胞细节,助力病理诊断|文献速递·24-10-11

好文分享 这篇文章是一篇关于苏木精-伊红&#xff08;H&E&#xff09;染色在诊断外科病理学中重要性的综述。 角色姓名单位第一作者John K. C. Chan香港特别行政区中国女王伊丽莎白医院 文章首先强调了尽管分子医学取得了显著进展&#xff0c;但显微镜仍然是外科病理学家日…

初阶数据结构(2):空间复杂度和复杂度算法题

Hello~,欢迎大家来到我的博客进行学习&#xff01; 目录 1.空间复杂度2. 常见复杂度对比3. 复杂度算法题3.1 旋转数组解法一解法二解法三 1.空间复杂度 根据摩尔定律&#xff0c;每隔一段时间晶体管的数量会增加一倍&#xff0c;即内存会增加&#xff0c;价格会降低。内存就不…

Windows CSC服务权限提升漏洞(CVE-2024-26229)

一、漏洞描述 csc.sys驱动程序中带有METHOD_NEITHER I/O控制代码的IOCTL地址验证不正确&#xff0c;导致任意地址写零漏洞。攻击者在Windows上获得较低权限的任意代码执行后&#xff0c;可以利用该漏洞将低权限提升至system权限。 二、漏洞详情 该漏洞源于 csc.sys 驱动程序…

Zilliz获Forrester报告全球第一;OB支持向量能力;Azure发布DiskANN;阿里云PG发布内置分析引擎

重要更新 1. Azure发布PostgreSQL向量索引扩展DiskANN&#xff0c;声称在构建HNSW/IVFFlat索引上&#xff0c;速度、精准度都超越pg_vector&#xff0c;并解决了pg_vector长期存在的偶发性返回错误结果的问题( [1] )。 2. 阿里云RDS PostgreSQL 发布AP加速引擎&#xff08;rds…

【python实操】python小程序之继承

引言 python小程序之继承 文章目录 引言一、继承1.1 概念1.1.1 基本语法1.1.2 关键点解释1.1.3 示例1.1.4 总结 1.2 题目1.3 代码1.4 代码解释1.4.1 类定义1.4.2 对象创建与方法调用1.4.3 总结 二、思考 一、继承 1.1 概念 python 中的继承是一种强大的机制&#xff0c;它允许…