首页 > 编程语言 >Android JAVA连接MQTT,以及常见问题

Android JAVA连接MQTT,以及常见问题

时间:2023-04-25 10:55:59浏览次数:39  
标签:mqttClient 常见问题 JAVA String param topic MQTT public

本文介绍如何使用Android(JAVA)客户机连接MQTT服务器

第一步先引入MQTT

在 build.gradle 添加以下:

dependencies {
    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
}

接下来演示如何连接

创建MQTT客户机类 

MqttConnect.class
public class MqttConnect {

  private String HOST = ContentValue.TCP_URL;
  private final String clientId = UUID.randomUUID().toString();
  private static MqttClient mqttClient;

  /**
   * 客户端connect连接mqtt服务器
   *
   * @param username 用户名
   * @param password 密码
   * @param mqttCallback 回调函数
   **/
  public void setMqttClient(String username, String password, MqttCallback mqttCallback)
      throws MqttException
  {
    MqttConnectOptions options = mqttConnectOptions(username, password);
    mqttClient.setCallback(mqttCallback);
    mqttClient.connect(options);
    if(mqttClient.isConnected()) {
      System.out.println("MQTT连接成功");
    }
  }

   /**
   * MQTT连接参数设置
   */
  private MqttConnectOptions mqttConnectOptions(String userName, String passWord)
      throws MqttException {
    mqttClient = new MqttClient(HOST, clientId, new MemoryPersistence());
    MqttConnectOptions options = new MqttConnectOptions();
    options.setUserName(userName);
    options.setPassword(passWord.toCharArray());
    options.setConnectionTimeout(60);
    options.setAutomaticReconnect(true);
    options.setCleanSession(false);
    return options;
  }

  /**
   * 关闭MQTT连接
   */
  public void close() throws MqttException {
    mqttClient.close();
    mqttClient.disconnect();
  }

  /**
   * 向某个主题发布消息 默认qos:1
   */
  public static void pub(String topic, String msg) throws MqttException {
    MqttMessage mqttMessage = new MqttMessage();
    mqttMessage.setPayload(msg.getBytes());
    MqttTopic mqttTopic = mqttClient.getTopic(topic);
    MqttDeliveryToken token = mqttTopic.publish(mqttMessage);
    token.waitForCompletion();
  }

  /**
   * 向某个主题发布消息
   *
   * @param topic: 发布的主题
   * @param msg: 发布的消息
   * @param qos: 消息质量    Qos:0、1、2
   */
  public static void pub(String topic, String msg, int qos) throws MqttException {
    MqttMessage mqttMessage = new MqttMessage();
    mqttMessage.setQos(qos);
    mqttMessage.setPayload(msg.getBytes());
    MqttTopic mqttTopic = mqttClient.getTopic(topic);
    MqttDeliveryToken token = mqttTopic.publish(mqttMessage);
    token.waitForCompletion();
  }

  /**
   * 订阅某一个主题 ,此方法默认的的Qos等级为:1
   *
   * @param topic 主题
   */
  public static void sub(String topic) throws MqttException {
    mqttClient.subscribe(topic);
  }

  /**
   * 订阅某一个主题,可携带Qos
   *
   * @param topic 所要订阅的主题
   * @param qos 消息质量:0、1、2
   */
  public void sub(String topic, int qos) throws MqttException {
    mqttClient.subscribe(topic, qos);
  }

}

创建MQTT消息回调类

MqttInitCallback.class
public class MqttInitCallback implements MqttCallback {

  /**
   * publish发布成功后会执行到这里
   */
  @Override
  public void deliveryComplete(IMqttDeliveryToken token) {
  }

  @Override
  public void connectionLost(Throwable throwable) {
    System.out.println("mqtt close...");
  }

  /**
   * subscribe订阅后得到的消息会执行到这里
   */
  @Override
  public void messageArrived(String topic, MqttMessage message) {
    System.out.println("topic-message:" + message.toString());
  }

}

到这里主要的两个函数也就完成了,分别为 MQTT客户机连接类 以及 MQTT数据回调类

接下来是调用连接以及订阅监听消息

// 用户名
private String username = ContentValue.TCP_USERNAME;
// 密码
private String password = ContentValue.TCP_PASSWORD;
// MQTT客户机连接类
private MqttConnect server = new MqttConnect();
// MQTT回调函数
private MqttInitCallback initCallback = new MqttInitCallback();
//    MQTT连接
server.setMqttClient(username, password, initCallback);

// MQTT订阅  "/test"是主题 0是qos,一共可以设置0,1,2
server.sub("/test",0)
    

可以使用MQTT.FX进行测试

如果需要免费版安装包,可以加我微信好友领取

配置以下连接

 

测试推送一条消息到主题

 我们来查看一下Android的运行日志

 

连接成功,并收到监听主题的消息。

 

 

 

 

 

标签:mqttClient,常见问题,JAVA,String,param,topic,MQTT,public
From: https://www.cnblogs.com/Thehorse/p/17351963.html

相关文章

  • java面试题--Spring
    一、Spring、SpringMVC、SpringBoot的区别是什么?二、????三、SpringMVC工作流程是什么?1、DispatcherServlet接收请求,将请求发给HandlerMapping;2、HandlerMapping根据请求url,匹配到要处理的handler,并包装成处理器执行链,返回给DispatcherServlet。3、DispatcherServlet根据处理器......
  • 比较Python与Java在类的定义、继承、多态等方面的异同
    首先我来进行介绍Python与Java在类的定义、继承、多态等方面的异同1.python类和java类的使用一览java:publicclassCar{privateStringcolor;privateStringmodel;privateintyear;publicCar(Stringcolor,Stringmodel,intyear){......
  • Java 反射机制的一个简单例子.
    一、什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中LEAD/LEAD++、Open......
  • java中使用RedisTemplate读取数据异常 Missing type id when trying to resolve subt
    java中使用RedisTemplate读取数据异常Missingtypeidwhentryingtoresolvesubtypeof[simpletype,classjava.lang.Object]:missingtypeidproperty'@class'at[Source:(byte[])"报错:Causedby:com.fasterxml.jackson.databind.exc.InvalidTypeIdExcep......
  • java 分词统计
    依赖(谷歌基于lucene的中文分词IKAnalyzer)<dependency><groupId>org.wltea</groupId><artifactId>ikanalyzer</artifactId><version>5.0.2</version></dependency><dependency><groupId>org.apache.lucen......
  • JavaScript回调函数
    一种场景js需要等待一个函数执行完后再执行另一个函数或者其他的操作。本编以最简单的例子来说明回调函数的执行过程。回调函数备注上就是以函数对象作为参数进行传递。demo<!DOCTYPEhtml><html><head><metahttp-equiv="Content-Type"content="text/html;charset=gb2312"/>......
  • Java设计模式-简单工厂模式
    简介在软件开发过程中,设计模式是一种被广泛应用的实践,它是通过总结、归纳和提炼出软件设计经验,从而使得设计更加优雅、高效。简单工厂模式是设计模式中最基本、最简单的一种模式,它能够有效地封装对象的创建过程,简化代码结构。简单工厂模式又称为静态工厂方法模式,它是通过定义一......
  • 【代理设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介代理模式(ProxyPattern)是一种结构型设计模式,用一个类来代理另一个类或几个类的功能。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。延迟初始化(虚拟代理)。如果你有一个偶尔使用的重量级服务对象,一直保持该对象运行会消耗系统资源时,可使用代理模式。访问......
  • GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践
    环顾四周,皆是对手!云时代的掉队者,由于Java启动的高延时、对资源的高占用、导致在Serverless及FaaS架构下力不从心,在越来越流行的边缘计算、IoT方向上也是难觅踪影;Java语言在业务服务开发中孤独求败,但在系统级应用领域几乎是C、C++、搅局者Go、黑天鹅Rust的天下;移动应用、敏捷......
  • JavaScript 正则表达式
    基本使用 //定义正则表达式 constreg=/^\d{4}-\d{1,2}-\d{1,2}$/; conststr="2020-11-11"; //验证字符串是否符合规则 reg.test(str);元字符^表示开始部分等于xxx$表示结束部分等于xxx[]表示字符串中存在中括号中定义的字符,可以使用连字符,如a-z表示可以匹......