本文介绍如何进行Java Link SDK初始化,建立设备与物联网平台的连接。

背景信息

  • Java Link SDK仅支持设备密钥方式,进行设备身份认证,具体包括以下几种认证方式。
    认证方式 说明 相关文档
    一机一密 每台设备烧录自己的设备证书(ProductKey、DeviceName和DeviceSecret)。 一机一密
    一型一密预注册
    • 同一产品下设备烧录相同产品证书(ProductKey和ProductSecret)。
    • 产品需开启动态注册功能。
    • 设备通过动态注册获取DeviceSecret。
    一型一密
    说明

    一型一密预注册和免预注册的区别,请参见预注册和免预注册的区别

    一型一密免预注册
    • 同一产品下设备烧录相同产品证书(ProductKey和ProductSecret)。
    • 产品需开启动态注册功能。
    • 设备通过动态注册获取ClientID与DeviceToken的组合。
  • Java Link SDK中参数说明,请参见LinkKitInitParams

动态注册

一型一密的设备认证方式的示例代码如下:

//  #######  一型一密动态注册接口 ######
/**
 * 注意:动态注册成功,设备上线之后,不能再次执行动态注册。如果设备上线后再次注册,物联网平台返回已注册。
 */
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = "al8wP******"; //必填
deviceInfo.deviceName = "LightSwitch"; //必填
deviceInfo.productSecret = "i11iUSWBiK6RhSO1Cx7DCB0C16******"; //必填

LinkKitInitParams params = new LinkKitInitParams();
IoTMqttClientConfig config = new IoTMqttClientConfig();
config.productKey = deviceInfo.productKey;
config.deviceName = deviceInfo.deviceName;

params.mqttClientConfig = config;
params.deviceInfo = deviceInfo;

final CommonRequest request = new CommonRequest();
request.setPath("/auth/register/device");
LinkKit.getInstance().deviceRegister(params, request, new IoTCallback() {
    public void onFailure(CommonRequest commonRequest, Exception e) {
        ALog.e(TAG, "动态注册失败 " + e);
    }

    public void onResponse(CommonRequest commonRequest, CommonResponse commonResponse) {
        if (commonResponse == null || StringUtils.isEmptyString(commonResponse.getData())) {
            ALog.e(TAG, "动态注册失败 response=null");
            return;
        }
        try {
            ResponseModel<Map<String, String>> response = new Gson().fromJson(commonResponse.getData(), new TypeToken<ResponseModel<Map<String, String>>>() {
            }.getType());
            if (response != null && "200".equals(response.code)) {
                ALog.d(TAG, "动态注册成功" + (commonResponse == null ? "" : commonResponse.getData()));
                /**  获取 deviceSecret, 存储到本地,然后执行初始化建联
                 * 该流程仅一次,获取DeviceSecret后,下次启动需要读取本地存储的设备认证信息,
                 * 直接执行初始化建立连接,不可再次动态初始化
                 */
                // deviceSecret = response.data.get("deviceSecret");
                // init(pk,dn,ds);
                return;
            }
        } catch (Exception e) {

        }
        ALog.d(TAG, "动态注册失败" + commonResponse.getData());
    }
});
//  ####### 一型一密动态注册接口结束  ######
            

一机一密

一型一密的设备认证方式的示例代码如下:

LinkKitInitParams 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);
    }

    public void onInitDone(InitResult initResult) {
        ALog.i(TAG, "onInitDone result=" + initResult);
    }
});
            
说明
  • 发起初始化请求后,如果返回onInitDone表示初始化成功,返回onError表示初始化失败。
  • 初始化失败后,您可以根据业务需要,设置是否再次进行初始化,Java Link SDK不会自动尝试连接物联网平台。
  • 初始化成功后,如果设备异常断开,Java Link SDK会自动重连。

设置接入域名

示例代码如下:

// 设置MQTT请求域名LinkKitInitParams初始化参数
IoTMqttClientConfig clientConfig = new IoTMqttClientConfig();
clientConfig.channelHost = "a18wP******.iot-as-mqtt.cn-shanghai.aliyuncs.com";
linkKitInitParams.mqttClientConfig = clientConfig;
            
参数说明:
参数 示例 说明
channelHost a18wP******.iot-as-mqtt.cn-shanghai.aliyuncs.com 设备的接入域名。
  • 企业版实例和新版公共实例:在实例详情页面的开发配置面板,查看接入域名。
  • 旧版公共实例:接入域名格式为${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com

新旧版公共实例和企业版实例、以及接入域名的更多信息,请参见实例管理

更多设置

您可以设置以下参数,实现设备接入相关的更多设置。

  • MQTT连接:
    配置项 说明 相关代码
    保活时间 设置设备的保活时间。通过该设置实现设备与物联网平台保持长连接。
    MqttConfigure.setKeepAliveInterval(int interval);
    QoS等级 设置QoS(Quality of Service)等级,即物联网平台与设备之间保证交付信息的协议。仅支持:
    • 0:最多一次。
    • 1:最少一次。
    - qos设置
    MqttPublishRequest request = new MqttPublishRequest();
    // 支持 0 和 1, 默认0
    request.qos = 0;
    request.isRPC = false;
    request.topic = topic.replace("request", "response");
    String resId = topic.substring(topic.indexOf("rrpc/request/")+13);
    request.msgId = resId;
    // TODO 用户根据实际情况填写 仅做参考
    request.payloadObj = "{\"id\":\"" + resId + "\", \"code\":\"200\"" + ",\"data\":{} }";
    离线消息 通过cleanSession,设置是否接收离线消息。
    
    /**
     * 设置MQTT初始化参数
     */
    IoTMqttClientConfig config = new IoTMqttClientConfig();
    config.productKey = deviceInfoData.productKey;
    config.deviceName = deviceInfoData.deviceName;
    config.deviceSecret = deviceInfoData.deviceSecret;
    config.channelHost = pk + ".iot-as-mqtt." + deviceInfoData.region + ".aliyuncs.com:1883";
    /**
     * 是否接受离线消息
     * 对应 receiveOfflineMsg = !cleanSession, 默认不接受离线消息
     */
    config.receiveOfflineMsg = false;
    params.mqttClientConfig = config;
  • 日志开关:

    如果需要设备连接物联网平台的本地日志,可以设置以下日志开关。

    ALog.setLevel(ALog.LEVEL_DEBUG);
  • 连接状态监听:

    如果需要监听设备的上下线信息,以及物联网平台下发的消息,可以设置以下监听器。

    IConnectNotifyListener notifyListener = new IConnectNotifyListener() {
        @Override
        public void onNotify(String connectId, String topic, AMessage aMessage) {
            // 物联网平台下行数据回调,包括connectId、连接类型、下行Topic和aMessage下行数据
            //String pushData = new String((byte[]) aMessage.data);
            // pushData示例  {"method":"thing.service.test_service","id":"123374967","params":{"vv":60},"version":"1.0.0"}
            // 上一行代码表示method服务类型以及params下推数据内容    
    }
    
        @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
        }
    }
    // 注册下行监听,包括长连接的状态和下行的数据
    LinkKit.getInstance().registerOnNotifyListener(notifyListener);
                
  • 反初始化:

    如果需要注销初始化,请参考如下示例代码。

    // 取消注册 notifyListener,notifyListener对象需和注册的时候是同一个对象
    LinkKit.getInstance().unRegisterOnNotifyListener(notifyListener);
    LinkKit.getInstance().deinit();