/******這里是客戶端需要的引數*******/
public static String deviceName = "0862664D0169757";
public static String productKey = "a18laywNXCJ";
public static String secret = "************";
//用于測驗的topic
private static String subTopic = "/" + productKey + "/" + deviceName + "/get";
private static String pubTopic = "/" + productKey + "/" + deviceName + "/update";
public static void StartConnect() throws Exception {
//客戶端設備自己的一個標記,建議是MAC或SN,不能為空,32字符內
String clientId = "0862664D0169757";//InetAddress.getLocalHost().getHostAddress();
//設備認證
Map<String, String> params = new HashMap<String, String>();
params.put("productKey", productKey); //這個是對應用戶在控制臺注冊的 設備productkey
params.put("deviceName", deviceName); //這個是對應用戶在控制臺注冊的 設備name
params.put("clientId", clientId);
String t = System.currentTimeMillis() + "";
params.put("timestamp", t);
//MQTT服務器地址
String targetServer = "tcp://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com:1883";
//客戶端ID格式,兩個||之間的內容為設備端自定義的標記,字符范圍[0-9][a-z][A-Z]
String mqttclientId = clientId + "|securemode=2,signmethod=hmacsha1,timestamp=" + t + "|";
String mqttUsername = deviceName + "&" + productKey; //mqtt用戶名格式
String mqttPassword = "A9E93DE6CFF17C42C90DE890F8BD4DCBF99BC376";//SignUtil.sign(params, secret, "hmacsha1"); //簽名
System.err.println("mqttclientId=" + mqttclientId+"&mqttPassword="+mqttPassword);
connectMqtt(targetServer, mqttclientId, mqttUsername, mqttPassword, deviceName);
}
public static void connectMqtt(String url, String clientId, String mqttUsername,
String mqttPassword, final String deviceName) throws Exception {
MemoryPersistence persistence = new MemoryPersistence();
//SSLSocketFactory socketFactory = createSSLSocket();
final MqttClient sampleClient = new MqttClient(url, clientId, persistence);
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setMqttVersion(4); // MQTT 3.1.1
//connOpts.setSocketFactory(socketFactory);
//設定是否自動重連
//connOpts.setAutomaticReconnect(true);
//如果是true,那么清理所有離線訊息,即QoS1或者2的所有未接收內容
connOpts.setCleanSession(false);
connOpts.setUserName(mqttUsername);
connOpts.setPassword(mqttPassword.toCharArray());
connOpts.setKeepAliveInterval(65);
//LogUtil.print(clientId + "進行連接, 目的地: " + url);
sampleClient.connect(connOpts);
sampleClient.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
System.out.println("連接失敗,原因:" + cause);
cause.printStackTrace();
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
System.out.println("接收到訊息,來至Topic [" + topic + "] , 內容是:["
+ new String(message.getPayload(), "UTF-8") + "], ");
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
//如果是QoS0的訊息,token.resp是沒有回復的
System.out.println("訊息發送成功! " + ((token == null || token.getResponse() == null) ? "null"
: token.getResponse().getKey()));
}
});
uj5u.com熱心網友回復:
sampleClient.connect(connOpts);呼叫這個函式的時候就報例外Invalid client ID (2)uj5u.com熱心網友回復:
//客戶端ID格式,兩個||之間的內容為設備端自定義的標記,字符范圍[0-9][a-z][A-Z],但是你的||之間有“,”,不知道是不是這個原因,我在使用MQTT時, clientId沒有這么復雜,就是一個唯一標志符,uj5u.com熱心網友回復:
我改成純字母也不行,去掉中間的逗號也不行,都是報這個例外,invalid client id。這個clientID是自己隨便起的嗎,還是要和后臺有什么關聯的。
uj5u.com熱心網友回復:
另外我在windows下面用C#這樣鏈接是可以連接上后臺的。不知道為啥到了安卓下面,同樣的引數報這個錯誤
uj5u.com熱心網友回復:
我在adroid上使用時是使用當前時間的毫秒值加上手機序列號做為clientId的,因為MQTT服務是自己建的服務器,測驗環境就我自己在用,也沒有出現什么問題,看資料上說是這個ID值不能相同,沒有查到具體起到什么作用。uj5u.com熱心網友回復:
跪求大神幫助uj5u.com熱心網友回復:
石沉大海了么?轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/120837.html
標籤:Android
上一篇:瀏覽器可以通過ip與埠號訪問網站,那程式中應該怎樣訪問
下一篇:請大佬幫忙看下哪里有問題。。。
