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;
}
}
}
阿里MQTT連接
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.