Java连接MQTT服务-wss方式

特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过。如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/mao2080/

说明:前面介绍的tcp、ws方式适合Java程序在局域网内使用,不涉及到安全问题。但由于Android手机APP需要通过websocket方式来连接,就必须考虑安全性问题了,这时候就采用了wss+CA证书方式进行认证,而且在数据传输中也是加密的。大致与ws方式相同,只不过是加了证书。

1、Java代码

  1 package com.mao.mqtt;
  2
  3 import java.io.FileInputStream;
  4 import java.security.KeyStore;
  5 import java.security.cert.CertificateFactory;
  6 import java.security.cert.X509Certificate;
  7 import java.text.SimpleDateFormat;
  8 import java.util.Date;
  9
 10 import javax.net.ssl.SSLContext;
 11 import javax.net.ssl.SSLSocketFactory;
 12 import javax.net.ssl.TrustManagerFactory;
 13
 14 import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
 15 import org.eclipse.paho.client.mqttv3.MqttCallback;
 16 import org.eclipse.paho.client.mqttv3.MqttClient;
 17 import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
 18 import org.eclipse.paho.client.mqttv3.MqttException;
 19 import org.eclipse.paho.client.mqttv3.MqttMessage;
 20 import org.eclipse.paho.client.mqttv3.MqttTopic;
 21
 22 /**
 23  *
 24  * 功能描述:MQTT测试
 25  * 创建人: [email protected]
 26  * 创建时间:2017年7月4日 下午5:08:59
 27  * 修改人: [email protected]
 28  * 修改时间:2017年7月4日 下午5:08:59
 29  */
 30 public class MQTTTest_wss {
 31
 32     /**MQTT服务端ip及端口*/
 33     private static String host = "wss://ip:443";
 34
 35     /**账号*/
 36     private static String username = "li2080";
 37
 38     /**密码*/
 39     private static String password = "123";
 40
 41     /**订阅的主题*/
 42     private static String subTopic = "a/b/c";
 43
 44     /**clientID*/
 45     private static String clientId = "li2080";
 46
 47     /**发布的主题*/
 48     private static String pubTopic = "a/b/c";
 49
 50     /**MQTT-Client*/
 51     private static MqttClient client;
 52
 53     /**证书路径*/
 54     private static String caPath = "E:\\mqtt-demo\\certfile\\CA.crt";
 55
 56     /**
 57      * @throws InterruptedException
 58      * @throws MqttException */
 59     public static void main(String[] args) throws InterruptedException, MqttException {
 60
 61         // 订阅消息的方法
 62         subscribe();
 63 //
 64         publish();
 65     }
 66
 67     /**
 68      *
 69      * 描述:订阅信息
 70      * @author [email protected]
 71      * @created 2017年7月4日 下午4:53:47
 72      * @since
 73      * @return
 74      */
 75     public static void subscribe() {
 76         try {
 77             // 创建MqttClient
 78             MQTTTest_wss.getClient().setCallback(new MqttCallback() {
 79
 80                 public void connectionLost(Throwable arg0) {
 81
 82                 }
 83
 84                 public void messageArrived(String topic, MqttMessage message) throws Exception {
 85                     System.out.println("MQTT Rece:" + message.toString());
 86                 }
 87
 88                 public void deliveryComplete(IMqttDeliveryToken token) {
 89
 90                 }
 91
 92             });
 93             MQTTTest_wss.getClient().subscribe(subTopic, 0);
 94             System.out.println("连接状态:" + client.isConnected());
 95         } catch (Exception e) {
 96             e.printStackTrace();
 97         }
 98     }
 99
100     /**
101      *
102      * 描述:获取MqttClient
103      * @author [email protected]
104      * @created 2017年7月6日 上午9:56:37
105      * @since
106      * @return
107      * @throws MqttException
108      */
109     public static MqttClient getClient() throws MqttException{
110         try {
111             if(client == null){
112                 client = new MqttClient(host, clientId);
113                 MqttConnectOptions conOptions = new MqttConnectOptions();
114                 conOptions.setUserName(username);
115                 conOptions.setPassword(password.toCharArray());
116                 conOptions.setCleanSession(true);
117                 conOptions.setSocketFactory(getSSLSocktet(caPath));
118                 client.connect(conOptions);
119             }
120             if(!client.isConnected()){
121                 client.reconnect();
122             }
123         } catch (Exception e) {
124             e.printStackTrace();
125         }
126         return client;
127     }
128
129     /**
130      *
131      * 描述:发布信息
132      * @author [email protected]
133      * @throws MqttException
134      * @created 2017年7月4日 下午4:53:32
135      * @since
136      */
137     public static void publish() throws MqttException {
138         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
139         String sendMsg = "{time:"+sdf.format(new Date())+", content:"+com.lds.iot.common.util.UUIDUtil.getLowerLetterNumber(15)+", from: java console}";
140         try {
141             MqttTopic topic = MQTTTest_wss.getClient().getTopic(pubTopic);
142             MqttMessage message = new MqttMessage(sendMsg.getBytes());
143             message.setQos(0);
144             topic.publish(message);
145             System.out.println("MQTT Send:" + sendMsg);
146         } catch (Exception e) {
147             e.printStackTrace();
148         }
149     }
150
151     /**
152      * 获取SSLSocketFactory
153      * @param caPath
154      * @return
155      * @throws Exception
156      */
157     public static SSLSocketFactory getSSLSocktet(String caPath) throws Exception {
158         CertificateFactory cAf = CertificateFactory.getInstance("X.509");
159         FileInputStream caIn = new FileInputStream(caPath);
160         X509Certificate ca = (X509Certificate) cAf.generateCertificate(caIn);
161         KeyStore caks = KeyStore.getInstance(KeyStore.getDefaultType());
162         caks.load(null, null);
163         caks.setCertificateEntry("ca-certificate", ca);
164         TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
165         tmf.init(caks);
166         caIn.close();
167         SSLContext context = SSLContext.getInstance("TLSv1");
168         context.init(null, tmf.getTrustManagers(), null);
169         return context.getSocketFactory();
170     }
171
172 }

2、Maven配置

1 <dependency>
2       <groupId>org.eclipse.paho</groupId>
3       <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
4       <version>1.2.0</version>
5 </dependency>

3、运行效果

时间: 2024-11-08 00:59:22

Java连接MQTT服务-wss方式的相关文章

Java 连接 Memcached 服务

Windows 下安装 Memcached http://www.runoob.com/memcached/window-install-memcached.html 通过 telnet 命令并指定主机ip和端口来连接 Memcached 服务. telnet HOST PORT telnet 127.0.0.1 11211 添加 Memcached jar 包 <dependency> <groupId>net.spy</groupId> <artifactId

Java连接SQL驱动的方式

某些JDBC的JAR文件将自动注册驱动器类.包含META-INF/services/java.sql.Driver文件的JAR文件可以自动注册驱动器类,解压缩驱动程序JAR文件就可以检查其是否包含该文件. 如果驱动程序JAR文件不支持自动注册,那就需要找出数据库提供商使用的JDBC驱动器类的名字.典型的驱动器名字如下: org.apache.derby.jdbc.ClientDriver org.postgresql.Driver com.mysql.jdbc.Driver 另一个需要注意的是数

JAVA连接Oracle两种方式

以前学习.NET连接数据库时,也是做各种的连接配置.而如今在用到java操纵Oracle时,同样是一些的操作.在此总结一下. 1.JDBC_ODBC连接数据库 此方法需要配置ODBC数据源,本机必须有Oracle数据库 1.配置数据源 打开控制面板--管理工具--数据源 2.接下来在代码中连接即可 //使用jdbc_odbc桥接方式连接,需要配置数据源 public static void main(String [] args){ try{ //1.加载驱动 Class.forName("su

java连接mysql数据库的方式(4句语句)

1 加载mysql驱动: class.forName("con.mysql.jdbc.Driver").newInstance(); 2 根据数据库路径url,账号,密码进行数据库连接: connection con=DriverManager.getconnection(url,"root","s123"); 3 创建处理过程: statement stmt=con.createStatement(); 4 执行处理语句: ResultSet

memcached(2)常用语法与java连接服务

memcached常用语法及java使用方式 Author:SimpleWu Memcached 存储命令 Memcached set 命令用于将 value(数据值) 存储在指定的 key(键) 中. 如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用. set key flags exptime bytes [noreply] value Memcached add 命令用于将 value(数据值) 存储在指定的 key(键) 中. 如果 add 的

java 连接Redis及demo

java连接linux Redis遇到的问题 昨天在Linux搭建了Redis服务,今天使用java连接测试了一下.要想使用java连接redis服务,就离不开jedis-2.6.1.jar.使用jedis连接redis十分方便.下面我们测试一下是否连接上redis服务: package com.coinvs.redis.util;import redis.clients.jedis.Jedis;//import redis.clients.jedis.Jedis;public class Ra

java连接Hive的几种方式

测试环境 Hadoop 0.20.2版本.Hive-0.5.0版本.JDK1.6 1.一般来说我们对hive的操作都是通过cli来进行,也就是Linux的控制台,但是,这样做本质上是每个连接都存放一个元数据,各个之间都不相同,所以,对于这样的模式我建议是用来做一些测试比较合适,并不适合做产品的开发和应用. 2.JDBC连接的方式,当然还有其他的连接方式,比如ODBC等, 这种方式很常用,可以在网上随便找到,就不再累赘了. 不稳定,经常会被大数据量冲挂,不建议使用. 3.这种方式是直接利用Hive

windows + myeclipse 调试 linux + tomcat 的java web服务 配置方式

一.linux tomcat配置和启动 1.catalina.sh第一行添加 declare -x CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000" 2.启动JPDA(这是tomcat下的启动方式,别的服务器可能会不一样,但道理是一样的) ./catalina.sh jpda start 3.启动web服务 ./start.sh 二.在windows端的myecli

Java字符串连接的几种方式

Java字符串连接的几种方式 字符串表现的几种方式 StringBuffer和StringBuilder及String的继承关系 字符串的连接 1.String的连接方法 可以看出连接方式是新建了一个包含两个长度的字符数组,然后进行连接. 2.StringBuilder中存储字符串其实用的是一个char数组,capacity其实就是指定这个char数组的大小,StringBuilder的连接方法是继承AbstractStringBuilder的方法的,线程不安全的 在append(str)函数调