From: TrillGates Date: Mon, 15 Nov 2021 02:45:51 +0000 (+0800) Subject: 默认运动检测开启,增加基站定位优化 X-Git-Url: http://git.snicker.com.cn/sitemap.xml?a=commitdiff_plain;h=43bdf374661bd945c3295cbf2d4a9219956688c6;p=protocol_srv.git 默认运动检测开启,增加基站定位优化 --- diff --git a/app/src/main/java/com/ic/protocolSrv/LocationClient.java b/app/src/main/java/com/ic/protocolSrv/LocationClient.java index 8f9bb565..a098d34d 100644 --- a/app/src/main/java/com/ic/protocolSrv/LocationClient.java +++ b/app/src/main/java/com/ic/protocolSrv/LocationClient.java @@ -591,11 +591,11 @@ public class LocationClient { if (runtime.getLocationInstance().getLocationStat() == ICLocation.LOCATION_STAT.LOCATION_GPS_TIEMOUT) gps_nosignal = true; lbs_ok = ( - runtime.getLocationInstance().isDataChanged() == false /*如果mcc,mnc等都没有赋过值 */|| - ( runtime.getLocationInstance().getMNC().equals("0") && runtime.getLocationInstance().getMCC().equals("0") - && runtime.getLocationInstance().getGSMStationCID() == 0 && runtime.getLocationInstance().getLAC() == 0 - ) - )? false : true; + runtime.getLocationInstance().isDataChanged() == false /*如果mcc,mnc等都没有赋过值 */ || + (runtime.getLocationInstance().getMNC().equals("0") && runtime.getLocationInstance().getMCC().equals("0") + && runtime.getLocationInstance().getGSMStationCID() == 0 && runtime.getLocationInstance().getLAC() == 0 + ) + ) ? false : true; // ICLogger.i("getMNC "+runtime.getLocationInstance().getMNC()+" getMCC "+runtime.getLocationInstance().getMCC()+" getGSMStationCID " + runtime.getLocationInstance().getGSMStationCID()+ " getLAC "+runtime.getLocationInstance().getLAC()+" changed "+runtime.getLocationInstance().isDataChanged()); ICLogger.i("waitAndSendLocation " + checktimes + ", lbs=" + lbs_ok + ", wifi=" + wifi_ok + ", gps=" + gps_ok + ", mode=" + mode); @@ -611,16 +611,16 @@ public class LocationClient { //GPS 优先的话多给些时间(10秒) timeCost = System.currentTimeMillis() - startCheckTime; - if ((checktimes > WiFiLocationTimeoutInSeconds) || ((startCheckTime != 0L) && (timeCost > WiFiLocationTimeoutInSeconds *1000))) { - ICLogger.i("waitAndSendLocation WiFi TimeOut " + checktimes + " > "+WiFiLocationTimeoutInSeconds + " or timeCost "+timeCost+"> "+WiFiLocationTimeoutInSeconds*1000+"ms "); + if ((checktimes > WiFiLocationTimeoutInSeconds) || ((startCheckTime != 0L) && (timeCost > WiFiLocationTimeoutInSeconds * 1000))) { + ICLogger.i("waitAndSendLocation WiFi TimeOut " + checktimes + " > " + WiFiLocationTimeoutInSeconds + " or timeCost " + timeCost + "> " + WiFiLocationTimeoutInSeconds * 1000 + "ms "); wifi_timeout = true; } - if ((checktimes > GPSLocationTimeoutInSeconds) || ((startCheckTime != 0L) && (timeCost > GPSLocationTimeoutInSeconds*1000))) { + if ((checktimes > GPSLocationTimeoutInSeconds) || ((startCheckTime != 0L) && (timeCost > GPSLocationTimeoutInSeconds * 1000))) { //有时timer计数不准,则根据实际时间计算 - ICLogger.i("waitAndSendLocation " + checktimes + "> "+GPSLocationTimeoutInSeconds+" or timeCost "+timeCost+"> "+GPSLocationTimeoutInSeconds*1000+"ms "); + ICLogger.i("waitAndSendLocation " + checktimes + "> " + GPSLocationTimeoutInSeconds + " or timeCost " + timeCost + "> " + GPSLocationTimeoutInSeconds * 1000 + "ms "); timeout = true; } - if (NoMoveTimeout && (timeout || gps_nosignal)) { + if (mNoMoveTimeout && (timeout || gps_nosignal)) { //没有移动,GPS超时或者没信号都会给 计数 加 1 gpsTimeoutCountOnNoMove++; } @@ -639,7 +639,7 @@ public class LocationClient { } runtime.getLocationInstance().setLocationType(locationtype); runtime.getLocationInstance().setLocationTime(TimeUtil.getSystemTime3()); - ICLogger.i("waitAndSendLocation startSOSLocation " + startSOSLocation +" or startNomalLocation "+startNomalLocation); + ICLogger.i("waitAndSendLocation startSOSLocation " + startSOSLocation + " or startNomalLocation " + startNomalLocation); if (startSOSLocation) { StringMessage AP10_CMD = protocolAPIHelper.getWarningMSG(runtime); @@ -651,8 +651,8 @@ public class LocationClient { startNomalLocation = false; if (gps_ok) { // if (!TextUtils.isEmpty(runtime.getWifiInfo())) { - StringMessage AP01_CMD = protocolAPIHelper.getGPSLocationMSG(runtime); - DeliverMessage(AP01_CMD); + StringMessage AP01_CMD = protocolAPIHelper.getGPSLocationMSG(runtime); + DeliverMessage(AP01_CMD); // } } else { StringMessage AP02_CMD = protocolAPIHelper.getLBSLocationMSG(runtime); @@ -672,7 +672,7 @@ public class LocationClient { if (Config.LOG_TOFILE) { ICLogger.logToFile("GPS", msg); } - } else if ((timeout ||gps_nosignal) && !lbs_ok && wifi_timeout) { + } else if ((timeout || gps_nosignal) && !lbs_ok && wifi_timeout) { //timeout + noLBS +noGPS ICLogger.i("timeout no location "); stopCheckLocationResult(); @@ -680,29 +680,28 @@ public class LocationClient { ICLogger.logToFile("GPS", "timeout no location "); } } - break; + break; case ICLocation.CUSTOM_MOD9_WIFI_FIRST: { //检测wifi和lbs先,成功则直接返回,失败则开启GPS timeCost = System.currentTimeMillis() - startCheckTime; //wifi扫描 检测次数到,或者实际时间到,都会触发 timeout事件,开启gps扫描。 - if ((checktimes > WiFiLocationTimeoutInSeconds) || ((startCheckTime != 0L) && (timeCost > WiFiLocationTimeoutInSeconds *1000))) { - ICLogger.i("waitAndSendLocation WiFi TimeOut " + checktimes + " > "+WiFiLocationTimeoutInSeconds + " or timeCost "+timeCost+"> "+WiFiLocationTimeoutInSeconds*1000+"ms "); - if (!wifi_timeout) - { + if ((checktimes > WiFiLocationTimeoutInSeconds) || ((startCheckTime != 0L) && (timeCost > WiFiLocationTimeoutInSeconds * 1000))) { + ICLogger.i("waitAndSendLocation WiFi TimeOut " + checktimes + " > " + WiFiLocationTimeoutInSeconds + " or timeCost " + timeCost + "> " + WiFiLocationTimeoutInSeconds * 1000 + "ms "); + if (!wifi_timeout) { gpsTimeoutCountOnNoMove = 0; //只要有一次不是GPS定位,则清零。 startGpsLocate(); } wifi_timeout = true; } //WIFI First 会在完成 wifi 检测且没有 后再开始GPS测试。 - if ((checktimes > (GPSLocationTimeoutInSeconds+WiFiLocationTimeoutInSeconds)) || ((startCheckTime != 0L) && (timeCost > (GPSLocationTimeoutInSeconds+WiFiLocationTimeoutInSeconds)*1000))) { + if ((checktimes > (GPSLocationTimeoutInSeconds + WiFiLocationTimeoutInSeconds)) || ((startCheckTime != 0L) && (timeCost > (GPSLocationTimeoutInSeconds + WiFiLocationTimeoutInSeconds) * 1000))) { //有时timer计数不准,则根据实际时间计算 - ICLogger.i("waitAndSendLocation GPS Timeout " + checktimes + "> "+(GPSLocationTimeoutInSeconds+WiFiLocationTimeoutInSeconds)+" or timeCost "+timeCost+"> "+GPSLocationTimeoutInSeconds*1000+"ms "); + ICLogger.i("waitAndSendLocation GPS Timeout " + checktimes + "> " + (GPSLocationTimeoutInSeconds + WiFiLocationTimeoutInSeconds) + " or timeCost " + timeCost + "> " + GPSLocationTimeoutInSeconds * 1000 + "ms "); timeout = true; } - if (NoMoveTimeout && (timeout || gps_nosignal)) { + if (mNoMoveTimeout && (timeout || gps_nosignal)) { //没有移动,GPS超时或者没信号都会给 计数 加 1 gpsTimeoutCountOnNoMove++; } @@ -713,7 +712,7 @@ public class LocationClient { locationtype = "WiFi"; runtime.getLocationInstance().setLocationType(locationtype); runtime.getLocationInstance().setLocationTime(TimeUtil.getSystemTime3()); - ICLogger.i("waitAndSendLocation startSOSLocation " + startSOSLocation +" or startNomalLocation "+startNomalLocation); + ICLogger.i("waitAndSendLocation startSOSLocation " + startSOSLocation + " or startNomalLocation " + startNomalLocation); if (startSOSLocation) { StringMessage AP10_CMD = protocolAPIHelper.getWarningMSG(runtime); DeliverMessage(AP10_CMD); @@ -747,7 +746,7 @@ public class LocationClient { } runtime.getLocationInstance().setLocationType(locationtype); runtime.getLocationInstance().setLocationTime(TimeUtil.getSystemTime3()); - ICLogger.i("waitAndSendLocation startSOSLocation " + startSOSLocation +" or startNomalLocation "+startNomalLocation); + ICLogger.i("waitAndSendLocation startSOSLocation " + startSOSLocation + " or startNomalLocation " + startNomalLocation); if (startSOSLocation) { StringMessage AP10_CMD = protocolAPIHelper.getWarningMSG(runtime); DeliverMessage(AP10_CMD); @@ -758,8 +757,8 @@ public class LocationClient { startNomalLocation = false; if (gps_ok) { // if (!TextUtils.isEmpty(runtime.getWifiInfo())) { - StringMessage AP01_CMD = protocolAPIHelper.getGPSLocationMSG(runtime); - DeliverMessage(AP01_CMD); + StringMessage AP01_CMD = protocolAPIHelper.getGPSLocationMSG(runtime); + DeliverMessage(AP01_CMD); // } } else { StringMessage AP02_CMD = protocolAPIHelper.getLBSLocationMSG(runtime); @@ -779,7 +778,7 @@ public class LocationClient { if (Config.LOG_TOFILE) { ICLogger.logToFile("GPS", msg); } - } else if ((timeout ||gps_nosignal) && !lbs_ok) { + } else if ((timeout || gps_nosignal) && !lbs_ok) { //timeout + noLBS +noGPS ICLogger.i("timeout no location "); stopCheckLocationResult(); @@ -788,15 +787,15 @@ public class LocationClient { } } } - break; + break; case ICLocation.NORMAL_MOD: case ICLocation.LOWPOWER_MOD: case ICLocation.CUSTOM_MOD8_WIFI: default: { //wifi优先的话给20秒时间 timeCost = System.currentTimeMillis() - startCheckTime; - if ((checktimes > WiFiLocationTimeoutInSeconds) || ((startCheckTime != 0L) && (timeCost > WiFiLocationTimeoutInSeconds *1000))) { - ICLogger.i("waitAndSendLocation WiFi TimeOut " + checktimes + " > "+WiFiLocationTimeoutInSeconds + " or timeCost "+timeCost+"> "+WiFiLocationTimeoutInSeconds*1000+"ms "); + if ((checktimes > WiFiLocationTimeoutInSeconds) || ((startCheckTime != 0L) && (timeCost > WiFiLocationTimeoutInSeconds * 1000))) { + ICLogger.i("waitAndSendLocation WiFi TimeOut " + checktimes + " > " + WiFiLocationTimeoutInSeconds + " or timeCost " + timeCost + "> " + WiFiLocationTimeoutInSeconds * 1000 + "ms "); wifi_timeout = true; } @@ -807,7 +806,7 @@ public class LocationClient { } runtime.getLocationInstance().setLocationType(locationtype); runtime.getLocationInstance().setLocationTime(TimeUtil.getSystemTime3()); - ICLogger.i("waitAndSendLocation startSOSLocation " + startSOSLocation +" or startNomalLocation "+startNomalLocation); + ICLogger.i("waitAndSendLocation startSOSLocation " + startSOSLocation + " or startNomalLocation " + startNomalLocation); if (startSOSLocation) { StringMessage AP10_CMD = protocolAPIHelper.getWarningMSG(runtime); @@ -839,7 +838,7 @@ public class LocationClient { ICLogger.logToFile("GPS", "WiFi timeout no location "); } } - break; + break; } ICLogger.i("needCheckAgain " + needCheckAgain); if (needCheckAgain) { @@ -961,7 +960,7 @@ public class LocationClient { private static int gpsTimeoutCountOnNoMove = 0;// 记录gps 无信号或者timeout的次数,超过5 就会停止使用gps定位,只要有一次 移动,或者设置为wifi定位,则清零。 private static final int MaxGpsTimeoutCountOnNoMove = 5;//不动的情况最大的gps搜不到星的次数。 - private static boolean skipMoveCheck = false; + private static boolean skipMoveCheck = true; public static void setSkipMoveCheck(boolean _skipMoveCheck) { @@ -974,7 +973,7 @@ public class LocationClient { private static boolean NoMoveAndNoGPSsignalSkipGpsFlag = false; private static boolean noMove = false; - private static boolean NoMoveTimeout = false; + private static boolean mNoMoveTimeout = false; private static boolean last_noMove = false; private static final int MaxNoMoveTimeout = 3 * 60 * 1000; //3分钟 private static long first_NoMove_timestamp = 0; @@ -1006,11 +1005,51 @@ public class LocationClient { } + + + private String lastMCC = ""; + private String lastMnc = ""; + private long lastLAC = 0l; + private long lastCID = 0l; + + private boolean checkLBS() { + //获取LBS上一次的数据,与当前的数据进行对比即可 + //只要有一个是变化的,那么我们就认为是变化了 + ICLocation locationInstance = runtime.getLocationInstance(); + String mcc = locationInstance.getMCC(); + ICLogger.d("mcc==> " + mcc); + String mnc = locationInstance.getMNC(); + ICLogger.d("mnc==> " + mnc); + long lac = locationInstance.getLAC(); + ICLogger.d("lac==> " + lac); + long gsmStationCID = locationInstance.getGSMStationCID(); + ICLogger.d("gsmStationCID==> " + gsmStationCID); + //判断跟上一次的是否一样,如果一样的话就没有变化 + //如果变了,那么就返回true + ICLogger.d("last ==> lastMCC " + lastMCC + " lastMnc ==> " + + lastMnc + " lastLAC ==> " + lastLAC + " lastCID " + lastCID); + boolean result = false; + if (!lastMCC.equals(mcc) || !lastMnc.equals(mnc) || lastCID != gsmStationCID || lastLAC != lac) { + result = true; + } + //更新值 + lastMnc = mnc; + lastMCC = mcc; + lastLAC = lac; + lastCID = gsmStationCID; + return result; + } + /*** *noMove and timeout return true * else return false */ private boolean checkNoMoveTimeout() { + //先检查LBS,如果LBS变了,那么我们就认为是位置改过了。 + if (checkLBS()) { + ICLogger.d("ON LBS CHANGE..."); + return false; + } noMove = (runtime.getTotalStepCount() - runtime.getLastStepCount() <= 0); runtime.updateFZDDevStatusMoving(!noMove); //设置当前运动状态 ICLogger.i("checkNoMoveTimeout last_noMove " + last_noMove + " noMove " + noMove + " lastStepCount " + runtime.getLastStepCount() + " StepCount " + runtime.getTotalStepCount()); @@ -1034,13 +1073,17 @@ public class LocationClient { private boolean needLocationForBT() { updateStepCount();//update StepCount,保证每次定位前,计步数据是最新的。防止丢数据。 //如果没有动,且超时。则跳过定位 - NoMoveTimeout = checkNoMoveTimeoutForBT(); - ICLogger.i("BT NoMoveTimeout " + NoMoveTimeout + ", forceLocation=" + forceLocation + ", Config.forceGPSMoveCheck=" + Config.forceGPSMoveCheck + ", skipMoveCheck=" + skipMoveCheck); - + if (skipMoveCheck || Config.forceGPSMoveCheck) { + mNoMoveTimeout = false; + } else { + mNoMoveTimeout = checkNoMoveTimeoutForBT(); + } + ICLogger.d("mNoMoveTimeout ==> " + mNoMoveTimeout); + ICLogger.i("BT NoMoveTimeout " + mNoMoveTimeout + ", forceLocation=" + forceLocation + ", " + + "Config.forceGPSMoveCheck=" + Config.forceGPSMoveCheck + ", skipMoveCheck=" + skipMoveCheck); // 不强制定位 且 (WorkingMod 不是紧急模式 或者 强制进行移动检测),且 没有移动过 if ((forceLocation != 1) && - (Config.forceGPSMoveCheck == true) && - (NoMoveTimeout) && (skipMoveCheck == false)) { + (mNoMoveTimeout) && (!skipMoveCheck)) { ICLogger.i("No Move ,skip BT location!"); return false; @@ -1053,15 +1096,17 @@ public class LocationClient { private boolean needLocation() { updateStepCount();//update StepCount,保证每次定位前,计步数据是最新的。防止丢数据。 //如果没有动,且超时。则跳过定位 - NoMoveTimeout = checkNoMoveTimeout(); - ICLogger.i(" NoMoveTimeout " + NoMoveTimeout + ", forceLocation=" + forceLocation + ", Config.forceGPSMoveCheck=" + Config.forceGPSMoveCheck + ", skipMoveCheck=" + skipMoveCheck); - + if (skipMoveCheck || Config.forceGPSMoveCheck) { + mNoMoveTimeout = false; + } else { + mNoMoveTimeout = checkNoMoveTimeout(); + } + ICLogger.d("mNoMoveTimeout => " + mNoMoveTimeout); + ICLogger.i(" NoMoveTimeout " + mNoMoveTimeout + ", forceLocation=" + forceLocation + + ", Config.forceGPSMoveCheck=" + Config.forceGPSMoveCheck + ", skipMoveCheck=" + skipMoveCheck); // 不强制定位 且 (WorkingMod 不是紧急模式 或者 强制进行移动检测),且 没有移动过 - if ((forceLocation != 1) && - (Config.forceGPSMoveCheck == true) && - (NoMoveTimeout) && (skipMoveCheck == false)) { + if ((forceLocation != 1) && mNoMoveTimeout) { ICLogger.i("No Move ,skip BT location2!"); - return false; } //只做正常定位前是否运动的判断,给定位前蓝牙扫描专用的。和 NeedlocationFotBT 还不同。 @@ -1075,23 +1120,28 @@ public class LocationClient { ICLogger.i("locating ,skip location!"); return; } - //如果没有动,且超时。则跳过定位 - NoMoveTimeout = checkNoMoveTimeout(); + //默认运动检测开启 + if (skipMoveCheck || Config.forceGPSMoveCheck) { + mNoMoveTimeout = false; + } else { + //如果没有动,且超时。则跳过定位 + mNoMoveTimeout = checkNoMoveTimeout(); + } /* 不强制定位(一次性强制取消移动检测用,定位后会恢复) && (( NORMAL_MOD , LOWPOWER_MOD, CUSTOM_MODE_WIFI 任意一种) || 强制移动检测(其它协议需GPS要强制移动检测用) ) && 没有移动过 && 不跳过移动检测(其它协议所有项目都需要跳过移动检测时使用) 都满足才检测 */ - if ( (forceLocation != 1) && - (((mod == ICLocation.NORMAL_MOD) || (mod == ICLocation.LOWPOWER_MOD) || (mod == ICLocation.CUSTOM_MOD8_WIFI)) || Config.forceGPSMoveCheck) && - (NoMoveTimeout) && - (!skipMoveCheck)) { - ICLogger.i("No Move ,skip location!"); - return; + if ((forceLocation != 1) && + (((mod == ICLocation.NORMAL_MOD) || + (mod == ICLocation.LOWPOWER_MOD) || + (mod == ICLocation.CUSTOM_MOD8_WIFI))) && mNoMoveTimeout) { + ICLogger.i("No Move ,skip location!"); + return; } - if (NoMoveTimeout) { + if (mNoMoveTimeout) { // 记录gps 无信号或者timeout的次数,超过5 就会停止使用gps定位,只要有一次 移动,或者设置为wifi定位,则清零。 if (gpsTimeoutCountOnNoMove >= MaxGpsTimeoutCountOnNoMove) { NoMoveAndNoGPSsignalSkipGpsFlag = true; diff --git a/app/src/main/java/com/ic/protocols/protocol_fzd.java b/app/src/main/java/com/ic/protocols/protocol_fzd.java index 36bc6f19..8884e94d 100644 --- a/app/src/main/java/com/ic/protocols/protocol_fzd.java +++ b/app/src/main/java/com/ic/protocols/protocol_fzd.java @@ -444,7 +444,7 @@ public class protocol_fzd { LOCATIONMODE,//设置工作模式 } - public static HashMap cmdMap = null; + public static HashMap cmdMap; static { cmdMap = new HashMap<>(); @@ -1292,8 +1292,8 @@ public class protocol_fzd { */ connection.send(LOCATIONMODE()); try { - String list[]=data.split(CMD_SPLIT); - if(list.length==2) { + String list[] = data.split(CMD_SPLIT); + if (list.length == 2) { int timesecond = Integer.parseInt(list[1]); int mod = Integer.parseInt(list[0]); log("LOCATION_MODE " + LOCATION_MODE + " mod " + mod); @@ -1733,7 +1733,7 @@ public class protocol_fzd { break; case LOCATIONMODE: //设置工作模式 - handleLOCATIONMODE(mConnection,mRuntime,cmd,data); + handleLOCATIONMODE(mConnection, mRuntime, cmd, data); //通知下面线程状态变化 mConnection.DeliverCMDMessageToSystem("setWorkMod", cmd); break;