CoreService.this.locationClient.updateStepCount();\r
Observable.timer(500L, TimeUnit.MILLISECONDS).subscribe(new Action1<Long>() {\r
public void call(Long param1Long) {\r
- connection.send(protocolAPIHelper.genStringMessage("heart",protocolAPIHelper.AP03(runtime)));\r
+ if (connection.isServerConnected()&& runtime.isServerProtocolConnected()) {\r
+ mKeepAlive.onHeartAlarm(connection, runtime);\r
+ }else{\r
+ ICLogger.i("check 发送心跳包时,如果发现服务器没有响应,或者socket连接,则重新尝试连接服务器!");\r
+ connection.disconnectServer();\r
+ startConnectionRetryTimer();\r
+ }\r
}\r
});\r
\r
startService(new Intent(this, InnerService.class));\r
\r
ReConnectToServer();\r
- this.locationClient.start();\r
+ this.locationClient.init();\r
\r
\r
//设置本service为前台运行,不被会被清理\r
if (!screenon) {\r
SimSignalUtil.send_at_to_update_lbs(this.runtime);\r
}\r
- //这里就是为了省电,如果wifi开启,且屏幕关闭,则wifi也关闭\r
+ //这里就是为了省电,如果wifi开启,且屏幕关闭,则wifi也关闭 ,还有获取wifi消息的时候也和它有关\r
if (Util.isConnectWifi((this.runtime.getContextProxy()).context) && !screenon) {\r
is_wifi_network_ok = true; //如果wifi开启的,则记录wifi状态为开启,以后屏幕开启时,再根据此变量决定是否打开wifi\r
Util.turnOffWifiForSleep((this.runtime.getContextProxy()).context, this.runtime);\r
public void run() {\r
ReConnectToServer();\r
}\r
- }, 0, 20000); //每次都是断网才需要重连,所以不需要delay,并且每20秒重试一次\r
+ }, 5000, 20000); //每次都是断网才需要重连,delay 5秒重连,并且每20秒重试一次\r
}\r
}\r
}\r
saveStepCount();\r
this.connectionServiceChain.processDetach(this.connection, this.runtime);\r
this.invokeHandlerServiceChain.processDetach(this.connection, this.runtime);\r
- this.locationClient.stop();\r
+ this.locationClient.deinit();\r
this.connection.close();\r
unregisterReceiver(this.broadcastReceiver);\r
unregisterReceiver(this.screenOnReceiver);\r
\r
int preNetworkTypeNomber;\r
\r
- private BroadcastReceiver screenOnReceiver = new BroadcastReceiver() {\r
- public void onReceive(Context param1Context, Intent param1Intent) {\r
- if ("android.intent.action.SCREEN_ON".equals(param1Intent.getAction())) {\r
- LocationClient.this.mSignalUtil.setAirMode("CloseAirplane");\r
- }\r
- }\r
- };\r
+// private BroadcastReceiver screenOnReceiver = new BroadcastReceiver() {\r
+// public void onReceive(Context param1Context, Intent param1Intent) {\r
+// if ("android.intent.action.SCREEN_ON".equals(param1Intent.getAction())) {\r
+// LocationClient.this.mSignalUtil.setAirMode("CloseAirplane");\r
+// }\r
+// }\r
+// };\r
\r
public LocationClient(NettyConnection paramNettyConnection, Runtime paramRuntime) {\r
connection = paramNettyConnection;\r
ICLogger.i("开启wifi扫描");\r
runtime.setWifiinfo("");\r
mHasWifiResult = false;\r
- this.mLbsHelper.registerBroadReceiver();\r
- this.mLbsHelper.getWifiInfo();\r
+// this.mLbsHelper.registerWiFiBroadReceiver();\r
this.mLbsHelper.setOnWiFiInfoListener(new LBSHelper.OnWiFiInfoListener() {\r
public void getWifiInfoCallBack(String param1String) {\r
ICLogger.i("get wifi scan Callback " + param1String);\r
runtime.setWifiinfo(param1String==null?"":param1String);\r
}\r
});\r
+ this.mLbsHelper.getWifiInfo();\r
}\r
// public void EqcAlgorithmInterfaceMethod2() {\r
public void startGpsLocate() {\r
//GPS 优先的话多给些时间(10秒)\r
if (checktimes> 50) timeout=true;\r
\r
- if ((lbs_ok && timeout==true) ||( gps_ok )||(lbs_ok && ( gps_ok ) )||(lbs_ok && ( gps_ok || startSOSLocation==true ) && wifi_ok )||(lbs_ok&&gps_nosignal&&wifi_ok)){\r
+ if ((lbs_ok && timeout==true) ||( gps_ok )||(lbs_ok && gps_ok )||(lbs_ok && ( gps_ok || startSOSLocation==true ) && wifi_ok )||(lbs_ok&&gps_nosignal&&wifi_ok)){\r
\r
\r
if (startSOSLocation==true){\r
CellInfoUtil.setCurrentAttachCellInfo(runtime, getLocationWakeLock());\r
}\r
\r
- public void updateSimSignalInfo() {\r
- SimSignalUtil.getInstance((runtime.getContextProxy()).context);\r
- }\r
-\r
-\r
\r
public PowerManager.WakeLock getLocationWakeLock() {\r
PowerManager.WakeLock wakeLock = ((PowerManager)(runtime.getContextProxy()).context.getSystemService(Context.POWER_SERVICE)).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, this.getClass().getSimpleName());\r
\r
updateStepCount();//update StepCount,保证每次定位前,计步数据是最新的。防止丢数据。\r
ICLogger.i("forceLocation="+forceLocation+", WorkingMod="+mod+", isLocating="+isLocating+", lastStep="+runtime.getLastStepCount()+", currentStep="+ runtime.getTotalStepCount());\r
- if (isLocating && 1!=forceLocation) {\r
+ if (isLocating && 1!=forceLocation) { //如果是强制定位,则即使是正在定位,也要执行,因为有时模式变换的时候,需要取消上一次定位信息,马上新的模式定位。\r
ICLogger.i("locating ,skip location!");\r
return;\r
}\r
isLocating=true;\r
\r
runtime.setLastStepCount(runtime.getTotalStepCount());\r
- updateSimSignalInfo();\r
-\r
updateCellInfo();\r
startWifiScan();\r
switch(mod){\r
\r
\r
\r
- public void start() {\r
+ public void init() {\r
\r
\r
this.mSignalUtil = SimSignalUtil.getInstance((runtime.getContextProxy()).context);\r
\r
\r
/*注册 亮屏监控*/\r
- IntentFilter intentFilter = new IntentFilter();\r
- intentFilter.addAction("android.intent.action.SCREEN_ON");\r
- (runtime.getContextProxy()).context.registerReceiver(this.screenOnReceiver, intentFilter);\r
+// IntentFilter intentFilter = new IntentFilter();\r
+// intentFilter.addAction("android.intent.action.SCREEN_ON");\r
+// (runtime.getContextProxy()).context.registerReceiver(this.screenOnReceiver, intentFilter);\r
\r
\r
\r
// this.haveChanegTo4GTime = SystemClock.elapsedRealtime();\r
}\r
\r
- public void stop() {\r
+ public void deinit() {\r
\r
- (runtime.getContextProxy()).context.unregisterReceiver(this.screenOnReceiver);\r
- mLbsHelper.unRegisterBroadReceiver();\r
+// (runtime.getContextProxy()).context.unregisterReceiver(this.screenOnReceiver);\r
+// mLbsHelper.unRegisterWiFiBroadReceiver();\r
// this.executor.execute(new Runnable() {\r
// public void run() {\r
// Deliver.saveQueue();\r
// 飞行模式 1 开启 0 关闭\r
public void setAirMode(int paramInt) {\r
boolean isAirModeOn = this.mSignalUtil.IsAirModeOn();\r
- boolean isScreenOn = this.mSignalUtil.isScreenON();\r
+ boolean isScreenOn = this.mSignalUtil.isScreenON(runtime.getContextProxy().context);\r
switch (paramInt) {\r
\r
case 1:\r
import java.util.List;\r
\r
public class NMEAListener implements NmeaListener, LocationListener {\r
- private boolean listening;\r
+ private boolean listening=false;\r
\r
\r
public class GpsSatellitePriv {\r
// if (Config.LOG_TOFILE)\r
// FileOutputUtil.fileOutput(this.runtime.getCacheDir(), "GPS", "GPRMC GPSTime="+utctime+",Lat="+Lat+",Lon="+lon+",fixed="+fixed+",speed="+speed);\r
\r
- StringBuilder sb=new StringBuilder();\r
- sb.append("GPRMC, location time= " + TimeUtil.getLocalTime() + " ,lon= " + lon + ", lat= " + Lat + ","+fixed+" FixedCount=" + locationFixedCount + ", speed=" + speed);\r
- ICLogger.i(sb.toString());\r
- if (Config.LOG_TOFILE)\r
- FileOutputUtil.fileOutput(this.runtime.getCacheDir(), "GPS", sb.toString());\r
- //定位了,\r
- if (fixed.equals("A")) {\r
- locationFixedCount++;\r
-\r
-\r
-\r
- if (speed.trim().isEmpty())speed="0.0";\r
- runtime.getLocationInstance().setLocation(Lat, lon,Double.valueOf(speed), 0, numSatelliteList.size());\r
- if (locationFixedCount > MaxFixedTimes) {\r
- /*\r
- 只有当前GPS已经定位,且location不为空才给 runtime赋值GPS坐标。\r
- 延迟MaxFixedTimes秒后才设置runtime的定位标志,以便稳定坐标值。\r
- */\r
- runtime.getLocationInstance().setLocationStat(ICLocation.LOCATION_STAT.LOCATION_FIXED);\r
- ICLogger.i("定位"+locationFixedCount+"次 > "+MaxFixedTimes+", set LOCATION_FIXED ");\r
- if (!noStop) {\r
- stopListen();\r
- }\r
- }\r
+ if (fixed.trim().equals("A")) {\r
+ if (speed.trim().isEmpty()) speed = "0.0";\r
+ runtime.getLocationInstance().setSpeed(Float.valueOf(speed));\r
}\r
\r
}else if (nmeastr.startsWith("$GPGSV,")) {\r
//最后一页,打印搜星情况,并作一些判断。\r
StringBuilder sb=new StringBuilder();\r
sb.append("搜索"+searchCout+"次,搜索到卫星个数" + SatlitesCount+", [SNR>0] ="+numSatelliteList.size());\r
- sb.append(", Max 3 SNR [");\r
+ sb.append(", Max 5 SNR [");\r
for (int i=0;i<max3Satellite.size();i++){\r
sb.append(max3Satellite.get(i).getSnr()+",");\r
}\r
String Lat=tmplist[2];\r
String lon=tmplist[4];\r
String fixed=tmplist[6];\r
-// ICLogger.i("GPGGA GPSTime="+utctime+",Lat="+Lat+",Lon="+lon+",fixed="+fixed);\r
+ String usedStarts=tmplist[7];\r
+ String hdop=tmplist[8];\r
+ if ( (fixed.trim().equals("1"))||(fixed.trim().equals("2"))||(fixed.trim().equals("6"))){\r
+ //定位\r
+ StringBuilder sb=new StringBuilder();\r
+ sb.append("GPGGA, location time= " + TimeUtil.getLocalTime() + ", FixedCount=" + locationFixedCount + ", GPSTime="+utctime+", Lat="+Lat+", Lon="+lon+", fixed="+fixed+", hdop="+hdop+", usedStarts="+usedStarts);\r
+ ICLogger.i(sb.toString());\r
+ if (Config.LOG_TOFILE)\r
+ FileOutputUtil.fileOutput(this.runtime.getCacheDir(), "GPS", sb.toString());\r
+ //定位了,\r
\r
+ locationFixedCount++;\r
+\r
+ if (locationFixedCount > MaxFixedTimes) {\r
+ /*\r
+ 只有当前GPS已经定位,且location不为空才给 runtime赋值GPS坐标。\r
+ 延迟MaxFixedTimes秒后才设置runtime的定位标志,以便稳定坐标值。\r
+ */\r
+ runtime.getLocationInstance().setLocation(Lat,lon);\r
+ runtime.getLocationInstance().setUsedStarts(Integer.valueOf(usedStarts.trim()));\r
+ runtime.getLocationInstance().setHod(Float.valueOf(hdop.trim()));\r
+ runtime.getLocationInstance().setLocationStat(ICLocation.LOCATION_STAT.LOCATION_FIXED);\r
+ ICLogger.i("定位"+locationFixedCount+"次 > "+MaxFixedTimes+", set LOCATION_FIXED ");\r
+ if (!noStop) {\r
+ stopListen();\r
+ }\r
+ }\r
+\r
+ }\r
\r
}else if (nmeastr.startsWith("$GPGSA,")) {\r
\r
// 字段17:VDOP垂直精度因子(0.5 - 99.9)\r
// 字段18:校验值($与*之间的数异或后的值)\r
\r
- String tmplist[]=nmeastr.split(",");\r
- String locationmod=tmplist[1];\r
- String fixed=tmplist[2];\r
-// ICLogger.i("GPGSA locationMode="+locationmod+",fixed="+fixed);\r
-\r
+// String tmplist[]=nmeastr.split(",");\r
+// String locationmod=tmplist[1];\r
+// String fixed=tmplist[2];\r
+// String hdop=tmplist[16];\r
+// if (!fixed.trim().equals("1")){\r
+// //定位\r
+// ICLogger.i("GPGSA fixed="+fixed+",hdop="+hdop);\r
+// }\r
}\r
}\r
\r
boolean b3 = locationManager.sendExtraCommand("gps", "delete_aiding_data", bundleHot);\r
return b3;\r
}\r
- private GpsStatus.Listener statusListener = new GpsStatus.Listener() {\r
- public void onGpsStatusChanged(int event) { // GPS状态变化时的回调,如卫星数\r
- GpsStatus status = locationManager.getGpsStatus(null); //取当前状态\r
- updateGpsStatus(event, status); //只更新状态\r
- numberOfSatellites = numSatelliteList.size();\r
-\r
- switch (event){\r
- case GpsStatus.GPS_EVENT_SATELLITE_STATUS:\r
-\r
-\r
-\r
- break;\r
- case GpsStatus.GPS_EVENT_FIRST_FIX:\r
- //普通测试,必须定位才算通过\r
-// +" cost "+status.getTimeToFirstFix()+"ms");\r
-// 定位算通过\r
- gpsMode = GPS_CURRENT_STATUS.GPS_FIXED;\r
-\r
- ICLogger.i("GPS_EVENT_FIRST_FIX !");\r
- // delaystop();\r
-\r
- break;\r
- case GpsStatus.GPS_EVENT_STARTED:\r
- // tvGps.setText("GPS_EVENT_STARTED");\r
- gpsMode=GPS_CURRENT_STATUS.GPS_LISTENING;\r
- runtime.getLocationInstance().setLocationStat(ICLocation.LOCATION_STAT.LOCATION_SEARCHING);\r
-\r
- listening=true;\r
- break;\r
- case GpsStatus.GPS_EVENT_STOPPED:\r
- // tvGps.setText("GPS_EVENT_STOPPED");\r
- gpsMode = GPS_CURRENT_STATUS.GPS_NOSINGAL;\r
-// runtime.getLocationInstance().setLocationStat(ICLocation.LOCATION_STAT.LOCATION_CLOSED);\r
-\r
- listening=false;\r
- break;\r
- default:\r
- break;\r
- }\r
-\r
-\r
-\r
-\r
- }\r
- };\r
\r
\r
private final int MSG_WHAT_GPS_FIXED=300;\r
}\r
}\r
}\r
- if (max3Satellite.size()>3){ //超过三个,谁小就删掉\r
- max3Satellite.remove(3);\r
+ if (max3Satellite.size()>5){ //超过三个,谁小就删掉\r
+ max3Satellite.remove(5);\r
}\r
\r
}\r
- private int updateGpsStatus(int event, GpsStatus status) {\r
- StringBuilder sb2 = new StringBuilder("");\r
- float strengh = 0;\r
- searchCout++;\r
- if (status == null) {\r
- sb2.append("搜索"+searchCout+"次,搜到卫星个数:" + 0);\r
- noSignalCount++;\r
- } else if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS) {\r
- int maxSatellites = status.getMaxSatellites();\r
- Iterator<GpsSatellite> it = status.getSatellites().iterator();\r
- numSatelliteList.clear();\r
- int count = 0;\r
- while (it.hasNext() && count <= maxSatellites) {\r
- GpsSatellite s = it.next();\r
- float snr = s.getSnr();\r
- if (snr > 0) {//只有信躁比不为0的时候才算搜到了星\r
- strengh = snr;\r
-// Toast.makeText(this, "信躁比大于20", Toast.LENGTH_LONG).show();\r
- //排序取得最大3个SNR\r
- get3MaxSnrSatellite(new GpsSatellitePriv(s.getPrn(),s.getSnr()));\r
- numSatelliteList.add(new GpsSatellitePriv(s.getPrn(),s.getSnr()));\r
- }\r
-\r
- count++;\r
- }\r
- sb2.append("搜索"+searchCout+"次,搜索到卫星个数:"+count+" , (SNR>0):" + numSatelliteList.size()+" \n Max 3 SNRs[ " );\r
- for (int i=0;i<max3Satellite.size();i++){\r
- sb2.append(max3Satellite.get(i).getSnr());\r
- sb2.append(", ");\r
- }\r
- sb2.append(" ]");\r
- // 卫星总数小于2 ,或者 snr小于20\r
- if (numSatelliteList.size()< 3 && (max3Satellite.size()>0?(max3Satellite.get(0).getSnr()<20?true:false) : true)){\r
- noSignalCount++;\r
- }\r
- }\r
-\r
- if(!noStop) {\r
- if (searchCout > SearchTimeout) {\r
- sb2.append(" 搜索" + searchCout + "次未定位,超过" + SearchTimeout + "限制退出GPS定位");\r
- gpsMode = GPS_CURRENT_STATUS.GPS_TIMEOUT;\r
- runtime.getLocationInstance().setLocationStat(ICLocation.LOCATION_STAT.LOCATION_GPS_TIEMOUT);\r
-\r
- stop(MSG_WHAT_GPS_TIMEOUT);\r
- }\r
- if (noSignalCount > 10) {\r
- sb2.append(" 搜索" + searchCout + "次,超过" + noSignalCount + "次没有收到星,退出GPS定位");\r
- gpsMode = GPS_CURRENT_STATUS.GPS_NOSINGAL;\r
- runtime.getLocationInstance().setLocationStat(ICLocation.LOCATION_STAT.LOCATION_GPS_TIEMOUT);\r
-\r
- stop(MSG_WHAT_GPS_NOSTAR);\r
- }\r
- }\r
- if (Config.LOG_TOFILE) FileOutputUtil.fileOutput(this.runtime.getCacheDir(),"GPS",sb2.toString());\r
- ICLogger.i( sb2.toString());\r
- getBestLocation(locationManager,status);\r
-\r
- return 0;\r
- }\r
\r
//停止定位\r
private void stop(int id){\r
}\r
boolean isFrist = true;\r
\r
- /**\r
- * 获取location对象,优先以GPS_PROVIDER获取location对象,当以GPS_PROVIDER获取到的locaiton为null时\r
- * ,则以NETWORK_PROVIDER获取location对象,这样可保证在室内开启网络连接的状态下获取到的location对象不为空\r
- *\r
- * @param locationManager\r
- * @return\r
- */\r
- private void getBestLocation(LocationManager locationManager,GpsStatus status) {\r
- Location location = null;\r
- if (locationManager != null) {\r
-\r
- location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);\r
- if (location == null) {\r
- ICLogger.i(" GPS Provider get failed , get Network Provider!");\r
- location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);\r
- }\r
-\r
- /*\r
- 只有当前GPS已经定位,且location不为空才给 runtime赋值GPS坐标。\r
- 延迟三秒后才设置runtime的定位标志,以便稳定坐标值。\r
- */\r
-// if (location != null && gpsMode == GPS_CURRENT_STATUS.GPS_FIXED ) {\r
- if (location != null ) {\r
- longitude = location.getLongitude();\r
- latitude = location.getLatitude();\r
-\r
-\r
- if (longitude > 0 && latitude > 0 ) {\r
-\r
- //log msg变量\r
- StringBuffer sb = new StringBuffer();\r
- // 经纬度 保留6位小数点\r
- DecimalFormat df = new DecimalFormat("#.000000");\r
- String strLatitude = df.format(latitude);\r
- String strLongitude = df.format(longitude);\r
-\r
- sb.append(" orig lat=").append(strLatitude).append(", orig lon=").append(strLongitude);\r
- // 转换单位,从度转换到分\r
- double intfen= ((longitude - (int)longitude))*60; //小数转换到分为单位\r
-// double miao= (longitude*100 - (int)(longitude*100)); //\r
- double last= ((int)longitude)*100 +intfen;\r
- longitude =last;\r
- intfen= (latitude - (int)latitude)*60;//小数转换到分为单位\r
-// miao= (latitude*100 - (int)(latitude*100));\r
- last= ((int)latitude)*100 +intfen;\r
- latitude=last;\r
-\r
- //sucess\r
- long gpsTime = location.getTime();\r
-\r
- double altitude = location.getAltitude();// 海拔\r
-\r
- // 速度\r
- float speed = location.getSpeed();// 速度 单位 m/s\r
- speed = (speed * 60) / 1000; // 单位转换 km/h\r
- // 保留一位小数点\r
- DecimalFormat dfSpeed = new DecimalFormat("#.0");\r
- String strSpeed = dfSpeed.format(speed);\r
- speed = Float.parseFloat(strSpeed);\r
- int intSpeed = (int) (speed * 10);\r
- // SimpleLogger.d("intSpeed:"+intSpeed);\r
-\r
- // 经纬度 保留4位小数点\r
- df = new DecimalFormat("#.0000");\r
- strLatitude = df.format(latitude);\r
- strLongitude = df.format(longitude);\r
-\r
- locationFixedCount++;\r
-\r
- sb.append(", gps time= "+TimeUtil.getLocalTime(gpsTime)+" ,lon= " + strLongitude + ", lat= " + strLatitude +" FixedCount="+locationFixedCount+", TimeToFirstFix="+status.getTimeToFirstFix());\r
- ICLogger.i( sb.toString());\r
- if (Config.LOG_TOFILE) FileOutputUtil.fileOutput(this.runtime.getCacheDir(),"GPS",sb.toString());\r
- runtime.getLocationInstance().setLocation(latitude,longitude,speed,0,status.getMaxSatellites());\r
- if (locationFixedCount > MaxFixedTimes ){\r
- /*\r
- 只有当前GPS已经定位,且location不为空才给 runtime赋值GPS坐标。\r
- 延迟MaxFixedTimes秒后才设置runtime的定位标志,以便稳定坐标值。\r
- */\r
- runtime.getLocationInstance().setLocationStat(ICLocation.LOCATION_STAT.LOCATION_FIXED);\r
- if(!noStop){\r
- stopListen();\r
- }\r
- }\r
- }\r
-\r
- }\r
- }\r
- }\r
-\r
-\r
\r
public boolean startListen() {\r
\r
\r
import com.enqualcomm.support.Config;\r
import com.enqualcomm.support.bean.Runtime;\r
+import com.enqualcomm.support.utils.DeviceInfoUtil;\r
import com.enqualcomm.support.utils.FileOutputUtil;\r
import com.enqualcomm.support.utils.ICLogger;\r
import com.enqualcomm.support.utils.SimSignalUtil;\r
import java.util.Comparator;\r
import java.util.Iterator;\r
import java.util.List;\r
-import java.util.Timer;\r
-import java.util.TimerTask;\r
\r
import static android.net.wifi.WifiManager.WIFI_STATE_DISABLED;\r
import static android.net.wifi.WifiManager.WIFI_STATE_DISABLING;\r
private Context context;\r
Handler mHandler;\r
private int mLastSignal;\r
- private LBSHelper.OnWiFiInfoListener mListener;\r
- private LBSHelper.MyPhoneStateListener mMyListener;\r
+ private LBSHelper.OnWiFiInfoListener mMyWifiListener;\r
+ private LBSHelper.MyPhoneStateListener mMyPhoneListener;\r
int mNetworkType;\r
- private static Timer mTimer;\r
public Runtime runtime;\r
private BroadcastReceiver wifiChangedReceiver;\r
private String wifiInfoResult;\r
this.context = _context;\r
this.runtime = dev;\r
initHelper();\r
- registerBroadReceiver();\r
- this.mMyListener = new LBSHelper.MyPhoneStateListener();\r
+// registerWiFiBroadReceiver();\r
+ this.mMyPhoneListener = new LBSHelper.MyPhoneStateListener();\r
TelephonyManager tm = ((TelephonyManager) LBSHelper.this.context.getSystemService(Context.TELEPHONY_SERVICE));\r
- tm.listen(this.mMyListener, LISTEN_SIGNAL_STRENGTHS);\r
+ tm.listen(this.mMyPhoneListener, LISTEN_SIGNAL_STRENGTHS);\r
this.mNetworkType = tm.getNetworkType();\r
}\r
\r
public void handleMessage(Message msg) {\r
super.handleMessage(msg);\r
if (msg.what == 104) {\r
- LBSHelper.this.wifiManager.setWifiEnabled(false);\r
- if (LBSHelper.this.mListener != null) {\r
- LBSHelper.this.mListener.getWifiInfoCallBack((String) null);\r
+ //停止扫描\r
+ StringBuilder sb = LBSHelper.this.handScanResults();\r
+ if (sb == null) {\r
+ LBSHelper.this.wifiInfoResult = null;\r
+ } else {\r
+ LBSHelper.this.wifiInfoResult = sb.toString();\r
}\r
-\r
- LBSHelper.this.mTimer = null;\r
- }\r
- }\r
- };\r
- this.wifiChangedReceiver = new BroadcastReceiver() {\r
- @Override\r
- public void onReceive(Context context, Intent intent) {\r
-\r
-// WIFI_STATE_DISABLING = 0\r
-// WIFI_STATE_DISABLED = 1\r
-// WIFI_STATE_ENABLING = 2\r
-// WIFI_STATE_ENABLED = 3\r
-// WIFI_STATE_UNKNOWN = 4\r
- switch (intent.getIntExtra("wifi_state", 0)) {\r
- case WIFI_STATE_ENABLED:\r
- LBSHelper.this.wifiManager.startScan();\r
- if (LBSHelper.this.mListener == null) {\r
- LBSHelper.this.mMyListener = new MyPhoneStateListener();\r
-\r
- }\r
-\r
- if (LBSHelper.this.IS_OPEN) {\r
- (new Thread(new Runnable() {\r
- public void run() {\r
- SystemClock.sleep(3000L);\r
- StringBuilder sb = LBSHelper.this.handScanResults();\r
- if (sb == null) {\r
- LBSHelper.this.wifiInfoResult = null;\r
- } else {\r
- LBSHelper.this.wifiInfoResult = sb.toString();\r
- }\r
-\r
- LBSHelper.this.mListener.getWifiInfoCallBack(LBSHelper.this.wifiInfoResult);\r
- LBSHelper.this.wifiManager.setWifiEnabled(false);\r
- LBSHelper.this.IS_OPEN = false;\r
- LBSHelper.this.IS_HASOPEN = false;\r
- if (LBSHelper.this.mTimer != null) {\r
- LBSHelper.this.mTimer.cancel();\r
- LBSHelper.this.mTimer.purge();\r
- LBSHelper.this.mTimer = null;\r
- }\r
-\r
- }\r
- })).start();\r
- return;\r
- } else if (LBSHelper.this.IS_HASOPEN) {\r
- if (LBSHelper.this.wifiManager == null) {\r
- if (LBSHelper.this.mListener != null) {\r
- LBSHelper.this.mListener.getWifiInfoCallBack((String) null);\r
- }\r
-\r
- return;\r
+ if (LBSHelper.this.mMyWifiListener != null) {\r
+ LBSHelper.this.mMyWifiListener.getWifiInfoCallBack(LBSHelper.this.wifiInfoResult);\r
+\r
+ if ((runtime.isNoTurnOffWifiOnScreenOff() && !SimSignalUtil.isScreenON(runtime.getContextProxy().context)) || DeviceInfoUtil.isFactoryTestTopActivity(runtime.getContextProxy().context))\r
+ {\r
+ //如果 NoTurnOffWifiOnScreenOff 开关 开启,且是屏灭,或者是在工厂测试模式,则原来什么状态就什么状态。\r
+ if (!IS_HASOPEN && IS_OPEN) {\r
+ wifiManager.setWifiEnabled(false);\r
+ IS_OPEN = false;\r
}\r
-\r
- (new Thread(new Runnable() {\r
- public void run() {\r
- SystemClock.sleep(3000L);\r
- StringBuilder sb = LBSHelper.this.handScanResults();\r
- if (sb == null) {\r
- LBSHelper.this.wifiInfoResult = null;\r
- } else {\r
- LBSHelper.this.wifiInfoResult = sb.toString();\r
- }\r
-\r
- LBSHelper.this.mListener.getWifiInfoCallBack(LBSHelper.this.wifiInfoResult);\r
- LBSHelper.this.IS_OPEN = false;\r
- LBSHelper.this.IS_HASOPEN = false;\r
- }\r
- })).start();\r
- return;\r
- } else if (LBSHelper.this.mListener != null) {\r
- LBSHelper.this.mListener.getWifiInfoCallBack((String) null);\r
+ }else if (!SimSignalUtil.isScreenON(runtime.getContextProxy().context) && !runtime.isNoTurnOffWifiOnScreenOff()){\r
+ //如果 NoTurnOffWifiOnScreenOff 开关 关闭,且是屏灭,则关闭wifi省电\r
+ wifiManager.setWifiEnabled(false);\r
+ IS_OPEN = false;\r
+ IS_HASOPEN=false;\r
}\r
- case WIFI_STATE_DISABLING:\r
- case WIFI_STATE_DISABLED:\r
- case WIFI_STATE_ENABLING:\r
- case WIFI_STATE_UNKNOWN:\r
- return;\r
- default:\r
+ }\r
}\r
}\r
};\r
-\r
-\r
}\r
\r
\r
});\r
}\r
\r
- private void startTimer() {\r
- if (this.mTimer == null) {\r
- this.mTimer = new Timer();\r
- }\r
-\r
- this.mTimer.schedule(new TimerTask() {\r
- @Override\r
- public void run() {\r
- LBSHelper.this.mHandler.sendEmptyMessage(104);\r
- }\r
- }, 10000L);\r
+ private void delayedStopScan() {\r
+ LBSHelper.this.mHandler.sendEmptyMessageDelayed(104,3000L);\r
}\r
\r
- public void unRegisterBroadReceiver() {\r
- this.context.unregisterReceiver(this.wifiChangedReceiver);\r
- }\r
+// public void unRegisterWiFiBroadReceiver() {\r
+// this.context.unregisterReceiver(this.wifiChangedReceiver);\r
+// }\r
\r
public String getAttchCellInfo(TelephonyManager tm) {\r
return this.getCellInfo(tm);\r
}\r
\r
public String getCellInfo(TelephonyManager telephonyManager) {\r
- int var3 = Build.VERSION.SDK_INT;\r
+// int var3 = Build.VERSION.SDK_INT;\r
int var2 = 0;\r
String var4;\r
- if (var3 > 23) {\r
+ if (Build.VERSION.SDK_INT > 23) {\r
var4 = telephonyManager.getSimOperator();\r
if (var4 == null) {\r
ICLogger.i("operator == null");\r
gsmSb.append(mNeighboringCellInfo.getCid());\r
gsmSb.append("@");\r
gsmSb.append(mNeighboringCellInfo.getRssi() + 110);\r
- var3 = var2 + 1;\r
- var2 = var3;\r
- if (var3 == 5) {\r
+ var2 ++;\r
+ if (var2 == 5) {\r
break;\r
}\r
}\r
} else {\r
this.wifiManager.setWifiEnabled(true);\r
this.IS_OPEN = true;\r
- this.startTimer();\r
+ try {\r
+ Thread.sleep(500);\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
}\r
- }\r
+ wifiManager.startScan();\r
+ delayedStopScan();\r
\r
- public void registerBroadReceiver() {\r
- IntentFilter var1 = new IntentFilter();\r
- var1.addAction("android.net.wifi.WIFI_STATE_CHANGED");\r
- this.context.registerReceiver(this.wifiChangedReceiver, var1);\r
}\r
\r
- public void setOnWiFiInfoListener(LBSHelper.OnWiFiInfoListener var1) {\r
- this.mListener = var1;\r
+// public void registerWiFiBroadReceiver() {\r
+// IntentFilter filter = new IntentFilter();\r
+// filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);//监听wifi是开关变化的状态\r
+// filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);//监听wifiwifi连接状态广播\r
+// filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);//监听wifi列表变化(开启一个热点或者关闭一个热点)\r
+// this.context.registerReceiver(this.wifiChangedReceiver, filter);\r
+// }\r
+\r
+ public void setOnWiFiInfoListener(LBSHelper.OnWiFiInfoListener wiFiInfoListener) {\r
+ this.mMyWifiListener = wiFiInfoListener;\r
}\r
\r
private class MyPhoneStateListener extends PhoneStateListener {\r
\r
log("work mode "+cmdlist[3]);\r
int mod=Integer.valueOf(cmdlist[3]);\r
- int Cycle=15;\r
+ int Cycle=900;\r
switch(mod){\r
case ICLocation.NORMAL_MOD:\r
- Cycle=15;\r
+ Cycle=900;\r
break;\r
case ICLocation.LOWPOWER_MOD:\r
- Cycle=60;\r
+ Cycle=3600;\r
break;\r
case ICLocation.EMERGNECY_MOD:\r
case ICLocation.REALTIME_MOD:\r
- Cycle=1;\r
+ Cycle=60;\r
break;\r
\r
}\r
public class GPS_LocationPoint{\r
public double lat;\r
public double lon;\r
- public double speed;\r
- public double heading;\r
+ public float speed;\r
+ public float heading;\r
public int used_gps_numbs;\r
public String latStr;\r
public String lonStr;\r
+ public float hdop;\r
}\r
public class LBS_Data{\r
HashMap<String ,Integer> wifi_aps=null;\r
return currentLP;\r
}\r
\r
- public void setLocation(double lat,double lon,double speed,double heading,int userdgpsnumbers){\r
+ public void setHod(float _hot){\r
+ currentLP.hdop=_hot;\r
+ }\r
+\r
+ public float getHdop(){\r
+ return currentLP.hdop;\r
+ }\r
+\r
+ public void setSpeed( float _speed){\r
+ currentLP.speed=_speed;\r
+ }\r
+ public float getSpeed(){\r
+ return currentLP.speed;\r
+ }\r
+\r
+ public void setLocation(double lat,double lon){\r
+ currentLP.lat=lat;\r
+ currentLP.lon=lon;\r
+ }\r
+ public void setLocation(String lat,String lon){\r
+ currentLP.latStr=lat;\r
+ currentLP.lonStr=lon;\r
+ }\r
+\r
+ public void setHeading(float heding){\r
+ currentLP.heading=heding;\r
+ }\r
+\r
+ public float getheading(){\r
+ return currentLP.heading;\r
+ }\r
+\r
+ public void setUsedStarts(int starts){\r
+ currentLP.used_gps_numbs=starts;\r
+ }\r
+\r
+ public int getUsedStarts(){\r
+ return currentLP.used_gps_numbs;\r
+ }\r
+\r
+ public void setLocation(double lat,double lon,float speed,float heading,int userdgpsnumbers,float hdop){\r
currentLP.lat=lat;\r
currentLP.lon=lon;\r
currentLP.speed=speed;\r
currentLP.used_gps_numbs = userdgpsnumbers;\r
currentLP.latStr="";\r
currentLP.lonStr="";\r
+ currentLP.hdop=hdop;\r
}\r
- public void setLocation(String lat,String lon,double speed,double heading,int userdgpsnumbers){\r
+ public void setLocation(String lat,String lon,float speed,float heading,int userdgpsnumbers,float hdop){\r
currentLP.lat=0;\r
currentLP.lon=0;\r
currentLP.speed=speed;\r
currentLP.used_gps_numbs = userdgpsnumbers;\r
currentLP.latStr=lat;\r
currentLP.lonStr=lon;\r
+ currentLP.hdop=99.9f;\r
}\r
\r
public void clearLBSdata(){\r
stringBuilder.append(",,first=");\r
stringBuilder.append(this.first);\r
ICLogger.i(stringBuilder.toString());\r
- if (param1Integer.intValue() > 0) {\r
+ if (param1Integer.intValue() > 1) {\r
//返回值大于0 证明是网络连接成功,开始重连服务器\r
if (this.first) {\r
this.first = false;\r
return;\r
}\r
- ICLogger.i("数据网络连接成功,重新连接网络。");\r
+ ICLogger.i("数据网络连接成功,重新连接服务器。");\r
CoreService.getInstance().ReConnectToServer();\r
} \r
}\r
connectionError = true;\r
isConnected = false;\r
paramRuntime.setServerProtocolConnected(false);\r
- paramRuntime.getContextProxy().sendBroadcast(isConnected);\r
+ paramRuntime.getContextProxy().sendBroadcast(false);\r
StringBuilder stringBuilder = new StringBuilder();\r
stringBuilder.append("onConnectionClose=");\r
stringBuilder.append(",set KeepAlive isConnected = false");\r
// isConnected = true;\r
is_heartBeat_send_success=true;\r
//广播服务器连接成功的消息\r
- paramRuntime.getContextProxy().sendBroadcast(isConnected);\r
+ paramRuntime.getContextProxy().sendBroadcast(true);\r
LauncherCtrl.getInstance(this.mContext).setStatusBarIcon("server_connected", STATUS_BAR_STATE_SERVER_CONNECTED_ON);\r
// Deliver.triggerSendThread(); //链接上就尝试清除 buffer中的数据\r
CoreService.getInstance().stopConnectionRetryTimer();\r
public void run() {\r
\r
if (mRuntime !=null) {\r
+\r
+ //更新lbs信息\r
CellInfoUtil.mCellInfo = mRuntime.getLbsHelper().getAttchCellInfo(mRuntime.getContextProxy().getTelephonyManager());\r
\r
if (mCellInfo != null) {\r
import android.content.Intent;\r
import android.content.IntentFilter;\r
import android.net.ConnectivityManager;\r
+ import android.net.Network;\r
import android.net.NetworkInfo;\r
import com.enqualcomm.support.service.KeepAlive;\r
import rx.Observable;\r
import rx.subjects.BehaviorSubject;\r
\r
public class NetworkObservable {\r
+ static String lastActivType="off";\r
BroadcastReceiver mNetStateBroadcastReceiver = new BroadcastReceiver() {\r
- public void onReceive(Context var1, Intent var2) {\r
- NetworkInfo networkInfo = ((ConnectivityManager)var1.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();\r
- if (networkInfo != null && networkInfo.isAvailable()) {\r
+ public void onReceive(Context context, Intent intent) {\r
+ NetworkInfo networkInfo = ((ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();\r
+// NetworkInfo wifiinfo=((ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE)).getNetworkInfo(ConnectivityManager.TYPE_WIFI);\r
+// NetworkInfo mobileinfo=((ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE)).getNetworkInfo(ConnectivityManager.TYPE_MOBILE);\r
+// ICLogger.i("active network type = "+wifiinfo.getTypeName()+", status="+wifiinfo.getState().name());\r
+// ICLogger.i("active network type = "+mobileinfo.getTypeName()+", status="+mobileinfo.getState().name());\r
+ if (networkInfo != null && networkInfo.isAvailable()) {\r
+ if (lastActivType!=networkInfo.getTypeName()){\r
+ lastActivType=networkInfo.getTypeName();\r
+ active_network_changed=true;\r
+ }else{\r
+ active_network_changed=false;\r
+ }\r
StringBuilder var4 = new StringBuilder();\r
- var4.append("BroadcastReceiver---reConnection++ KeepAlive.isConnected=");\r
+\r
+ var4.append("BroadcastReceiver---网络连接成功 KeepAlive.isConnected=");\r
var4.append(KeepAlive.isConnected);\r
- var4.append(",network_is_down=");\r
- var4.append(NetworkObservable.this.network_is_down);\r
+ var4.append(",active_network_changed=");\r
+ var4.append(active_network_changed);\r
var4.append(",network_is_from_no_to_yes=");\r
- var4.append(NetworkObservable.this.network_is_from_no_to_yes);\r
+ var4.append(network_is_from_no_to_yes);\r
+ var4.append(",network_type=").append(networkInfo.getTypeName());\r
ICLogger.i(var4.toString());\r
- if (!KeepAlive.isConnected && !NetworkObservable.this.network_is_from_no_to_yes) {\r
- if (NetworkObservable.this.network_is_down) {\r
-\r
- NetworkObservable.this.objectPublishSubject.onNext(3);\r
- NetworkObservable.this.network_is_down = false;\r
+ if (!KeepAlive.isConnected && !network_is_from_no_to_yes) {\r
+ //如果serversocket 未连接成功,且之前网络未断开重连\r
+ if (active_network_changed) {\r
+ //如果之前一次是网络断开,则重连\r
+ objectPublishSubject.onNext(2);\r
} else {\r
- NetworkObservable.this.objectPublishSubject.onNext(2);\r
- NetworkObservable.this.network_is_down = true;\r
+ //如果之前网络正常,则无需重连\r
+ objectPublishSubject.onNext(1);\r
}\r
- } else if (NetworkObservable.this.network_is_from_no_to_yes) {\r
- NetworkObservable.this.objectPublishSubject.onNext(1);\r
+ } else if (network_is_from_no_to_yes) {\r
+ //如果是断网重连,则证明需要重连\r
+ objectPublishSubject.onNext(3);\r
} else if (KeepAlive.isConnected) {\r
- NetworkObservable.this.network_is_down = false;\r
+ //如果网络实际连接的,就无需重连\r
+ active_network_changed = false;\r
}\r
- NetworkObservable.this.network_is_from_no_to_yes = false;\r
+ //下次在有新状态,无需重连\r
+ network_is_from_no_to_yes = false;\r
} else {\r
ICLogger.i("网络断开");\r
- NetworkObservable.this.network_is_from_no_to_yes = true;\r
- NetworkObservable.this.objectPublishSubject.onNext(0);\r
+ lastActivType="off";\r
+ network_is_from_no_to_yes = true; //断网了,则下次变化必然是 FromNoToYes,需要重连 所以为 True\r
+ objectPublishSubject.onNext(0); //发送断网消息。\r
}\r
\r
}\r
};\r
- private boolean network_is_down = false;\r
+ private boolean active_network_changed = false;\r
private boolean network_is_from_no_to_yes = true;\r
BehaviorSubject<Integer> objectPublishSubject = BehaviorSubject.create();\r
\r
this.mNetworkType = ((TelephonyManager)this.context.getSystemService(Context.TELEPHONY_SERVICE)).getNetworkType();\r
}\r
\r
- public boolean isScreenON() {\r
+ public static boolean isScreenON(Context context) {\r
// If you use less than API20:\r
- PowerManager powerManager = (PowerManager) this.context.getSystemService(POWER_SERVICE);\r
+ PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);\r
// If the screen is off then the device has been locked\r
\r
boolean lisScreenOn;\r
-#Wed Mar 11 02:07:29 CST 2020\r
-VERSION_CODE=373\r
+#Fri Mar 13 10:11:53 CST 2020\r
+VERSION_CODE=374\r