热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Javaspringmvc结合阿里MQTT功能

近期,公司准备使用阿里MQTT,自己做了一个demo。准备工作首先,你歹有一个阿里云帐号,去阿里云注册一个MQTT实例&

近期,公司准备使用阿里MQTT,自己做了一个demo。


准备工作

首先,你歹有一个阿里云帐号,去阿里云注册一个MQTT实例,现在有免费试用一个月的

在这我们要记得尤其记一下我们购买的实例是买的哪的 比如我的这个是深圳  可以写进配置文件中

public final static String instanceId = "";public final static String accessKey= "";public final static String secretKey= "";public final static String cOnnectEndpoint= "";;public final static String topicId ="demo";public final static String groupId ="GID_demo";public final static String messageModel="5000";public final static String sendMsgTimeoutMillis="5000";public final static String suspendTimeMillis="5000";/*** 消息消费失败时的最大重试次数*/public final static String maxRecOnsumeTimes="10";/*** QoS参数代表传输质量,可选0,1,2*/public final static int qosLevel = 0;/*** 客户端超时时间*/public final static int timeToWait =5000;/*** MQTT所在地域*/ public final static String mqttAddress= "cn-shenzhen";

MQTT消息队列的实现功能

我们主要完成五个接口功能的实现

1.设备code发送消息到topic中

2.设备code发送消息到指定设备上(P2P模式)

3.服务启动监听队列消息

4.根据设备ID及所在队列查询设备当前状态消息(单独设备)

5.根据设备ID及所在队列批量查询设备当前状态消息(注意最大只是支持十个设备的查询)


设备code发送消息到topic中

主要思路是创建连接MQTT,直接将消息发送到对应的topic中

public void sendMqttMsgTopic(@RequestParam(value = "deviceCode", required = true) String deviceCode,@RequestParam(value = "msg", required = true) String msg) throws InterruptedException, MqttException{ String listenTopic ="earTagTopic";String clientId = MqttConfig.earTagGroupId + "@@@" + deviceCode;String topic = MqttConfig.earTagTopicId + "/" + listenTopic; //发送消息到消息队列MqttMessage message = new MqttMessage(msg.getBytes());message.setQos(MqttConfig.qosLevel);/*** 发送普通消息时,topic 必须和接收方订阅的 topic 一致,或者符合通配符匹配规则*/ try {mqttClient = MqtttClient.getProducerConnection(clientId,topic,deviceCode,MqttConfig.earTagGroupId); mqttClient.publish(topic, message);} catch (InvalidKeyException | NoSuchAlgorithmException | MqttException e1) {System.out.printf("消息发送失败:{}", e1.getMessage());e1.printStackTrace();}mqttClient.disconnect();Thread.sleep(Long.MAX_VALUE);return ;}

我们可以看到我们向earTag的eraTagTopic的主题消息发送成功,并且可以看到已经监听到并打印

如果我们不需要发送成功返回的回调,我们直接将callback代码去掉即可

mqttClient.setCallback(new MqttCallbackExtended()

我们可以看到这两条就是去掉成功回调,我们直接监听到返回结果了


设备code发送消息到指定设备上(P2P模式)

主要思路也是连接到MQTT上,然后直接向目标设备发送消息。

public void sendMqttp2pMsg(@RequestParam(value = "deviceCode", required = true) String deviceCode,@RequestParam(value = "msg", required = true) String msg) throws InterruptedException, MqttException{/*** MQ4IoT支持点对点消息,即如果发送方明确知道该消息只需要给特定的一个设备接收,且知道对端的 clientId,则可以直接发送点对点消息。* 点对点消息不需要经过订阅关系匹配,可以简化订阅方的逻辑。点对点消息的 topic 格式规范是 {{parentTopic}}/p2p/{{targetClientId}}*///对指定设备发送p2p消息 当前测试只是给监听我这个队列的设备发送消息String listenTopic ="earTagTopic";String clientId = MqttConfig.earTagGroupId + "@@@" + deviceCode+"aa";String topic = MqttConfig.earTagTopicId + "/" + listenTopic; //String msgSendTopic = MqttConfig.earTagTopicId + "/p2p/" + MqttConfig.earTagGroupId + "@@@" + deviceCode;String msgSendTopic = MqttConfig.topicId + "/p2p/" + MqttConfig.groupId + "@@@" + deviceCode;MqttMessage mqttMessage = new MqttMessage(msg.getBytes());mqttMessage.setQos(MqttConfig.qosLevel); try {mqttClient = MqtttClient.getProducerConnection(clientId,topic,deviceCode+"aa",MqttConfig.earTagGroupId); mqttClient.publish(msgSendTopic, mqttMessage);} catch (InvalidKeyException | NoSuchAlgorithmException | MqttException e1) {System.out.printf("消息发送失败:{}", e1.getMessage());e1.printStackTrace();}mqttClient.disconnect();Thread.sleep(Long.MAX_VALUE);return ;}

我向GID_demo@@@test3的设备发送指定的消息,GID_demo@@@test3这个设备成功接收到了。


服务启动监听队列消息

主要思路使用ApplicationListener来进行实现 项目启动自动启动监听


根据设备ID及所在队列查询设备当前状态消息(单独设备)

主要思路传想要查询的主题及设备code,返回当前状态信息

public SourceDataBean querySessionByClientId(@RequestParam(value = "topic", required = true) String topic,@RequestParam(value = "deviceCode", required = true) String deviceCode) throws InterruptedException, MqttException{ SourceDataBean sdb = new SourceDataBean(); List res = queryDeviceStateService.querySessionByClientId(topic, deviceCode);if(res.size()>0) {sdb.setDataSource(new DataSource<>(res,1,1,1));sdb.setMessage(RestCode.SUCCESS.code,PropertiesUtil.getValue("config.properties","QuerySuccessful"));}else {sdb.setMessage(RestCode.FAILED.code,res.get(0).getOnlineStatusName());}return sdb;}


根据设备ID及所在队列批量查询设备当前状态消息(注意最大只是支持十个设备的查询)

主要思路传想要查询的主题及设备codes,返回查询设备的状态信息

注意deviceCodes  使用逗号分隔即可,当前阿里MQTT官方文档写的是最大只是十个设备的查询,因为我这边的分页最大数量是10,未做超过10的测试。

public SourceDataBean querySessionByClientIds(@RequestParam(value = "topic", required = true) String topic,@RequestParam(value = "deviceCodes", required = true) String deviceCodes) throws InterruptedException, MqttException{ SourceDataBean sdb = new SourceDataBean();List res = queryDeviceStateService.querySessionByClientIds(topic, deviceCodes);if(res.size()>0) {sdb.setDataSource(new DataSource<>(res,res.size(),0,0));sdb.setMessage(RestCode.SUCCESS.code,PropertiesUtil.getValue("config.properties","QuerySuccessful"));}else {sdb.setMessage(RestCode.FAILED.code,res.get(0).getOnlineStatusName());}return sdb;}


这样,springMVC结合阿里MQTT的基本使用就完成了。

有不懂的地方可以QQ联系我,外接私活,源码出售,欢迎各位老板。

 


推荐阅读
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • Keepalived 提供了多种强大且灵活的后端健康检查机制,包括 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK 和 MISC_CHECK 等多种检测方法。这些健康检查功能确保了高可用性环境中的服务稳定性和可靠性。通过合理配置这些检查方式,可以有效监测后端服务器的状态,及时发现并处理故障,从而提高系统的整体性能和可用性。 ... [详细]
  • Tornado框架中模块与静态文件的应用
    本文详细介绍了Tornado框架中模块和静态文件的使用方法。首先明确模块与模板的区别,然后通过具体的代码示例展示如何在HTML文档中使用模块,并配置模块的路由。最后,提供了模块类中参数获取的示例。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 本文探讨了C语言和C++中大小写的处理方式,并详细介绍了如何在C++中实现不区分大小写的字符串比较。通过自定义`char_traits`类,可以灵活地处理字符的比较、复制和转换。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 2022年7月20日:关键数据与市场动态分析
    2022年7月20日,本文对当日的关键数据和市场动态进行了深入分析。主要内容包括:1. 关键数据的解读与趋势分析;2. 市场动态的变化及其对投资策略的影响;3. 相关经济指标的评估。通过这些分析,帮助读者更好地理解当前市场环境,为决策提供参考。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
author-avatar
霹靂一頁書_629
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有