全部产品
云市场

认证与连接

更新时间:2019-10-10 09:48:50

本文介绍如何进行 SDK 初始化,建立设备与云端的连接。

设备认证

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

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

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

一型一密动态注册

如果设备认证选择了一型一密,需要先调用动态注册接口,一机一密设备可以跳过这一步,直接调用初始化接口。动态注册成功之后,持久化获取到的三元组信息,然后调用初始化接口。设备三元组信息(productKey、deviceName、deviceSecret)需要持久化存在本地。动态初始化成功,初始化建联之后,不能再执行动态初始化,后续重新运行程序都需要从持久化存储中获取三元组,然后执行初始化建联。LinkKitInitParams 初始化参数。

  1. // ####### 一型一密动态注册接口开始 ######
  2. /**
  3. * 注意:动态注册成功,设备上线之后,不能再次执行动态注册,云端会返回已注册。
  4. */
  5. DeviceInfo deviceInfo = new DeviceInfo();
  6. deviceInfo.productKey = "xx"; //必填
  7. deviceInfo.deviceName = "xx"; //必填
  8. deviceInfo.productSecret = "xx"; //必填
  9. LinkKitInitParams params = new LinkKitInitParams();
  10. IoTMqttClientConfig config = new IoTMqttClientConfig();
  11. config.productKey = deviceInfo.productKey;
  12. config.deviceName = deviceInfo.deviceName;
  13. params.mqttClientConfig = config;
  14. params.deviceInfo = deviceInfo;
  15. final CommonRequest request = new CommonRequest();
  16. request.setPath("/auth/register/device");
  17. LinkKit.getInstance().deviceRegister(params, request, new IoTCallback() {
  18. public void onFailure(CommonRequest commonRequest, Exception e) {
  19. ALog.e(TAG, "动态注册失败 " + e);
  20. }
  21. public void onResponse(CommonRequest commonRequest, CommonResponse commonResponse) {
  22. if (commonResponse == null || StringUtils.isEmptyString(commonResponse.getData())) {
  23. ALog.e(TAG, "动态注册失败 response=null");
  24. return;
  25. }
  26. try {
  27. ResponseModel<Map<String, String>> response = new Gson().fromJson(commonResponse.getData(), new TypeToken<ResponseModel<Map<String, String>>>() {
  28. }.getType());
  29. if (response != null && "200".equals(response.code)) {
  30. ALog.d(TAG, "动态注册成功" + (commonResponse == null ? "" : commonResponse.getData()));
  31. /** 获取 deviceSecret, 存储到本地,然后执行初始化建联
  32. * 这个流程只能走一次,获取到 secret 之后,下次启动需要读取本地存储的三元组,
  33. * 直接执行初始化建联,不可以再走动态初始化
  34. */
  35. // deviceSecret = response.data.get("deviceSecret");
  36. // init(pk,dn,ds);
  37. return;
  38. }
  39. } catch (Exception e) {
  40. }
  41. ALog.d(TAG, "动态注册失败" + commonResponse.getData());
  42. }
  43. });
  44. // ####### 一型一密动态注册接口结束 ######

SDK 初始化

SDK初始化,即一机一密建联。设备如果初始化失败,如网络问题,请做业务重试确保初始化成功,初始化成功之后和云端的连接的断连重试由SDK 负责。onInitDone表示初始化成功,onError表示初始化失败。

```javaLinkKitInitParams params = new LinkKitInitParams();/**

  • 设置 Mqtt 初始化参数/IoTMqttClientConfig config = new IoTMqttClientConfig();config.productKey = pk;config.deviceName = dn;config.deviceSecret = ds;/*
  • 是否接受离线消息
  • 对应 mqtt 的 cleanSession 字段*/config.receiveOfflineMsg = false;params.mqttClientConfig = config;

/**

  • 设置初始化三元组信息,用户传入*/DeviceInfo deviceInfo = new DeviceInfo();deviceInfo.productKey = pk;deviceInfo.deviceName = dn;deviceInfo.deviceSecret = ds;

params.deviceInfo = deviceInfo;

/**

  • 设置设备当前的初始状态值,属性需要和云端创建的物模型属性一致
  • 如果这里什么属性都不填,物模型就没有当前设备相关属性的初始值。
  • 用户调用物模型上报接口之后,物模型会有相关数据缓存。*/Map propertyValues = new HashMap();// 示例// propertyValues.put(“LightSwitch”, new ValueWrapper.BooleanValueWrapper(0));params.propertyValues = propertyValues;

LinkKit.getInstance().init(params, new ILinkKitConnectListener() { public void onError(AError aError) { ALog.e(TAG, “Init Error error=” + aError); }

  1. public void onInitDone(InitResult initResult) {
  2. ALog.i(TAG, "onInitDone result=" + initResult);
  3. }

});

  1. <a name="wd3wwn"></a>
  2. ## [](#wd3wwn)SDK 反初始化
  3. 如果需要注销初始化,调用如下接口。[IConnectNotifyListener](http://gaic.alicdn.com/ztms/java-iot-device-sdk-demo-v0130/html/com/aliyun/alink/linksdk/cmp/core/listener/IConnectNotifyListener.html) 是全局下行数据和连接状态监听。
  4. > ```java
  5. // 取消注册 notifyListener,notifyListener对象需和注册的时候是同一个对象
  6. LinkKit.getInstance().unRegisterOnNotifyListener(notifyListener);
  7. LinkKit.getInstance().deinit();

其他设置

日志开关

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

  1. ALog.setLevel(ALog.LEVEL_DEBUG);

连接状态监听

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

  1. IConnectNotifyListener notifyListener = new IConnectNotifyListener() {
  2. @Override
  3. public void onNotify(String connectId, String topic, AMessage aMessage) {
  4. // 云端下行数据回调
  5. // connectId 连接类型 topic 下行 topic; aMessage 下行数据
  6. //String pushData = new String((byte[]) aMessage.data);
  7. // pushData 示例 {"method":"thing.service.test_service","id":"123374967","params":{"vv":60},"version":"1.0.0"}
  8. // method 服务类型; params 下推数据内容
  9. }
  10. @Override
  11. public boolean shouldHandle(String connectId, String topic) {
  12. // 选择是否不处理某个 topic 的下行数据
  13. // 如果不处理某个topic,则onNotify不会收到对应topic的下行数据
  14. return true; //TODO 根基实际情况设置
  15. }
  16. @Override
  17. public void onConnectStateChange(String connectId, ConnectState connectState) {
  18. // 对应连接类型的连接状态变化回调,具体连接状态参考 SDK ConnectState
  19. }
  20. }
  21. // 注册下行监听,包括长连接的状态和云端下行的数据
  22. LinkKit.getInstance().registerOnNotifyListener(notifyListener);

请求域名

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

  • MQTT域名设置

SDK初始化的时候添加以下设置。

  1. // 设置 Mqtt 请求域名 LinkKitInitParams 初始化参数
  2. IoTMqttClientConfig clientConfig = new IoTMqttClientConfig();
  3. // 慎用 设置 mqtt 请求域名,默认productKey+".iot-as-mqtt.cn-shanghai.aliyuncs.com:1883" ,如果无具体的业务需求,请不要设置。
  4. //clientConfig.channelHost = "xxx";
  5. linkKitInitParams.mqttClientConfig = clientConfig;
  • 一型一密域名设置

SDK动态注册的时候添加以下设置。

  1. HubApiRequest hubApiRequest = new HubApiRequest();
  2. // 一型一密域名 默认"iot-auth.cn-shanghai.aliyuncs.com"
  3. // hubApiRequest.domain = "xxx"; // 如无特殊需求,不要设置

Mqtt 连接参数

  • 设置Mqtt Keep-Alive 时间
  1. // interval 单位秒
  2. MqttConfigure.setKeepAliveInterval(int interval);
  • qos设置
  1. MqttPublishRequest request = new MqttPublishRequest();
  2. // 支持 0 和 1, 默认0
  3. request.qos = 0;
  4. request.isRPC = false;
  5. request.topic = topic.replace("request", "response");
  6. String resId = topic.substring(topic.indexOf("rrpc/request/")+13);
  7. request.msgId = resId;
  8. // TODO 用户根据实际情况填写 仅做参考
  9. request.payloadObj = "{\"id\":\"" + resId + "\", \"code\":\"200\"" + ",\"data\":{} }";
  • cleanSession 设置
  1. /**
  2. * 设置 Mqtt 初始化参数
  3. */
  4. IoTMqttClientConfig config = new IoTMqttClientConfig();
  5. config.productKey = deviceInfoData.productKey;
  6. config.deviceName = deviceInfoData.deviceName;
  7. config.deviceSecret = deviceInfoData.deviceSecret;
  8. config.channelHost = pk + ".iot-as-mqtt." + deviceInfoData.region + ".aliyuncs.com:1883";
  9. /**
  10. * 是否接受离线消息
  11. * 对应 receiveOfflineMsg = !cleanSession, 默认不接受离线消息
  12. */
  13. config.receiveOfflineMsg = false;
  14. params.mqttClientConfig = config;