天天看點

阿裡雲物聯網平台遠端配置功能JAVA 示例參考

作者:俏巴

概述

很多場景下,開發者需要更新裝置的配置資訊,包括裝置的系統參數、網絡參數、本地政策等。通常情況下,是通過固件更新的方式更新裝置的配置資訊。但是,這将加大固件版本的維護工作,并且需要裝置中斷運作以完成更新。為了解決上述問題,物聯網平台提供了遠端配置更新的功能,裝置無需重新開機或中斷運作即可線上完成配置資訊的更新。本文主要示範如何使用JAVA SDK實作兩種應用場景。

原理說明

1、物聯網平台提供的遠端配置功能,支援:

  • 開啟/關閉遠端配置。
  • 線上編輯配置檔案,并管理版本。
  • 批量更新裝置配置資訊。
  • 裝置主動請求更新配置資訊。

2、流程圖

阿裡雲物聯網平台遠端配置功能JAVA 示例參考

3、遠端配置大緻分為三部分:

  • 生成配置檔案:您在物聯網平台控制台編輯并儲存配置資訊。
  • 推送配置檔案:您在物聯網平台控制台批量推送配置資訊給裝置。裝置接收後,修改本地配置檔案。
  • 裝置主動請求配置資訊:裝置主動向雲端請求新的配置檔案,并進行更新。
遠端配置使用分為兩種場景,一種是雲端推送配置資訊給裝置端,一種是裝置端主動請求配置資訊。根據場景的不同,遠端配置的步驟也有所差別。

場景一:雲端推送配置資訊給裝置端

1、裝置端業務代碼實作

import com.aliyun.alink.dm.api.DeviceInfo;
import com.aliyun.alink.dm.api.InitResult;
import com.aliyun.alink.dm.api.IoTApiClientConfig;
import com.aliyun.alink.linkkit.api.ILinkKitConnectListener;
import com.aliyun.alink.linkkit.api.IoTMqttClientConfig;
import com.aliyun.alink.linkkit.api.LinkKit;
import com.aliyun.alink.linkkit.api.LinkKitInitParams;
import com.aliyun.alink.linksdk.cmp.connect.channel.MqttSubscribeRequest;
import com.aliyun.alink.linksdk.cmp.core.base.AMessage;
import com.aliyun.alink.linksdk.cmp.core.base.ConnectState;
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectNotifyListener;
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectSubscribeListener;
import com.aliyun.alink.linksdk.tools.AError;

public class DeviceCOTADemo1 {

    public static void main(String[] args) {
        String regionId = "cn-shanghai";
        DeviceInfo deviceInfo = new DeviceInfo();
        deviceInfo.productKey = "******";
        deviceInfo.deviceName = "******";
        deviceInfo.deviceSecret = "********";

        LinkKitInitParams params = new LinkKitInitParams();
        IoTMqttClientConfig config = new IoTMqttClientConfig();
        config.productKey = deviceInfo.productKey;
        config.deviceName = deviceInfo.deviceName;
        config.deviceSecret = deviceInfo.deviceSecret;
        config.channelHost = deviceInfo.productKey + ".iot-as-mqtt." + regionId + ".aliyuncs.com:1883";
        params.mqttClientConfig = config;
        params.connectConfig = new IoTApiClientConfig();
        params.deviceInfo = deviceInfo;

        /**建立連接配接**/
        LinkKit.getInstance().init(params, new ILinkKitConnectListener() {
            @Override
            public void onError(AError aError) {
                System.out.println("初始化失敗 " + aError.getMsg());
            }

            @Override
            public void onInitDone(InitResult initResult) {

                System.out.println("初始化成功 " + initResult.tsl);

                String pd = deviceInfo.productKey + "/" + deviceInfo.deviceName;

                // 1、cota 請求 Topic
                String requestcotaTopic = "/sys/"+pd+"/thing/config/push";

                // 訂閱Topic
                MqttSubscribeRequest upgradeTopicRequest = new MqttSubscribeRequest();
                upgradeTopicRequest.topic = requestcotaTopic;
                upgradeTopicRequest.isSubscribe = true;

                // 直接做Topic的訂閱
                LinkKit.getInstance().subscribe(upgradeTopicRequest, new IConnectSubscribeListener(){
                    @Override
                    public void onSuccess() {
                        System.out.println("cota訂閱成功");
                    }

                    @Override
                    public void onFailure(AError aError) {
                        System.out.println("直接訂閱失敗" + aError.getMsg());
                    }
                });

                // 注冊ota下行監聽
                LinkKit.getInstance().registerOnNotifyListener(new IConnectNotifyListener() {
                    @Override
                    public void onNotify(String s, String s1, AMessage aMessage) {

                        System.out.println("cota 監聽響應:");
                        System.out.println(new String((byte[])aMessage.getData()));
                    }

                    @Override
                    public boolean shouldHandle(String s, String s1) {
                        return false;
                    }

                    @Override
                    public void onConnectStateChange(String s, ConnectState connectState) {
                        System.out.println("連接配接狀态發生變化 :" + s + connectState);
                    }
                });

            }
        });
    }
}           

2、管理門戶配置遠端控制,詳細步驟參考

連結

阿裡雲物聯網平台遠端配置功能JAVA 示例參考

3、啟動裝置端程式,管理門戶批量更新,裝置端擷取資訊(批量更新頻率限制:一小時内僅允許操作一次):

{"method":"thing.config.push","id":"1296799269","params":{"getType":"file","configId":"92eb82a17a7441111f7dcb830e93ed79","sign":"568e9211117eedc9eadbc2907719fe2086348f572ddd3f373d6f297ba5aba4d1","configSize":12,"signMethod":"Sha256","url":"https://otx-devicecenter-thing-config-cn-shanghai-online.oss-cn-shanghai.aliyuncs.com/11zisMUtYDk/1567338668042_gz2Qs7hl?Expires=1567340568&OSSAccessKeyId=1111113rx5dg2JBm&Signature=S0LS9H%1111zJqTg%2Fphf19%2BfE%2F2bs%3D"},"version":"1.0"}
           

場景二:裝置主動請求配置資訊

import com.aliyun.alink.dm.api.DeviceInfo;
import com.aliyun.alink.dm.api.InitResult;
import com.aliyun.alink.dm.api.IoTApiClientConfig;
import com.aliyun.alink.linkkit.api.ILinkKitConnectListener;
import com.aliyun.alink.linkkit.api.IoTMqttClientConfig;
import com.aliyun.alink.linkkit.api.LinkKit;
import com.aliyun.alink.linkkit.api.LinkKitInitParams;
import com.aliyun.alink.linksdk.cmp.connect.channel.MqttPublishRequest;
import com.aliyun.alink.linksdk.cmp.connect.channel.MqttSubscribeRequest;
import com.aliyun.alink.linksdk.cmp.core.base.AMessage;
import com.aliyun.alink.linksdk.cmp.core.base.ARequest;
import com.aliyun.alink.linksdk.cmp.core.base.AResponse;
import com.aliyun.alink.linksdk.cmp.core.base.ConnectState;
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectNotifyListener;
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectSendListener;
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectSubscribeListener;
import com.aliyun.alink.linksdk.tools.AError;

public class DeviceCOTADemo2 {

    public static void main(String[] args) {
        String regionId = "cn-shanghai";
        DeviceInfo deviceInfo = new DeviceInfo();
        deviceInfo.productKey = "******";
        deviceInfo.deviceName = "******";
        deviceInfo.deviceSecret = "********";

        LinkKitInitParams params = new LinkKitInitParams();
        IoTMqttClientConfig config = new IoTMqttClientConfig();
        config.productKey = deviceInfo.productKey;
        config.deviceName = deviceInfo.deviceName;
        config.deviceSecret = deviceInfo.deviceSecret;
        config.channelHost = deviceInfo.productKey + ".iot-as-mqtt." + regionId + ".aliyuncs.com:1883";
        params.mqttClientConfig = config;
        params.connectConfig = new IoTApiClientConfig();
        params.deviceInfo = deviceInfo;

        /**建立連接配接**/
        LinkKit.getInstance().init(params, new ILinkKitConnectListener() {
            @Override
            public void onError(AError aError) {
                System.out.println("初始化失敗 " + aError.getMsg());
            }

            @Override
            public void onInitDone(InitResult initResult) {

                System.out.println("初始化成功 " + initResult.tsl);

                String pd = deviceInfo.productKey + "/" + deviceInfo.deviceName;

                // 1、裝置端訂閱Topic:/sys/${productKey}/${deviceName}/thing/config/get_reply
                String requestcotaTopic = "/sys/"+pd+"/thing/config/get_reply";
                MqttSubscribeRequest upgradeTopicRequest = new MqttSubscribeRequest();
                upgradeTopicRequest.topic = requestcotaTopic;
                upgradeTopicRequest.isSubscribe = true;
                LinkKit.getInstance().subscribe(upgradeTopicRequest, new IConnectSubscribeListener(){
                    @Override
                    public void onSuccess() {
                        System.out.println("ota訂閱成功");
                    }

                    @Override
                    public void onFailure(AError aError) {
                        System.out.println("直接訂閱失敗" + aError.getMsg());
                    }
                });

                // 注冊下行監聽
                LinkKit.getInstance().registerOnNotifyListener(new IConnectNotifyListener() {
                    @Override
                    public void onNotify(String s, String s1, AMessage aMessage) {

                        System.out.println("cota 監聽響應:");
                        System.out.println(new String((byte[])aMessage.getData()));
                    }

                    @Override
                    public boolean shouldHandle(String s, String s1) {
                        return false;
                    }

                    @Override
                    public void onConnectStateChange(String s, ConnectState connectState) {
                        System.out.println("連接配接狀态發生變化 :" + s + connectState);
                    }
                });

                // 4、裝置通過Topic /sys/${productKey}/${deviceName}/thing/config/get主動查詢最新的配置資訊
                String requestTopic = "/sys/"+pd+"/thing/config/get";

                System.out.println("發送消息" + requestTopic);

                // 訂閱Topic
                MqttPublishRequest request = new MqttPublishRequest();
                request.topic = requestTopic;
                request.payloadObj = "{\"id\":\"123\",\"method\":\"thing.config.get\",\"params\":{\"getType\":\"file\",\"configScope\":\"product\"},\"version\":\"1.0\"}";

                // 直接做Topic的發送
                LinkKit.getInstance().publish(request, new IConnectSendListener() {
                    @Override
                    public void onResponse(ARequest aRequest, AResponse aResponse) {
                        System.out.println("請求發送成功 " + aResponse.getData());
                    }

                    @Override
                    public void onFailure(ARequest aRequest, AError aError) {
                        System.out.println("請求發送成功 " + aError.getMsg());
                    }
                });
            }
        });
    }
}
           

2、運作結果

`

(/sys/${productKey}/${deviceName}/thing/config/get_reply 訂閱擷取的内容)

{"code":200,"data":{"configId":"a9415f2d6e444d7f9e60a3d46f11d566","configSize":18,"getType":"file","sign":"112f38e7345a2ac46d9f80a401886727f27de96ebf1c82b6825df4b31116ab02","signMethod":"Sha256","url":"https://otx-devicecenter-thing-config-cn-shanghai-online.oss-cn-shanghai.aliyuncs.com/11D8NwXCe56/1567337893929_gpUFnE69?Expires=1567339979&OSSAccessKeyId=11AIRY3rx5dg2JBm&Signature=1112qy8bOsa48elOQFt4qHQGaqk%3D"},"id":"123","method":"thing.config.get","version":"1.0"}

參考連結
----
[遠端配置](https://help.aliyun.com/document_detail/84891.html?spm=a2c4e.11153940.0.0.74486ec8BMciHh)