package com.mm.android.deviceaddmodule.model;
|
|
import android.os.Handler;
|
import android.text.TextUtils;
|
|
import com.company.NetSDK.CFG_NETAPP_WLAN;
|
import com.company.NetSDK.EM_LOGIN_SPAC_CAP_TYPE;
|
import com.company.NetSDK.EM_WLAN_SCAN_AND_CONFIG_TYPE;
|
import com.company.NetSDK.FinalVar;
|
import com.company.NetSDK.INetSDK;
|
import com.company.NetSDK.NET_DEVICEINFO_Ex;
|
import com.company.NetSDK.NET_IN_GET_DEV_WIFI_LIST;
|
import com.company.NetSDK.NET_IN_INIT_DEVICE_ACCOUNT;
|
import com.company.NetSDK.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY;
|
import com.company.NetSDK.NET_IN_SET_DEV_WIFI;
|
import com.company.NetSDK.NET_IN_WLAN_ACCESSPOINT;
|
import com.company.NetSDK.NET_OUT_GET_DEV_WIFI_LIST;
|
import com.company.NetSDK.NET_OUT_INIT_DEVICE_ACCOUNT;
|
import com.company.NetSDK.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY;
|
import com.company.NetSDK.NET_OUT_SET_DEV_WIFI;
|
import com.company.NetSDK.NET_OUT_WLAN_ACCESSPOINT;
|
import com.company.NetSDK.NET_WLAN_ACCESSPOINT_INFO;
|
import com.company.NetSDK.SDKDEV_NETINTERFACE_INFO;
|
import com.company.NetSDK.SDKDEV_WLAN_DEVICE_LIST_EX;
|
import com.company.NetSDK.SDK_PRODUCTION_DEFNITION;
|
import com.lechange.opensdk.device.LCOpenSDK_DeviceInit;
|
import com.lechange.opensdk.media.DeviceInitInfo;
|
import com.lechange.opensdk.searchwifi.WlanInfo;
|
import com.mm.android.deviceaddmodule.helper.DeviceAddHelper;
|
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.BusinessException;
|
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.BusinessRunnable;
|
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.ProviderManager;
|
import com.mm.android.deviceaddmodule.mobilecommon.businesstip.HandleMessageCode;
|
import com.mm.android.deviceaddmodule.mobilecommon.entity.deviceadd.DeviceAddInfo;
|
import com.mm.android.deviceaddmodule.mobilecommon.entity.deviceadd.DeviceBindResult;
|
import com.mm.android.deviceaddmodule.mobilecommon.entity.deviceadd.DeviceIntroductionInfo;
|
import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
|
import com.mm.android.deviceaddmodule.mobilecommon.utils.UIUtils;
|
import com.mm.android.deviceaddmodule.service.DeviceAddService;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
|
import static com.mm.android.deviceaddmodule.helper.DeviceAddHelper.printError;
|
|
/**
|
* 设备添加数据请求类,由于设备添加页面流程单一,这里设计为单例
|
**/
|
public class DeviceAddModel implements IDeviceAddModel {
|
private static final int NET_ERROR_DEVICE_ALREADY_INIT = 1017; // 设备已经初始化
|
private volatile static DeviceAddModel deviceAddModel;
|
DeviceAddInfo mDeviceAddInfo;
|
final int DMS_TIMEOUT = 45 * 1000;
|
int TIME_OUT = 10 * 1000;
|
boolean loop = true; //获取设备信息轮询标志变量
|
boolean middleTimeUp = false; //设定的中间时间时间到,此时间之后如设备还是已在服务注册,且不在线以及仍为P2P类型,走绑定流程
|
int LOOP_ONCE_TIME = 3 * 1000; //轮询间隔时间3S
|
|
DeviceAddService deviceAddService;
|
|
private DeviceAddModel() {
|
deviceAddService = new DeviceAddService();
|
}
|
|
public static DeviceAddModel newInstance() {
|
if (deviceAddModel == null) {
|
synchronized (DeviceAddModel.class) {
|
if (deviceAddModel == null) {
|
deviceAddModel = new DeviceAddModel();
|
}
|
}
|
}
|
return deviceAddModel;
|
}
|
|
public void updateDeviceCache(DeviceAddInfo deviceAddInfo) {
|
mDeviceAddInfo.setDeviceExist(deviceAddInfo.getDeviceExist());
|
mDeviceAddInfo.setBindStatus(deviceAddInfo.getBindStatus());
|
mDeviceAddInfo.setBindAcount(deviceAddInfo.getBindAcount());
|
mDeviceAddInfo.setAccessType(deviceAddInfo.getAccessType());
|
mDeviceAddInfo.setStatus(deviceAddInfo.getStatus());
|
mDeviceAddInfo.setConfigMode(deviceAddInfo.getConfigMode());
|
mDeviceAddInfo.setBrand(deviceAddInfo.getBrand());
|
mDeviceAddInfo.setFamily(deviceAddInfo.getFamily());
|
mDeviceAddInfo.setDeviceModel(deviceAddInfo.getDeviceModel());
|
mDeviceAddInfo.setModelName(deviceAddInfo.getModelName());
|
mDeviceAddInfo.setCatalog(deviceAddInfo.getCatalog());
|
mDeviceAddInfo.setAbility(deviceAddInfo.getAbility());
|
mDeviceAddInfo.setType(deviceAddInfo.getType());
|
mDeviceAddInfo.setWifiTransferMode(deviceAddInfo.getWifiTransferMode());
|
mDeviceAddInfo.setChannelNum(deviceAddInfo.getChannelNum());
|
mDeviceAddInfo.setWifiConfigModeOptional(deviceAddInfo.isWifiConfigModeOptional());
|
mDeviceAddInfo.setSupport(deviceAddInfo.isSupport());
|
}
|
|
public void updateDeviceAllCache(DeviceAddInfo deviceAddInfo) {
|
mDeviceAddInfo.setDeviceExist(deviceAddInfo.getDeviceExist());
|
mDeviceAddInfo.setBindStatus(deviceAddInfo.getBindStatus());
|
mDeviceAddInfo.setBindAcount(deviceAddInfo.getBindAcount());
|
mDeviceAddInfo.setAccessType(deviceAddInfo.getAccessType());
|
mDeviceAddInfo.setStatus(deviceAddInfo.getStatus());
|
mDeviceAddInfo.setConfigMode(deviceAddInfo.getConfigMode());
|
mDeviceAddInfo.setBrand(deviceAddInfo.getBrand());
|
mDeviceAddInfo.setFamily(deviceAddInfo.getFamily());
|
mDeviceAddInfo.setDeviceModel(deviceAddInfo.getDeviceModel());
|
mDeviceAddInfo.setModelName(deviceAddInfo.getModelName());
|
mDeviceAddInfo.setCatalog(deviceAddInfo.getCatalog());
|
mDeviceAddInfo.setAbility(deviceAddInfo.getAbility());
|
mDeviceAddInfo.setType(deviceAddInfo.getType());
|
mDeviceAddInfo.setWifiTransferMode(deviceAddInfo.getWifiTransferMode());
|
mDeviceAddInfo.setChannelNum(deviceAddInfo.getChannelNum());
|
mDeviceAddInfo.setWifiConfigModeOptional(deviceAddInfo.isWifiConfigModeOptional());
|
mDeviceAddInfo.setSupport(deviceAddInfo.isSupport());
|
|
mDeviceAddInfo.setDeviceSn(deviceAddInfo.getDeviceSn());
|
mDeviceAddInfo.setDeviceCodeModel(deviceAddInfo.getDeviceCodeModel());
|
mDeviceAddInfo.setRegCode(deviceAddInfo.getRegCode());
|
mDeviceAddInfo.setSc(deviceAddInfo.getSc());
|
mDeviceAddInfo.setNc(deviceAddInfo.getNc()); // 将16进制的字符串转换为数字
|
// 支持SC码的设备,使用SC码作为设备密码
|
mDeviceAddInfo.setDevicePwd(deviceAddInfo.getSc());
|
|
String wifiConfigMode;
|
if (TextUtils.isEmpty(deviceAddInfo.getConfigMode())) { // 若配网模式未返回,默认可进行有线无线切换 V5.1默认增加软AP
|
wifiConfigMode = DeviceAddInfo.ConfigMode.SmartConfig.name() + ","
|
+ DeviceAddInfo.ConfigMode.LAN.name() + ","
|
+ DeviceAddInfo.ConfigMode.SoundWave.name() + ","
|
+ DeviceAddInfo.ConfigMode.SoftAP.name();
|
} else {
|
wifiConfigMode = deviceAddInfo.getConfigMode();
|
}
|
mDeviceAddInfo.setConfigMode(wifiConfigMode);
|
}
|
|
@Override
|
public void getDeviceInfo(final String sn, final String deviceCodeModel, final String deviceModelName, final Handler handler) {
|
new BusinessRunnable(handler) {
|
@Override
|
public void doBusiness() throws BusinessException {
|
try {
|
DeviceAddInfo deviceAddInfo = deviceAddService.deviceInfoBeforeBind(sn, deviceCodeModel, deviceModelName, mDeviceAddInfo.getNc(), TIME_OUT);
|
updateDeviceCache(deviceAddInfo);
|
handler.obtainMessage(HandleMessageCode.HMC_SUCCESS, mDeviceAddInfo).sendToTarget();
|
} catch (BusinessException e) {
|
throw e;
|
}
|
}
|
};
|
}
|
|
@Override
|
public void getDeviceInfoLoop(final String sn, final String model, final int timeout, final Handler handler) {
|
loop = true;
|
new BusinessRunnable(handler) {
|
@Override
|
public void doBusiness() throws BusinessException {
|
while (loop) {
|
if (canInterruptLoop()) {
|
break;
|
}
|
|
DeviceAddInfo deviceAddInfo = deviceAddService.deviceInfoBeforeBind(sn, mDeviceAddInfo.getDeviceCodeModel(), model, mDeviceAddInfo.getNc(), TIME_OUT);
|
updateDeviceCache(deviceAddInfo);
|
if (canInterruptLoop()) {
|
break;
|
}
|
try {//间隔3S查询一次
|
Thread.sleep(LOOP_ONCE_TIME);
|
} catch (InterruptedException e) {
|
e.printStackTrace();
|
}
|
}
|
if (loop)
|
handler.obtainMessage(HandleMessageCode.HMC_SUCCESS).sendToTarget();
|
}
|
};
|
}
|
|
/**
|
* 是否满足中断轮询的条件,可以走绑定流程
|
*
|
* @return
|
*/
|
private boolean canInterruptLoop() {
|
String status = mDeviceAddInfo.getStatus();
|
if (TextUtils.isEmpty(status)) {
|
status = DeviceAddInfo.Status.offline.name();
|
}
|
if (mDeviceAddInfo.isDeviceInServer() &&
|
(DeviceAddInfo.Status.online.name().equals(status)
|
|| (DeviceAddInfo.Status.offline.name().equals(status) && mDeviceAddInfo.isP2PDev() && middleTimeUp))) {
|
//以下两种情况走绑定流程:
|
// 1.已注册上服务并且设备DMS在线
|
// 2.已注册上服务,设备DMS不在线,设备类型为P2P(此时无法区分设备到底是P2P设备还是PAAS设备),并且设定的最大等待时间已到)
|
return true;
|
}
|
return false;
|
}
|
|
@Override
|
public void setLoop(boolean loop) {
|
this.loop = loop;
|
}
|
|
@Override
|
public void setMiddleTimeUp(boolean middleTimeUp) {
|
this.middleTimeUp = middleTimeUp;
|
}
|
|
@Override
|
public DeviceAddInfo getDeviceInfoCache() {
|
if (mDeviceAddInfo == null) {
|
mDeviceAddInfo = new DeviceAddInfo();
|
LogUtil.debugLog("DeviceAddModel", "getDeviceInfoCache");
|
}
|
return mDeviceAddInfo;
|
}
|
|
@Override
|
public void checkDevIntroductionInfo(final String deviceModelName, final Handler handler) {
|
new BusinessRunnable(handler) {
|
@Override
|
public void doBusiness() throws BusinessException {
|
String lan = ProviderManager.getAppProvider().getAppLanguage();
|
DeviceIntroductionInfo deviceIntroductionInfo = deviceAddService.introductionInfosGetCache(deviceModelName);
|
boolean result = true;
|
if (deviceIntroductionInfo != null) {
|
mDeviceAddInfo.setDevIntroductionInfos(deviceIntroductionInfo);
|
if (!TextUtils.isEmpty(deviceIntroductionInfo.getUpdateTime())) {
|
String resultStr = deviceAddService.deviceModelOrLeadingInfoCheck("DEVICE_LEADING_INFO", deviceModelName, deviceIntroductionInfo.getUpdateTime(), TIME_OUT);
|
result = resultStr.equalsIgnoreCase("true");
|
}
|
}
|
handler.obtainMessage(HandleMessageCode.HMC_SUCCESS, result ? null : deviceIntroductionInfo).sendToTarget();
|
}
|
};
|
}
|
|
@Override
|
public void getDevIntroductionInfo(final String deviceModelName, final Handler handler) {
|
new BusinessRunnable(handler) {
|
@Override
|
public void doBusiness() throws BusinessException {
|
String lan = ProviderManager.getAppProvider().getAppLanguage();
|
String modelName = mDeviceAddInfo.getModelName();
|
if (TextUtils.isEmpty(modelName)) {
|
modelName = deviceModelName;
|
}
|
DeviceIntroductionInfo introductionInfos = deviceAddService.deviceLeadingInfo(modelName, TIME_OUT);
|
mDeviceAddInfo.setDevIntroductionInfos(introductionInfos);
|
handler.obtainMessage(HandleMessageCode.HMC_SUCCESS).sendToTarget();
|
}
|
};
|
}
|
|
@Override
|
public void getDevIntroductionInfoCache(final String deviceModelName, final Handler handler) {
|
new BusinessRunnable(handler) {
|
@Override
|
public void doBusiness() throws BusinessException {
|
String lan = ProviderManager.getAppProvider().getAppLanguage();
|
String modelName = mDeviceAddInfo.getModelName();
|
if (TextUtils.isEmpty(modelName)) {
|
modelName = deviceModelName;
|
}
|
DeviceIntroductionInfo introductionInfos = deviceAddService.introductionInfosGetCache(modelName);
|
mDeviceAddInfo.setDevIntroductionInfos(introductionInfos);
|
handler.obtainMessage(HandleMessageCode.HMC_SUCCESS).sendToTarget();
|
}
|
};
|
}
|
|
@Override
|
public void deviceIPLogin(final String ip, final String devPwd, final LCOpenSDK_DeviceInit.ILogInDeviceListener listener) {
|
LCOpenSDK_DeviceInit.getInstance().deviceIPLogin(ip,devPwd,listener);
|
}
|
|
|
@Override
|
public void modifyDeviceName(final String deviceId, final String channelId, final String name, final Handler handler) {
|
new BusinessRunnable(handler) {
|
@Override
|
public void doBusiness() throws BusinessException {
|
boolean isSucceed = deviceAddService.modifyDeviceName(deviceId, channelId, name, TIME_OUT);
|
handler.obtainMessage(HandleMessageCode.HMC_SUCCESS, isSucceed).sendToTarget();
|
}
|
};
|
}
|
|
@Override
|
public void addApDevice(final String deviceId, final String apId, final String apType, final String apModel, final Handler handler) {
|
new BusinessRunnable(handler) {
|
@Override
|
public void doBusiness() throws BusinessException {
|
//TODO 配件绑定需要实现接口,当前版本不支持
|
|
}
|
};
|
}
|
|
@Override
|
public void modifyAPDevice(final String deviceId, final String apId, final String apName, final boolean toDevice, final Handler handler) {
|
new BusinessRunnable(handler) {
|
@Override
|
public void doBusiness() throws BusinessException {
|
//TODO 配件绑定需要实现接口
|
|
}
|
};
|
}
|
|
@Override
|
public void getAddApResultAsync(final String deviceId, final String apId, final Handler handler) {
|
loop = true;
|
new BusinessRunnable(handler) {
|
@Override
|
public void doBusiness() throws BusinessException {
|
//TODO 配件绑定需要实现接口
|
|
}
|
};
|
}
|
|
|
@Override
|
public void bindDevice(final String sn, final String devPwd, final Handler handler) {
|
new BusinessRunnable(handler) {
|
@Override
|
public void doBusiness() throws BusinessException {
|
DeviceBindResult deviceBindResult = deviceAddService.hdlUserDeviceBind( sn, devPwd, DMS_TIMEOUT);
|
mDeviceAddInfo.setDeviceDefaultName(deviceBindResult.getDeviceName());
|
mDeviceAddInfo.setBindStatus(deviceBindResult.getBindStatus());
|
mDeviceAddInfo.setBindAcount(deviceBindResult.getUserAccount());
|
mDeviceAddInfo.setRecordSaveDays(deviceBindResult.getRecordSaveDays());
|
mDeviceAddInfo.setStreamType(deviceBindResult.getStreamType());
|
mDeviceAddInfo.setServiceTime(deviceBindResult.getServiceTime());
|
handler.obtainMessage(HandleMessageCode.HMC_SUCCESS).sendToTarget();
|
}
|
};
|
}
|
|
@Override
|
public void addPolicy(final String sn, final Handler handler) {
|
new BusinessRunnable(handler) {
|
@Override
|
public void doBusiness() throws BusinessException {
|
boolean result = deviceAddService.addPolicyDevice(sn,DMS_TIMEOUT);
|
if (result){
|
handler.obtainMessage(HandleMessageCode.HMC_SUCCESS).sendToTarget();
|
}
|
}
|
};
|
}
|
|
|
//添加流程完成,需调用此方法,以释放相关资源
|
public void recyle() {
|
deviceAddModel.setLoop(false);
|
mDeviceAddInfo = null;
|
deviceAddModel = null;
|
}
|
}
|