全部產品
Search
文件中心

IoT Platform:進階用法

更新時間:Sep 10, 2024

本文介紹云云對接SDK中進階功能的使用,包括自訂設定檔路徑、配置動態建立橋接器裝置、調用SDK中封裝的介面進行物模型資料上報、裝置屬性和事件批量上報、屬性設定和服務調用。

自訂組態管理

預設情況下,橋接器的設定檔和裝置認證的映射關係設定檔,都是從固定路徑的固定檔案(分別是application.confdevices.conf)中讀取的。

云云對接SDK提供自訂配置能力,您只需在調用bootstrap方法前,先調用ConfigFactory.init方法,自訂設定檔的路徑,自訂執行個體實現對應的介面。

重要

使用自訂組態管理,必須實現getDeviceIdentitygetOriginalIdentity方法。

程式碼範例:

private static DeviceConfigManager selfDefineDeviceConfigManager = new DeviceConfigManager() {
    @Override
    public DeviceIdentity getDeviceIdentity(String originalIdentity) {
        // 根據originalIdentity返回裝置資訊
        return devicesMap.get(originalIdentity);
    }

    @Override
    public String getOriginalIdentity(String productKey, String deviceName) {
        // 根據裝置資訊返回originalIdentity
        return null;
    }
};
BridgeBootstrap bridgeBootstrap = new BridgeBootstrap();
ConfigFactory.init(ConfigFactory.getBridgeConfigManager("application-self-define.conf"),selfDefineDeviceConfigManager);
bridgeBootstrap.bootstrap();

動態建立橋接器裝置

當在大量的伺服器上部署橋接器應用,如果為每一個橋接器伺服器指定不同的橋接器裝置,資訊會比較繁瑣。為解決此問題,您可配置橋接器資訊檔application.conf,動態建立橋接器裝置。

您需在設定檔中,傳入參數productKeypopClientProfile,云云對接SDK將調用物聯網平台開放的API,以伺服器MAC地址作為裝置名稱,建立一個橋接器裝置。

說明
  • 動態建立橋接器裝置,僅需修改橋接器設定檔,調用代碼與基礎用法一致。

  • popClientprofile的所有參數必須配置完整。如果當前MAC地址為已有裝置名稱,會直接使用該裝置作為橋接器裝置。

  • 參數deviceNamedeviceSecret值必須為空白,如果已指定橋接器裝置資訊,不會再動態建立裝置。

  • 建議使用專用的調測裝置偵錯工具,不要直接在本地機器上調試,以免影響正式的生產環境。

    在多個本地PC上偵錯工具,每次都會將當前機器的MAC地址註冊為橋接器,並將devices.conf檔案中的所有裝置與該橋接器關聯。

表 1. 配置參數說明

參數

是否必需

說明

productKey

橋接器裝置所屬產品的ProductKey。

subDeviceConnectMode

橋接器掛載裝置模式:

  • 大型橋接器:傳入3,單橋接器下最大支援掛載500,000個裝置。

  • 小型橋接器:不傳入,單橋接器下最大支援掛載1,500個裝置。

大型橋接器、小型橋接器的掛載裝置下線策略不同,請參見裝置下線

http2Endpoint

HTTP2網關服務地址。橋接器裝置和物聯網平台通過HTTP2協議建立長串連通道。

地址結構:

  • 企業版執行個體:https://${IotInstanceId}.http2.iothub.aliyuncs.com:443

    其中,變數${IotInstanceId}需替換成執行個體ID。

    例如:某使用者的企業版執行個體的執行個體ID為iot-cn-g06kwb****,地址為https://iot-cn-g06kwb****.http2.iothub.aliyuncs.com:443

  • 公用執行個體:新舊版公用執行個體的地址填寫格式不同。

    • 新版公用執行個體:與企業版執行個體填寫格式一致。

    • 舊版公用執行個體:https://${productKey}.iot-as-http2.${RegionId}.aliyuncs.com:443

      其中,變數${productKey}需替換成您的橋接器裝置所屬產品的ProductKey。

      變數${RegionId}需替換成您的服務所在地區代碼。RegionId的表達方法,請參見地區和可用性區域

      例如:某使用者的橋接器裝置的productKey為a1abcab****,地區為華東2(上海),地址為https://a1abcab****.iot-as-http2.cn-shanghai.aliyuncs.com:443

    執行個體的詳細說明,請參見執行個體概述

authEndpoint

裝置認證服務地址。

地址結構:

  • 企業版執行個體:https://${IotInstanceId}.auth.iothub.aliyuncs.com/auth/bridge

    其中,變數${IotInstanceId}需替換成執行個體ID。

    例如:某使用者的企業版執行個體的執行個體ID為iot-cn-g06kwb****,則地址為 https://iot-cn-g06kwb****.auth.iothub.aliyuncs.com/auth/bridge

  • 公用執行個體:新舊版公用執行個體的地址填寫格式不同。

    • 新版公用執行個體:與企業版執行個體填寫格式一致。

    • 舊版公用執行個體:https://iot-auth.${RegionId}.aliyuncs.com/auth/bridge

      其中,變數${RegionId}需替換成您的服務所在地區代碼。RegionId的表達方法,請參見地區和可用性區域

      例如:地區為華東2(上海),則地址為https://iot-auth.cn-shanghai.aliyuncs.com/auth/bridge

popClientProfile

配置此參數,云云對接SDK將調用阿里雲物聯網平台開放介面自動建立一個橋接器裝置。

具體參數配置見下表popClientProfile

表 2. popClientProfile

參數

是否必需

描述

accessKey

您的阿里雲帳號的AccessKey ID。

物聯網平台控制台,滑鼠移動到您的帳號頭像上,然後單擊AccessKey管理,建立或查看AccessKey。

accessSecret

您的阿里雲帳號的AccessKey Secret。

name

將要建立橋接器裝置的所在地區ID。

地區的表達方法,請參見地區和可用性區域

region

product

產品名稱,固定為Iot。

endpoint

調用指定地區API的節點地址。結構為iot.${RegionId}.aliyuncs.com

變數${RegionId}需替換成您的服務所在地區代碼。RegionId的表達方法,請參見地區和可用性區域

例如:華東2(上海)地區的endpoint為iot.cn-shanghai.aliyuncs.com

以企業版執行個體為例,動態建立小型橋接器裝置的配置代碼如下:

// 服務地址
http2Endpoint = "https://${IotInstanceId}.http2.iothub.aliyuncs.com:443"
authEndpoint = "https://${IotInstanceId}.auth.iothub.aliyuncs.com/auth/bridge"

// 橋接器裝置資訊
productKey = ${YourProductKey}

popClientProfile = {
    accessKey = ${YourAliyunAccessKey}
    accessSecret = ${YourAliyunAccessSecret}
    name = cn-shanghai
    region = cn-shanghai
    product = Iot
    endpoint = iot.cn-shanghai.aliyuncs.com
}

調用物模型資料上報介面

云云對接SDK中封裝了部分資料上報介面,包括屬性上報介面 reportProperty、事件上報介面fireEvent和更新裝置標籤介面updateDeviceTag。裝置可通過以上介面向物聯網平台上報相應訊息。

說明
  • 調用reportPropertyfireEvent上報屬性值和事件前,您需先在物聯網平台控制台裝置所屬產品的產品詳情頁的功能定義頁簽下,定義屬性和事件。請參見單個添加物模型

  • 調用updateDeviceTag介面上報裝置標籤時,如果您已在物聯網平台控制台裝置對應的裝置詳情頁,添加了該標籤,則更新標籤值(value)。否則,建立標籤。

調用樣本:

TslUplinkHandler tslUplinkHandler = new TslUplinkHandler();
//上報屬性。
//已定義testProp屬性。
String requestId = String.valueOf(random.nextInt(1000));
//上報屬性時,不攜帶時間戳記。
tslUplinkHandler.reportProperty(requestId, originalIdentity, "testProp", random.nextInt(100));
//上報屬性時,攜帶時間戳記。
//tslUplinkHandler.reportProperty(requestId, originalIdentity, "testProp", random.nextInt(100), System.currentTimeMillis());

//上報事件。
//已定義testEvent事件。
requestId = String.valueOf(random.nextInt(1000));
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("testEventParam", 123);
//上報事件時,不攜帶時間戳記。
tslUplinkHandler.fireEvent(originalIdentity, "testEvent", ThingEventTypes.INFO, params);
//上報事件時,攜帶時間戳記
//tslUplinkHandler.fireEvent(originalIdentity, "testEvent", ThingEventTypes.INFO, params, System.currentTimeMillis());

//上報裝置標籤。
//已定義裝置標籤key為testDeviceTag。
requestId = String.valueOf(random.nextInt(1000));
tslUplinkHandler.updateDeviceTag(requestId, originalIdentity, "testDeviceTag", String.valueOf(random.nextInt(1000)));

以上樣本中參數說明如下。

參數

說明

requestId

請求訊息ID。

originalIdentity

裝置的原始身份標識符。

testProp

屬性的identifier。本樣本的產品已定義功能屬性標識符為testProp。本樣本上報了該屬性的值。

random.nextInt(100)

上報的屬性值。定義屬性時,可設定其取值範圍。在本樣本中,使用random.nextInt(100)表示取小於100的整型隨機值。

testEvent

事件的identifier。本樣本的產品已定義功能事件標識符為testEvent。本樣本上報了該事件。

ThingEventTypes.INFO

事件類型。ThingEventTypes表示事件類型,INFO表示事件類型值為INFO(資訊)。

本樣本產品定義事件testEvent時,選擇的事件類型為資訊(INFO)。

如果事件類型定義為故障,則該參數為ThingEventTypes.ERROR

params

事件的輸出參數。事件輸出參數的identifier、資料類型、取值範圍等已在定義事件時定義。本樣本中,上報事件的出參identifiertestEventParam,參數值是123。

testDeviceTag

裝置標籤鍵(key),String類型。本樣本中為testDeviceTag。 實際使用時,請根據裝置標籤鍵規範和您的需求設定。更多資訊,請參見裝置標籤

String.valueOf(random.nextInt(1000))

裝置標籤值(value),String類型。本樣本中,用String.valueOf(random.nextInt(1000))表示取一個小於1000的隨機值。實際使用時,請根據裝置標籤值規範和您的需求設定,請參見裝置標籤

System.currentTimeMillis()

擷取當前系統時間的毫秒數。

調用裝置屬性、事件批量上報介面

云云對接SDK封裝了資料批量上報介面,通過BatchPostEventPropertyMessage 對象執行個體,鏈式調用addPropertyaddEvent方法,分別添加屬性和事件數目據後,再通過TslUplinkHandler調用對象執行個體BatchPostEventPropertyMessage ,實現裝置資料批量上報。

說明

調用reportPropertyfireEvent上報屬性值和事件前,您需先在物聯網平台控制台裝置所屬產品的產品詳情頁的功能定義頁簽下,定義屬性和事件。請參見單個添加物模型

調用樣本:

TslUplinkHandler tslUplinkHandler = new TslUplinkHandler();
//批量上報屬性和事件
String requestId = String.valueOf(random.nextInt(1000));
long startTime = System.currentTimeMillis() - 3000;

//構造批量上報的報文
BatchPostEventPropertyMessage batchPostEventPropertyMessage = new BatchPostEventPropertyMessage();
Map<String, Object> aiEventParams = new HashMap<>();
aiEventParams.put("EventContent", "hello world");
batchPostEventPropertyMessage
    .addProperty("PowerConsumption", 1000, startTime)
    .addProperty("PowerConsumption", 123, startTime + 1000)
    .addProperty("LightAdjustLevel", 23, startTime)
    .addProperty("LightAdjustLevel", 44, startTime + 1000)
    .addProperty("LightAdjustLevel", 47, startTime + 2000)
    .addEvent("AIEvent", aiEventParams, startTime);
batchPostEventPropertyMessage.setId(requestId);

//發起上報
tslUplinkHandler.batchPostEventPropertyMessage(originalIdentity, batchPostEventPropertyMessage);

以上樣本中參數說明如下。

參數

說明

requestId

請求訊息ID。

startTime

屬性和事件上報時間戳記。類型為UTC毫秒級時間。可根據實際業務自訂。

aiEventParams

上報事件的具體資訊。

PowerConsumption

屬性的identifier。本樣本的產品已定義功能屬性標識符為PowerConsumptionLightAdjustLevel。本樣本上報了兩屬性不同時間點的值。

LightAdjustLevel

AIEvent

事件的identifier。本樣本的產品已定義功能事件標識符為AIEvent。本樣本上報了該事件。

originalIdentity

裝置的原始身份標識符。

調用屬性設定、服務調用介面

云云對接SDK中封裝了屬性設定介面PropertySetHandler和服務調用介面ServiceInvokeHandler。裝置端可通過以上介面接收物聯網平台下發的指令,實現資料更新。

調用樣本:

BridgeBootstrap bridgeBootstrap = new BridgeBootstrap();
//屬性設定
bridgeBootstrap.setPropertySetHandler(new PropertySetHandler() {
    @Override
    public void onPropertySet(PropertySetMessage msg) {
        log.info("on property set, {}", msg.getParams());
        //如果調用replySuccess,則SDK會向物聯網平台發送/property/set_reply訊息,code為200
        msg.replySuccess();
        //如果調用replyFail,則SDK會向物聯網平台發送/property/set_reply訊息,code為調用方指定的code
        //msg.replyFail(400);
    }
});

//服務調用
bridgeBootstrap.setServiceInvokeHandler(new ServiceInvokeHandler() {
    @Override
    public void onServiceInvoke(ServiceInvokeMessage message) {
        log.info("on service invoke, {}", message.getParams());
        //如果調用replySuccess,則SDK會向物聯網平台發送/service/{service.identifier}_reply訊息,code為200
        message.replySuccess();
        //如果調用replyFail,則SDK會向物聯網平台發送/service/{service.identifier}_reply訊息,code為調用方指定的code
        //msg.replyFail(400);
    }
});