API通道SDK是IoT官方服务的API通道。 API通道基于HTTPS协议,并通过整合安全组件来提升通道的安全性。集成该SDK后,可以通过调用SDK的请求接口,完成对生活物联网平台云端接口的调用。

引入方式

  • 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>;
    }

初始化

初始化前需确保已集成安全图片,初始化的操作请参见SDK初始化

使用方式

  • 请求调用

    以下接口示例是根据设备端iotId查询设备的详情和绑定关系的接口,云端介绍请参见根据设备获取绑定关系

    // 构建请求
    
    Map<String, Object> params = new HashMap<>();
    params.put("pageNo", 1);
    params.put("pageSize", 100);
    // iotId获取当前账号绑定设备列表的时候可以拿到,对应唯一设备
    params.put("iotId", "xxxx); 
    
    IoTRequest request = new IoTRequestBuilder()
        .setScheme(Scheme.HTTPS) // 如果是HTTPS,可以省略本设置
        // .setHost(host) // 如果是IoT官方服务,可以省略本设置
        .setPath("uc/listBindingByDev") // 参照业务API文档,设置path
        .setApiVersion("1.0.2")  // 参照业务API文档,设置apiVersion
        .authType("iotAuth") // 云端接口需要用户身份鉴权的时候需要设置,云端接口不需要鉴权的时候不设置,本接口示例需要
        .addParam("input", "测试") // 参照业务API文档,设置params,也可使用setParams(Map<Strign,Object> params)
        .build();
    
    // 获取Client实例,并发送请求
    IoTAPIClient ioTAPIClient = new IoTAPIClientFactory().getClient();
    ioTAPIClient.send(request, new IoTCallback() {
        @Override
        public void onFailure(IoTRequest request, Exception e) {
            // TODO根据e,处理异常
        }
    
        @Override
        public void onResponse(IoTRequest request, IoTResponse response) {
            int code = response.getCode();
    
            // 200 代表成功
            if(200 != code){
                //失败示例,参见 "异常数据返回示例"
                String mesage = response.getMessage();
                String localizedMsg = response.getLocalizedMsg();
                //TODO,根据mesage和localizedMsg,处理失败信息
                return;
            }
            Object data = response.getData();
            //TODO,可以将data转成一个本地的对象或者直接使用JSONObject进行数据解析
    
            /**
             * 解析data,data示例参见"正常数据返回示例"
             * 以下解析示例采用fastjson针对"正常数据返回示例",解析各个数据节点
            */
            JSONObject jsonObject = JSON.parseObject(data);
            //获取业务层code
            String codeBiz = jsonObject.getString("code");
            //获取业务返回的数据
            JSONObject dataBizJsonObject = jsonObject.getJSONObject("data");
            //获取data,data数据是一个JSONArray,即设备列表
            JSONArray devListJsonArray = dataBizJsonObject.getJSONArray("data");
            //后续具体设备信息,则是对devListJsonArray进行一个遍历解析了
            if (devListJsonArray != null) {
                for (int i = 0; i < devListJsonArray.size(); i++) {
                    JSONObject devJsonObject = devListJsonArray.getJSONObject(i);
                    // TODO 从 devJsonObject 解析出各个字段
                }
            }
        }
    });    
  • 正常数据返回示例
    {
        "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"
    }
  • 异常数据返回示例
    {
         "code":2064,
         "id":"4fa207ca-fffd-xxxx-xxxx-e6f7ca6c99c3",
         "localizedMsg":"请求错误",
         "message":"need authorize to bind"
    }

添加日志

API通道SDK本身没有输出任何请求日志(从性能和安全性的角度考虑)。您在开发过程中,可以选择以下任一方式来打印日志。

  • 自行添加Tracker
  • 使用内置的LogTracker(如以下代码所示)
  • 在初始化中,传入debug=true
  • 初始化后调用IoTSmart.setDebug(true)打开SDK调试日志开关
IoTAPIClientImpl.getInstance().registerTracker(new Tracker() {
    @Override
    public void onSend(IoTRequest ioTRequest) {
        // 收到上层接口请求,请求发送前触发
    }

    @Override
    public void onFailure(IoTRequest ioTRequest, Exception e) {
        // 请求失败时触发
    }

    @Override
    public void onResponse(IoTRequest ioTRequest, IoTResponse ioTResponse) {
        // 请求成功时触发
    }

    @Override
    public void onRealSend(IoTRequestWrapper ioTRequestWrapper) {
        // 上层接口发送之后触发
    }

    @Override
    public void onRawFailure(IoTRequestWrapper ioTRequestWrapper, Exception e) {
        // API 网关 SDK 接口请求失败时触发
    }

    @Override
    public void onRawResponse(IoTRequestWrapper ioTRequestWrapper, IoTResponse ioTResponse) {
        // API 网关 SDK 接口响应成功时触发    
    }
});

切换语言(国际化)

为了满足国际化需求,自有App可以支持多种语言。如果您需要切换语言,请参见国际站开发实践专题

常见错误

错误码列表包含了初始化常见的一些错误,可以在logcat中看到如下异常信息。其它业务相关接口错误码、含义及解决方式请参见 常见问题

错误码 含义 解决方法
103 安全组件so加载失败 过滤掉x86架构
202 安全图片与当前apk的签名不匹配导致的 修改当前apk签名或者重新上传apk生成新的安全图片
203 未找到安全图片
  • 检查安全图片是否存在或者authCode是否正确
  • 是否开启资源优化导致
  • 是否启用instant run导致无法加载