SSL 方式接入示例__Java 接入示例_MQTT 接入(物聯)_消息隊列 MQ-阿裏雲
本文主要介紹如何使用 MQTT 的 SSL 加密通道來收發消息。
注意:
SSL 方式接入需要服務端支持,目前各個 Region 對 SSL 通道的支持情況請參考環境準備章節的文檔。
本文給出的示例均基於 Eclipse Paho Java SDK 實現,SDK 下載請參見 MQTT 接入準備。如使用其他第三方的客戶端,請適當修改。
1. 證書下載
如果需要使用 SSL 加密通道,需要首先下載服務端的安全證書到本地。證書下載請點擊證書下載。
2. 客戶端設置 SSL 屬性
在添加好本地的信任證書倉庫後,應用的代碼中即可設置該倉庫到 SSL 的屬性中。具體示例如下:
public static void main(String[] args) throws IOException {
/**
* 設置MQTT的接入點,請根據應用所在環境選擇合適的Region,不支持跨Region訪問
*/
final String broker ="ssl://mqtt-test.cn-qingdao.aliyuncs.com:8883";
/**
* 設置阿裏雲的AccessKey,用於鑒權
*/
final String acessKey ="XXXXXX";
/**
* 設置阿裏雲的SecretKey,用於鑒權
*/
final String secretKey ="XXXXXXX";
/**
* 發消息使用的一級Topic,需要先在MQ控製台裏申請
*/
final String topic ="XXXX";
/**
* MQTT的ClientID,一般由兩部分組成,GroupID@@@DeviceID
* 其中GroupID在MQ控製台裏申請
* DeviceID由應用方設置,可能是設備編號等,需要唯一,否則服務端拒絕重複的ClientID連接
*/
final String clientId ="GID_XXX@@@ClientID_XXXX";
String sign;
MemoryPersistence persistence = new MemoryPersistence();
try {
final MqttClient sampleClient = new MqttClient(broker, clientId, persistence);
final MqttConnectOptions connOpts = new MqttConnectOptions();
System.out.println("Connecting to broker: " + broker);
/**
* 計算簽名,將簽名作為MQTT的password。
* 簽名的計算方法,參考工具類MacSignature,第一個參數是ClientID的前半部分,即GroupID
* 第二個參數阿裏雲的SecretKey
*/
sign = MacSignature.macSignature(clientId.split("@@@")[0], secretKey);
connOpts.setUserName(acessKey);
connOpts.setServerURIs(new String[] { broker });
connOpts.setPassword(sign.toCharArray());
connOpts.setCleanSession(false);
connOpts.setKeepAliveInterval(100);
/**
*導入證書的路徑,生成加密連接
*/
SocketFactory socketFactory = initSSLSocket("intermedia.crt");
connOpts.setSocketFactory(socketFactory);
sampleClient.setCallback(new MqttCallback() {
public void connectionLost(Throwable throwable) {
System.out.println("mqtt connection lost");
throwable.printStackTrace();
while(!sampleClient.isConnected()){
try {
sampleClient.connect(connOpts);
} catch (MqttException e) {
e.printStackTrace();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
System.out.println("messageArrived:" + topic + "------" + new String(mqttMessage.getPayload()));
}
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
System.out.println("deliveryComplete:" + iMqttDeliveryToken.getMessageId());
}
});
sampleClient.connect(connOpts);
for (int i = 0; i < 10; i++) {
try {
String scontent = new Date()+"MQTT Test body" + i;
final MqttMessage message = new MqttMessage(scontent.getBytes());
message.setQos(0);
System.out.println(i+" pushed at "+new Date()+" "+ scontent);
/**
*消息發送到某個主題Topic,所有訂閱這個Topic的設備都能收到這個消息
* 遵循MQTT的發布訂閱規範,Topic也可以是多級Topic。此處設置了發送到二級Topic
*/
sampleClient.publish(topic+"/notice/", message);
/**
* 如果發送P2P消息,二級Topic必須是“p2p”,三級Topic是目標的ClientID
* 此處設置的三級Topic需要是接收方的ClientID
*/
String p2pTopic =topic+"/p2p/GID_mqttdelay3@@@DEVICEID_001";
sampleClient.publish(p2pTopic,message);
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception me) {
me.printStackTrace();
}
}
導入證書的方法:
private static SSLSocketFactory initSSLSocket(String certFileName) throws Exception {
InputStream caInput = new BufferedInputStream(ClassLoader.getSystemResourceAsStream(certFileName));
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate ca = null;
try {
ca = cf.generateCertificate(caInput);
} catch (CertificateException e) {
e.printStackTrace();
} finally {
caInput.close();
}
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
SSLContext context = SSLContext.getInstance("TLSV1.2");
context.init(null, tmf.getTrustManagers(), null);
SSLSocketFactory socketFactory = context.getSocketFactory();
return socketFactory;
}
注意:使用 SSL 接入時,服務端的地址協議請設置為 ssl://XXX,不要使用 tcp://XXX,其他部分的設置和非加密通道一致即可。
最後更新:2016-11-30 10:04:28
上一篇:
MQTT 客戶端收發 MQTT 消息__Java 接入示例_MQTT 接入(物聯)_消息隊列 MQ-阿裏雲
下一篇:
MQTT iOS 接入示例__iOS 接入示例_MQTT 接入(物聯)_消息隊列 MQ-阿裏雲
企業郵箱在iPhone5上使用的設置說明__客戶端使用_郵箱常見問題_企業郵箱-阿裏雲
什麼是雲服務器 ECS
雲服務器ECS監控__雲服務監控_用戶指南_雲監控-阿裏雲
GetMachineGroup__Logtail機器組相關接口_API-Reference_日誌服務-阿裏雲
創建備份__備份恢複_API 參考_雲數據庫 RDS 版-阿裏雲
ScheduleKeyDeletion__API 參考_密鑰管理服務-阿裏雲
nginx日誌__常見日誌格式_用戶指南_日誌服務-阿裏雲
上雲培訓體係__上雲培訓介紹_上雲培訓-阿裏雲
下載__Java SDK_SDK使用手冊_消息服務-阿裏雲
阿裏雲全球化邁入2.0階段,或將助推阿裏取得更大突破
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲