API通道SDK
API通道SDK是IoT官方服務(wù)的API通道。API通道基于HTTPS協(xié)議,并通過整合安全組件來提升通道的安全性。集成該SDK后,可以通過調(diào)用SDK的請(qǐng)求接口,完成對(duì)生活物聯(lián)網(wǎng)平臺(tái)云端接口的調(diào)用。
引入方式
Maven倉庫
maven { url "http://maven.aliyun.com/nexus/content/repositories/releases/" }
gradle依賴
api 'com.aliyun.iot.aep.sdk:apiclient:0.0.9.1' api 'com.aliyun.alink.linksdk:api-client-biz:1.0.1'
混淆配置
在proguard-rules.pro文件中,加入以下代碼,排除不需要被混淆的類和方法。
-keep public class com.aliyun.iot.aep.sdk.apiclient.** { public <methods>; public <fields>; }
初始化
初始化的操作請(qǐng)參見SDK初始化。
使用方式
請(qǐng)求調(diào)用
以下接口示例是根據(jù)設(shè)備端iotId查詢?cè)O(shè)備的詳情和綁定關(guān)系的接口,云端介紹請(qǐng)參見根據(jù)設(shè)備獲取綁定關(guān)系。
// 構(gòu)建請(qǐng)求 Map<String, Object> params = new HashMap<>(); params.put("pageNo", 1); params.put("pageSize", 100); // iotId獲取當(dāng)前賬號(hào)綁定設(shè)備列表的時(shí)候可以拿到,對(duì)應(yīng)唯一設(shè)備 params.put("iotId", "xxxx); IoTRequest request = new IoTRequestBuilder() .setScheme(Scheme.HTTPS) // 設(shè)置Scheme方式,取值范圍:Scheme.HTTP或Scheme.HTTPS,默認(rèn)為Scheme.HTTPS .setPath("uc/listBindingByDev") // 參照API文檔,設(shè)置API接口描述中的Path,本示例為uc/listBindingByDev .setApiVersion("1.0.2") // 參照API文檔,設(shè)置API接口的版本號(hào),本示例為1.0.2 .authType("iotAuth") // 當(dāng)云端接口需要用戶身份鑒權(quán)時(shí)需要設(shè)置該參數(shù),反之則不需要設(shè)置 .addParam("input", "測試") // 參照API文檔,設(shè)置API接口的參數(shù),也可以使用.setParams(Map<Strign,Object> params)來設(shè)置 .build(); // 獲取Client實(shí)例,并發(fā)送請(qǐng)求 IoTAPIClient ioTAPIClient = new IoTAPIClientFactory().getClient(); ioTAPIClient.send(request, new IoTCallback() { @Override public void onFailure(IoTRequest request, Exception e) { // TODO根據(jù)e,處理異常 } @Override public void onResponse(IoTRequest request, IoTResponse response) { int code = response.getCode(); // 200 代表成功 if(200 != code){ //失敗示例,參見 "異常數(shù)據(jù)返回示例" String mesage = response.getMessage(); String localizedMsg = response.getLocalizedMsg(); //TODO,根據(jù)mesage和localizedMsg,處理失敗信息 return; } Object data = response.getData(); //TODO,可以將data轉(zhuǎn)成一個(gè)本地的對(duì)象或者直接使用JSONObject進(jìn)行數(shù)據(jù)解析 /** * 解析data,data示例參見"正常數(shù)據(jù)返回示例" * 以下解析示例采用fastjson針對(duì)"正常數(shù)據(jù)返回示例",解析各個(gè)數(shù)據(jù)節(jié)點(diǎn) */ if (data == null) { return; } JSONObject jsonObject = JSON.parseObject(data.toString()); //獲取業(yè)務(wù)層code String codeBiz = jsonObject.getString("code"); //獲取業(yè)務(wù)返回的數(shù)據(jù) JSONObject dataBizJsonObject = jsonObject.getJSONObject("data"); //獲取data,data數(shù)據(jù)是一個(gè)JSONArray,即設(shè)備列表 JSONArray devListJsonArray = dataBizJsonObject.getJSONArray("data"); //后續(xù)具體設(shè)備信息,則是對(duì)devListJsonArray進(jìn)行一個(gè)遍歷解析了 if (devListJsonArray != null) { for (int i = 0; i < devListJsonArray.size(); i++) { JSONObject devJsonObject = devListJsonArray.getJSONObject(i); // TODO 從 devJsonObject 解析出各個(gè)字段 } } } });
正常數(shù)據(jù)返回示例
{ "code":200, "data":{ "total":1, "data":[ { "productModel":"X1", "gmtModified":1581772608000, "categoryImage":"http://iotx-paas-admin.oss-cn-shanghai.aliyuncs.com/publish-sg/image/xxxx.png", "netType":"NET_WIFI", "description":"February 15, 2020 9:16:48 PM CST Add binding", "nodeType":"DEVICE", "productKey":"xxx", "deviceName":"xxxx", "productName":"xxxx", "identityAlias":"xxxxxx", "iotId":"xrHAYrQDFSEpexxxx", "owned":1, "identityId":"5053ope232f4xxxx", "thingType":"DEVICE", "status":3 } ], "pageNo":1, "pageSize":100 }, "id":"5168fe23-xxx-xxx-962c-1f61b8bdbd2d" }
異常數(shù)據(jù)返回示例
{ "code":2064, "id":"4fa207ca-fffd-xxxx-xxxx-e6f7ca6c99c3", "localizedMsg":"請(qǐng)求錯(cuò)誤", "message":"need authorize to bind" }
添加日志
API通道SDK本身沒有輸出任何請(qǐng)求日志(從性能和安全性的角度考慮)。您在開發(fā)過程中,可以選擇以下任一方式來打印日志。
自行添加Tracker。
使用內(nèi)置的LogTracker(如以下代碼所示)。
在初始化中,傳入
debug=true
。初始化后調(diào)用
IoTSmart.setDebug(true)
打開SDK調(diào)試日志開關(guān)。
IoTAPIClientImpl.getInstance().registerTracker(new Tracker() {
@Override
public void onSend(IoTRequest ioTRequest) {
// 收到上層接口請(qǐng)求,請(qǐng)求發(fā)送前觸發(fā)
}
@Override
public void onFailure(IoTRequest ioTRequest, Exception e) {
// 請(qǐng)求失敗時(shí)觸發(fā)
}
@Override
public void onResponse(IoTRequest ioTRequest, IoTResponse ioTResponse) {
// 請(qǐng)求成功時(shí)觸發(fā)
}
@Override
public void onRealSend(IoTRequestWrapper ioTRequestWrapper) {
// 上層接口發(fā)送之后觸發(fā)
}
@Override
public void onRawFailure(IoTRequestWrapper ioTRequestWrapper, Exception e) {
// API 網(wǎng)關(guān) SDK 接口請(qǐng)求失敗時(shí)觸發(fā)
}
@Override
public void onRawResponse(IoTRequestWrapper ioTRequestWrapper, IoTResponse ioTResponse) {
// API 網(wǎng)關(guān) SDK 接口響應(yīng)成功時(shí)觸發(fā)
}
});
常見錯(cuò)誤
錯(cuò)誤碼列表包含了初始化常見的一些錯(cuò)誤,可以在logcat中看到如下異常信息。其它業(yè)務(wù)相關(guān)接口錯(cuò)誤碼、含義及解決方式請(qǐng)參見 常見問題。
錯(cuò)誤碼 | 含義 | 解決方法 |
103 | 安全組件so加載失敗 | 過濾掉x86架構(gòu) |
202 | 安全圖片與當(dāng)前apk的簽名不匹配導(dǎo)致的 | 修改當(dāng)前apk簽名 |
203 | 未找到安全圖片 |
|