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

阿里云物联网通讯测试

1.软件准备mqtt.fx下载:www.jensd.deappsmqttfxMQTT(消息队列遥测传输)是ISO标准(ISOIECPRF20922)下基于发布订阅

1.软件准备

mqtt.fx下载:www.jensd.de/apps/mqttfx

MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。
MQTT.fx 是目前主流的mqtt客户端,可以快速验证是否可以与IoT Hub 服务交流发布或订阅消息。

2.使用模式

在这里插入图片描述
mqtt.fx相当于温度计,作为终端设备模拟通信,测试状态联通。
物联网平台为阿里云物联网平台,解析协议关系,分别连接终端设备和服务器平台,设备上云远程运维。
服务器作为管理终端,远程发送指令,并从云平台获取终端设备相关状态信息。

3.联通步骤

3.1 阿里云物联网
创建产品和设备
定义模型

3.2 mqtt.fx连接云平台设置
在这里插入图片描述
连接属性详解
在这里插入图片描述
mqtt模拟设备联通测试
实际设备上云需在设备安装sdk接入云平台,详情官网。

3.3 服务端连接云平台(java)
maven依赖

<dependency><groupId>org.apache.qpid</groupId><artifactId>qpid-jms-client</artifactId><version>0.31.0</version></dependency><!-- util for base64--><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.12</version></dependency> <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.1.2</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-iot</artifactId><version>6.3.1</version></dependency><dependency><groupId>com.aliyun.openservices</groupId><artifactId>iot-client-message</artifactId><version>1.1.2</version></dependency>

服务端代码

//1. 接收消息
package com.WulianwangTest;import java.net.URI;
import java.util.Hashtable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.naming.Context;
import javax.naming.InitialContext;import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.iot.model.v20180120.PubRequest;
import com.aliyuncs.iot.model.v20180120.PubResponse;
import com.aliyuncs.profile.DefaultProfile;import org.apache.commons.codec.EncoderException;
import org.apache.qpid.jms.JmsConnection;
import org.apache.qpid.jms.JmsConnectionListener;
import org.apache.qpid.jms.message.JmsInboundMessageDispatch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import org.apache.commons.codec.binary.Base64;public class AmqpJavaClientDemo {private final static Logger logger &#61; LoggerFactory.getLogger(AmqpJavaClientDemo.class);//业务处理异步线程池&#xff0c;线程池参数可以根据您的业务特点调整&#xff1b;或者您也可以用其他异步方式处理接收到的消息private final static ExecutorService executorService &#61; new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),Runtime.getRuntime().availableProcessors() * 2, 60, TimeUnit.SECONDS,new LinkedBlockingQueue<>(50000));public static void main(String[] args) throws Exception {//参数说明&#xff0c;请参见文档&#xff1a;AMQP客户端接入说明。String accessKey &#61; "${YourAccessKeyID}";String accessSecret &#61; "${YourAccessKeySecret}";String consumerGroupId &#61; "${YourConsumerGroupId}";//iotInstanceId&#xff1a;购买的实例请填写实例ID&#xff0c;公共实例请填空字符串""。String iotInstanceId &#61; "";long timeStamp &#61; System.currentTimeMillis();//签名方法&#xff1a;支持hmacmd5&#xff0c;hmacsha1和hmacsha256String signMethod &#61; "hmacsha1";//控制台服务端订阅中消费组状态页客户端ID一栏将显示clientId参数。//建议使用机器UUID、MAC地址、IP等唯一标识等作为clientId。便于您区分识别不同的客户端。String clientId &#61; "ecs_"&#43;System.currentTimeMillis();//UserName组装方法&#xff0c;请参见文档&#xff1a;AMQP客户端接入说明。String userName &#61; clientId &#43; "|authMode&#61;aksign"&#43; ",signMethod&#61;" &#43; signMethod&#43; ",timestamp&#61;" &#43; timeStamp&#43; ",authId&#61;" &#43; accessKey&#43; ",iotInstanceId&#61;" &#43; iotInstanceId&#43; ",consumerGroupId&#61;" &#43; consumerGroupId&#43; "|";//password组装方法&#xff0c;请参见文档&#xff1a;AMQP客户端接入说明。String signContent &#61; "authId&#61;" &#43; accessKey &#43; "×tamp&#61;" &#43; timeStamp;String password &#61; doSign(signContent,accessSecret, signMethod);//按照qpid-jms的规范&#xff0c;组装连接URL。// String connectionUrl &#61; "failover:(amqps://${uid}.iot-amqp.${regionId}.aliyuncs.com:5671?amqp.idleTimeout&#61;80000)"// &#43; "?failover.reconnectDelay&#61;30";String connectionUrl &#61; "failover:(amqps://1402577367912554.iot-amqp.cn-shanghai.aliyuncs.com:5671?amqp.idleTimeout&#61;80000)"&#43; "?failover.reconnectDelay&#61;30";Hashtable<String, String> hashtable &#61; new Hashtable<>();hashtable.put("connectionfactory.SBCF",connectionUrl);hashtable.put("queue.QUEUE", "default");hashtable.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.qpid.jms.jndi.JmsInitialContextFactory");Context context &#61; new InitialContext(hashtable);ConnectionFactory cf &#61; (ConnectionFactory)context.lookup("SBCF");Destination queue &#61; (Destination)context.lookup("QUEUE");// Create ConnectionConnection connection &#61; cf.createConnection(userName, password);((JmsConnection) connection).addConnectionListener(myJmsConnectionListener);// Create Session// Session.CLIENT_ACKNOWLEDGE: 收到消息后&#xff0c;需要手动调用message.acknowledge()// Session.AUTO_ACKNOWLEDGE: SDK自动ACK&#xff08;推荐&#xff09;Session session &#61; connection.createSession(false, Session.AUTO_ACKNOWLEDGE);connection.start();// Create Receiver LinkMessageConsumer consumer &#61; session.createConsumer(queue);consumer.setMessageListener(messageListener);}private static MessageListener messageListener &#61; new MessageListener() {&#64;Overridepublic void onMessage(Message message) {try {//1.收到消息之后一定要ACK// 推荐做法&#xff1a;创建Session选择Session.AUTO_ACKNOWLEDGE&#xff0c;这里会自动ACK。// 其他做法&#xff1a;创建Session选择Session.CLIENT_ACKNOWLEDGE&#xff0c;这里一定要调message.acknowledge()来ACK。// message.acknowledge();//2.建议异步处理收到的消息&#xff0c;确保onMessage函数里没有耗时逻辑。// 如果业务处理耗时过程过长阻塞住线程&#xff0c;可能会影响SDK收到消息后的正常回调。executorService.submit(() -> processMessage(message));} catch (Exception e) {logger.error("submit task occurs exception ", e);}}};/*** 在这里处理您收到消息后的具体业务逻辑。*/private static void processMessage(Message message) {try {byte[] body &#61; message.getBody(byte[].class);String content &#61; new String(body);String topic &#61; message.getStringProperty("topic");String messageId &#61; message.getStringProperty("messageId");logger.info("receive message"&#43; ", topic &#61; " &#43; topic&#43; ", messageId &#61; " &#43; messageId&#43; ", content &#61; " &#43; content);} catch (Exception e) {logger.error("processMessage occurs error ", e);}}private static JmsConnectionListener myJmsConnectionListener &#61; new JmsConnectionListener() {/*** 连接成功建立*/&#64;Overridepublic void onConnectionEstablished(URI remoteURI) {logger.info("onConnectionEstablished, remoteUri:{}", remoteURI);}/*** 尝试过最大重试次数之后&#xff0c;最终连接失败。*/&#64;Overridepublic void onConnectionFailure(Throwable error) {logger.error("onConnectionFailure, {}", error.getMessage());}/*** 连接中断。*/&#64;Overridepublic void onConnectionInterrupted(URI remoteURI) {logger.info("onConnectionInterrupted, remoteUri:{}", remoteURI);}/*** 连接中断后又自动重连上。*/&#64;Overridepublic void onConnectionRestored(URI remoteURI) {logger.info("onConnectionRestored, remoteUri:{}", remoteURI);}&#64;Overridepublic void onInboundMessage(JmsInboundMessageDispatch envelope) {}&#64;Overridepublic void onSessionClosed(Session session, Throwable cause) {}&#64;Overridepublic void onConsumerClosed(MessageConsumer consumer, Throwable cause) {}&#64;Overridepublic void onProducerClosed(MessageProducer producer, Throwable cause) {}};/*** password签名计算方法&#xff0c;请参见文档&#xff1a;AMQP客户端接入说明。*/private static String doSign(String toSignString, String secret, String signMethod) throws Exception {SecretKeySpec signingKey &#61; new SecretKeySpec(secret.getBytes(), signMethod);Mac mac &#61; Mac.getInstance(signMethod);mac.init(signingKey);byte[] rawHmac &#61; mac.doFinal(toSignString.getBytes());return Base64.encodeBase64String(rawHmac);}
}

//2. 发送消息
package com.WulianwangTest;import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.iot.model.v20180120.PubRequest;
import com.aliyuncs.iot.model.v20180120.PubResponse;
import com.aliyuncs.profile.DefaultProfile;import java.io.UnsupportedEncodingException;
import java.util.Base64;public class Demo2 {public static void main(String[] args) throws ClientException, UnsupportedEncodingException {String regionId &#61; "您设备所处区域regionId";String accessKey &#61; "您的阿里云账号accessKey";String accessSecret &#61; "您的阿里云账号accessSecret";final String productKey &#61; "您的产品productKey";String deviceName &#61; "您的设备名";//设置client的参数DefaultProfile profile &#61; DefaultProfile.getProfile(regionId, accessKey, accessSecret);IAcsClient client &#61; new DefaultAcsClient(profile);PubRequest request &#61; new PubRequest();request.setQos(0);//设置发布消息的topic /user/double改成自己的topicrequest.setTopicFullName("/" &#43; productKey &#43; "/" &#43; deviceName &#43; "/user/double");request.setProductKey(productKey);//设置消息的内容&#xff0c;一定要用base64编码&#xff0c;否则乱码String encode &#61; Base64.getEncoder().encodeToString("xxooxxoo".getBytes("UTF-8"));request.setMessageContent(encode);PubResponse response &#61; client.getAcsResponse(request);System.out.println("pub success?:" &#43; response.getSuccess());}
}

mqtt.fx接入物联网平台光官方详细介绍&#xff1a;
https://www.alibabacloud.com/help/zh/doc-detail/86706.htm

官方教程&#xff1a;https://help.aliyun.com/document_detail/120986.html?spm&#61;a2c4g.11186623.6.928.7ac47848x05eGi

区域字段分类&#xff1a;
https://help.aliyun.com/document_detail/40654.html?spm&#61;a2c6h.13066369.0.0.c85c7eec5V3gbz


推荐阅读
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 本文介绍了禅道作为一款国产开源免费的测试管理工具的特点和功能,并提供了禅道的搭建和调试方法。禅道是一款B/S结构的项目管理工具,可以实现组织管理、后台管理、产品管理、项目管理和测试管理等功能。同时,本文还介绍了其他软件测试相关工具,如功能自动化工具和性能自动化工具,以及白盒测试工具的使用。通过本文的阅读,读者可以了解禅道的基本使用方法和优势,从而更好地进行测试管理工作。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • 如何使用Python从工程图图像中提取底部的方法?
    本文介绍了使用Python从工程图图像中提取底部的方法。首先将输入图片转换为灰度图像,并进行高斯模糊和阈值处理。然后通过填充潜在的轮廓以及使用轮廓逼近和矩形核进行过滤,去除非矩形轮廓。最后通过查找轮廓并使用轮廓近似、宽高比和轮廓区域进行过滤,隔离所需的底部轮廓,并使用Numpy切片提取底部模板部分。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • 本人学习笔记,知识点均摘自于网络,用于学习和交流(如未注明出处,请提醒,将及时更正,谢谢)OS:我学习是为了上 ... [详细]
  • TiDB | TiDB在5A级物流企业核心系统的应用与实践
    TiDB在5A级物流企业核心系统的应用与实践前言一、业务背景科捷物流概况神州金库简介二、现状与挑战神州金库现有技术体系业务挑战应对方案三、TiDB解决方案测试迁移收益问题四、说在最 ... [详细]
  • rabbitmq杂谈
    rabbitmq中的consumerTag和deliveryTag分别是干啥的,有什么用?同一个会话,consumerTag是固定的可以做此会话的名字,deliveryTag每次接 ... [详细]
  • 【Python 爬虫】破解按照顺序点击验证码(非自动化浏览器)
    #请求到验证码base64编码json_img_datajson_raw.get(Vimage)#获取到验证码编码 #保存验证码图片到本地defbase64_to_img(bstr ... [详细]
  • 加密、解密、揭秘
    谈PHP中信息加密技术同样是一道面试答错的问题,面试官问我非对称加密算法中有哪些经典的算法?当时我愣了一下,因为我把非对称加密与单项散列加 ... [详细]
author-avatar
手机用户2502931567
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有