认证与连接

更新时间:2018-10-23 21:22:27

本文介绍如何初始化设备信息,建立设备与云端的连接。</span>

设备认证

设备的身份认证支持两种方法,不同方法需填写不同信息。

  • 若使用一机一密认证方式,需要有ProductKey、DeviceName和DeviceSecret。

  • 若使用一型一密认证方式,需要有ProductKey、ProductSecret和DeviceName,并在控制台开启动态注册。
    说明 若使用一型一密认证方式,初始化过程中需设置一型一密动态注册接口。

DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 三元组 产品型号(必填)
deviceInfo.deviceName = deviceName; // 三元组 设备标识 (必填)
deviceInfo.deviceSecret = deviceSecret; // 三元组 设备密钥 (一机一密必填)
deviceInfo.productSecret = productSecret; // 产品密钥(一型一密必填)

请求域名

云端接口的请求域名,请参考地域和可用区查看支持的域名。

// 请求域名
IoTApiClientConfig userData = new IoTApiClientConfig();
// 预留 目前不需要设置
  • MQTT域名设置

      // 设置 Mqtt 请求域名
      IoTMqttClientConfig clientConfig = new IoTMqttClientConfig(productKey, deviceName, deviceSecret);
      // 慎用 设置 mqtt 请求域名,默认".iot-as-mqtt.cn-shanghai.aliyuncs.com:1883" ,如果无具体的业务需求,请不要设置。
      //clientConfig.channelHost = "xxx";
      params.mqttClientConfig = clientConfig;
    
  • 一型一密域名设置

      // 一型一密域名 默认"iot-auth.cn-shanghai.aliyuncs.com" 
      // hubApiRequest.domain = "xxx";  // 如无特殊需求,不要设置
      hubApiRequest.path = "/auth/register/device";
    

设备属性初始值

// 设备属性初始值
Map<String, ValueWrapper> propertyValues = new HashMap<>();
// TODO 开发者需根据实际产品从设备获取属性值,如果不使用物模型无需设置属性初始值
//propertyValues.put("LightSwitch", new ValueWrapper.BooleanValueWrapper(0));

LinkKitInitParams params = new LinkKitInitParams();
params.deviceInfo = deviceInfo;
params.propertyValues = propertyValues;
params.connectConfig = userData;

// 如果不设置建联之后会从云端更新最新的TSL
// 如果主动设置TSL,需确保TSL和线上完全一致,且功能定义与云端一致
// params.tsl = "{xxx}"; // 不建议用户设置,直接依赖SDK从云端更新最新的TSL即可

监听

如果需要监听设备的上下线信息,云端下发的所有数据,可以设置以下监听器。

// 注册下行监听
// 包括长连接的状态
// 云端下行的数据
LinkKit.getInstance().registerOnPushListener(new IConnectNotifyListener() {
    @Override
    public void onNotify(String connectId, String topic, AMessage aMessage) {
        // 云端下行数据回调
        // connectId 连接类型 topic 下行 topic aMessage 下行数据
    }

    @Override
    public boolean shouldHandle(String connectId, String topic) {
        // 选择是否不处理某个 topic 的下行数据
        // 如果不处理某个topic,则onNotify不会收到对应topic的下行数据
        return true; //TODO 根基实际情况设置
    }

    @Override
    public void onConnectStateChange(String connectId, ConnectState connectState) {
        // 对应连接类型的连接状态变化回调,具体连接状态参考 SDK ConnectState
    }
});

一型一密动态注册

如果设备认证选择了一型一密,还需要设置动态注册接口。</span>

//  #######  一型一密动态注册接口开始 ######
// 如果是一型一密的设备,需要先调用动态注册接口;一机一密设备不需要执行此流程
HubApiRequest hubApiRequest = new HubApiRequest();
hubApiRequest.path = "/auth/register/device";
LinkKit.getInstance().deviceRegister(context, params, hubApiRequest, new IConnectSendListener() {
    @Override
    public void onResponse(ARequest aRequest, AResponse aResponse) {
        // aRequest 用户的请求数据
        if (aResponse != null && aResponse.data != null) {
            ResponseModel<Map<String, String>> response = JSONObject.parseObject(aResponse.data.toString(),
                    new TypeReference<ResponseModel<Map<String, String>>>() {
                    }.getType());
            if ("200".equals(response.code) && response.data != null && response.data.containsKey("deviceSecret") &&
                    !TextUtils.isEmpty(response.data.get("deviceSecret"))) {
                deviceInfo.deviceSecret = response.data.get("deviceSecret");
                // getDeviceSecret success, to build connection.
                // 持久化 deviceSecret 初始化建联的时候需要
                // TODO  用户需要按照实际场景持久化设备的三元组信息,用于后续的连接
                // 成功获取 deviceSecret,调用初始化接口建联
                // TODO 调用设备初始化建联
            }
        }
    }

    @Override
    public void onFailure(ARequest aRequest, AError aError) {
        Log.d(TAG, "onFailure() called with: aRequest = [" + aRequest + "], aError = [" + aError + "]");
    }
});
//  ####### 一型一密动态注册接口结束  ######

// 设备初始化建联  如果是一型一密设备,需要在获取deviceSecret成功之后执行该操作。
LinkKit.getInstance().init(context, params, new ILinkKitConnectListener() {
    @Override
    public void onError(AError error) {
        // 初始化失败 error包含初始化错误信息 
    }

    @Override
    public void onInitDone(Object data) {
        // 初始化成功 data 作为预留参数
    }
});

日志

打开SDK内部日志输出开关:

ALog.setLevel(ALog.LEVEL_DEBUG);

初始化结果

初始化成功会收到 onInitDone 回调,失败会收到 onError 回调。DeviceInfo 结构体内容可参见 </span>DeviceInfo ApiReference</span>

results matching ""

    No results matching ""