日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

認(rèn)證與連接

設(shè)備接入物聯(lián)網(wǎng)平臺之前,需通過身份認(rèn)證。本文介紹如何將Android Link SDK進(jìn)行初始化,實現(xiàn)將設(shè)備接入物聯(lián)網(wǎng)平臺。

前提條件

背景信息

Android Link SDK支持設(shè)備密鑰和ID2認(rèn)證進(jìn)行設(shè)備身份認(rèn)證。

  • 設(shè)備密鑰:

    認(rèn)證方式

    注冊方式

    說明

    一機(jī)一密

    不涉及

    每臺設(shè)備燒錄自己的設(shè)備證書(ProductKey、DeviceName和DeviceSecret)。

    一型一密

    預(yù)注冊

    • 同一產(chǎn)品下設(shè)備燒錄相同產(chǎn)品證書(ProductKey和ProductSecret)。

    • 產(chǎn)品需開啟動態(tài)注冊功能。

    • 設(shè)備通過動態(tài)注冊獲取DeviceSecret。

    免預(yù)注冊

    • 同一產(chǎn)品下設(shè)備燒錄相同產(chǎn)品證書(ProductKey和ProductSecret)。

    • 產(chǎn)品需開啟動態(tài)注冊功能。

    • 設(shè)備通過動態(tài)注冊獲取ClientID與DeviceToken的組合。

    說明

    一型一密預(yù)注冊和免預(yù)注冊的區(qū)別,請參見預(yù)注冊和免預(yù)注冊的區(qū)別

  • ID2認(rèn)證:ID2是一種物聯(lián)網(wǎng)設(shè)備的可信身份標(biāo)識,具備不可篡改、不可偽造等安全屬性。

說明

具體代碼實現(xiàn),請參見Demo中的InitManager.java

一機(jī)一密

一機(jī)一密的設(shè)備認(rèn)證方式的示例代碼如下:

AppLog.setLevel(ALog.LEVEL_DEBUG);

final LinkKitInitParams params = new LinkKitInitParams();

String productKey = "${YourProductKey}";
String deviceName = "${YourDeviceName}";
String deviceSecret = "${YourDeviceSecret}";
String productSecret = "";

//Step1: 構(gòu)造設(shè)備認(rèn)證信息
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;  // 產(chǎn)品類型
deviceInfo.deviceName = deviceName;  // 設(shè)備名稱
deviceInfo.deviceSecret = deviceSecret;  // 設(shè)備密鑰
deviceInfo.productSecret = productSecret;  // 產(chǎn)品密鑰
params.deviceInfo = deviceInfo;

//Step2: 全局默認(rèn)域名
IoTApiClientConfig userData = new IoTApiClientConfig();
params.connectConfig = userData;

//Step3: 物模型緩存
Map<String, ValueWrapper> propertyValues = new HashMap<>();
/**
 * 物模型的數(shù)據(jù)會緩存到該字段中,不可刪除或者設(shè)置為空,否則功能會異常
 * 用戶調(diào)用物模型上報接口之后,物模型會有相關(guān)數(shù)據(jù)緩存。
 */
params.propertyValues = propertyValues;

//Step4: mqtt設(shè)置
/**
 * Mqtt 相關(guān)參數(shù)設(shè)置,包括接入點等信息,具體參見deviceinfo文件說明
 * 域名、產(chǎn)品密鑰、認(rèn)證安全模式等;
 */
IoTMqttClientConfig clientConfig = new IoTMqttClientConfig();
clientConfig.receiveOfflineMsg = false;//cleanSession=1 不接受離線消息
//mqtt接入點信息
clientConfig.channelHost = "${YourMqttHostUrl}:8883";
params.mqttClientConfig = clientConfig;
//如果滅屏情況下經(jīng)常出現(xiàn)設(shè)備離線,請參考下述的"設(shè)置自定義心跳和解決滅屏情況下的心跳不準(zhǔn)問題"一節(jié)

//Step5: 高階功能配置,除物模型外,其余默認(rèn)均為關(guān)閉狀態(tài)
IoTDMConfig ioTDMConfig = new IoTDMConfig();
// 默認(rèn)開啟物模型功能,物模型初始化(包含請求云端物模型)完成后才返回onInitDone
ioTDMConfig.enableThingModel = true;
// 默認(rèn)不開啟網(wǎng)關(guān)功能,開啟之后,初始化的時候會初始化網(wǎng)關(guān)模塊,獲取云端網(wǎng)關(guān)子設(shè)備列表
ioTDMConfig.enableGateway = false;
// 默認(rèn)不開啟,是否開啟日志推送功能
ioTDMConfig.enableLogPush = false;
params.ioTDMConfig = ioTDMConfig;

//Step6: 下行消息處理回調(diào)設(shè)置
LinkKit.getInstance().registerOnPushListener(new IConnectNotifyListener() {
    @Override
    public void onNotify(String s, String s1, AMessage aMessage) {
        //TODO: 處理下行消息的回調(diào),請參考文檔
    }

    @Override
    public boolean shouldHandle(String s, String s1) {
        return true; //TODO 根據(jù)實際情況設(shè)置,請參考文檔
    }

    @Override
    public void onConnectStateChange(String connectId, ConnectState connectState) {
        // 對應(yīng)連接類型的連接狀態(tài)變化回調(diào),具體連接狀態(tài)參考SDK ConnectState
        AppLog.d(TAG, "onConnectStateChange() called with: connectId = [" + connectId + "], connectState = [" + connectState + "]");
    
        //首次連云可能失敗。對于首次連云失敗,SDK會報出ConnectState.CONNECTFAIL這種狀態(tài)。對于這種場景,用戶可以嘗試若干次后退出,也可以一直重試直到連云成功
        //TODO: 以下是首次建連時用戶主動重試的一個參考實現(xiàn),用戶可以打開下面注釋使能下述代碼
//      if(connectState == ConnectState.CONNECTFAIL){
//          try{
//              Thread.sleep(5000);
//              PersistentNet.getInstance().reconnect();
//          }catch (Exception e){
//              AppLog.d(TAG, "exception is " + e);
//          };
//          AppLog.d(TAG, "onConnectStateChange() try to reconnect when connect failed");
//      }
    
        //SDK連云成功后,后續(xù)如果網(wǎng)絡(luò)波動導(dǎo)致連接斷開時,SDK會拋出ConnectState.DISCONNECTED這種狀態(tài)。在這種情況下,SDK會自動嘗試重連,重試的間隔是1s、2s、4s、8s...128s...128s,到了最大間隔128s后,會一直以128s為間隔重連直到連云成功。
    }
});

//對于一型一密免預(yù)注冊的設(shè)備, 設(shè)備連云時要用上deviceToken和clientId
//Step7: 一型一密免預(yù)注冊設(shè)置,默認(rèn)關(guān)閉
// MqttConfigure.deviceToken = DemoApplication.deviceToken;
// MqttConfigure.clientId = DemoApplication.clientId;

//Step8: H2文件上傳設(shè)置
/**
 * 如果要用到HTTP2文件上傳, 需要用戶設(shè)置域名.默認(rèn)關(guān)閉
 */
// IoTH2Config ioTH2Config = new IoTH2Config();
// ioTH2Config.clientId = "client-id";
// ioTH2Config.endPoint = "https://" + productKey + ioTH2Config.endPoint;// 線上環(huán)境
// params.iotH2InitParams = ioTH2Config;

/**
 * 設(shè)備初始化建聯(lián)
 * onError 初始化建聯(lián)失敗,如果因網(wǎng)絡(luò)問題導(dǎo)致初始化失敗,需要用戶重試初始化
 * onInitDone 初始化成功
 */
LinkKit.getInstance().init(getAppContext(), params, new ILinkKitConnectListener() {
    @Override
    public void onError(AError error) {
        ALog.d(TAG, "onError() called with: error = [" + (error) + "]");
    }

    @Override
    public void onInitDone(Object data) {
        ALog.d(TAG, "onInitDone() called with: data = [" + data + "]");
        //TODO 開始用戶自己的業(yè)務(wù)
    }
});

一型一密

一型一密又稱動態(tài)注冊,用于向物聯(lián)網(wǎng)平臺獲取設(shè)備的密鑰,具體分為免預(yù)注冊和預(yù)注冊兩種方式。使用該功能前,需要確保:

  • 已在物聯(lián)網(wǎng)平臺創(chuàng)建產(chǎn)品已開啟動態(tài)注冊開關(guān)。

  • Demo的deviceinfo文件中的deviceSecret的值為空,productSecret不為空。

  • 請確保已執(zhí)行下面示例代碼中的step 1、step 2、step 3。

  • 動態(tài)注冊成功或失敗之后,需要斷開當(dāng)前的動態(tài)注冊長連接,具體參考step 4。

  • 為了您的設(shè)備安全,一型一密的認(rèn)證方式獲取到設(shè)備密鑰后,請將其持久固化至設(shè)備,若需連接至物聯(lián)網(wǎng)平臺,請參考上述一機(jī)一密流程。

免預(yù)注冊和預(yù)注冊區(qū)別如下:

區(qū)別

預(yù)注冊

免預(yù)注冊

通信協(xié)議

MQTT、HTTPS

MQTT

地域支持

  • 基于MQTT的動態(tài)注冊,物聯(lián)網(wǎng)平臺支持的所有地域。

  • 基于HTTPS的動態(tài)注冊,僅限于上海區(qū)域,不推薦使用,不在本示例代碼介紹范圍之內(nèi)。

華東2(上海)、華北2(北京)

返回的設(shè)備密鑰

DeviceSecret具體使用方式,請參考上述一機(jī)一密示例中的Step1。

設(shè)備的ClientID和DeviceToken,請將其持久固化至設(shè)備,以便連云等其他功能使用。具體使用方式,請參考上述一機(jī)一密示例中的Step7。

添加設(shè)備

需要在物聯(lián)網(wǎng)平臺預(yù)注冊設(shè)備DeviceName。

不需要在物聯(lián)網(wǎng)平臺預(yù)注冊設(shè)備DeviceName。

使用次數(shù)限制

  • 同一組設(shè)備證書只能用于激活一個物理設(shè)備。若DeviceName名下已激活物理設(shè)備A,但物理設(shè)備B需要使用該DeviceName,則您可以在物聯(lián)網(wǎng)平臺上刪除設(shè)備A,使設(shè)備A的DeviceSecret作廢,再使用原DeviceName重新添加設(shè)備,激活物理設(shè)備B。

  • 若設(shè)備因丟失DeviceSecret等原因需要重新激活,需您調(diào)用ResetThing接口,重置設(shè)備狀態(tài)為未激活,然后將設(shè)備重新聯(lián)網(wǎng)激活。此時,物聯(lián)網(wǎng)平臺下發(fā)的DeviceSecret不變。

物聯(lián)網(wǎng)平臺允許最多5個物理設(shè)備使用同一組ProductKey、ProductSecret、DeviceName進(jìn)行激活,并為不同物理設(shè)備頒發(fā)不同的ClientID、DeviceToken。

說明

具體代碼實現(xiàn),請參見Demo中的DemoApplication.java

示例代碼如下:

String productKey = "${YourProductKey}";
String deviceName = "${YourDeviceName}";
String deviceSecret = "${YourDeviceSecret}";
String productSecret = "";
MqttInitParams initParams = new MqttInitParams(productKey, productSecret, deviceName, deviceSecret, MqttConfigure.MQTT_SECURE_MODE_TLS);

//動態(tài)注冊step1: 確定一型一密的類型(免預(yù)注冊, 還是非免預(yù)注冊)
//case 1: 如果registerType里面填寫了regnwl, 表明設(shè)備的一型一密方式為免預(yù)注冊(即無需創(chuàng)建設(shè)備)
//case 2: 如果這個字段為空, 或填寫"register", 則表示為需要預(yù)注冊的一型一密(需要實現(xiàn)創(chuàng)建設(shè)備)
initParams.registerType = "";

//動態(tài)注冊step2: 設(shè)置動態(tài)注冊的注冊接入點域名
MqttConfigure.mqttHost = "${YourMqttHostUrl}:8883";;

//動態(tài)注冊step3: 對于企業(yè)實例, 或者2021年07月30日之后(含當(dāng)日)開通的物聯(lián)網(wǎng)平臺服務(wù)下公共實例
//對于2021年07月30日之前(不含當(dāng)日)開通的物聯(lián)網(wǎng)平臺服務(wù)下公共實例,該字段為空字符串""
MqttConfigure.registerInstanceId = "${YourInstanceId}";

final Object lock = new Object();
LinkKit.getInstance().deviceDynamicRegister(this, initParams, new IOnCallListener() {
    @Override
    public void onSuccess(com.aliyun.alink.linksdk.channel.core.base.ARequest request, com.aliyun.alink.linksdk.channel.core.base.AResponse response) {
        ALog.i(TAG, "onSuccess() called with: request = [" + request + "], response = [" + response + "]");
        // response.data is byte array
        try {
            String responseData = new String((byte[]) response.data);
            JSONObject jsonObject = JSONObject.parseObject(responseData);
            String pk = jsonObject.getString("productKey");
            String dn = jsonObject.getString("deviceName");
            // 一型一密預(yù)注冊返回
            String deviceSecret = jsonObject.getString("deviceSecret");

            // 一型一密免預(yù)注冊返回
            String clientId = jsonObject.getString("clientId");
            String deviceToken = jsonObject.getString("deviceToken");

            //TODO: 請用戶保存用戶密鑰,不要在此做連云的操作,要等step 4執(zhí)行完成后再做連云的操作(例如在其onSuccess分支中進(jìn)行連云)

            //讓等待的api繼續(xù)執(zhí)行
            synchronized (lock){
                lock.notify();
            }

        } catch (Exception e) {
        }

    }

    @Override
    public void onFailed(com.aliyun.alink.linksdk.channel.core.base.ARequest request, com.aliyun.alink.linksdk.channel.core.base.AError error) {
        ALog.e(TAG, "onFailed() called with: request = [" + request + "], error = [" + error + "]");
        //讓等待的api繼續(xù)執(zhí)行
        synchronized (lock){
            lock.notify();
        }
    }

    @Override
    public boolean needUISafety() {
        return false;
    }
});

try{
    //等待下行報文,一般1s內(nèi)就有回復(fù)
    synchronized (lock){
        lock.wait(3000);
    }
    
    //step 4: 退出動態(tài)注冊
    //不要在LinkKit.getInstance().deviceDynamicRegister回調(diào)中執(zhí)行下述函數(shù),否則會報錯
    LinkKit.getInstance().stopDeviceDynamicRegister(10 * 1000, null, new IMqttActionListener() {
        @Override
        public void onSuccess(IMqttToken iMqttToken) {
            ALog.d(TAG, "onSuccess() called with: iMqttToken = [" + iMqttToken + "]");
            // TODO: 在此處參考一機(jī)一密進(jìn)行連云和初始化
        }

        @Override
        public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
            ALog.w(TAG, "onFailure() called with: iMqttToken = [" + iMqttToken + "], throwable = [" + throwable + "]");
        }
    });
}catch (Exception e){

};

ID2認(rèn)證

。/**
 * 在物聯(lián)網(wǎng)平臺創(chuàng)建使用iTLS認(rèn)證方式的設(shè)備,采用該方式初始化
 * 產(chǎn)品需要ID2授權(quán)
 */
IoTMqttClientConfig clientConfig = new IoTMqttClientConfig(productKey, deviceName, deviceSecret);
clientConfig.channelHost = productKey + ".itls.cn-shanghai.aliyuncs.com:1883";
clientConfig.productSecret = productSecret;
clientConfig.secureMode = 8;
linkKitInitParams.mqttClientConfig = clientConfig;
//對于企業(yè)版實例, 或2021年07月30日之后(含當(dāng)日)開通的物聯(lián)網(wǎng)平臺服務(wù)下公共實例,通過如下方式指定實例ID,其中${實例id}替換為具體ID值,格式為iot-*******
MqttConfigure.extraMqttClientIdItems=",instanceId=" + "${實例id}";   

示例代碼中的參數(shù)clientConfig.channelHost為設(shè)備的接入域名。

更多設(shè)置

您可以設(shè)置以下參數(shù),實現(xiàn)設(shè)備接入相關(guān)的更多設(shè)置。

  • MQTT連接:

    配置項

    說明

    相關(guān)代碼

    保活時間

    設(shè)置設(shè)備的保活時間。通過該設(shè)置實現(xiàn)設(shè)備與物聯(lián)網(wǎng)平臺保持長連接。

    說明
    • 當(dāng)前SDK默認(rèn)保活時間為65秒。

    • 您可設(shè)置的心跳周期在30 ~ 1200秒。

    // interval 單位秒
    MqttConfigure.setKeepAliveInterval(int interval);

    QoS等級

    設(shè)置QoS(Quality of Service)等級,即物聯(lián)網(wǎng)平臺與設(shè)備之間保證交付信息的協(xié)議。僅支持:

    • 0:最多一次。

    • 1:最少一次。

    MqttPublishRequest request = new MqttPublishRequest();
    // 支持 0 和 1, 默認(rèn)0
    request.qos = 0;
    request.isRPC = false;
    request.topic = topic.replace("request", "response");
    String resId = topic.substring(topic.indexOf("rrpc/request/")+13);
    request.msgId = resId;
    // TODO 用戶根據(jù)實際情況填寫
    request.payloadObj = "{\"id\":\"" + resId + "\", \"code\":\"200\"" + ",\"data\":{} }";

    離線消息

    通過cleanSession,設(shè)置是否接收離線消息。

    IoTMqttClientConfig clientConfig = new IoTMqttClientConfig();
    // 對應(yīng) receiveOfflineMsg = !cleanSession, 默認(rèn)不接受離線消息 
    clientConfig.receiveOfflineMsg = true;
     

    客戶端ID

    通過clientId設(shè)置客戶端ID。clientId的詳細(xì)說明,請參見clientId說明

    MqttConfigure.clientId = "abcdef******";

    重連機(jī)制

    通過automaticReconnect參數(shù)的值,設(shè)置是否重連。

    • true:重連。

    • false:不重連。

    參數(shù)設(shè)置:

    MqttConfigure.automaticReconnect = true;
  • SDK反初始化:

    如果需要注銷初始化,調(diào)用如下反初始化接口。該接口為同步接口。

    說明

    SDK進(jìn)行初始化時,需確保最近一次的反初始化已執(zhí)行完成。否則,會導(dǎo)致重復(fù)初始化失敗。

    // 取消注冊 notifyListener,notifyListener對象需和注冊的時候是同一個對象
    LinkKit.getInstance().unRegisterOnPushListener(notifyListener);
    LinkKit.getInstance().deinit();
  • 連接狀態(tài)與下行消息監(jiān)聽:

    如果需要監(jiān)聽設(shè)備的上下線信息,物聯(lián)網(wǎng)平臺下發(fā)的所有數(shù)據(jù),可以設(shè)置以下監(jiān)聽器。

    IConnectNotifyListener notifyListener = new IConnectNotifyListener() {
        @Override
        public void onNotify(String connectId, String topic, AMessage aMessage) {
            // 下行數(shù)據(jù)回調(diào)
            // connectId連接類型Topic下行Topic; aMessage下行數(shù)據(jù)
            // 數(shù)據(jù)解析如下:
            //String pushData = new String((byte[]) aMessage.data);
            // pushData 示例  {"method":"thing.service.test_service","id":"123374967","params":{"vv":60},"version":"1.0.0"}
            // method 服務(wù)類型; params 下推數(shù)據(jù)內(nèi)容    
       }
        @Override
        public boolean shouldHandle(String connectId, String topic) {
            // 選擇是否不處理某個Topic的下行數(shù)據(jù)
            // 如果不處理某個Topic,則onNotify不會收到對應(yīng)Topic的下行數(shù)據(jù)
            return true; //TODO 根據(jù)實際情況設(shè)置
        }
        @Override
        public void onConnectStateChange(String connectId, ConnectState connectState) {
            // 對應(yīng)連接類型的連接狀態(tài)變化回調(diào),具體連接狀態(tài)參考SDK ConnectState
            AppLog.d(TAG, "onConnectStateChange() called with: connectId = [" + connectId + "], connectState = [" + connectState + "]");
        
            //首次連云可能失敗。對于首次連云失敗,SDK會報出ConnectState.CONNECTFAIL這種狀態(tài)。對于這種場景,用戶可以嘗試若干次后退出,也可以一直重試直到連云成功
            //TODO: 以下是首次建連時用戶主動重試的一個參考實現(xiàn),用戶可以打開下面注釋使能下述代碼
    //      if(connectState == ConnectState.CONNECTFAIL){
    //          try{
    //              Thread.sleep(5000);
    //              PersistentNet.getInstance().reconnect();
    //          }catch (Exception e){
    //              AppLog.d(TAG, "exception is " + e);
    //          };
    //          AppLog.d(TAG, "onConnectStateChange() try to reconnect when connect failed");
    //      }
        
            //SDK連云成功后,后續(xù)如果網(wǎng)絡(luò)波動導(dǎo)致連接斷開時,SDK會拋出ConnectState.DISCONNECTED這種狀態(tài)。在這種情況下,SDK會自動嘗試重連,重試的間隔是1s、2s、4s、8s...128s...128s,到了最大間隔128s后,會一直以128s為間隔重連直到連云成功。
        }
    }
    // 注冊下行監(jiān)聽,包括長連接的狀態(tài)和下行的數(shù)據(jù)
    LinkKit.getInstance().registerOnPushListener(notifyListener);
    // 取消下行監(jiān)聽,需要確保和注冊的是同一個對象
    // LinkKit.getInstance().unRegisterOnPushListener(notifyListener);
                
    說明

    下行數(shù)據(jù)的回調(diào)onNotify,默認(rèn)是在UI線程透出。自lp-iot-linkkit的1.7.3版本起,您可以通過PersistentConnect.mNotifyReceivedMsgOnMainThread = false;選擇將下行消息通過非UI線程透出。對于下行消息密集,或者UI線程業(yè)務(wù)繁忙的場景,建議將該配置項設(shè)置為false

  • 日志開關(guān):

    打開SDK內(nèi)部日志輸出開關(guān):

    PersistentNet.getInstance().openLog(true);
    ALog.setLevel(ALog.LEVEL_DEBUG);
       

    安卓SDK提供了一個全量的攔截器,支持您重寫攔截器的log函數(shù),實現(xiàn)自定義的日志處理。例如:將日志通過持久化保存到特定文件中。

    日志輸出示例代碼:

            ALog.setLogDispatcher(new ILogDispatcher() {
                @Override
                public void log(int level, String prefix, String msg) {
                    switch (level){
                        case LEVEL_DEBUG:
                            System.out.println("debug:"+ prefix + msg);
                            break;
                        case LEVEL_INFO:
                            System.out.println("info:" + prefix + msg);
                            break;
                        case LEVEL_ERROR:
                            System.out.println("error:" + prefix + msg);
                            break;
                        case LEVEL_WARNING:
                            System.out.println("warnings:" + prefix + msg);
                            break;
                        default:
                            System.out.println("other:" + prefix + msg);
                    }
                }
            });
  • 獲取SDK的版本號:

    ALog.i(TAG, "sdk version = " + LinkKit.getInstance().getSDKVersion());

安卓設(shè)備快速重連

安卓SDK斷開后,快速重連的默認(rèn)時間為65秒。部分場景下,您需要在斷開后快速重連。請參考如下代碼:

LinkKit.getInstance().reconnect();

設(shè)置自定義心跳和解決電池供電及滅屏情況下的心跳不準(zhǔn)問題

  • 通過接口MqttPingSender,可實現(xiàn)自定義心跳時間。更多信息,請參見TimerPingSender。通過TimerPingSender,您可以設(shè)置下一次發(fā)送心跳的時間點,以及停止發(fā)送心跳。

    說明

    發(fā)送心跳的時間點不要超過保活時間。

    示例代碼如下:

    // 其中PrivateMqttPingSender實現(xiàn)了MqttPingSender接口
    MqttConfigure.pingSender = new PrivateMqttPingSender();
  • 部分安卓6以及更高版本的電池供電的安卓設(shè)備在滅屏情況下,會因心跳發(fā)送不及時,導(dǎo)致設(shè)備離線。此時,您可參考接口AlarmMqttPingSender實現(xiàn)自定義心跳時間。

    重要
    • 該方式會定期喚醒安卓系統(tǒng),會產(chǎn)生額外的功耗開銷。

    • 對于安卓API level >= 31的設(shè)備:

      • 需要在AndroidManifest.xml文件中添加權(quán)限:

        android.permission.SCHEDULE_EXACT_ALARM

      • 在第67行調(diào)用API PendingIntent.getBroadcast時,flag字段(最后一個參數(shù))需要根據(jù)實際情況考慮設(shè)置為FLAG_IMMUTABLE或者FLAG_MUTABLE

    • 在電池供電同時滅屏的情況下,安卓6以及更高版本的安卓系統(tǒng)的網(wǎng)絡(luò)可能會由于Doze機(jī)制自動斷開(例如系統(tǒng)日志中會出現(xiàn)Netd : Destroyed 3 sockets for UidRanges),這種情況下,即使定時器準(zhǔn)確心跳報文還是無法正常發(fā)出,請聯(lián)系您的安卓系統(tǒng)的供應(yīng)商解決該問題。

Demo使用說明

  • 如果設(shè)備初始化失敗,需再次對SDK進(jìn)行初始化。當(dāng)設(shè)備由于網(wǎng)絡(luò)等原因?qū)е屡c物聯(lián)網(wǎng)平臺斷開連接時,SDK會自動嘗試與物聯(lián)網(wǎng)平臺建立連接。

  • 修改Android Link SDK Demo./app/src/main/res/raw/deviceinfo文件的參數(shù),實現(xiàn)設(shè)備的快速接入。表格中提示”需要填寫“的參數(shù)進(jìn)行填寫,為否的參數(shù)保持默認(rèn)設(shè)置不需修改。

  • 參數(shù)

    說明

    一機(jī)一密

    一型一密(預(yù)注冊)

    一型一密(免預(yù)注冊)

    productKey

    物聯(lián)網(wǎng)平臺為產(chǎn)品頒發(fā)的標(biāo)識符。

    需要填寫

    需要填寫

    需要填寫

    deviceName

    設(shè)備在產(chǎn)品內(nèi)的標(biāo)識符。

    需要填寫

    需要填寫

    需要填寫

    productSecret

    產(chǎn)品密鑰。

    需要填寫

    需要填寫

    deviceSecret

    設(shè)備密鑰。

    需要填寫

    registerType

    一型一密的方式,預(yù)注冊或免預(yù)注冊。

    需要填寫,內(nèi)容為字符串regnwl

    instanceId

    實例ID,對企業(yè)實例和新版本公共實例適用,具體請參見實例概述

    需要填寫

    需要填寫

    mqttHost

    MQTT接入域名。

    需要填寫(上海區(qū)域除外),需要修改接入點的域名和端口號。

    • 使用新版公共實例、企業(yè)實例接入的用戶,控制臺的實例詳情中帶有端口號信息,可直接拷貝使用。格式如下: {instanceid}.mqtt.iothub.aliyuncs.com:8883

    • 使用舊版實例的用戶,控制臺的實例詳情中沒有端口號信息, 請拷貝后自行添加端口號信息。實例接入?yún)⒖几袷饺缦拢?/p>

      {YourProductKey}.iot-as-mqtt.{region}.aliyuncs.com:8883具體請參見查看實例終端節(jié)點

常見問題

Android Link SDK相關(guān)問題