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

認(rèn)證與連接

本文介紹如何進(jìn)行Java Link SDK初始化,建立設(shè)備與物聯(lián)網(wǎng)平臺的連接。

前提條件

背景信息

  • Java Link SDK僅支持設(shè)備密鑰方式,進(jìn)行設(shè)備身份認(rèn)證,具體包括以下幾種認(rèn)證方式。

    認(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ū)別

  • Java Link SDK中參數(shù)說明,請參見LinkKitInitParams

一機(jī)一密

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

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

LinkKitInitParams params = new LinkKitInitParams();
final String TAG = "HelloWorld";

/**
 * step 1: 設(shè)置MQTT初始化參數(shù)
 */
IoTMqttClientConfig config = new IoTMqttClientConfig();

MqttConfigure.mqttHost = "{YourInstanceId}.mqtt.iothub.aliyuncs.com:8883";

/*
 *是否接受離線消息
 *對應(yīng)MQTT的cleanSession字段
 */
config.receiveOfflineMsg = false;
params.mqttClientConfig = config;

/**
 * step 2: 設(shè)置初始化設(shè)備認(rèn)證信息
 */
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
params.deviceInfo = deviceInfo;

/**
 * step 3: 設(shè)置設(shè)備的username, token和clientId
 * 僅用于一型一密免預(yù)注冊
 * 默認(rèn)關(guān)閉
 */
 // MqttConfigure.deviceToken="${YourDeviceToken}";
 // MqttConfigure.clientId="${YourClientId}";


LinkKit.getInstance().init(params, new ILinkKitConnectListener() {
    public void onError(AError aError) {
        ALog.e(TAG, "Init Error error= "+aError);
    }
    public void onInitDone(InitResult initResult) {
        ALog.i(TAG, "onInitDone result=" + initResult);
    }
});
說明
  • 發(fā)起初始化請求后,如果返回onInitDone表示初始化成功,返回onError表示初始化失敗。

  • 初始化失敗后,您可以根據(jù)業(yè)務(wù)需要,設(shè)置是否再次進(jìn)行初始化,Java Link SDK不會自動嘗試連接物聯(lián)網(wǎng)平臺。

  • 初始化成功后,如果設(shè)備異常斷開,Java Link SDK會自動重連。

動態(tài)注冊

一型一密又稱動態(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í)行下面示例代碼中的step1、step2、step3。

  • 動態(tài)注冊成功或失敗之后,需要斷開當(dāng)前的動態(tài)注冊長連接,請參考示例代碼的step4。

  • 當(dāng)前Demo支持的是一型一密預(yù)注冊方式。您可參考示例代碼中step 1的說明調(diào)整成一型一密免預(yù)注冊方式。

  • 為了您的設(shè)備安全,使用一型一密認(rèn)證方式獲取到設(shè)備密鑰后,請將設(shè)備密鑰持久固化至設(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ī)一密示例中的Step3。

添加設(shè)備

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

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

使用次數(shù)限制

  • 同一組設(shè)備證書只能用于激活一個物理設(shè)備。若DeviceName名下已激活物理設(shè)備A,但同一產(chǎn)品下物理設(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。

示例代碼如下:

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

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

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

        MqttInitParams initParams = new MqttInitParams(productKey, productSecret, deviceName, "",registerType);

        //動態(tài)注冊step3: 如果用戶所用的實例為新版本的公共實例或者企業(yè)實例(控制臺中有實例詳情的頁面), 需設(shè)置動態(tài)注冊的實例id
        initParams.instanceId = "${YourInstanceId}";

        final Object lock = new Object();
        LinkKit.getInstance().deviceDynamicRegister(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) {
                try {
                    String responseData = new String((byte[]) response.data);
                    JSONObject jsonObject = JSONObject.parseObject(responseData);
                    // 一型一密預(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(ARequest aRequest, com.aliyun.alink.linksdk.channel.core.base.AError aError) {
                System.out.println("mqtt dynamic registration failed");
                //讓等待的api繼續(xù)執(zhí)行
                synchronized (lock){
                    lock.notify();
                }
            }

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

        try {
            //等待下行報文,一般1s內(nèi)就有回復(fù)
            synchronized (lock){
                lock.wait(3000);
            }

            //動態(tài)注冊step4: 關(guān)閉動態(tài)注冊的實例。
            //不要在LinkKit.getInstance().deviceDynamicRegister回調(diào)中執(zhí)行下述函數(shù),否則會報錯
            LinkKit.getInstance().stopDeviceDynamicRegister(2000, null, new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken iMqttToken) {
                    System.out.println("mqtt dynamic registration success");
                    //TODO: 在此處參考一機(jī)一密進(jìn)行連云和初始化
                }

                @Override
                public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
                    System.out.println("mqtt dynamic registration failed");
                }
            });

        } catch (Exception e) {
        }

設(shè)置接入域名

示例代碼如下:

// 設(shè)置MQTT請求域名LinkKitInitParams初始化參數(shù)
IoTMqttClientConfig clientConfig = new IoTMqttClientConfig();
clientConfig.channelHost = "a18wP******.iot-as-mqtt.cn-shanghai.aliyuncs.com:8883";
linkKitInitParams.mqttClientConfig = clientConfig;           

參數(shù)說明:

參數(shù)

示例

說明

channelHost

a18wP******.iot-as-mqtt.cn-shanghai.aliyuncs.com:8883

設(shè)備的${接入域名}:${端口號}

  • 企業(yè)版實例和新版公共實例:在實例詳情頁面的開發(fā)配置面板,查看接入域名。

  • 舊版公共實例:接入域名格式為${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com:8883

新舊版公共實例和企業(yè)版實例、以及接入域名的更多信息,請參見查看實例終端節(jié)點

更多設(shè)置

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

  • MQTT連接:

    配置項

    說明

    相關(guān)代碼

    保活時間

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

    MqttConfigure.setKeepAliveInterval(int interval);

    QoS等級

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

    • 0:最多一次。

    • 1:最少一次。

    - qos設(shè)置
    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è)置是否接收離線消息。

    /**
     * 設(shè)置MQTT初始化參數(shù)
     */
    IoTMqttClientConfig config = new IoTMqttClientConfig();
    config.productKey = deviceInfoData.productKey;
    config.deviceName = deviceInfoData.deviceName;
    config.deviceSecret = deviceInfoData.deviceSecret;
    config.channelHost = pk + ".iot-as-mqtt." + deviceInfoData.region + ".aliyuncs.com:1883";
    /**
     * 是否接受離線消息
     * 對應(yīng) receiveOfflineMsg = !cleanSession, 默認(rèn)不接受離線消息
     */
    config.receiveOfflineMsg = false;
    params.mqttClientConfig = config;
  • 日志與Log4j支持:

    用戶可以通過如下日志輸出Debug日志:

    ALog.setLevel(ALog.LEVEL_DEBUG);
    MqttLogger.isLoggable = true;  // 輸出底層MQTT庫的全量日志, 默認(rèn)關(guān)閉

    Java Link SDK從1.2.3.1版本起,提供了一個全量的攔截器,支持用戶重寫攔截器的log函數(shù),實現(xiàn)自定義的日志處理。例如將日志通過Log4j工具持久化到文件中。

    日志輸出示例代碼:

            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);
                    }
                }
            });
  • 連接狀態(tài)與下行消息監(jiān)聽:

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

    IConnectNotifyListener notifyListener = new IConnectNotifyListener() {
        @Override
        public void onNotify(String connectId, String topic, AMessage aMessage) {
            // 物聯(lián)網(wǎng)平臺下行數(shù)據(jù)回調(diào),包括connectId、連接類型、下行Topic和aMessage下行數(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ù)實際情況,編寫要處理的監(jiān)聽邏輯。
        }
        @Override
        public void onConnectStateChange(String connectId, ConnectState connectState) {
            // 對應(yīng)連接類型的連接狀態(tài)變化回調(diào),具體連接狀態(tài)參考SDK ConnectState
            //當(dāng)SDK因網(wǎng)絡(luò)波動斷開連接時,會自動嘗試重連,重試的間隔是1s、2s、4s、8s...128s...128s, 到了最大間隔128s后,會一直以128s為間隔重連直到連云成功。
        }
    }
    // 注冊下行監(jiān)聽,包括長連接的狀態(tài)和下行的數(shù)據(jù)
    LinkKit.getInstance().registerOnNotifyListener(notifyListener);
                
  • 反初始化:

    如果需要注銷初始化,請參考如下示例代碼。

    // 取消注冊 notifyListener,notifyListener對象需和注冊的時候是同一個對象
    LinkKit.getInstance().unRegisterOnNotifyListener(notifyListener);
    LinkKit.getInstance().deinit();