请确保你已经有证书了,且已经配置好了mqtt的ssl支持。没有配置好的请看之前的文章:自制CA证书,自制客户端,服务端证书、mqtt配置使用ssl加密通信。按照这两篇文章操作之后接下来就可以编写java代码来使用ssl方式连接mqtt了。
作者是maven项目,所以添加一下依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.47</version>
</dependency>
整个项目目录结构如图:
核心类是SslUtil.java,里面配置了用于连接mqtt的ca根证书以及客户端证书和秘钥。下面列出上图中的各个文件的完整代码:
1.PublishCallback.java
package com.siplock.siplocklockservice.callbacks;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttMessage;
@Slf4j
public class PublishCallback implements MqttCallbackExtended {
@Override
public void connectionLost(Throwable cause) {
// 连接丢失后,一般在这里面进行重连
log.info("[PublishCallback] 连接断开");
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
log.info("deliveryComplete---------" + token.isComplete());
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
}
@Override
public void connectComplete(boolean b, String s) {
log.info("connected");
}
}
2.SubcribeCallBack.java
package com.siplock.siplocklockservice.callbacks;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttMessage;
@Slf4j
public class SubcribeCallBack impleme