package com.mm.android.deviceaddmodule.helper; import android.annotation.TargetApi; import android.content.Context; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkRequest; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import com.company.NetSDK.CFG_NETAPP_WLAN; import com.company.NetSDK.DEVICE_NET_INFO_EX; import com.company.NetSDK.FinalVar; import com.company.NetSDK.INetSDK; import com.dahua.mobile.utility.network.DHWifiUtil; import com.lechange.opensdk.media.DeviceInitInfo; import com.mm.android.deviceaddmodule.DeviceAddActivity; import com.mm.android.deviceaddmodule.event.DeviceAddEvent; import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.ProviderManager; import com.mm.android.deviceaddmodule.mobilecommon.annotation.DeviceAbility; import com.mm.android.deviceaddmodule.mobilecommon.entity.deviceadd.DeviceAddInfo; import com.mm.android.deviceaddmodule.mobilecommon.p2pDevice.P2PErrorHelper; import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil; import com.mm.android.deviceaddmodule.model.DeviceAddModel; import org.greenrobot.eventbus.EventBus; import org.json.JSONException; import org.json.JSONObject; public class DeviceAddHelper { public static final String DEVICE_MODEL_NAME_PARAM= "device_model_name_param"; //设备市场型号 public static final int DEVICE_NAME_MAX_LENGTH = 20; //设备名长度限制 public static final int AP_NAME_MAX_LENGTH = 20; //配件名长度限制 public static final String AP_WIFI_NAME_DAP = "DAP-XXXX"; //软Ap通用设备热点名称 public static final String AP_WIFI_VERSION_V1 = "V1"; //软Ap wifi version版本 public static final String AP_WIFI_VERSION_V2 = "V2"; //软Ap wifi version版本 // 是否支持新声波,二进制第1位,0表示否,1表示是 public static final int ALLOW_SoundWaveV2 = 1; // 0001 // 是否支持老声波,二进制第2位,0表示否,1表示是 public static final int ALLOW_SoundWave = 1 << 1; // 0010 // 是否支持SmartConfig,二进制第3位,0表示否,1表示是 public static final int ALLOW_SmartConfig = 1 << 2; // 0100 // 是否支持SoftAP,二进制第4位,0表示否,1表示是 public static final int ALLOW_SoftAP = 1 << 3; // 1000 // 是否支持LAN,二进制第4位,0表示否,1表示是 public static final int ALLOW_LAN = 1 << 4; // 10000 // 是否支持蓝牙,二进制第4位,0表示否,1表示是 public static final int ALLOW_BT = 1 << 5; // 100000 public enum TitleMode { // FLASH, //闪光灯 MORE, //更多 MORE2, //更多模式2 MORE3, //更多模式3 MORE4, //更多模式4 REFRESH, //刷新 BLANK, //空白 SHARE, //设备共享 FREE_CLOUD_STORAGE, //免费云存储 MODIFY_DEVICE_NAME //修改设备密码 } public enum TimeoutDevTypeModel { A_MODEL, //A系列 CK_MODEL, //CK系列 COMMON_MODEL, //通用设备 DOORBELL_MODEL, //门铃系列 AP_MODEL, //配件 OTHER_MODEL, //其他 TP1_MODEL, //TP1类型 TP1S_MODEL, //TP1S类型 G1_MODEL, //G1类型 K5_MODEL //门锁类型 } //设备添加相关错误码 public interface ErrorCode { //输入设备序列号流程相关错误码 int INPUT_SN_ERROR_BIND_BY_OTHER = 1000 + 1; //输入序列号时设备被其他用户绑定 int DEVICE_BIND_ERROR_BIND_BY_OTHER = 1000 + 2; //绑定时设备被其他用户绑定 int DEVICE_BIND_ERROR_NOT_SUPPORT_TO_BIND = 1000 + 3; //扫码、选型号、设备上线绑定时不支持绑定的设备类型 //设备选择流程相关错误码 int TYPE_CHOOSE_ERROR_1 = 2000; //有线无线配置流程相关错误码 int WIRED_WIRELESS_ERROR_CONFIG_TIMEOUT = 3000 + 1; //配置超时 //软AP添加流程相关错误码 int SOFTAP_ERROR_CONNECT_HOT_FAILED = 4000 + 1; //连接设备热点失败 int SOFTAP_ERROR_CONNECT_WIFI_FAILED = 4000 + 2; //设备连接wifi失败 //设备初始化流程相关错误码 int INIT_ERROR_SERCRITY_CHECK_TIMEOUT = 5000 + 1; //安全检查超时 int INIT_ERROR_INIT_FAILED = 5000 + 2; //初始化失败 //连接云平台流程相关错误码 int CLOUND_CONNECT_ERROR_CONNECT_TIMEOUT = 6000 + 1; //连接超时 int CLOUND_CONNECT_QUERY_STATUS_TIMEOUT = 6000 + 2; //查询超时 //通用 int COMMON_ERROR_NOT_SUPPORT_5G = 7000 + 1; //不支持5G int COMMON_ERROR_NOT_SUPPORT_RESET = 7000 + 2; //重置设备 int COMMON_ERROR_NOT_SUPPORT_HUB_AP_RESET = 7000 + 3; //重置设备 int COMMON_ERROR_NOT_SUPPORT_HUB_RESET = 7000 + 4; //重置设备 int COMMON_ERROR_DEVICE_LOCKED = 7000 + 5; //设备锁定 int COMMON_ERROR_RED_ROTATE = 7000 + 6; //红灯旋转 int COMMON_ERROR_RED_ALWAYS = 7000 + 7; //红灯长亮 int COMMON_ERROR_RED_FLASH = 7000 + 8; //红灯闪烁 int COMMON_ERROR_DEVICE_BIND_MROE_THAN_TEN = 7000 + 9; //超过10次 int COMMON_ERROR_DEVICE_MROE_THAN_TEN_TWICE = 7000 + 10; //再次超过10次 int COMMON_ERROR_DEVICE_IP_ERROR = 7000 + 11; //IP int COMMON_ERROR_DEVICE_SN_CODE_CONFLICT = 7000 + 12; //串号 int COMMON_ERROR_DEVICE_SN_OR_IMEI_NOT_MATCH = 7000 + 13; //imei和device id不匹配 int COMMON_ERROR_ABOUT_WIFI_PWD = 7000 + 14; //关于WIFI密码 int COMMON_ERROR_CONNECT_FAIL = 7000 + 15; //软AP连接失败 int COMMON_ERROR_WIFI_NAME = 7000 + 16; //软AP连接失败 //配件 int AP_ERROR_PAIR_TIMEOUT = 8000 + 2; //配对超时 } //OMS配置key public interface OMSKey { final static String ERROR_TIPS_TYPE = "ErrorTipsType"; final static String ERROR_WIFI_TIPS_TYPE = "WifiErrorTipsType"; //有线无线配网错误页面模式 final static String ERROR_SOFTAP_TIPS_TYPE = "SoftAPErrorTipsType"; //软AP配网错误页面模式 final static String ERROR_ACCESSORY_TIPS_TYPE = "AccessoryErrorTipsType"; //配件配网错误页面模式 //有线无线 final static String WIFI_MODE_GUIDING_LIGHT_IMAGE = "WifiModeGuidingLightImage"; final static String WIFI_MODE_CONFIG_INTRODUCTION = "WifiModeConfigIntroduction"; final static String WIFI_MODE_CONFIG_CONFIRM_INTRODUCTION = "WifiModeConfigConfirmIntroduction"; final static String WIFI_MODE_RESET_GUIDE_INTRODUCTION = "WifiModeResetGuideIntroduction"; final static String WIFI_MODE_RESET_IMAGE = "WifiModeResetImage"; final static String WIFI_MODE_RESET_OPERATION_INTRODUCTION = "WifiModeResetOperationIntroduction"; final static String WIFI_MODE_FINISH_DEVICE_IMAGE = "WifiModeFinishDeviceImage"; //软AP final static String SOFT_AP_MODE_WIFI_NAME = "SoftAPModeWifiName"; final static String SOFT_AP_MODE_GUIDING_STEP_ONE_IMAGE = "SoftAPModeGuidingStepOneImage"; final static String SOFT_AP_MODE_GUIDING_STEP_ONE_INTRODUCTION = "SoftAPModeGuidingStepOneIntroduction"; final static String SOFT_AP_MODE_GUIDING_STEP_TWO_IMAGE = "SoftAPModeGuidingStepTwoImage"; final static String SOFT_AP_MODE_GUIDING_STEP_TWO_INTRODUCTION = "SoftAPModeGuidingStepTwoIntroduction"; final static String SOFT_AP_MODE_GUIDING_STEP_THREE_IMAGE = "SoftAPModeGuidingStepThreeImage"; final static String SOFT_AP_MODE_GUIDING_STEP_THREE_INTRODUCTION = "SoftAPModeGuidingStepThreeIntroduction"; final static String SOFT_AP_MODE_GUIDING_STEP_FOUR_IMAGE = "SoftAPModeGuidingStepFourImage"; final static String SOFT_AP_MODE_GUIDING_STEP_FOUR_INTRODUCTION = "SoftAPModeGuidingStepFourIntroduction"; final static String SOFT_AP_MODE_RESET_GUIDE_INTRODUCTION = "SoftAPModeResetGuideIntroduction"; final static String SOFT_AP_MODE_RESET_IMAGE = "SoftAPModeResetImage"; final static String SOFT_AP_MODE_RESET_OPERATION_INTRODUCTION = "SoftAPModeResetOperationIntroduction"; final static String SOFT_AP_MODE_RESULT_PROMPT_IMAGE = "SoftAPModeResultPromptImage"; final static String SOFT_AP_MODE_RESULT_INTRODUCTION = "SoftAPModeResultIntroduction"; final static String SOFT_AP_MODE_CONFIRM_INTRODUCTION = "SoftAPModeConfirmIntroduction"; final static String SOFT_AP_MODE_WIFI_VERSION = "SoftAPModeWifiVersion"; //配件 final static String ACCESSORY_MODE_PAIR_STATUS_IMAGE = "AccessoryModePairStatusImage"; final static String ACCESSORY_MODE_PAIR_OPERATION_INTRODUCTION = "AccessoryModePairOperationIntroduction"; final static String ACCESSORY_MODE_PAIR_CONFIRM_INTRODUCTION = "AccessoryModePairConfirmIntroduction"; final static String ACCESSORY_MODE_RESET_GUIDE_INTRODUCTION = "AccessoryModeResetGuideIntroduction"; final static String ACCESSORY_MODE_RESET_IMAGE = "AccessoryModeResetImage"; final static String ACCESSORY_MODE_RESET_OPERATION_INTRODUCTION = "AccessoryModeResetOperationIntroduction"; final static String ACCESSORY_MODE_FINISH_DEVICE_IMAGE = "AccessoryModeFinishDeviceImage"; //Hub final static String HUB_MODE_PAIR_STATUS_IMAGE = "HubModePairStatusImage"; final static String HUB_MODE_PAIR_OPERATION_INTRODUCTION = "HubModePairOperationIntroduction"; final static String HUB_MODE_RESET_GUIDE_INTRODUCTION = "HubModeResetGuideIntroduction"; final static String HUB_MODE_RESET_IMAGE = "HubModeResetImage"; final static String HUB_MODE_RESET_OPERATION_INTRODUCTION = "HubModeResetOperationIntroduction"; final static String HUB_ACCESSORY_MODE_PAIR_STATUS_IMAGE = "HubAccessoryModePairStatusImage"; final static String HUB_ACCESSORY_MODE_PAIR_OPERATION_INTRODUCTION = "HubAccessoryModePairOperationIntroduction"; final static String HUB_ACCESSORY_MODE_RESET_GUIDE_INTRODUCTION = "HubAccessoryModeResetGuideIntroduction"; final static String HUB_ACCESSORY_MODE_RESET_IMAGE = "HubAccessoryModeResetImage"; final static String HUB_ACCESSORY_MODE_RESET_OPERATION_INTRODUCTION = "HubAccessoryModeResetOperationIntroduction"; final static String HUB_MODE_RESULT_PROMPT_IMAGE = "HUBModeResultPromptImage"; final static String HUB_MODE_RESULT_INTRODUCTION = "HUBModeResultIntroduction"; final static String HUB_MODE_CONFIRM_INTRODUCTION = "HUBModeConfirmIntroduction"; //设备本地配网 final static String LOCATION_MODE_OPERATION_IMAGE = "LocationOperationImages"; //引导图 final static String LOCATION_MODE_OPERATION_INTRODUCTION = "LocationOperationIntroduction"; //引导文案 final static String LOCATION_MODE_FINISH_DEVICE_IMAGE = "LocationModeFinishDeviceImage"; //添加完成正视图 // NB final static String THIRD_PARTY_PLATFORM_MODE_GUIDING_LIGHT_IMAGE = "ThirdPartyPlatformModeGuidingLightImage"; //引导图 final static String THIRD_PARTY_PLATFORM_MODE_RESULT_PROMPT_IMAGE = "ThirdPartyPlatformModeResultPromptImage"; } public static void updateTile(TitleMode titleMode) { Bundle bundle = new Bundle(); bundle.putString(DeviceAddEvent.KEY.TITLE_MODE, titleMode.name()); EventBus.getDefault().post(new DeviceAddEvent(DeviceAddEvent.TITLE_MODE_ACTION, bundle)); } //判断设备是否需要初始化 public static boolean isDeviceNeedInit(DeviceInitInfo device_net_info_ex) { byte[] s = getByteArray(device_net_info_ex.mInitStatus); // 设备初始化状态,按位确定初始化状态 // bit0~1:0-老设备,没有初始化功能 1-未初始化帐号 2-已初始化帐户 // bit2~3:0-老设备,保留 1-公网接入未使能 2-公网接入已使能 // bit4~5:0-老设备,保留 1-手机直连未使能 2-手机直连使能 if (s[s.length - 1] != 1) { return false; } else { return true; } } //判断设备是否已经初始化 public static boolean isDeviceInited(DeviceInitInfo device_net_info_ex) { byte[] s = getByteArray(device_net_info_ex.mInitStatus); // 设备初始化状态,按位确定初始化状态 // bit0~1:0-老设备,没有初始化功能 1-未初始化帐号 2-已初始化帐户 // bit2~3:0-老设备,保留 1-公网接入未使能 2-公网接入已使能 // bit4~5:0-老设备,保留 1-手机直连未使能 2-手机直连使能 if (s[s.length - 1] != 2) { return false; } else { return true; } } //判断设备是否支持初始化,仅在软AP添加流程中使用(为了兼容K5不支持初始化,需要用默认用admin登录设备)。其余添加流程仅判断是否需要初始化即可,需要的弹框用户输入,不需要的跳过。 public static boolean isDeviceSupportInit(DeviceInitInfo device_net_info_ex){ byte[] s = getByteArray(device_net_info_ex.mInitStatus); // 设备初始化状态,按位确定初始化状态 // bit0~1:0-老设备,没有初始化功能 1-未初始化帐号 2-已初始化帐户 // bit2~3:0-老设备,保留 1-公网接入未使能 2-公网接入已使能 // bit4~5:0-老设备,保留 1-手机直连未使能 2-手机直连使能 if (s[s.length - 2] != 1) { return false; } else { return true; } } /** * 获取配置,3代协议 * * @param loginHandle * @param channelID * @param strCommand * @param BUFFERLEN * @param stCfg * @return */ public static boolean getNewDevConfig(long loginHandle, int channelID, String strCommand, int BUFFERLEN, CFG_NETAPP_WLAN stCfg, String requestId) { boolean ret = false; //netsdk 使用局限,只能使用 类对象传递参数。 Integer error = new Integer(0); char szBuffer[] = new char[BUFFERLEN]; ret = INetSDK.GetNewDevConfig(loginHandle, strCommand, channelID, szBuffer, BUFFERLEN, error, 5 * 1000); if (!ret) { return false; } ret = INetSDK.ParseData(strCommand, szBuffer, stCfg, null); if (!ret) { return false; } return true; } /** * 判断是否是设备用户名或密码错误 * * @param error */ public static boolean isDevPwdError(int error) { return (error == P2PErrorHelper.LOGIN_ERROR_KEY_OR_USER_MISMATCH || error == P2PErrorHelper.LOGIN_ERROR_KEY_MISMATCH || error == FinalVar.NET_LOGIN_ERROR_PASSWORD || error == FinalVar.NET_USER_FLASEPWD || error == FinalVar.NET_LOGIN_ERROR_USER_OR_PASSOWRD); } public static byte[] getByteArray(byte b) { byte[] array = new byte[8]; for (int i = 7; i >= 0; i--) { array[i] = (byte) (b & 1); b = (byte) (b >> 1); } return array; } /** * 字符过滤 * @param str * @return */ public static String strDeviceNameFilter(String str) { if (TextUtils.isEmpty(str)) { return str; } StringBuilder builder = new StringBuilder(); String strEx = "^[a-zA-Z0-9\\-\u4E00-\u9FA5\\_\\@\\s]+"; for (int i = 0; i < str.length(); i++) { String temp = str.substring(i, i + 1); if (temp.matches(strEx)) { builder.append(temp); } } return builder.toString(); } /** * 支持sc码添加 * @param deviceAddInfo * @return */ public static boolean isSupportAddBySc(DeviceAddInfo deviceAddInfo) { if(deviceAddInfo == null) { return false; } if(!TextUtils.isEmpty(deviceAddInfo.getSc()) && deviceAddInfo.getSc().length() == 8) { return true; } if(deviceAddInfo.hasAbility(DeviceAbility.SCCode)) { return true; } return false; } /** * 支持SC码的设备,使用SC码作为设备密码 */ public static void setDevicePwdBySc() { DeviceAddInfo deviceAddInfo = DeviceAddModel.newInstance().getDeviceInfoCache(); if(DeviceAddHelper.isSupportAddBySc(deviceAddInfo)) { deviceAddInfo.setDevicePwd(deviceAddInfo.getSc()); } } /** * 支持2代声波 * @param deviceAddInfo * @return */ public static boolean isSupportSoundWaveV2(DeviceAddInfo deviceAddInfo) { if(deviceAddInfo == null) { return false; } return deviceAddInfo.getConfigMode() != null && deviceAddInfo.getConfigMode().contains(DeviceAddInfo.ConfigMode.SoundWaveV2.name()); } public static String getJsonString(DeviceAddInfo deviceAddInfo, boolean offlineConfigType) { JSONObject result = new JSONObject(); try { result.put("SN", deviceAddInfo.getDeviceSn()); if(offlineConfigType) { result.put("deviceModelName", deviceAddInfo.getDeviceModel()); } else { result.put("SC", deviceAddInfo.getSc()); } } catch (JSONException e){ e.printStackTrace(); } return result.toString(); } // 打印错误码 public static int printError() { int error = (INetSDK.GetLastError() & 0x7fffffff); LogUtil.debugLog("DeviceAddHelper", "error:" + error); return error; } public interface BindNetworkListener{ void onBindWifiListener(); } /** * 指定手机走wifi链路 */ public static void bindNetwork(final BindNetworkListener bindNetworkListener){ final ConnectivityManager connectivityManager = (ConnectivityManager) ProviderManager.getAppProvider().getAppContext().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkRequest.Builder builder; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { builder = new NetworkRequest.Builder(); //set the transport type do WIFI builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN) .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .build(); connectivityManager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() { @TargetApi(Build.VERSION_CODES.M) @Override public void onAvailable(Network network) { LogUtil.debugLog(DeviceAddActivity.TAG, "bindNetwork succuss"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { connectivityManager.bindProcessToNetwork(null); connectivityManager.bindProcessToNetwork(network); } else { //This method was deprecated in API level 23 ConnectivityManager.setProcessDefaultNetwork(null); ConnectivityManager.setProcessDefaultNetwork(network); } connectivityManager.unregisterNetworkCallback(this); if(bindNetworkListener != null){ bindNetworkListener.onBindWifiListener(); } } }); } } /** * 清除网络链路配置,注意软ap调用过{@link #bindNetwork},需要在合适的时机释放,否则无法连外网 */ public static void clearNetWork(){ LogUtil.debugLog(DeviceAddActivity.TAG, "clearNetWork succuss"); final ConnectivityManager connectivityManager = (ConnectivityManager) ProviderManager.getAppProvider().getAppContext().getSystemService(Context.CONNECTIVITY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { connectivityManager.bindProcessToNetwork(null); } else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ //This method was deprecated in API level 23 ConnectivityManager.setProcessDefaultNetwork(null); } } /** * 连接之前的wifi * @return */ public static void connectPreviousWifi(){ DeviceAddInfo deviceAddInfo = DeviceAddModel.newInstance().getDeviceInfoCache(); String previousSsid = deviceAddInfo.getPreviousSsid(); if(!TextUtils.isEmpty(previousSsid)) { deviceAddInfo.setPreviousSsid(""); DHWifiUtil wifiUtil = new DHWifiUtil(ProviderManager.getAppProvider().getAppContext()); wifiUtil.connectWifi(previousSsid, ""); } } }