java mqtt

Wesley13
• 阅读 505

代码:

package cc.gongchang.mqtt;

import java.net.URISyntaxException;

import org.fusesource.hawtdispatch.Dispatch;
import org.fusesource.mqtt.client.Future;
import org.fusesource.mqtt.client.FutureConnection;
import org.fusesource.mqtt.client.MQTT;
import org.fusesource.mqtt.client.Message;
import org.fusesource.mqtt.client.QoS;
import org.fusesource.mqtt.client.Topic;

import com.alibaba.fastjson.JSONObject;

/**
 * Hello world!
 *
 */
public class App {
    public static void main(String[] args) {
        MQTT mqtt = new MQTT();
        // MQTT设置说明
        // 设置主机号
        try {
            mqtt.setHost("tcp://sgdzpic.3322.org:1883");
        } catch (URISyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 用于设置客户端会话的ID。在setCleanSession(false);被调用时,MQTT服务器利用该ID获得相应的会话。此ID应少于23个字符,默认根据本机地址、端口和时间自动生成
        mqtt.setClientId("876543210");
        // 若设为false,MQTT服务器将持久化客户端会话的主体订阅和ACK位置,默认为true
        mqtt.setCleanSession(false);
        // 定义客户端传来消息的最大时间间隔秒数,服务器可以据此判断与客户端的连接是否已经断开,从而避免TCP/IP超时的长时间等待
        mqtt.setKeepAlive((short) 60);
        // 服务器认证用户名
        mqtt.setUserName("admin");
        // 服务器认证密码
        mqtt.setPassword("123456");
        // 设置“遗嘱”消息的话题,若客户端与服务器之间的连接意外中断,服务器将发布客户端的“遗嘱”消息
        mqtt.setWillTopic("willTopic");
        // 设置“遗嘱”消息的内容,默认是长度为零的消息
        mqtt.setWillMessage("willMessage");
        // 设置“遗嘱”消息的QoS,默认为QoS.ATMOSTONCE
        mqtt.setWillQos(QoS.AT_LEAST_ONCE);
        // 若想要在发布“遗嘱”消息时拥有retain选项,则为true
        mqtt.setWillRetain(true);
        // 设置版本
        mqtt.setVersion("3.1.1");
        // 失败重连接设置说明
        // 客户端首次连接到服务器时,连接的最大重试次数,超出该次数客户端将返回错误。-1意为无重试上限,默认为-1
        mqtt.setConnectAttemptsMax(10L);
        // 客户端已经连接到服务器,但因某种原因连接断开时的最大重试次数,超出该次数客户端将返回错误。-1意为无重试上限,默认为-1
        mqtt.setReconnectAttemptsMax(3L);
        // 首次重连接间隔毫秒数,默认为10ms
        mqtt.setReconnectDelay(10L);
        // 重连接间隔毫秒数,默认为30000ms
        mqtt.setReconnectDelayMax(30000L);
        // 设置重连接指数回归。设置为1则停用指数回归,默认为2
        mqtt.setReconnectBackOffMultiplier(2);

        // Socket设置说明
        // 设置socket接收缓冲区大小,默认为65536(64k)
        mqtt.setReceiveBufferSize(65536);
        // 设置socket发送缓冲区大小,默认为65536(64k)
        mqtt.setSendBufferSize(65536);
        // 设置发送数据包头的流量类型或服务类型字段,默认为8,意为吞吐量最大化传输
        mqtt.setTrafficClass(8);

        // 带宽限制设置说明
        // 设置连接的最大接收速率,单位为bytes/s。默认为0,即无限制
        mqtt.setMaxReadRate(0);
        // 设置连接的最大发送速率,单位为bytes/s。默认为0,即无限制
        mqtt.setMaxWriteRate(0);

        Boolean contition = true;
        while (contition) {
            // 选择消息分发队列
            // 若没有调用方法setDispatchQueue,客户端将为连接新建一个队列。如果想实现多个连接使用公用的队列,显式地指定队列是一个非常方便的实现方法
            mqtt.setDispatchQueue(Dispatch.createQueue("foo"));
            FutureConnection connection = mqtt.futureConnection();
            Future<Void> f1 = connection.connect();
            try {
                f1.await();
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            // 订阅消息
            Future<byte[]> f2 = connection.subscribe(new Topic[] {
                    new Topic("person/blacklist/#", QoS.AT_LEAST_ONCE) });
            //
            try {
                byte[] qoses = f2.await();
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            // 发送身份验证消息.
            // Future<Void> f3 = connection.publish("foo", "Hello".getBytes(),
            // QoS.AT_LEAST_ONCE, false);
            // 接收订阅消息..
            Future<Message> receive = connection.receive();
            // 打印消息.
            Message message = null;
            try {
                message = receive.await();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            String subscribeInfo = String.valueOf(message.getPayloadBuffer());
            if(subscribeInfo.startsWith("ascii")) {
                JSONObject subscribeObject = JSONObject.parseObject(subscribeInfo.substring(7));
                System.out.println(subscribeInfo);
                System.out.println(subscribeObject.get("name"));//姓名,对应name
                System.out.println(subscribeObject.get("certifiedNo"));//身份证,对应identityId
                System.out.println(subscribeObject.get("url"));//图片地址,对应imageUrl
                //还需要传送tarLibSerial
                //入库黑名单
            }
            // 回应
            message.ack();
            //
            Future<Void> f4 = connection.disconnect();
            try {
                f4.await();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
}
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
2年前
java基础知识随身记
2018年11月12日20:51:35一、基础知识:1、JVM、JRE和JDK的区别:JVM(JavaVirtualMachine):java虚拟机,用于保证java的跨平台的特性。  java语言是跨平台,jvm不是跨平台的。JRE(JavaRuntimeEnvironment):java的运行环境,包括jvmjava的核心类
Wesley13 Wesley13
2年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Wesley13 Wesley13
2年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
2年前
Java日期时间API系列35
  通过Java日期时间API系列1Jdk7及以前的日期时间类(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fxkzhangsanx%2Fp%2F12032719.html)中得知,Java8以前除了java.sql.Timestamp扩充
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
京东云开发者 京东云开发者
6个月前
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了