开发者社区 问答 正文

SSL 方式接入如何制作?


注意:
SSL 方式接入需要服务端支持,目前各个 Region 对 SSL 通道的支持情况请参考环境准备章节的文档。
本文给出的示例均基于 Eclipse Paho Java SDK 实现,SDK 下载请参见 MQTT 接入准备。如使用其他第三方的客户端,请适当修改。

客户端设置 SSL 属性


使用加密端口连接服务,需要注意应用的代码中服务端的端口和协议类型和默认的 MQTT 协议不一样。具体示例如下:

  1. public static void main(String[] args) throws IOException {
  2.        /**
  3.          * 设置当前用户私有的MQTT的接入点。例如此处示意使用XXX,实际使用请替换用户自己的接入点。接入点的获取方法是,在控制台申请MQTT实例,每个实例都会分配一个接入点域名。
  4.          */
  5.         final String broker ="ssl://XXXX.mqtt.aliyuncs.com:8883";
  6.         /**
  7.          * 设置阿里云的AccessKey,用于鉴权
  8.          */
  9.         final String acessKey ="XXXXXX";
  10.         /**
  11.          * 设置阿里云的SecretKey,用于鉴权
  12.          */
  13.         final String secretKey ="XXXXXXX";
  14.         /**
  15.          * 发消息使用的一级Topic,需要先在MQ控制台里申请
  16.          */
  17.         final String topic ="XXXX";
  18.         /**
  19.          * MQTT的ClientID,一般由两部分组成,GroupID@@@DeviceID
  20.          * 其中GroupID在MQ控制台里申请
  21.          * DeviceID由应用方设置,可能是设备编号等,需要唯一,否则服务端拒绝重复的ClientID连接
  22.          */
  23.         final String clientId ="GID_XXX@@@ClientID_XXXX";
  24.         String sign;
  25.         MemoryPersistence persistence = new MemoryPersistence();
  26.         try {
  27.             final MqttClient sampleClient = new MqttClient(broker, clientId, persistence);
  28.             final MqttConnectOptions connOpts = new MqttConnectOptions();
  29.             System.out.println("Connecting to broker: " + broker);
  30.             /**
  31.              * 计算签名,将签名作为MQTT的password。
  32.              * 签名的计算方法,参考工具类MacSignature,第一个参数是ClientID的前半部分,即GroupID
  33.              * 第二个参数阿里云的SecretKey
  34.              */
  35.             sign = MacSignature.macSignature(clientId.split("@@@")[0], secretKey);
  36.             connOpts.setUserName(acessKey);
  37.             connOpts.setServerURIs(new String[] { broker });
  38.             connOpts.setPassword(sign.toCharArray());
  39.             connOpts.setCleanSession(false);
  40.             connOpts.setKeepAliveInterval(100);
  41.             connOpts.setAutomaticReconnect(true);
  42.             sampleClient.setCallback(new MqttCallback() {
  43.                 public void connectComplete(boolean reconnect, String serverURI) {
  44.                 System.out.println("connect success");
  45.                }
  46.                 public void connectionLost(Throwable throwable) {
  47.                     System.out.println("mqtt connection lost");
  48.                     throwable.printStackTrace();
  49.                 }
  50.                 public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
  51.                     System.out.println("messageArrived:" + topic + "------" + new String(mqttMessage.getPayload()));
  52.                 }
  53.                 public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
  54.                     System.out.println("deliveryComplete:" + iMqttDeliveryToken.getMessageId());
  55.                 }
  56.             });
  57.             sampleClient.connect(connOpts);
  58.             for (int i = 0; i < 10; i++) {
  59.                 try {
  60.                     String scontent = new Date()+"MQTT Test body" + i;
  61.                     final MqttMessage message = new MqttMessage(scontent.getBytes());
  62.                     message.setQos(0);
  63.                     System.out.println(i+" pushed at "+new Date()+" "+ scontent);
  64.                     /**
  65.                      *消息发送到某个主题Topic,所有订阅这个Topic的设备都能收到这个消息
  66.                      * 遵循MQTT的发布订阅规范,Topic也可以是多级Topic。此处设置了发送到二级Topic
  67.                      */
  68.                     sampleClient.publish(topic+"/notice/", message);
  69.                     /**
  70.                      * 如果发送P2P消息,二级Topic必须是“p2p”,三级Topic是目标的ClientID
  71.                      * 此处设置的三级Topic需要是接收方的ClientID
  72.                      */
  73.                     String p2pTopic =topic+"/p2p/GID_mqttdelay3@@@DEVICEID_001";
  74.                     sampleClient.publish(p2pTopic,message);
  75.                 } catch (Exception e) {
  76.                     e.printStackTrace();
  77.                 }
  78.             }
  79.         } catch (Exception me) {
  80.             me.printStackTrace();
  81.         }
  82.     }

注意:使用 SSL 接入时,服务端的地址协议请设置为 ssl://XXX,不要使用 tcp://XXX,其他部分的设置和非加密通道一致即可。

展开
收起
猫饭先生 2017-10-27 11:02:12 1695 分享 版权
0 条回答
写回答
取消 提交回答