AndroidStudio配置MQTT连接云平台EMQX

引言

        本篇博客主要介绍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"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Exqm  Mqtt"android:textSize="30dp"android:layout_gravity="center"android:layout_margin="60dp" /><TextViewandroid: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" /><Buttonandroid: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";@Overrideprotected 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() {@Overridepublic void onClick(View v) {i++;publishMessagePlus(mqtt_pub_topic, "第一个客户端发送的信息 " + i); // Publish messagebtn.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 casebreak;case 2: // Example casebreak;case 3: // MQTT message receivedtext1.setText(msg.obj.toString());break;case 30: // Connection failureToast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();break;case 31: // Connection successToast.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() {@Overridepublic void connectionLost(Throwable cause) {Log.e(TAG, "Connection lost", cause);}@Overridepublic void deliveryComplete(IMqttDeliveryToken token) {Log.d(TAG, "Delivery complete: " + token.isComplete());}@Overridepublic 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() {@Overridepublic void run() {try {if (!client.isConnected()) {Log.d(TAG, "Connecting to MQTT broker...");client.connect(options);Message msg = new Message();msg.what = 31; // Connection successhandler.sendMessage(msg);}} catch (MqttException e) {Log.e(TAG, "MQTT connection failed", e);Message msg = new Message();msg.what = 30; // Connection failedhandler.sendMessage(msg);}}}).start();}private void startReconnect() {scheduler = Executors.newSingleThreadScheduledExecutor();scheduler.scheduleAtFixedRate(new Runnable() {@Overridepublic 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.rhkb.cn/news/450862.html

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

相关文章

黎巴嫩爆炸事件分析:硬件国产自主可控的意义

黎巴嫩近期发生的寻呼机爆炸事件&#xff0c;不仅对当地社会造成了冲击&#xff0c;也在全球范围内引发了对通信设备安全性的深刻反思。这一事件凸显了在全球化背景下&#xff0c;电子产品安全性的重要性&#xff0c;以及自主可控技术在保障国家安全和公共安全中的关键作用。 …

DataWhale10月动手实践——Bot应用开发task02学习笔记

一、Prompt工程 之前有接触过一些Prompt工程的内容&#xff0c;也做过一些简单的应用&#xff0c;比如使用langchain和Openai库自己搭建了一个助手项目&#xff0c;但是还从未关注过在智能体方面的Prompt。在这篇博客中&#xff0c;我会将我之前掌握的和在本次任务学习中掌握的…

【C++】在Windows中使用Boost库——实现TCP、UDP通信

目录 一、编译Boost库 二、TCP服务端 三、TCP客户端 四、UDP连接 一、编译Boost库 1. 先去官网下载Boost库源码 2. 点击下载最新的版本 下载Windows环境的压缩包&#xff0c;然后解压 3. 在解压后的目录路径下找到“bootstrap.bat” 打开控制台&#xff0c;在“bootstrap.…

ROS2 常用工具之Launch -- 启动管理工具

基于上一篇的action代码上继续&#xff0c;链接如上&#xff1a; ROS2 通信三大件之动作 -- Action-CSDN博客 参考链接&#xff1a;ROS2——教你写新版Launch文件 | 范子琦的博客 1、创建文件 src/action_moudle/launch/action_launch.launch.py 路径下创建文件action_lau…

腾讯六宫格本地识别,本地模型识别,腾讯六图识别

基于K哥爬虫昨天发的文章&#xff0c;特此训练了一版腾讯模型&#xff0c;效果不错&#xff0c;特此感谢K哥的指导&#xff0c;效果如下图: 有需求&#xff0c;有疑问的欢迎评论区点出

尚硅谷大数据Flink1.17实战教程-笔记04【Flink DataStream API】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink 概述、Flink 快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink 部署】尚硅…

【Spring篇】初识之Spring的入门程序及控制反转与依赖注入

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】&#xff0c;【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 文章目录 &#x1f3af;初始Spring …

【K8S系列】Kubernetes pod节点NotReady问题及解决方案详解【已解决】

Kubernetes 集群中的每个节点都是运行容器化应用的基础。当节点状态显示为 NotReady 时&#xff0c;意味着该节点无法正常工作&#xff0c;这可能会导致 Pod 无法调度&#xff0c;从而影响整个应用的可用性。本文将深入分析节点不健康的各种原因、详细的排查步骤以及有效的解决…

查看SQL执行计划 explain

查看SQL执行计划 explain explain使用方式 alter session set current_schematest; explain plan for sql语句; --并不会实际执行&#xff0c;因此生成的执行计划也是预估的 select * from table(dbms_xplan.display); explain使用场景 1.内存中没有谓词信息了&#xff0…

MySQL从入门到跑路

SQL语言 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是用于管理和操作关系数据库的一种标准编程语言。 SQL分类&#xff1a; DDL(Data Definition Language)&#xff1a;数据定义语言&#xff0c;用于操作数据库、表、字段&#xff0c…

前端文件流导出

1、前端代码 ​ /** 导出 */ const handleExport async () > {let config {responseType: blob,headers: {Content-Type: application/json,},};const res await getTargetExport(config);const blob new Blob([res]);const fileName PK目标跟进导出列表.xls;const li…

SpringBoot整合Freemarker(一)

Freemarker和jsp一样是一个视图的引擎模板&#xff0c;其实所有的模板引擎的工作原理都是类似的&#xff0c;如下图&#xff1a; 接下来就具体讲解一下Freemarker的用法&#xff0c;参考手册&#xff1a;模板 数据模型 输出 - FreeMarker 中文官方参考手册 SpringBoot默认就…

【浏览器】如何正确使用Microsoft Edge

1、清理主页广告 如今的Microsoft Edge 浏览器 主页太乱了&#xff0c;各种广告推送&#xff0c;点右上角⚙️设置&#xff0c;把快速链接、网站导航、信息提要、背景等全部关闭。这样你就能得到一个超级清爽的主页。 网站导航       关闭 …

HarmonyOS NEXT和认证(在校生的大福利)

今天重点关注了一下HarmonyOS NEXT&#xff0c;也就是我们所说的纯血鸿蒙&#xff01; 根据官方的说法&#xff1a; 欢迎开发者进入HarmonyOS NEXT。暌违一年&#xff0c;HarmonyOS NEXT终于在万千开发者的期待下从幕后走向台前。 HarmonyOS NEXT采用全新升级的系统架构&#…

【Python】NumPy(一):数据类型、创建数组及基本操作

目录 ​NumPy初识 1.什么是NumPy&#xff1f; NumPy的应用 NumPy数据类型 Python基本数据类型 NumPy数据类型 NumPy数组 创建数组 1.使用numpy.array() 2.使用arange()方法创建 3.使用linspace()创建等差数列 4使用zeros()创建数组 5.使用ones()创建数组 6.利用…

Linux基本使用和程序部署

文章目录 一. Linux背景Linux发行版 二. Linux环境搭建Linux常见命令lspwdcdtouchcatmkdirrmcpmvtailvimgreppsnetstat管道 三. 搭建java部署环境安装jdk安装mysql部署Web项目到Linux 一. Linux背景 1969−1970年,⻉尔实验室的DennisRitchie和KenTompson开发了Unix操作系统. 他…

在Linux操作系统上安装NVM教程——CentOS 7/VMware 17版

目录 一、测试网络是否能上网 二、下载阿里云镜像 三、解决执行yum命令出现报错&#xff08;没有就跳过&#xff09; 四、下载NVM安装包 五、解压NVM安装包 六、安装Node 七、连接新的动态库 八、升级GLIBC版本 九、安装GCC 十、查看当前服务器CentOS版本 一、测试网…

[AWS云]kafka调用和创建

背景:因为因为公司的项目需要使用AWS的kafka&#xff0c;但是在创建和使用过程中都遇到了一些报错和麻烦&#xff0c;毕竟老外的东西&#xff0c;和阿里云、华为使用起来还是不一样。 一、创建&#xff08;创建的配置过程就略了&#xff0c;就是配置一下可用区、型号&#xff0…

闯关leetcode——110. Balanced Binary Tree

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/balanced-binary-tree/description/ 内容 Given a binary tree, determine if it is height-balanced. A height-balanced binary tree is a binary tree in which the depth of the two subtrees…

深入理解售后派单管理系统,功能优势一览

售后派单管理系统优化售后服务流程&#xff0c;提升响应速度、运营效率和服务质量。ZohoDesk等系统通过自动化派单、实时调度监控等功能&#xff0c;助力企业赢得竞争优势。适用于电子产品、汽车、IT及房地产等行业。 一、什么是售后派单管理系统 售后派单管理系统是一种专门用…