认证与连接
更新时间: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>