默认运动检测开启,增加基站定位优化
authorTrillGates <williamtrillgates@gmail.com>
Mon, 15 Nov 2021 02:45:51 +0000 (10:45 +0800)
committerTrillGates <williamtrillgates@gmail.com>
Mon, 15 Nov 2021 02:45:51 +0000 (10:45 +0800)
app/src/main/java/com/ic/protocolSrv/LocationClient.java
app/src/main/java/com/ic/protocols/protocol_fzd.java

index 8f9bb56..a098d34 100644 (file)
@@ -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;
index 36bc6f1..8884e94 100644 (file)
@@ -444,7 +444,7 @@ public class protocol_fzd {
         LOCATIONMODE,//设置工作模式
     }
 
-    public static HashMap<CMD_TYPE, String> cmdMap = null;
+    public static HashMap<CMD_TYPE, String> 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;