阿里MQTT連接



import android.content.Intent;
import android.util.Log;

import com.alibaba.fastjson.JSONObject;


import org.apache.commons.codec.binary.Base64;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttSecurityException;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

import java.nio.charset.Charset;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Date;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

public class MqttConnect {
    private static final String TAG= "MQTT";
    private String clientId ="";//GROUPID@@@自定義
    private static MqttClient client;//client
    private MqttConnectOptions options;//配置
    private static MqttConnect instance;
    public static MqttConnect getInstance() {
        if (null == instance) {
            synchronized (MqttConnect.class) {
                instance = new MqttConnect();
            }
        }
        return instance;
    }

    public MqttConnect() {
        try {
           MqttInit();
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            e.printStackTrace();
        }
        MqttConnectThread mqttConnectThread = new MqttConnectThread();
        mqttConnectThread.start();//連接服務器任務
    }

    private void MqttInit() throws NoSuchAlgorithmException, InvalidKeyException {
        clientId =  clientId + "";
        try
        {
            //(1)主機地址(2)客戶端ID,一般以客戶端唯一標識符(不能夠和其它客戶端重名)(3)內存保留client
            client = new MqttClient("tcp:xxx:1883", clientId,new MemoryPersistence());
        } catch (MqttException e) {
            e.printStackTrace();
        }
        options = new MqttConnectOptions();//MQTT的連接設置
        options.setCleanSession(false);//設置是否清空session,這裏如果設置爲false表示服務器會保留客戶端的連接記錄,這裏設置爲true表示每次連接到服務器都以新的身份連接
        options.setUserName("");//設置連接的用戶名(自己的服務器沒有設置用戶名)
        String s = macSignature(clientId, "");
        options.setPassword(s.toCharArray());//設置連接的密碼
        options.setConnectionTimeout(30);//  設置連接超時時間 單位爲秒
        options.setKeepAliveInterval(20);// 設置會話心跳時間 單位爲秒
        options.setAutomaticReconnect(true); //設置重連機制
        client.setCallback(new MqttCallback() {
            @Override//獲取消息會執行這裏--arg0是主題,arg1是消息
            public void messageArrived(final String arg0, MqttMessage arg1) throws Exception {
                final String topic = arg0;//主題
                final String msgString  = new String(arg1.getPayload(),"GBK");
                Log.e(TAG,topic);
                Log.e(TAG,msgString);
               
            }
            @Override//訂閱主題後會執行到這裏
            public void deliveryComplete(IMqttDeliveryToken arg0) {
                Log.e(TAG,"deliveryComplete");
            }
            @Override//連接丟失後,會執行這裏
            public void connectionLost(Throwable arg0) {
                Log.e(TAG,"connectionLost");

            }
        });
    }

    /*連接服務器任務*/
    class MqttConnectThread extends Thread {
        public void run() {
            try {
                client.connect(options);
                client.subscribe("test/"+T.getDeviceNo(), 1);//設置(訂閱)接收的主題,主題的級別是1
                Log.e(TAG, " connetecd " + client.isConnected());
            } catch (MqttSecurityException e) {
                //安全問題連接失敗
                Log.e(TAG, "a" + e.toString());
            } catch (MqttException e) {
                //連接失敗原因
                Log.e(TAG, e.toString());

            }
        }
    }
    /**
     * @param text 要簽名的文本
     * @param secretKey 阿里雲MQ secretKey
     * @return 加密後的字符串
     * @throws InvalidKeyException
     * @throws NoSuchAlgorithmException
     */
    public static String macSignature(String text,
                                      String secretKey) throws InvalidKeyException, NoSuchAlgorithmException {
        Charset charset = Charset.forName("UTF-8");
        String algorithm = "HmacSHA1";
        Mac mac = Mac.getInstance(algorithm);
        mac.init(new SecretKeySpec(secretKey.getBytes(charset), algorithm));
        byte[] bytes = mac.doFinal(text.getBytes(charset));
        return new String(Base64.encodeBase64(bytes), charset);
    }

    public void clearClient() {
        if (client !=null) {
            try {
                client.disconnect();
                client = null;
            } catch (MqttException e) {
                e.printStackTrace();
            }
            instance = null;
            options = null;
        }
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章