1、修改和添加短信命令及broadcast测试对应命令,今日主要增加了apn和location命令。具体命令如下:
authorsnickersun <snickersun@qq.com>
Fri, 14 Feb 2020 17:34:36 +0000 (01:34 +0800)
committersnickersun <snickersun@qq.com>
Fri, 14 Feb 2020 17:34:36 +0000 (01:34 +0800)
2、修改定位逻辑,增加Custom Mode(5),定位间隔以秒为单位,最低30秒。低于1分钟定位的话,GPS就不会关闭了。
am broadcast -a com.enqualcomm.support.SMSCMD --es smsCmd "#status#"
am broadcast -a com.enqualcomm.support.SMSCMD --es smsCmd "#deviceinfo#"
am broadcast -a com.enqualcomm.support.SMSCMD --es smsCmd "#apn#=current#"
am broadcast -a com.enqualcomm.support.SMSCMD --es smsCmd "#apn#=460,07,CMNET,cmnet,,#"
am broadcast -a com.enqualcomm.support.SMSCMD --es smsCmd "#imei:reset"
am broadcast -a com.enqualcomm.support.SMSCMD --es smsCmd "#imei:current"
am broadcast -a com.enqualcomm.support.SMSCMD --es smsCmd "#imei:123456789012345"
am broadcast -a com.enqualcomm.support.SMSCMD --es smsCmd "#setlocation#=reset#"
am broadcast -a com.enqualcomm.support.SMSCMD --es smsCmd "#setlocation#=5,30#"
am broadcast -a com.enqualcomm.support.SMSCMD --es smsCmd "#ip#=reset#"
am broadcast -a com.enqualcomm.support.SMSCMD --es smsCmd "#ip#=current#"
am broadcast -a com.enqualcomm.support.SMSCMD --es smsCmd "#ip#=192.168.0.1:8080#"
am broadcast -a com.enqualcomm.support.SMSCMD --es smsCmd "#ip#=192.168.0.1,8080#"

app/src/main/AndroidManifest.xml
app/src/main/java/com/enqualcomm/support/CoreService.java
app/src/main/java/com/enqualcomm/support/ICSmsManager.java
app/src/main/java/com/enqualcomm/support/LocationClient.java
app/src/main/java/com/enqualcomm/support/NMEAListener.java
app/src/main/java/com/enqualcomm/support/bean/ICLocation.java
app/src/main/java/com/enqualcomm/support/utils/APNUtil.java [new file with mode: 0644]
app/src/main/java/com/enqualcomm/support/utils/AlarmHelper.java
app/src/main/java/com/enqualcomm/support/utils/BatteryUtil.java
dNSCache/src/main/java/com/sina/util/dnscache/DNSCache.java

index 6d43060..bb6d0e9 100644 (file)
     <uses-feature android:name="android.hardware.camera"/>
     <uses-feature android:name="android.hardware.camera.autofocus"/>
     <uses-permission android:name="android.permission.GET_TASKS"/>
+
+    <uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />
+
     <permission android:name="com.enqualcomm.support.permission.MIPUSH_RECEIVE" android:protectionLevel="signature"/>
     <uses-permission android:name="com.enqualcomm.support.permission.MIPUSH_RECEIVE"/>
     <protected-broadcast android:name="com.enqualcomm.support.ACTION_EQC_ALARM"/>
index eba3437..4da9a78 100644 (file)
@@ -176,10 +176,9 @@ public class CoreService extends Service {
             Logger.i(stringBuilder2.toString());\r
 \r
             if (ACTION_SEND_EMEGENCY_LOCATION_START.equals(param1Intent.getAction())){\r
-                runtime.getLocationInstance().setWorkingMod(CUSTOM_MOD);\r
-                runtime.getLocationInstance().setLocation_cycle(1);\r
+                runtime.getLocationInstance().setWorkingMod(EMERGNECY_MOD);\r
                 runtime.setPpgTestCycle(1);\r
-                setLocationAlarm(CUSTOM_MOD);\r
+                setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
                 setHeartRateDetectAlarm(runtime.getPpgTestCycle());\r
                 setEmegencyLocationSTOPAlarm(5);\r
             }else if (ACTION_LOCAL_SOS_ACTION.endsWith(param1Intent.getAction())){\r
@@ -194,9 +193,8 @@ public class CoreService extends Service {
                     connection.send(protocolAPIHelper.genStringMessage("AP10",protocolAPIHelper.AP10(runtime)));\r
 \r
                     //开启紧急定位模式,GPS 优先1分钟一次定位,持续5分钟\r
-                   runtime.getLocationInstance().setWorkingMod(CUSTOM_MOD);\r
-                   runtime.getLocationInstance().setLocation_cycle(1);\r
-                    setLocationAlarm(CUSTOM_MOD);\r
+                    runtime.getLocationInstance().setWorkingMod(EMERGNECY_MOD);\r
+                    setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
                     //SOS模式,心率测试1分钟一次,持续5分钟\r
                     runtime.setPpgTestCycle(1);\r
                     setHeartRateDetectAlarm(runtime.getPpgTestCycle());\r
@@ -441,7 +439,7 @@ public class CoreService extends Service {
 \r
     @Override\r
     public void onCreate() {\r
-//        Logger.i("CoreService--onCreate002");\r
+\r
         log("初始化网络协议服务");\r
         mProtocolServer=this;\r
 \r
@@ -530,15 +528,17 @@ public class CoreService extends Service {
         this.mSignalUtil = SimSignalUtil.getInstance(this);\r
 \r
         //初始化 电池电量监控工具(内部注册接收电池变化)\r
-        batteryUtil = new BatteryUtil(this.runtime);\r
-        batteryUtil.registerBroadReceiver();\r
-\r
+        batteryUtil = new BatteryUtil(this.runtime,connection);\r
 \r
         //保证发送心跳时提前获取BatLevel数据\r
         int batlevel=batteryUtil.getBatteryLevel(this);\r
         runtime.setBattery(String.format("%03d",batlevel));\r
         Logger.i("Battery get from api "+batlevel);\r
 \r
+        //api直接获取batterylevel取消注册 receiver, 需要重新注册一下。\r
+\r
+        batteryUtil.registerBroadReceiver();\r
+\r
         //设置计步清零时间。\r
         setCleanStepCountAlarm();\r
 \r
@@ -692,13 +692,6 @@ public class CoreService extends Service {
                             }else if(ACTION_SEND_EMEGENCY_LOCATION_STOP.equals(paramIntent.getAction())){\r
                                 //stop Emegency location Stop\r
                                 Config.loadModCycleSettings(runtime); //回复之前的 工作模式即可\r
-                            }else if (ACTION_BATTERY_LOW_MSG.equals(paramIntent.getAction())){\r
-\r
-                                runtime.setAlarmType(false,runtime.getBatteryLow(),false,false);\r
-                                //trigger AP10 报警定位\r
-                                CoreService.this.locationClient.triggerSOSLocationProcess();\r
-\r
-                                return Service.START_STICKY;\r
                             }\r
                             this.invokeHandlerServiceChain.processUserRequest(paramIntent, this.connection, this.runtime);\r
                         }\r
@@ -755,21 +748,21 @@ public class CoreService extends Service {
         switch(mod){\r
             case EMERGNECY_MOD:\r
             case REALTIME_MOD:\r
-                cycle=1;\r
+                cycle=60;\r
                 break;\r
             case NORMAL_MOD:\r
-                cycle=15;\r
+                cycle=15*60;\r
                 break;\r
             case LOWPOWER_MOD:\r
-                cycle=60;\r
+                cycle=60*60;\r
                 break;\r
             case CUSTOM_MOD:\r
                 cycle=runtime.getLocationInstance().getLocation_cycle();\r
                 break;\r
         }\r
 \r
-        AlarmHelper.setRealTimeAlarm(runtime.getContextProxy().context,cycle, ACTION_LOCATION_ALARM);\r
-        sb.append(" setLocationAlarm  "+ACTION_LOCATION_ALARM+" mod "+mod+", cycle "+cycle);\r
+        AlarmHelper.setRealTimeAlarmInSeconds(runtime.getContextProxy().context,cycle, ACTION_LOCATION_ALARM);\r
+        sb.append(" setLocationAlarm  "+ACTION_LOCATION_ALARM+" mod "+mod+", cycle in Seconds "+cycle);\r
         locationClient.triggerLocationProcess();\r
 \r
         Logger.i(sb.toString());\r
@@ -833,32 +826,14 @@ public class CoreService extends Service {
         }\r
     }\r
 \r
-    private void LogToast(String msg) {\r
-//        if (msg!=null && msg.length()>0 && toast!=null)\r
-//            toast.setText(msg).show();\r
-    }\r
-\r
-\r
      private static final String TAG = "ICSrv." + CoreService.class.getSimpleName();\r
 \r
-    private static boolean mLowPowerMode = false;\r
-    private static boolean mCallStateIsIdle = true;     // 非通话活动\r
-     private TelephonyManager telManager;\r
     private Timer mTimer_retry_connect=null;\r
-    private WifiManager mWifiManager=null;\r
-\r
-    private static Runtime mDevStat=null;\r
-//    private protocolAPIHelper mProtocolAPI=null;\r
-\r
 \r
     private void log(String msg) {\r
         Logger.log(TAG,msg);\r
     }\r
 \r
-    private void log(String funcName, String msg) {\r
-        Logger.log(TAG,funcName,msg);\r
-    }\r
-\r
     public static CoreService getInstance(){\r
         return mProtocolServer;\r
     }\r
@@ -927,10 +902,7 @@ public class CoreService extends Service {
     @Override\r
     public void onDestroy() {\r
         super.onDestroy();\r
-        try {\r
-            unregisterReceiver(mIntentReceiver);\r
-        } catch (Exception ignored) {\r
-        }\r
+\r
         saveStepCount();\r
         this.connectionServiceChain.processDetach(this.connection, this.runtime);\r
         this.invokeHandlerServiceChain.processDetach(this.connection, this.runtime);\r
@@ -940,6 +912,7 @@ public class CoreService extends Service {
         unregisterReceiver(this.screenOnReceiver);\r
         unregisterReceiver(this.AtCallbackBroadcastReceiver);\r
         batteryUtil.unregisterBroadReceiver();\r
+        smsManager.unregisterBroadReceiver();\r
 \r
     }\r
 \r
@@ -947,77 +920,4 @@ public class CoreService extends Service {
         this.connection.close();\r
     }\r
 \r
-    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {\r
-        @Override\r
-        public void onReceive(Context context, Intent intent) {\r
-            String action = intent.getAction();\r
-            boolean lastIsLowPowerMode = isLowPowerMode();\r
-            log("mIntentReceiver,onReceive", "START");\r
-            log("mIntentReceiver,onReceive", "action: " + action\r
-                    + ", mCallStateIsIdle: " + mCallStateIsIdle);\r
-\r
-            setLowPowerMode(false);\r
-            if (!inCall() && action != null) { // 非通话活动\r
-                boolean currLowPowerMode = false;\r
-                if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {\r
-                    int rawLevel = intent.getIntExtra("level", -1);\r
-                    int scale = intent.getIntExtra("scale", -1);\r
-                    int status = intent.getIntExtra("status", -1);\r
-                    int level = -1; // percentage, or -1 for unknown\r
-\r
-                    if (status != BatteryManager.BATTERY_STATUS_CHARGING) {  // 非充电状态\r
-                        if (rawLevel >= 0 && scale > 0) {\r
-                            level = (rawLevel * 100) / scale;\r
-                            currLowPowerMode = isLowPower(level);\r
-                            log("mIntentReceiver,onReceive", "level: " + level);\r
-                        }\r
-                    }\r
-                } else if (action.equals(Intent.ACTION_BATTERY_LOW)) {\r
-                    log("mIntentReceiver,onReceive", "ACTION_BATTERY_LOW");\r
-                    currLowPowerMode = true;\r
-                }\r
-\r
-                // 只在状态改变时激活桌面\r
-                boolean needActivateLauncher = (currLowPowerMode != lastIsLowPowerMode);\r
-                log("mIntentReceiver,onReceive",\r
-                        "lastIsLowPowerMode:" + lastIsLowPowerMode +\r
-                                "currLowPowerMode:" + currLowPowerMode +\r
-                                ", needActivateLauncher:" + needActivateLauncher);\r
-\r
-                setLowPowerMode(currLowPowerMode);\r
-\r
-\r
-                if (needActivateLauncher) {\r
-                    log("低电量,进入协议省电模式!");\r
-                }\r
-\r
-            }\r
-            log("mIntentReceiver,onReceive", "END");\r
-        }\r
-    };\r
-\r
-    public boolean isLowPowerMode() {\r
-        log("isLowPowerMode", "" + mLowPowerMode);\r
-        return mLowPowerMode;\r
-    }\r
-\r
-    /**\r
-     * 根据电量,判断是否是低电量\r
-     *\r
-     * @param level\r
-     * @return\r
-     */\r
-    public static boolean isLowPower(int level) {\r
-        return (level <= 15);\r
-    }\r
-\r
-    public void setLowPowerMode(boolean v) {\r
-        log("setLowPowerMode", "" + v);\r
-        mLowPowerMode = v;\r
-    }\r
-\r
-    private boolean inCall() {\r
-//        return telManager.getCallState() != TelephonyManager.CALL_STATE_IDLE;\r
-        return false;\r
-    }\r
 }\r
index a422450..3406084 100644 (file)
@@ -15,6 +15,7 @@ import android.telephony.SmsMessage;
 import android.widget.Toast;\r
 \r
 import com.enqualcomm.support.bean.Runtime;\r
+import com.enqualcomm.support.utils.APNUtil;\r
 import com.enqualcomm.support.utils.DeviceInfoUtil;\r
 import com.enqualcomm.support.utils.Logger;\r
 import com.enqualcomm.support.utils.ServiceUtil;\r
@@ -26,24 +27,18 @@ import chestnut.utils.PhoneUtils;
 \r
 \r
 public class ICSmsManager {\r
-    private static String mNumber;\r
+    private static String ACTION_SMSCMD="com.enqualcomm.support.SMSCMD";\r
     private static long preTimeMillis;\r
-    private Uri SMS_INBOX = Uri.parse("content://sms/inbox");\r
     private Context mContext = null;\r
     Runtime runtime;\r
-//    ArrayList<CheckBillInfo> smsInfoList;\r
     ICSmsManager.SmsReceiver smsReceiver;\r
-//    ArrayList<byte[]> source;\r
 \r
     public ICSmsManager( Runtime _runtime) {\r
-//        this.source = src;\r
         this.runtime = _runtime;\r
         this.mContext = runtime.getContextProxy().context;\r
         this.smsReceiver = new ICSmsManager.SmsReceiver();\r
-        IntentFilter intentFilter = new IntentFilter();\r
-        intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");\r
-        intentFilter.setPriority(2147483647);\r
-        this.mContext.registerReceiver(this.smsReceiver, intentFilter);\r
+\r
+        registerBroadReceiver();\r
     }\r
 \r
     public void sendSMS(String phonenumber, String msg) {\r
@@ -53,7 +48,9 @@ public class ICSmsManager {
         while(msgit.hasNext()) {\r
             String message= (String)msgit.next();\r
             Logger.i("reply message to "+phonenumber+", "+message);\r
-            smsManager.sendTextMessage(phonenumber, (String)null,message, (PendingIntent)null, (PendingIntent)null);\r
+            if (phonenumber!=null && !phonenumber.isEmpty()) {\r
+                smsManager.sendTextMessage(phonenumber, (String) null, message, (PendingIntent) null, (PendingIntent) null);\r
+            }\r
         }\r
     }\r
 \r
@@ -61,7 +58,33 @@ public class ICSmsManager {
 \r
         return true;\r
     }\r
+    public void registerBroadReceiver() {\r
+\r
+        IntentFilter intentFilter = new IntentFilter();\r
+        intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");\r
+        intentFilter.setPriority(2147483647);\r
+        this.mContext.registerReceiver(this.smsReceiver, intentFilter);\r
 \r
+        intentFilter = new IntentFilter();\r
+        intentFilter.addAction(ACTION_SMSCMD);\r
+        (this.runtime.getContextProxy()).context.registerReceiver(this.mSMSCMD_BroadcastReceiver, intentFilter);\r
+    }\r
+\r
+    public void unregisterBroadReceiver() {\r
+        (this.runtime.getContextProxy()).context.unregisterReceiver(this.mSMSCMD_BroadcastReceiver);\r
+        (this.runtime.getContextProxy()).context.unregisterReceiver(this.smsReceiver);\r
+    }\r
+\r
+    private final BroadcastReceiver mSMSCMD_BroadcastReceiver = new BroadcastReceiver() {\r
+        @Override\r
+        public void onReceive(Context context, Intent intent) {\r
+            String action = intent.getAction();\r
+            if (ACTION_SMSCMD.equals(action)) {\r
+                String cmd = intent.getStringExtra("smsCmd");\r
+                handleSMS_CMD("", cmd);\r
+            }\r
+        }\r
+    };\r
     //1:短信设置服务器\r
     //#ip#=198.11.183.28,5088#\r
     //回复 ip set ok\r
@@ -81,28 +104,77 @@ public class ICSmsManager {
     //SW: L02_20200208_V1\r
     public void handleSMS_CMD(String phonenumber, String sms){\r
         if (isAdminNumber(phonenumber)) {\r
-            if (sms.startsWith("#deviceinfo#")) {\r
+\r
+            if (sms==null || sms.isEmpty()) return ;\r
+\r
+            if (sms.startsWith("#apn#=")&& sms.endsWith("#")){\r
+                String[] tmp=sms.split("#");\r
+                if(tmp.length==3) {\r
+                    String[] apnvalues=  tmp[2].replace("=","").split(",");\r
+                    if (apnvalues.length==4){\r
+                        String mcc=apnvalues[0];\r
+                        String mnc=apnvalues[1];\r
+                        String apnName=apnvalues[2];\r
+                        String apn=apnvalues[3];\r
+                        String user="";\r
+                        String password="";\r
+                        if(APNUtil.addVPN(mcc,mnc,apnName,apn,user,password,mContext)==true){\r
+                            sendSMS(phonenumber,"apn add success!");\r
+                        }else{\r
+                            sendSMS(phonenumber,"apn add failed!");\r
+                        }\r
+                    }else if (apnvalues.length==6) {\r
+                        String mcc=apnvalues[0];\r
+                        String mnc=apnvalues[1];\r
+                        String apnName=apnvalues[2];\r
+                        String apn=apnvalues[3];\r
+                        String user=apnvalues[4];\r
+                        String password=apnvalues[5];\r
+                        if(APNUtil.addVPN(mcc,mnc,apnName,apn,user,password,mContext)==true){\r
+                            sendSMS(phonenumber,"apn add success!");\r
+                        }else{\r
+                            sendSMS(phonenumber,"apn add failed!");\r
+                        }\r
+                    }else  if (apnvalues.length==1){\r
+                        if (apnvalues[0].equals("current")) {\r
+\r
+                            String apnstr = APNUtil.getCurrentAPN(mContext);\r
+                            sendSMS(phonenumber, apnstr);\r
+                        }else{\r
+                            sendSMS(phonenumber,"apn cmd format error!");\r
+                        }\r
+                    } else{\r
+                        sendSMS(phonenumber,"apn cmd format error!");\r
+                    }\r
+                }else {\r
+\r
+                    sendSMS(phonenumber,"apn cmd format error!");\r
+\r
+                }\r
+            }else if (sms.startsWith("#deviceinfo#")) {\r
                 Logger.i("SMS "+sms+" reply "+DeviceInfoUtil.getShortDeviceInfo(runtime));\r
                 sendSMS(phonenumber,DeviceInfoUtil.getShortDeviceInfo(runtime));\r
             }else if (sms.startsWith("#status#")) {\r
-                String reply="IMEI="+runtime.IMEI()+"\nSW:"+DeviceInfoUtil.getVersionCode(runtime.getContextProxy().context)+" "+DeviceInfoUtil.getSWVersionDisplayName();\r
+                String reply="IMEI="+runtime.IMEI()+"\nSW:"+DeviceInfoUtil.getVersionCode(mContext)+" "+DeviceInfoUtil.getSWVersionDisplayName();\r
                 Logger.i("SMS "+sms+" reply \n"+reply);\r
                 sendSMS(phonenumber,reply);\r
             }else if (sms.startsWith("#imei:")) {\r
                 String imei=sms.substring(6);\r
                 Logger.i("SMS "+sms+" imei="+imei);\r
                 if (imei.length()==15 ) {\r
-                    Config.setIMEI(runtime.getContextProxy().context, imei);\r
+                    Config.setIMEI(mContext, imei);\r
                     runtime.setImeiAndCid(imei, "");\r
                     sendSMS(phonenumber, "set IMEI " + imei + " sucess !");\r
                     CoreService.getInstance().disconnect_server();\r
                     CoreService.getInstance().ReConnectToServer();\r
                 }else if (imei.equals("reset")) {\r
-                    Config.setIMEI(runtime.getContextProxy().context, "");\r
-                    runtime.setImeiAndCid(PhoneUtils.getIMEI(runtime.getContextProxy().context), "");\r
-                    sendSMS(phonenumber, "reset IMEI to " + PhoneUtils.getIMEI(runtime.getContextProxy().context) + " sucess !");\r
+                    Config.setIMEI(mContext, "");\r
+                    runtime.setImeiAndCid(PhoneUtils.getIMEI(mContext), "");\r
+                    sendSMS(phonenumber, "reset IMEI to " + PhoneUtils.getIMEI(mContext) + " sucess !");\r
                     CoreService.getInstance().disconnect_server();\r
                     CoreService.getInstance().ReConnectToServer();\r
+                }else if (imei.equals("current")) {\r
+                    sendSMS(phonenumber, "Current IMEI " + runtime.IMEI());\r
                 }else{\r
                     sendSMS(phonenumber, "set IMEI " + imei + "  failed ! len!=15");\r
                 }\r
@@ -110,54 +182,84 @@ public class ICSmsManager {
                 String tmp[]=sms.split("=");\r
                 String reply="";\r
                 Logger.i(sms+" len "+tmp.length);\r
-                if (tmp.length==2)\r
-                {\r
-                    //分析 以 , 为分界的格式\r
-                    String[] ipstr = tmp[1].split(",");\r
-                    if (ipstr[0].equals("reset#")) {\r
-                        Config.setProtocolServerHost(runtime.getContextProxy().context, Runtime.DefaultHost);\r
-                        Config.setProtocolServerAddr(runtime.getContextProxy().context, "", Runtime.DefaultPort);\r
+                if (tmp.length==2) {\r
+                    if (tmp[1].equals("reset#")) {\r
+                        Config.setProtocolServerHost(mContext, Runtime.DefaultHost);\r
+                        Config.setProtocolServerAddr(mContext, "", Runtime.DefaultPort);\r
                         reply = "reset ServerIP to " + Runtime.DefaultHost + ":" + Runtime.DefaultPort + " success! ";\r
                         Config.loadServerSettings(runtime);\r
                         CoreService.getInstance().disconnect_server();\r
                         CoreService.getInstance().ReConnectToServer();\r
-                    }else if (ipstr.length==2){\r
-                        String ip=ipstr[0];\r
-                        int port=Integer.valueOf(ipstr[1].replace("#",""));\r
-                        Config.setProtocolServerHost(runtime.getContextProxy().context,ip);\r
-                        Config.setProtocolServerAddr(runtime.getContextProxy().context,"",port);\r
-                        reply = sms+" success! ";\r
-                        Config.loadServerSettings(runtime);\r
-                        CoreService.getInstance().disconnect_server();\r
-                        CoreService.getInstance().ReConnectToServer();\r
-                    }else{\r
-                        //分析以 : 为分界的格式\r
-                        ipstr = tmp[1].split(":");\r
-\r
-                        if (ipstr[0].equals("reset#")) {\r
-                            Config.setProtocolServerHost(runtime.getContextProxy().context, Runtime.DefaultHost);\r
-                            Config.setProtocolServerAddr(runtime.getContextProxy().context, "", Runtime.DefaultPort);\r
-                            reply = "reset ServerIP to " + Runtime.DefaultHost + ":" + Runtime.DefaultPort + " success! ";\r
-                            Config.loadServerSettings(runtime);\r
-                            CoreService.getInstance().disconnect_server();\r
-                            CoreService.getInstance().ReConnectToServer();\r
-                        } else if (ipstr.length == 2) {\r
+                    } else if (tmp[1].equals("current#")) {\r
+                        reply = "current serverAddress:" + runtime.getHost() + ":" + runtime.getPort();\r
+                    } else {\r
+                        //分析 以 , 为分界的格式\r
+                        String[] ipstr = tmp[1].split(",");\r
+                        if (ipstr.length == 2) {\r
                             String ip = ipstr[0];\r
                             int port = Integer.valueOf(ipstr[1].replace("#", ""));\r
-                            Config.setProtocolServerHost(runtime.getContextProxy().context, ip);\r
-                            Config.setProtocolServerAddr(runtime.getContextProxy().context, "", port);\r
+                            Config.setProtocolServerHost(mContext, ip);\r
+                            Config.setProtocolServerAddr(mContext, "", port);\r
                             reply = sms + " success! ";\r
                             Config.loadServerSettings(runtime);\r
                             CoreService.getInstance().disconnect_server();\r
                             CoreService.getInstance().ReConnectToServer();\r
                         } else {\r
-                            reply = sms + " falied! ";\r
+                            //分析以 : 为分界的格式\r
+                            ipstr = tmp[1].split(":");\r
+                            if (ipstr.length == 2) {\r
+                                String ip = ipstr[0];\r
+                                int port = Integer.valueOf(ipstr[1].replace("#", ""));\r
+                                Config.setProtocolServerHost(mContext, ip);\r
+                                Config.setProtocolServerAddr(mContext, "", port);\r
+                                reply = sms + " success! ";\r
+                                Config.loadServerSettings(runtime);\r
+                                CoreService.getInstance().disconnect_server();\r
+                                CoreService.getInstance().ReConnectToServer();\r
+                            } else {\r
+                                reply = sms + " falied! ";\r
+                            }\r
                         }\r
                     }\r
                 }else{\r
                     reply = sms + " falied! ";\r
                 }\r
                 sendSMS(phonenumber, reply);\r
+            }else if (sms.startsWith("#setlocation#=")&& sms.endsWith("#")){\r
+                String tmp[]=sms.split("=");\r
+                if (tmp.length==2){\r
+                    if (tmp[1].equals("reset#")){\r
+                        Config.loadModCycleSettings(runtime);//恢复初始设置\r
+                        sendSMS(phonenumber, "reset to Location Mode="+runtime.getLocationInstance().getWorkingMod()+", Cycle="+runtime.getLocationInstance().getLocation_cycle());\r
+                    }else {\r
+                        String[] t=tmp[1].replace("#","").split(",");\r
+                        if (t.length==2){\r
+                            int mod=0;\r
+                            int cycle=0;\r
+                            try {\r
+                                mod = Integer.valueOf(t[0]);\r
+                                cycle = Integer.valueOf(t[1]);\r
+                            }catch (Exception e){\r
+                                e.printStackTrace();\r
+                            }\r
+                            if(mod<6&& mod>0 && cycle>=30 ){\r
+                                runtime.getLocationInstance().setLocation_cycle(cycle);\r
+                                runtime.getLocationInstance().setWorkingMod(mod);\r
+                                CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
+                                sendSMS(phonenumber, "set to Location Mode="+runtime.getLocationInstance().getWorkingMod()+", Cycle="+runtime.getLocationInstance().getLocation_cycle());\r
+                            }else{\r
+                                sendSMS(phonenumber, "set to Location Failed ,value range should be 1<= Mode <=5 and cycle >=30!");\r
+                            }\r
+\r
+                        }else{\r
+                            sendSMS(phonenumber, "setlocation format error!");\r
+                        }\r
+                    }\r
+\r
+                }else{\r
+                    sendSMS(phonenumber, "setlocation format error!");\r
+                }\r
+\r
             }\r
         }\r
     }\r
index d429439..bc05c38 100644 (file)
@@ -283,9 +283,10 @@ public class LocationClient {
         Logger.i("lbs_ok "+lbs_ok+" waitAndSendLocation wifi_ok " + wifi_ok+ " gps_ok "+gps_ok + " mode "+mode);\r
 \r
         switch(mode){\r
+          case ICLocation.CUSTOM_MOD:\r
           case ICLocation.EMERGNECY_MOD:\r
           case ICLocation.REALTIME_MOD:\r
-          case ICLocation.CUSTOM_MOD:\r
+\r
 \r
             //GPS 优先的话多给些时间(10秒)\r
             if (checktimes> 50) timeout=true;\r
@@ -441,9 +442,14 @@ public void updateCellInfo() {
     updateCellInfo();\r
       startWifiScan();\r
     switch(mod){\r
+      case ICLocation.CUSTOM_MOD:\r
+        if(runtime.getLocationInstance().getLocation_cycle()<60){\r
+          nmeaListener.setNoStop(true);\r
+        }else{\r
+          nmeaListener.setNoStop(false);\r
+        }\r
       case ICLocation.EMERGNECY_MOD:\r
       case ICLocation.REALTIME_MOD:\r
-      case ICLocation.CUSTOM_MOD:\r
         startGpsLocate();\r
         break;\r
     }\r
index 11113ea..1379b86 100644 (file)
@@ -33,13 +33,22 @@ public class NMEAListener implements NmeaListener, LocationListener {
   private double longitude;\r
   private double latitude;\r
 \r
+  private boolean noStop=false;\r
+\r
   private int SearchTimeout = 120;\r
   private int noSignalCount=0;\r
   private int searchCout=0;\r
   private  GPS_CURRENT_STATUS  gpsMode;\r
   int numberOfSatellites;\r
   Runtime runtime;\r
-  \r
+\r
+\r
+  public void setNoStop(boolean nostop){\r
+    noStop=nostop;\r
+    if (noStop==false){\r
+      stopListen();\r
+    }\r
+  }\r
   public NMEAListener(LocationManager paramLocationManager, Runtime paramRuntime) {\r
     this.locationManager = paramLocationManager;\r
     this.runtime = paramRuntime;\r
@@ -136,16 +145,20 @@ public class NMEAListener implements NmeaListener, LocationListener {
   };\r
 \r
 \r
+  private final int MSG_WHAT_GPS_FIXED=300;\r
+  private final int MSG_WHAT_GPS_TIMEOUT=100;\r
+  private final int MSG_WHAT_GPS_NOSTAR=200;\r
+  private final int MSG_WHAT_GPS_FIXED_NO_STOP=400;\r
 \r
   Handler temHandler = new Handler(new Handler.Callback() {\r
     @Override\r
     public boolean handleMessage(Message message) {\r
 \r
-      if( message.what== 100|| message.what==200){\r
+      if( message.what== MSG_WHAT_GPS_TIMEOUT|| message.what==MSG_WHAT_GPS_NOSTAR){\r
       //no start\r
       //do nothing\r
 \r
-      }else if (message.what==300){\r
+      }else if (message.what==MSG_WHAT_GPS_FIXED){\r
         //fixed\r
          /*\r
         只有当前GPS已经定位,且location不为空才给 runtime赋值GPS坐标。\r
@@ -153,10 +166,13 @@ public class NMEAListener implements NmeaListener, LocationListener {
          */\r
         runtime.getLocationInstance().setLocationStat(ICLocation.LOCATION_STAT.LOCATION_FIXED);\r
 \r
+      }else if (message.what== MSG_WHAT_GPS_FIXED_NO_STOP){\r
+        runtime.getLocationInstance().setLocationStat(ICLocation.LOCATION_STAT.LOCATION_FIXED);\r
+        return true;\r
       }\r
 \r
       NMEAListener.this.stopListen();\r
-      return false;\r
+      return true;\r
     }\r
   });\r
   private void get3MaxSnrSatellite(GpsSatellite gst){\r
@@ -225,14 +241,14 @@ public class NMEAListener implements NmeaListener, LocationListener {
       gpsMode=GPS_CURRENT_STATUS.GPS_TIMEOUT;\r
       runtime.getLocationInstance().setLocationStat(ICLocation.LOCATION_STAT.LOCATION_GPS_TIEMOUT);\r
 \r
-      stop(100);\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(200);\r
+      stop(MSG_WHAT_GPS_NOSTAR);\r
     }\r
     if (Config.LOG_TOFILE) FileOutputUtil.fileOutput(this.runtime.getCacheDir(),"GPS",sb2.toString());\r
 \r
@@ -258,12 +274,16 @@ public class NMEAListener implements NmeaListener, LocationListener {
   }\r
   private void delaystop(){\r
 \r
+    if (noStop){\r
+      NMEAListener.this.temHandler.sendEmptyMessageDelayed(MSG_WHAT_GPS_FIXED_NO_STOP, 3000L);\r
+    }else {\r
     /*\r
         只有当前GPS已经定位,且location不为空才给 runtime赋值GPS坐标。\r
         延迟三秒后才设置runtime的定位标志,以便稳定坐标值。\r
          */\r
-    //发送停止消息\r
-    NMEAListener.this.temHandler.sendEmptyMessageDelayed(300,3000L);\r
+      //发送停止消息\r
+      NMEAListener.this.temHandler.sendEmptyMessageDelayed(MSG_WHAT_GPS_FIXED, 3000L);\r
+    }\r
   }\r
   boolean isFrist = true;\r
 \r
@@ -348,28 +368,32 @@ public class NMEAListener implements NmeaListener, LocationListener {
 \r
   public boolean startListen() {\r
 \r
-    Criteria criteria = new Criteria();\r
-    criteria.setAccuracy(Criteria.ACCURACY_FINE);// 设置为最大精度\r
-    criteria.setAltitudeRequired(false);//不要求海拔信息\r
-    criteria.setBearingRequired(false);// 不要求方位信息\r
-    criteria.setCostAllowed(true);//是否允许付费\r
-    criteria.setPowerRequirement(Criteria.POWER_LOW);// 对电量的要求\r
-\r
-    String provider = locationManager.getBestProvider(criteria,true);\r
-\r
-    Logger.i("GPS StartListen with Provider "+provider);\r
-    this.locationManager.requestLocationUpdates(provider, 0L, 0.0F, this);\r
-    this.listening = true;\r
-    noSignalCount=0;\r
-    longitude=0;\r
-    latitude=0;\r
-    searchCout=0;\r
-    gpsMode = GPS_CURRENT_STATUS.GPS_LISTENING;\r
-    locationManager.addGpsStatusListener(statusListener);//监听搜星状态\r
+    if (this.listening == false) {\r
+      Criteria criteria = new Criteria();\r
+      criteria.setAccuracy(Criteria.ACCURACY_FINE);// 设置为最大精度\r
+      criteria.setAltitudeRequired(false);//不要求海拔信息\r
+      criteria.setBearingRequired(false);// 不要求方位信息\r
+      criteria.setCostAllowed(true);//是否允许付费\r
+      criteria.setPowerRequirement(Criteria.POWER_LOW);// 对电量的要求\r
+\r
+      String provider = locationManager.getBestProvider(criteria, true);\r
+\r
+      Logger.i("GPS StartListen with Provider " + provider);\r
+      this.locationManager.requestLocationUpdates(provider, 0L, 0.0F, this);\r
+      this.listening = true;\r
+      noSignalCount = 0;\r
+      longitude = 0;\r
+      latitude = 0;\r
+      searchCout = 0;\r
+      gpsMode = GPS_CURRENT_STATUS.GPS_LISTENING;\r
+      locationManager.addGpsStatusListener(statusListener);//监听搜星状态\r
 //    this.locationManager.addNmeaListener(this);\r
 \r
       //做个热启动\r
-    return gpsHotStart();\r
+      return gpsHotStart();\r
+    }else{\r
+      return true;\r
+    }\r
   }\r
   \r
 \r
index bb0adde..05daadb 100644 (file)
@@ -31,8 +31,8 @@ public class ICLocation {
 \r
     public static final int NORMAL_MOD=1;     //location rate 1 time per 15 minutes\r
     public static final int LOWPOWER_MOD=2;   // location rate 1 time per hour\r
-    public static final int EMERGNECY_MOD=3; //location rate 1 time per minutes\r
-    public static final int REALTIME_MOD=4; //location rate 1 time per minutes\r
+    public static final int REALTIME_MOD=3; //location rate 1 time per minutes\r
+    public static final int EMERGNECY_MOD=4; //location rate 1 time per minutes work 5 minutes\r
     public static final int CUSTOM_MOD=5; //location rate 1 time per minutes\r
 \r
 \r
diff --git a/app/src/main/java/com/enqualcomm/support/utils/APNUtil.java b/app/src/main/java/com/enqualcomm/support/utils/APNUtil.java
new file mode 100644 (file)
index 0000000..e283f4a
--- /dev/null
@@ -0,0 +1,127 @@
+package com.enqualcomm.support.utils;\r
+\r
+import android.content.ContentResolver;\r
+import android.content.ContentValues;\r
+import android.content.Context;\r
+import android.database.Cursor;\r
+import android.net.Uri;\r
+import android.telephony.TelephonyManager;\r
+import android.widget.Toast;\r
+\r
+public class APNUtil {\r
+\r
+    /**\r
+     * 当前连接APN\r
+     * */\r
+    private static Uri APN_URI_NOW =Uri.parse("content://telephony/carriers/current");\r
+    /**\r
+     * 所有APN\r
+     * */\r
+    private static Uri APN_URI = Uri.parse("content://telephony/carriers");\r
+\r
+    private static Uri CURRENT_APN_URI = Uri.parse("content://telephony/carriers/preferapn");\r
+\r
+    public static String getCurrentAPN(Context context){\r
+        ContentResolver resolver = context.getContentResolver();\r
+        Cursor c = resolver.query(APN_URI_NOW, null, null, null, null); //从apn列表中查找apn名称为myapn的apn信息\r
+        String APNSTR="";\r
+        if (c != null && c.moveToNext()) {\r
+            int id = c.getShort(c.getColumnIndex("_id")); //获取该apn的id信息\r
+            String mcc=c.getString(c.getColumnIndex("mcc"));\r
+            String mnc=c.getString(c.getColumnIndex("mnc"));\r
+            String name=c.getString(c.getColumnIndex("name"));\r
+            String apnname=c.getString(c.getColumnIndex("apn"));\r
+            String user=c.getString(c.getColumnIndex("user"));\r
+            String pwd=c.getString(c.getColumnIndex("password"));\r
+            APNSTR="Current APN "+id+","+mcc+","+mnc+","+name+","+apnname+","+user+","+pwd;\r
+            Logger.i(APNSTR);\r
+        } else {\r
+            Logger.i("APN不存在");\r
+            return "APN 不存在";\r
+        }\r
+        return APNSTR;\r
+    }\r
+    public static boolean addVPN(String apnName, String apn, String mcc,String mnc , String user,String passwd,Context context) {\r
+\r
+        if (checkAPN(mcc,mnc,apn,context)==true){\r
+            Logger.i("VPN 已经存在,不需要添加!");\r
+            return false;\r
+        }\r
+        //添加新的APN到系统\r
+        int id= AddNewApn(apnName,apn,mcc,mnc,user,passwd,context);\r
+\r
+        //添加后设置为当前指定APN\r
+        SetAPN(id,context);\r
+\r
+\r
+        boolean isAddSuccess = checkAPN(mcc,mnc,apn,context);\r
+        if (isAddSuccess) {\r
+            Logger.i("APN 添加成功!");\r
+            return true;\r
+//            Toast.makeText(NewAPNActivity.this, "新增APN成功", Toast.LENGTH_SHORT).show();\r
+        } else {\r
+            Logger.i("APN 添加失败!");\r
+            return false;\r
+//            Toast.makeText(NewAPNActivity.this, "新增APN失败", Toast.LENGTH_SHORT).show();\r
+        }\r
+    }\r
+    // 设置接入点\r
+    public static void SetAPN(int id,Context context) {\r
+        ContentResolver resolver = context.getContentResolver();\r
+        ContentValues values = new ContentValues();\r
+        values.put("apn_id", id);\r
+        resolver.update(CURRENT_APN_URI, values, null, null);\r
+    }\r
+    public static boolean checkAPN(String mcc,String mnc,String apn,Context context) {\r
+        // 检查系统已经写入的APN\r
+        Cursor cr = context.getContentResolver().query(APN_URI, null, null, null, null);\r
+        while (cr != null && cr.moveToNext()) {\r
+            if(cr.getString(cr.getColumnIndex("apn")).equals(apn)\r
+                    && cr.getString(cr.getColumnIndex("mcc")).equals(mcc)\r
+                    && cr.getString(cr.getColumnIndex("mnc")).equals(mnc)){\r
+                return true;\r
+            }\r
+        }\r
+        return false;\r
+    }\r
+\r
+\r
+    public static int AddNewApn(String apnName,String apn, String mcc,String mnc , String user,String passwd, Context context) {\r
+        Logger.i("添加一个新的apn ==> "+apnName+", mcc="+mcc+", mnc="+mnc+", user="+user+", password="+passwd);\r
+        int apnId = -1;\r
+        ContentResolver resolver = context.getContentResolver();\r
+        ContentValues values = new ContentValues();\r
+        values.put("name", apnName); //apn中文描述\r
+        values.put("apn", apn); //apn名称\r
+        values.put("type", "default");\r
+        values.put("numeric", mcc+mnc);\r
+        values.put("mcc", mcc);\r
+        values.put("mnc", mnc);\r
+        values.put("proxy", "");\r
+        values.put("port", "");\r
+        values.put("mmsproxy", "");\r
+        values.put("mmsport", "");\r
+        values.put("user", user);\r
+        values.put("server", "");\r
+        values.put("password", passwd);\r
+        values.put("mmsc", "");\r
+        Cursor c = null;\r
+// 获取新添加的apn的ID\r
+        try {\r
+            Uri newRow = resolver.insert(APN_URI, values);\r
+            if (newRow != null) {\r
+                c = resolver.query(newRow, null, null, null, null);\r
+                int idindex = c.getColumnIndex("_id");\r
+                c.moveToFirst();\r
+                apnId = idindex;\r
+            }\r
+        } catch (Exception e) {\r
+            e.printStackTrace();\r
+        }\r
+        if (c != null)\r
+            c.close();\r
+        return apnId;\r
+    }\r
+\r
+\r
+}\r
index 2ce56df..7420499 100644 (file)
@@ -93,7 +93,29 @@ public class AlarmHelper {
     }\r
     alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, l + (minutes * 60 * 1000), pendingIntent);\r
   }\r
-  \r
+\r
+  public static void setRealTimeAlarmInSeconds(Context context, int seconds, String actionname) {\r
+    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);\r
+    Intent intent = new Intent(context, com.enqualcomm.support.CoreService.class);\r
+    intent.setAction(actionname);\r
+    PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);\r
+    alarmManager.cancel(pendingIntent);\r
+    long l = SystemClock.elapsedRealtime();\r
+    StringBuilder stringBuilder = new StringBuilder();\r
+    stringBuilder.append("SDK_INT=");\r
+    stringBuilder.append(Build.VERSION.SDK_INT);\r
+    stringBuilder.append(",m=,");\r
+    stringBuilder.append(23);\r
+    stringBuilder.append(",kitkat=");\r
+    stringBuilder.append(19);\r
+    Logger.i(stringBuilder.toString());\r
+    if (Build.VERSION.SDK_INT >= 19) {\r
+      alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, l + (seconds  * 1000), pendingIntent);\r
+      return;\r
+    }\r
+    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, l + (seconds  * 1000), pendingIntent);\r
+  }\r
+\r
   public static void setTimeAlarm(Context context, int hour, int minutes, String paramString) {\r
     AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);\r
     Intent intent = new Intent(context, com.enqualcomm.support.CoreService.class);\r
index 4704db9..385ea12 100644 (file)
@@ -11,6 +11,7 @@ import android.os.Build;
 \r
 import com.enqualcomm.support.Config;\r
 import com.enqualcomm.support.CoreService;\r
+import com.enqualcomm.support.adapter.protocolAPIHelper;\r
 import com.enqualcomm.support.bean.Runtime;\r
 \r
 import static android.content.Context.BATTERY_SERVICE;\r
@@ -87,10 +88,10 @@ public class BatteryUtil {
           BatteryUtil.this.mRuntime.setBatteryLow(true);\r
           Logger.i("lowbattery finish video_end_call");\r
 \r
+          mRuntime.setAlarmType(false,mRuntime.getBatteryLow(),false,false);\r
+          //trigger AP10 报警定位\r
+          connection.send(protocolAPIHelper.genStringMessage("AP10",protocolAPIHelper.AP10(mRuntime)));\r
 \r
-          ComponentName componentName = new ComponentName("com.enqualcomm.support", "com.enqualcomm.support.CoreService");\r
-          Intent intent = (new Intent(ACTION_BATTERY_LOW_MSG)).setComponent(componentName);\r
-          (mRuntime.getContextProxy()).context.startService(intent);\r
         }\r
       }\r
     };\r
@@ -98,8 +99,11 @@ public class BatteryUtil {
   private StringBuffer mBuffer;\r
 \r
   Runtime mRuntime;\r
-  \r
-  public BatteryUtil(Runtime paramRuntime) { this.mRuntime = paramRuntime; }\r
+  Connection connection;\r
+  public BatteryUtil(Runtime paramRuntime,Connection _connection) {\r
+    this.mRuntime = paramRuntime;\r
+    connection = _connection;\r
+  }\r
   \r
   public void registerBroadReceiver() {\r
     this.mBuffer = new StringBuffer();\r
@@ -114,8 +118,7 @@ public class BatteryUtil {
       BatteryManager batteryManager = (BatteryManager)context.getSystemService(BATTERY_SERVICE);\r
       return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);\r
     } else {\r
-      Intent intent = new ContextWrapper(context.getApplicationContext()).\r
-              registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));\r
+      Intent intent = new ContextWrapper(context.getApplicationContext()).registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));\r
       return (intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100) /\r
               intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);\r
     }\r
index 798c0d6..b1f8261 100644 (file)
@@ -68,7 +68,7 @@ public class DNSCache {
         scoreManager = new ScoreManager();
         dnsManager = new DnsManager();
         speedtestManager = new SpeedtestManager();
-        startTimer();
+//        startTimer();
     }
 
     public static DNSCache getInstance() {