子设备接入
更新时间:2018-10-23 21:25:19
如果当前设备是一个网关,且该网关下的子设备需接入云端,此时需要使用子设备管理功能。
网关子设备管理提供了子设备动态注册、获取云端网关下子设备列表、添加子设备、删除子设备、子设备上线、子设备下线、监听子设备禁用和删除、代理子设备上下行的能力。
网关本身是一个直连设备可直接使用上述介绍的所有能力。网关和子设备之间的连接、数据通信需要用户处理。
说明 网关子设备管理相关接口参见设备 IGateway
设备每次初始建联的时候都需要调用添加、登录接口。
子设备动态注册
需要在云端开启允许动态注册功能,可以同时注册多个。子设备添加到网关之前需要先进行动态注册。
LinkKit.getInstance().getGateway().gatewaySubDevicRegister(getSubDevList(), new IConnectSendListener() {
@Override
public void onResponse(ARequest aRequest, AResponse aResponse) {
ALog.d(TAG, "onResponse() called with: aRequest = [" + aRequest + "], aResponse = [" + (aResponse == null ? "null" : aResponse.data) + "]");
try {
// 子设备动态注册成功
ResponseModel<List<DeviceInfo>> response = JSONObject.parseObject(aResponse.data.toString(), new TypeReference<ResponseModel<List<DeviceInfo>>>() {
}.getType());
// 根据 response 的数据判断是否成功 code=200
//TODO 保存子设备的三元组信息
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(ARequest aRequest, AError aError) {
// 子设备动态注册失败
}
});
获取子设备列表
获取网关当前在云端已经有哪些子设备。
LinkKit.getInstance().getGateway().gatewayGetSubDevices(new IConnectSendListener() {
@Override
public void onResponse(ARequest aRequest, AResponse aResponse) {
// 获取子设备列表结果
try {
ResponseModel<List<DeviceInfo>> response = JSONObject.parseObject(aResponse.data.toString(), new TypeReference<ResponseModel<List<DeviceInfo>>>() {
}.getType());
// TODO 根据实际应用场景处理
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(ARequest aRequest, AError aError) {
// 获取子设备列表失败
}
});
添加子设备
子设备动态注册完成之后,可以通过该接口将子设备添加到网关下。
final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 三元组 产品型号(必填)
deviceInfo.deviceName = deviceName; // 三元组 设备标识 (必填)
LinkKit.getInstance().getGateway().gatewayAddSubDevice(deviceinfo, new ISubDeviceConnectListener() {
@Override
public String getSignMethod() {
// 使用的签名方法
return "hmacsha1";
}
@Override
public String getSignValue() {
// 获取签名,用户使用 deviceSecret 获得签名结果
Map<String, String> signMap = new HashMap<>();
signMap.put("productKey", info.productKey);
signMap.put("deviceName", info.deviceName);
// signMap.put("timestamp", String.valueOf(System.currentTimeMillis()));
signMap.put("clientId", getClientId());
return SignUtils.hmacSign(signMap, info.deviceSecret);
}
@Override
public String getClientId() {
// clientId 可为任意值
return "id";
}
@Override
public void onConnectResult(boolean isSuccess, ISubDeviceChannel iSubDeviceChannel, AError aError) {
// 添加结果
if (isSuccess) {
// 子设备添加成功,接下来可以做子设备上线的逻辑
// subDevOnline(null);
}
}
@Override
public void onDataPush(String s, String s1) {
// 收到子设备下行数据 topic=" + s + ", data=" + s1
// 如禁用 删除 已经 设置、服务调用等
}
});
删除子设备
此处指在子设备的产品里面删除该子设备,并非删除和网关的拓扑关系。
final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 三元组 产品型号(必填)
deviceInfo.deviceName = deviceName; // 三元组 设备标识 (必填)
LinkKit.getInstance().getGateway().gatewayDeleteSubDevice(deviceinfo, new ISubDeviceRemoveListener() {
@Override
public void onSuceess() {
// 成功删除子设备 删除之前可先做下线操作
}
@Override
public void onFailed(AError aError) {
// 删除子设备失败
}
});
子设备上线
代理子设备上线,子设备上线之后可以执行子设备的订阅、发布等操作。
final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 三元组 产品型号(必填)
deviceInfo.deviceName = deviceName; // 三元组 设备标识 (必填)
LinkKit.getInstance().getGateway().gatewaySubDeviceLogin(deviceinfo, new ISubDeviceActionListener() {
@Override
public void onSuccess() {
// 代理子设备上线成功
// 上线之后可订阅 删除和禁用的下行通知
// subDevDisable(null);
// subDevDelete(null);
}
@Override
public void onFailed(AError aError) {
ALog.d(TAG, "onFailed() called with: aError = [" + aError + "]");
showToast("代理子设备上线失败");
log(TAG ,"代理子设备上线失败" + getPkDn(info));
}
});
子设备下线
子设备下线之后不可以进行子设备的发布、订阅、取消订阅等操作。
final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 三元组 产品型号(必填)
deviceInfo.deviceName = deviceName; // 三元组 设备标识 (必填)
LinkKit.getInstance().getGateway().gatewaySubDeviceLogout(deviceinfo, new ISubDeviceActionListener() {
@Override
public void onSuccess() {
// 代理子设备下线成功
}
@Override
public void onFailed(AError aError) {
// 代理子设备下线失败
}
});
监听子设备禁用、删除
网关设备可以在云端操作子设备,如禁用子设备、启用子设备、删除和子设备的拓扑关系。目前服务端只支持禁用子设备的下行通知。服务端在禁用子设备的时候会对子设备做下线处理,后续网关将不能代理子设备和云端做通信。
final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 三元组 产品型号(必填)
deviceInfo.deviceName = deviceName; // 三元组 设备标识 (必填)
LinkKit.getInstance().getGateway().gatewaySetSubDeviceDisableListener(deviceinfo, new IConnectRrpcListener() {
@Override
public void onSubscribeSuccess(ARequest aRequest) {
// 订阅成功
}
@Override
public void onSubscribeFailed(ARequest aRequest, AError aError) {
// 订阅失败
}
@Override
public void onReceived(ARequest aRequest, IConnectRrpcHandle iConnectRrpcHandle) {
// 子设备禁用通知
iConnectRrpcHandle.onRrpcResponse(null, null);
}
@Override
public void onResponseSuccess(ARequest aRequest) {
Log.d(TAG, "onResponseSuccess() called with: aRequest = [" + aRequest + "]");
}
@Override
public void onResponseFailed(ARequest aRequest, AError aError) {
Log.d(TAG, "onResponseFailed() called with: aRequest = [" + aRequest + "], aError = [" + aError + "]");
}
});
代理子设备物模型上下行
子设备物模型初始化
DeviceInfo deviceInfo = new DeviceInfo(); deviceInfo.productKey = productKey; deviceInfo.deviceName = deviceName; // deviceInfo.deviceSecret = "xxxx"; Map<String, ValueWrapper> subDevInitState = new HashMap<>(); // subDevInitState.put(); //TODO 用户根据实际情况设置 String tsl = null;// 用户根据实际情况设置,默认为空 直接从云端获取最细的 TSL LinkKit.getInstance().getGateway().initSubDeviceThing(tsl, deviceInfo, subDevInitState, new IDMCallback<InitResult>() { @Override public void onSuccess(InitResult initResult) { // 物模型初始化成功之后 可以做服务注册 上报等操作 } @Override public void onFailure(AError aError) { // 子设备初始化失败 } });
子设备物模型使用
接口使用和直连设备的物模型使用一致,获取 IThing 接口实现使用如下方式获取。// 获取 IThing 实例 IThing thing = LinkKit.getInstance().getGateway().getSubDeviceThing(mBaseInfo).first; // thing 有可能为空,如子设备未登录、物模型未初始化、子设备未添加到网关、子设备处于离线状态等。 // error 信息在 LinkKit.getInstance().getGateway().getSubDeviceThing(mBaseInfo).second 返回 // 参考示例 注意判空 thing.thingPropertyPost(reportData, new IPublishResourceListener() { @Override public void onSuccess(String s, Object o) { // 设备上报状态成功 } @Override public void onError(String s, AError aError) { // 设备上报状态失败 } });
子设备物模型销毁
反初始化物模型,后续如果需要重新使用需要重新走登录、物模型初始化流程。LinkKit.getInstance().getGateway().uninitSubDeviceThing(mBaseInfo);
代理子设备基础上下行
使用网关的通道执行子设备的数据上下行。
final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 三元组 产品型号(必填)
deviceInfo.deviceName = deviceName; // 三元组 设备标识 (必填)
String topic = xxx;
String publishData = xxx;
// 订阅
LinkKit.getInstance().getGateway().gatewaySubDeviceSubscribe(topic, deviceinfo, new ISubDeviceActionListener() {
@Override
public void onSuccess() {
// 代理子设备订阅成功
}
@Override
public void onFailed(AError aError) {
// 代理子设备订阅失败
}
});
//发布
LinkKit.getInstance().getGateway().gatewaySubDevicePublish(topic, publishData, deviceinfo, new ISubDeviceActionListener() {
@Override
public void onSuccess() {
// 代理子设备发布成功
}
@Override
public void onFailed(AError aError) {
// 代理子设备发布失败
}
});
// 取消订阅
LinkKit.getInstance().getGateway().gatewaySubDeviceUnsubscribe(topic, deviceinfo, new ISubDeviceActionListener() {
@Override
public void onSuccess() {
// 代理子设备取消订阅成功
}
@Override
public void onFailed(AError aError) {
// 代理子设备取消订阅事变
}
});