本文介紹云云對接SDK中進階功能的使用,包括自訂設定檔路徑、配置動態建立橋接器裝置、調用SDK中封裝的介面進行物模型資料上報、裝置屬性和事件批量上報、屬性設定和服務調用。
自訂組態管理
預設情況下,橋接器的設定檔和裝置認證的映射關係設定檔,都是從固定路徑的固定檔案(分別是application.conf和devices.conf)中讀取的。
云云對接SDK提供自訂配置能力,您只需在調用bootstrap方法前,先調用ConfigFactory.init方法,自訂設定檔的路徑,自訂執行個體實現對應的介面。
使用自訂組態管理,必須實現getDeviceIdentity
和getOriginalIdentity
方法。
程式碼範例:
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,動態建立橋接器裝置。
您需在設定檔中,傳入參數productKey和popClientProfile,云云對接SDK將調用物聯網平台開放的API,以伺服器MAC地址作為裝置名稱,建立一個橋接器裝置。
動態建立橋接器裝置,僅需修改橋接器設定檔,調用代碼與基礎用法一致。
popClientprofile的所有參數必須配置完整。如果當前MAC地址為已有裝置名稱,會直接使用該裝置作為橋接器裝置。
參數deviceName和deviceSecret值必須為空白,如果已指定橋接器裝置資訊,不會再動態建立裝置。
建議使用專用的調測裝置偵錯工具,不要直接在本地機器上調試,以免影響正式的生產環境。
在多個本地PC上偵錯工具,每次都會將當前機器的MAC地址註冊為橋接器,並將devices.conf檔案中的所有裝置與該橋接器關聯。
表 1. 配置參數說明
參數 | 是否必需 | 說明 |
productKey | 是 | 橋接器裝置所屬產品的ProductKey。 |
subDeviceConnectMode | 否 | 橋接器掛載裝置模式:
大型橋接器、小型橋接器的掛載裝置下線策略不同,請參見裝置下線。 |
http2Endpoint | 是 | HTTP2網關服務地址。橋接器裝置和物聯網平台通過HTTP2協議建立長串連通道。 地址結構:
|
authEndpoint | 是 | 裝置認證服務地址。 地址結構:
|
popClientProfile | 是 | 配置此參數,云云對接SDK將調用阿里雲物聯網平台開放介面自動建立一個橋接器裝置。 具體參數配置見下表popClientProfile。 |
表 2. popClientProfile
參數 | 是否必需 | 描述 |
accessKey | 是 | 您的阿里雲帳號的AccessKey ID。 在物聯網平台控制台,滑鼠移動到您的帳號頭像上,然後單擊AccessKey管理,建立或查看AccessKey。 |
accessSecret | 是 | 您的阿里雲帳號的AccessKey Secret。 |
name | 是 | 將要建立橋接器裝置的所在地區ID。 地區的表達方法,請參見地區和可用性區域。 |
region | 是 | |
product | 是 | 產品名稱,固定為Iot。 |
endpoint | 是 | 調用指定地區API的節點地址。結構為 變數${RegionId}需替換成您的服務所在地區代碼。RegionId的表達方法,請參見地區和可用性區域。 例如:華東2(上海)地區的endpoint為 |
以企業版執行個體為例,動態建立小型橋接器裝置的配置代碼如下:
// 服務地址
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。裝置可通過以上介面向物聯網平台上報相應訊息。
調用樣本:
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) | 上報的屬性值。定義屬性時,可設定其取值範圍。在本樣本中,使用 |
testEvent | 事件的identifier。本樣本的產品已定義功能事件標識符為testEvent。本樣本上報了該事件。 |
ThingEventTypes.INFO | 事件類型。ThingEventTypes表示事件類型,INFO表示事件類型值為INFO(資訊)。 本樣本產品定義事件testEvent時,選擇的事件類型為資訊(INFO)。 如果事件類型定義為故障,則該參數為 |
params | 事件的輸出參數。事件輸出參數的identifier、資料類型、取值範圍等已在定義事件時定義。本樣本中,上報事件的出參identifier是testEventParam,參數值是123。 |
testDeviceTag | 裝置標籤鍵(key),String類型。本樣本中為testDeviceTag。 實際使用時,請根據裝置標籤鍵規範和您的需求設定。更多資訊,請參見裝置標籤。 |
String.valueOf(random.nextInt(1000)) | 裝置標籤值(value),String類型。本樣本中,用 |
System.currentTimeMillis() | 擷取當前系統時間的毫秒數。 |
調用裝置屬性、事件批量上報介面
云云對接SDK封裝了資料批量上報介面,通過BatchPostEventPropertyMessage 對象執行個體,鏈式調用addProperty和addEvent方法,分別添加屬性和事件數目據後,再通過TslUplinkHandler調用對象執行個體BatchPostEventPropertyMessage ,實現裝置資料批量上報。
調用樣本:
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。本樣本的產品已定義功能屬性標識符為PowerConsumption、LightAdjustLevel。本樣本上報了兩屬性不同時間點的值。 |
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);
}
});