1、添加轮询检测脱腕逻辑(但未实现主动脱腕查询函数)
authorsnickersun <scy@incartech.cn>
Mon, 2 Nov 2020 15:18:13 +0000 (23:18 +0800)
committersnickersun <scy@incartech.cn>
Mon, 2 Nov 2020 15:18:13 +0000 (23:18 +0800)
2、实现蓝牙的第二种扫描方式,周期扫描并上传结果。结果有排序。

app/src/main/java/com/enqualcomm/support/Config.java
app/src/main/java/com/enqualcomm/support/Constants.java
app/src/main/java/com/enqualcomm/support/CoreService.java
app/src/main/java/com/enqualcomm/support/LocationClient.java
app/src/main/java/com/enqualcomm/support/adapter/BTHelper.java
app/src/main/java/com/enqualcomm/support/bean/BLEInfo.java
app/src/main/java/com/enqualcomm/support/service/AntiMonitorService.java
app/src/main/java/com/ic/protocols/protocolAPIHelper.java
app/src/main/java/com/ic/protocols/protocol_ic.java
dNSCache/dNSCache.iml

index 9f028eb..7b7e722 100644 (file)
@@ -57,9 +57,16 @@ public class Config {
   public static boolean noPPGSensor=false;\r
   public static boolean needBroadcastAntiAlarm=true;\r
   public static boolean disableWiFiScan=false;\r
+  public static int BLEScanProtocol=0; /** 0 代表扫描beacon后 自行判断是否在指定区域,需要协议绑定beacon地址。\r
+                                        *  1  代表扫描beacon后,直接把扫描结果上报即可。\r
+                                       **/\r
+  public static boolean UsePolingCheckWeared=false;\r
+\r
   static  {\r
     disableWiFiScan=Util.getSystemProperties("persist.sys.disableWiFiLocation","false").equals("true");\r
     disableWristTemp=Util.getSystemProperties("persist.sys.disableWristTemp","false").equals("true");\r
+    BLEScanProtocol=Util.getSystemPropertiesInt("persist.sys.BLEScanProtocol",0);\r
+    UsePolingCheckWeared=Util.getSystemProperties("persist.sys.PolingCheckAnti","false").equals("true");\r
   }\r
   \r
   private static String make() {\r
@@ -131,6 +138,24 @@ public class Config {
   final static String KeyBPLadust="KeyBPLAdjust";\r
   final static String KeySPo2adust="KeySPo2Adjust";\r
 \r
+  final static String KeyPolingCycleCheckAnti="PolingCycleCheckAnti";\r
+  final static String KeyBleScanCycle="BleScanCycle";\r
+\r
+  public static void setCheckAntiPolingCycle(Context context, int cycle){\r
+    SharPreferenceUtil.setPrefInt(context,KeyPolingCycleCheckAnti,cycle);\r
+  }\r
+\r
+  public static int getCheckAntiPolingCycle(Context context){\r
+    return SharPreferenceUtil.getPrefInt(context,KeyPolingCycleCheckAnti,0);\r
+  }\r
+\r
+  public static void setBleScanCycle(Context context, int cycle){\r
+    SharPreferenceUtil.setPrefInt(context,KeyBleScanCycle,cycle);\r
+  }\r
+\r
+  public static int getBleScanCycle(Context context){\r
+    return SharPreferenceUtil.getPrefInt(context,KeyBleScanCycle,0);\r
+  }\r
 \r
   public static String getSMSPwd(Context context){\r
     return SharPreferenceUtil.getPrefString(context,KeySMSPassword,DefaultSMSPassword);\r
index 0b7fedb..a5343a1 100644 (file)
@@ -14,7 +14,11 @@ public interface Constants {
   public static final String ACTION_ADDTEST_CONTACTS = "com.enqualcomm.imessage.ACTION_ADDTEST_CONTACTS";\r
   \r
   public static final String ACTION_ALARM_ADD_DATAPOINTS = "com.enqualcomm.support.ADD_DATAPOINTS";\r
-  \r
+\r
+\r
+  public static final String ACTION_ALARM_BLE_SCAN = "com.ic.Action.ALarm.bleScan";\r
+  public static final String ACTION_ALARM_CHECK_ANTI = "com.ic.Action.ALarm.CheckAnti";\r
+\r
   public static final String ACTION_ALARM_ALARM_CHANGE = "com.enqualcomm.support.ACTION_ALARM_ALARM_CHANGE";\r
   \r
   public static final String ACTION_ANTIOFF_ALARM_CHANGE = "com.enqualcomm.support.ACTION_ANTIOFF_ALARM_CHANGE";\r
index cfd600f..e78b3cf 100644 (file)
@@ -16,6 +16,7 @@ import android.os.PowerManager;
 import android.os.SystemClock;\r
 import android.widget.Toast;\r
 \r
+import com.enqualcomm.support.adapter.BTHelper;\r
 import com.enqualcomm.support.bean.Contact;\r
 import com.enqualcomm.support.bean.ICLocation;\r
 import com.enqualcomm.support.bean.SleepInfo;\r
@@ -74,6 +75,8 @@ import java.util.concurrent.TimeUnit;
 \r
 import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;\r
 import static com.enqualcomm.support.Constants.ACTION_ALARM_ADD_DATAPOINTS;\r
+import static com.enqualcomm.support.Constants.ACTION_ALARM_BLE_SCAN;\r
+import static com.enqualcomm.support.Constants.ACTION_ALARM_CHECK_ANTI;\r
 import static com.enqualcomm.support.Constants.ACTION_CHECK_ANTIOFF_EVENT;\r
 import static com.enqualcomm.support.Constants.ACTION_EQC_ALARM;\r
 import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\r
@@ -777,6 +780,8 @@ public class CoreService extends Service {
         runtime.setNeddReportCutoff(Config.getNeedCutOff(this));\r
         runtime.setNeedAntioff(Config.getNeedAntiOff(this));\r
 \r
+\r
+\r
         Config.setHeartBeatCycle(this,5); //临时设置为3分钟,给L03测试用。测试断线问题未解决,取消测试。\r
         //初始化ServerHeartBeat Cycle\r
         Config.loadHearBeatSetting(runtime);\r
@@ -909,6 +914,20 @@ public class CoreService extends Service {
 \r
         setTempAlarm();\r
 \r
+\r
+        //初始化佩戴检测\r
+        runtime.anti_test_cycle=Config.getCheckAntiPolingCycle(this);\r
+        if( runtime.anti_test_cycle>0){\r
+            setAntiAlarm();\r
+        }\r
+\r
+        //初始化蓝牙检测\r
+        runtime.bleInfo.bleScanCycle=Config.getBleScanCycle(this);\r
+        if(Config.BLEScanProtocol==1 && runtime.bleInfo.bleScanCycle>0)\r
+        {\r
+            setBleScanAlarm(runtime.bleInfo.bleScanCycle);\r
+        }\r
+\r
         //设置来电模式\r
         SimSignalUtil.SetRingMode(this, AudioManager.RINGER_MODE_NORMAL,true);\r
 \r
@@ -1114,6 +1133,10 @@ public class CoreService extends Service {
                 if (Config.LOG_TOFILE) ICLogger.logToFile("alarmCycle", stringBuilder1.toString());\r
 //                this.locationClient.triggerLocationProcess();\r
 \r
+            }else if (Constants.ACTION_ALARM_BLE_SCAN.equals(paramIntent.getAction())) {\r
+                    //循环蓝牙扫描\r
+                setBleScanAlarm(runtime.bleInfo.bleScanCycle);\r
+\r
             }else if (Constants.ACTION_PRACTICE_REPORT_ALARM.equals(paramIntent.getAction())) {\r
                 //alarm是延迟的,所以这个判断主要是给最后一次可能无效的测量\r
                 if (Runtime.practising==true) {\r
@@ -1157,18 +1180,19 @@ public class CoreService extends Service {
                 setWakeAlarm();\r
                 return Service.START_STICKY;\r
             } else if (ANTI_ALARM.equals(paramIntent.getAction())) {\r
+                //测试是否佩戴\r
+                antiservice.CheckAntiByPoling();\r
+                if (Config.LOG_TOFILE)\r
+                    ICLogger.logToFile("alarmCycle", "ANTI_ALARM alarmCycle  ");\r
+                setAntiAlarm();\r
 \r
-                if (this.mKeepAlive != null) {\r
-\r
-                    if (connection.isServerConnected() && runtime.isServerProtocolConnected()) {\r
-                        //测试是否佩戴\r
-\r
-                    }\r
-                    setAntiAlarm();\r
-                    if (Config.LOG_TOFILE)\r
-                        ICLogger.logToFile("alarmCycle", "ANTI_ALARM alarmCycle  ");\r
-                    return Service.START_STICKY;\r
-                }\r
+                return Service.START_STICKY;\r
+//                if (this.mKeepAlive != null) {\r
+//\r
+//                    if (connection.isServerConnected() && runtime.isServerProtocolConnected()) {\r
+//                    }\r
+//                    return Service.START_STICKY;\r
+//                }\r
             } else if (TEMP_ALARM.equals(paramIntent.getAction())) {\r
 \r
                 setTempAlarm();\r
@@ -1235,6 +1259,7 @@ public class CoreService extends Service {
                 setLocationAlarm(runtime.getLocationInstance().getWorkingMod());//同时重置alarm并触发定位\r
 \r
             }else if(ACTION_CHECK_ANTIOFF_EVENT.equals(paramIntent.getAction())){\r
+                //只在中断式检测过程中延时用\r
                 antiservice.check_ant_event();\r
             }\r
 \r
@@ -1273,6 +1298,21 @@ public class CoreService extends Service {
         if (Config.LOG_TOFILE)ICLogger.logToFile("alarmCycle",sb.toString());\r
     }\r
 \r
+    public void setBleScanAlarm(int cycle){\r
+        if (Config.BLEScanProtocol!=1) {\r
+            ICLogger.i("BLEScanProtocol!=1  skip setPolingCheckAntiAlarm");\r
+            return;\r
+        }\r
+        StringBuilder sb=new StringBuilder();\r
+        if (cycle>1) {\r
+            AlarmHelper.setRealTimeAlarm(runtime.getContextProxy().context, cycle, ACTION_ALARM_BLE_SCAN);\r
+        }\r
+        sb.append("setBleScanAlarm " + cycle);\r
+        locationClient.triggerBLEProcess();\r
+        ICLogger.i(sb.toString());\r
+        if (Config.LOG_TOFILE)ICLogger.logToFile("alarmCycle",sb.toString());\r
+    }\r
+\r
     public void setEmegencyLocationSTOPAlarm(int delayTimeInMinutes){\r
         StringBuilder sb=new StringBuilder();\r
         AlarmHelper.setRealTimeAlarm(runtime.getContextProxy().context,delayTimeInMinutes, ACTION_SEND_EMEGENCY_LOCATION_STOP);\r
@@ -1341,15 +1381,13 @@ public class CoreService extends Service {
 //        int mod=runtime.getLocationInstance().getWorkingMod();\r
         StringBuilder sb=new StringBuilder();\r
         int cycle=runtime.anti_test_cycle;\r
-\r
-        //心跳指令默认设置为3分钟\r
-        AlarmHelper.setRealTimeAlarm(runtime.getContextProxy().context,cycle, ANTI_ALARM);\r
+        if(cycle>1) {\r
+            AlarmHelper.setRealTimeAlarm(runtime.getContextProxy().context, cycle, ANTI_ALARM);\r
+        }\r
         sb.append(" setHeartAlarm  "+ANTI_ALARM+", cycle "+cycle);\r
-//        locationClient.triggerLocationProcess();\r
+\r
         ICLogger.i(sb.toString());\r
         FileOutputUtil.fileOutput(runtime.getCacheDir(),"alarmCycle",sb.toString());\r
-\r
-//        AlarmHelper.setRealTimeAlarm(runtime.getContextProxy().context,1, HEART_ALARM);\r
     }\r
     public void setTempAlarm(){\r
 //        int mod=runtime.getLocationInstance().getWorkingMod();\r
index c9a9f34..8a839ed 100644 (file)
@@ -141,42 +141,47 @@ public class LocationClient {
     btHelper=BTHelper.CreateInstance(paramRuntime, new BTHelper.BTScanCallback() {\r
       @Override\r
       public void OnScanFinished(ArrayList<String> btPairedScanResult, ArrayList<String> btNewScanResult) {\r
-\r
+        if(Config.BLEScanProtocol==0) { //扫描并判定是否在区域内。\r
         if (btNewScanResult!=null && btNewScanResult.size() > 0) {\r
           StringBuilder sb=new StringBuilder();\r
           sb.append("found bt mac ").append(btNewScanResult.size() );\r
           sb.append(" bounding BeaconMacList ").append(runtime.bleInfo.btMacList.size() );\r
+          runtime.bleInfo.btScanResult.clear();\r
           for(String mac:runtime.bleInfo.btMacList){\r
             sb.append(" ").append(mac);\r
           }\r
           ICLogger.i( sb.toString() );\r
-          boolean in_area = false;\r
-          try {\r
-            for (String mac : btNewScanResult) {\r
-              ICLogger.i("bt mac " + mac.replace(":", "").toLowerCase() + "  " + mac.toLowerCase());\r
-              String tmp = mac.replace(":", "").toLowerCase();\r
-              tmp = tmp.substring(0, tmp.indexOf(","));\r
-              if (runtime.bleInfo.btMacList.contains(tmp)) {\r
-                in_area = true;\r
-                break;\r
+\r
+\r
+            boolean in_area = false;\r
+            try {\r
+              for (String mac : btNewScanResult) {\r
+                ICLogger.i("bt mac " + mac.replace(":", "").toLowerCase() + "  " + mac.toLowerCase());\r
+                String tmp = mac.replace(":", "").toLowerCase();\r
+                tmp = tmp.substring(0, tmp.indexOf(","));\r
+                if (runtime.bleInfo.btMacList.contains(tmp)) {\r
+                  in_area = true;\r
+                  break;\r
+                }\r
               }\r
-            }\r
-            if(in_area == false && ScanBLERetryCount-- > 0){\r
+              if (in_area == false && ScanBLERetryCount-- > 0) {\r
                 //如果没有扫描到,且扫描次数没有超限,则重新扫描一次。注意要delay 5秒\r
-              Util.mSleep(5000);\r
+                Util.mSleep(5000);\r
                 //Do retry Scan\r
-                ICLogger.i("BT BLE not found retry Scan "+ ScanBLERetryCount);\r
+                ICLogger.i("BT BLE not found retry Scan " + ScanBLERetryCount);\r
                 btHelper.scanBLE();\r
-              return ;\r
-            }else {\r
-              runtime.bleInfo.is_in_area = in_area;\r
-              ScanBLERetryCount=maxBLEScanTime;\r
+                return;\r
+              } else {\r
+                runtime.bleInfo.is_in_area = in_area;\r
+                ScanBLERetryCount = maxBLEScanTime;\r
+              }\r
+\r
+            } catch (Exception e) {//如果出错,原来的状态不要变。防止误报,最多延迟一个周期报。\r
+              e.printStackTrace();\r
+              ICLogger.i(e.getMessage());\r
             }\r
 \r
-          }catch(Exception e){//如果出错,原来的状态不要变。防止误报,最多延迟一个周期报。\r
-            e.printStackTrace();\r
-            ICLogger.i(e.getMessage());\r
-          }\r
+\r
         } else {\r
           runtime.bleInfo.is_in_area = false;\r
           ScanBLERetryCount=maxBLEScanTime;\r
@@ -245,7 +250,21 @@ public class LocationClient {
         runtime.bleInfo.last_is_in_area=runtime.bleInfo.is_in_area;\r
         //扫描结束就清掉scanBLEOnly,保证下次不会被误操作。\r
         scanBLEOnly=false;\r
-\r
+        }else{ //Config.BLEScanProtocol==0\r
+          if (btNewScanResult!=null && btNewScanResult.size() > 0) {\r
+            StringBuilder sb = new StringBuilder();\r
+            sb.append("found bt mac ").append(btNewScanResult.size());\r
+            runtime.bleInfo.btScanResult.clear();\r
+            for (String mac : btNewScanResult) {\r
+              sb.append("\n").append(mac);\r
+              runtime.bleInfo.btScanResult.add(mac.replace(":",""));\r
+            }\r
+            ICLogger.i(sb.toString());\r
+            Deliver.sendLocationMSG(protocolAPIHelper.getBLEScanResult(runtime));\r
+          }else{\r
+            ICLogger.i("未搜到蓝牙设备!");\r
+          }\r
+        }\r
       }\r
     });\r
 \r
@@ -439,13 +458,23 @@ public class LocationClient {
               startLocationProcess(runtime.getLocationInstance().getWorkingMod());\r
             }\r
           }else if (msg.what == msgWhat_StartBLEProcess){\r
-            if (runtime.bleInfo.btMacList.size() > 0) {\r
+            if(Config.BLEScanProtocol==0) {\r
+              if (runtime.bleInfo.btMacList.size() > 0) {\r
+                //有蓝牙搜索要求则 先进行蓝牙扫描\r
+                if (!btHelper.isBtscanning()) {\r
+                  scanBLEOnly = true;\r
+                  if (needLocationForBT())\r
+                    btHelper.scanBLE();\r
+                } else {\r
+                  ICLogger.i("BT Scanning skip ScanBLE only!");\r
+                }\r
+              }\r
+            }else{\r
               //有蓝牙搜索要求则 先进行蓝牙扫描\r
-              if (! btHelper.isBtscanning()) {\r
-                scanBLEOnly = true;\r
+              if (!btHelper.isBtscanning()) {\r
                 if (needLocationForBT())\r
                   btHelper.scanBLE();\r
-              }else{\r
+              } else {\r
                 ICLogger.i("BT Scanning skip ScanBLE only!");\r
               }\r
             }\r
index f89a3fe..ae2ecb2 100644 (file)
@@ -7,6 +7,7 @@ import android.content.BroadcastReceiver;
 import android.content.Context;\r
 import android.content.Intent;\r
 import android.content.IntentFilter;\r
+import android.net.wifi.ScanResult;\r
 import android.os.Handler;\r
 import com.enqualcomm.support.bean.Runtime;\r
 import com.enqualcomm.support.Config;\r
@@ -14,6 +15,8 @@ import com.enqualcomm.support.utils.ICLogger;
 import com.enqualcomm.support.utils.Util;\r
 \r
 import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Comparator;\r
 import java.util.Set;\r
 \r
 public class BTHelper {\r
@@ -209,12 +212,31 @@ public class BTHelper {
                 disableBT();\r
                 hasStopedByFoundBT=true;\r
 \r
-                if (mCallback != null)\r
+                if (mCallback != null) {\r
+                    resortScanResult(mNewDevicesArray);\r
                     mCallback.OnScanFinished(mPairedDevicesArray, mNewDevicesArray);\r
+                }\r
             }\r
         }\r
     }\r
 \r
+    private  void resortScanResult( ArrayList<String> btlist){\r
+\r
+        Collections.sort(btlist, new Comparator<String>() {\r
+            public int compare(String var1, String var2) {\r
+                try {\r
+                    int tmp = var1.indexOf(",");\r
+                    int rssi1 = Integer.parseInt(var1.substring(tmp + 1));\r
+                    tmp = var2.indexOf(",");\r
+                    int rssi2 = Integer.parseInt(var2.substring(tmp + 1));\r
+                    return Math.abs(rssi1) - Math.abs(rssi2);\r
+                }catch (Exception e){\r
+                    return 0;\r
+                }\r
+            }\r
+        });\r
+\r
+    }\r
     private class RunableStopBleScan implements   Runnable{\r
 \r
         @Override\r
@@ -225,9 +247,10 @@ public class BTHelper {
             //开始扫描前是关闭的,就关闭它\r
             //                if(!enabledBeforScan)\r
             disableBT();\r
-            if (mCallback != null)\r
+            if (mCallback != null){\r
+                resortScanResult(mNewDevicesArray);\r
                 mCallback.OnScanFinished(mPairedDevicesArray, mNewDevicesArray);\r
-\r
+            }\r
         }\r
     }\r
 \r
index 09d8b7e..7c95702 100644 (file)
@@ -7,10 +7,13 @@ public class BLEInfo {
     public String ble_area_id="";\r
 \r
     public ArrayList<String> btMacList=new ArrayList<>();\r
+    public ArrayList<String> btScanResult=new ArrayList<>();\r
 \r
     public String gps_n="";\r
     public String gps_e="";\r
     public boolean is_in_area=false;\r
     public boolean last_is_in_area=false;\r
 \r
+    public static int bleScanCycle=0;\r
+\r
 }\r
index df9f4e7..3e63a6a 100644 (file)
@@ -187,6 +187,13 @@ public class AntiMonitorService extends AbstractInvokeHandlerService {
         ICLogger.i("AntiOff Timeout! send antioff event "+current_anti_status);\r
     }\r
 \r
+    public boolean CheckAntiByPoling(){\r
+        //检查是否佩戴。佩戴返回true\r
+        //send_antiof_event();\r
+        return false;\r
+    }\r
+\r
+\r
     //return 0 表示check 结束, 1表示需要继续check  由coreService中 ACTION_CHECK_ANTIOFF_EVENT进行\r
     public int check_ant_event(){\r
 \r
@@ -194,18 +201,18 @@ public class AntiMonitorService extends AbstractInvokeHandlerService {
         ICLogger.i("anti_event_receivedTime in "+ (currenttime - anti_event_receivedTime)\r
                 +"ms ago ,anti_event_count_when_start_timer "+ant_status_event_reported\r
         );\r
-        if ((currenttime- anti_event_receivedTime) >= 2000){\r
+\r
+        if ((currenttime - anti_event_receivedTime) >= 2000) {\r
             send_antiof_event();\r
 \r
-            ant_status_event_reported=0;\r
+            ant_status_event_reported = 0;\r
             return 0;\r
-        }else{\r
-            long restTimeNeedDelay=(2000 + anti_event_receivedTime-currenttime);\r
-            ICLogger.i("Still need delay "+restTimeNeedDelay+"ms to check anti_event again!");\r
-            setAntiCheckAlarm((int)restTimeNeedDelay);\r
+        } else {\r
+            long restTimeNeedDelay = (2000 + anti_event_receivedTime - currenttime);\r
+            ICLogger.i("Still need delay " + restTimeNeedDelay + "ms to check anti_event again!");\r
+            setAntiCheckAlarm((int) restTimeNeedDelay);\r
             return 1;\r
         }\r
-\r
     }\r
 \r
     public void setAntiCheckAlarm(int ms){\r
@@ -452,11 +459,18 @@ public class AntiMonitorService extends AbstractInvokeHandlerService {
         mRuntime=paramRuntime;\r
         mContext=mRuntime.getContextProxy().context;\r
         mConnection=paramConnection;\r
-        startSensor();\r
+        if(Config.UsePolingCheckWeared==false) {\r
+            ICLogger.i("启用中断式佩戴检测!");\r
+            startSensor();\r
+        }else{\r
+            ICLogger.i("启用循环式佩戴检测!");\r
+        }\r
     }\r
 \r
     @Override\r
     public void onDetach(Connection paramConnection, Runtime paramRuntime) {\r
-        mSensorManager.unregisterListener(mSensorEventListener);\r
+        if(Config.UsePolingCheckWeared==false) {\r
+            mSensorManager.unregisterListener(mSensorEventListener);\r
+        }\r
     }\r
 }\r
index 79d0f1f..7e21969 100644 (file)
@@ -680,4 +680,28 @@ public class protocolAPIHelper {
         }\r
         return ret;\r
     }\r
+\r
+    public static StringMessage getBLEScanResult(Runtime runtime){\r
+        if (is_protocol_not_Initialled()) return null;\r
+        StringMessage ret=null;\r
+        switch(Config.protocol_no)\r
+        {\r
+            case Config.PROTOCOL_JIAI:\r
+                ret=null;\r
+                break;\r
+            case Config.PROTOCOL_BEEHOME:\r
+                ret=null;\r
+                break;\r
+            case Config.PROTOCOL_IC:\r
+                ret = protocol_ic.APBR(runtime);\r
+                break;\r
+            case Config.PROTOCOL_FZD:\r
+                ret=null;\r
+                break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret=null;\r
+                break;\r
+        }\r
+        return ret;\r
+    }\r
 }\r
index 7307b55..1c58bc3 100644 (file)
@@ -2606,6 +2606,78 @@ public class protocol_ic {
     }\r
 \r
 \r
+\r
+    public static StringMessage APBT(String id,String cycle)\r
+    {\r
+        return genStringMessage("APBT",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APBT))\r
+                .append(CMDSPLIT).append(id)\r
+                .append(CMDSPLIT).append(cycle)\r
+                .append(CMDEND).toString());\r
+    }\r
+\r
+    /***\r
+     * 响应蓝牙扫描周期设定\r
+     * @param connection\r
+     * @param runtime\r
+     * @param cmd\r
+     */\r
+    public void handleBPBT( Connection connection,Runtime runtime,String cmd) {\r
+/***\r
+ * IWBPBT,353456789012345,080835,1#\r
+ * 说明:设置蓝牙扫描周期,单位时间分钟\r
+ * IW:标识符\r
+ * BPBT : 命令字符\r
+ * 353456789012345:IMEI号,设备唯一ID\r
+ * 080835:指令流水号\r
+ * 1: 扫描周期,对应单位为分钟\r
+ * 设备响应:     IWAPBT,080835, 1#\r
+ * 080835:指令流水号\r
+ * 1: 剪断开关状态(实际上与下行的命令一致)\r
+ */\r
+\r
+        log("BPBT "+cmd);\r
+        String[] cmdlist=cmd.split(CMDSPLIT);\r
+        if (cmdlist.length==4){\r
+            String id=cmdlist[2];\r
+            String cycle=cmdlist[3].replace("#","");\r
+            connection.send(APBT(id,cycle));\r
+\r
+            if(Util.isNumeric(cycle)){\r
+                int intcycle=Integer.parseInt(cycle);\r
+                Config.setBleScanCycle(runtime.getContextProxy().context,intcycle);\r
+                runtime.bleInfo.bleScanCycle=intcycle;\r
+                ICLogger.i("设置蓝牙扫描周期 "+intcycle+" 分钟");\r
+                CoreService.getInstance().setBleScanAlarm(intcycle);\r
+            }else{\r
+                ICLogger.i(" BPBT Format error!");\r
+            }\r
+\r
+        }else{\r
+            ICLogger.i(" BPBT Format error!");\r
+        }\r
+    }\r
+\r
+    /***\r
+     * 发送蓝牙扫描结果\r
+     * @param runtime\r
+     * @return\r
+     */\r
+    public static StringMessage APBR(Runtime runtime) {\r
+        if (runtime.bleInfo.btScanResult.size() > 0) {\r
+            StringBuffer sb=new StringBuffer();\r
+            sb.append(runtime.bleInfo.btScanResult.size());\r
+            for(String it:runtime.bleInfo.btScanResult){\r
+                sb.append(CMDSPLIT).append(it);\r
+            }\r
+            return genStringMessage("APBR", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APBR))\r
+                    .append(CMDSPLIT).append(sb.toString())\r
+                    .append(CMDEND).toString());\r
+\r
+        }else{\r
+            return null;\r
+        }\r
+    }\r
+\r
     public boolean handleCmd(CMD_TYPE type, String cmd) {\r
 \r
            //普通非二进制命令用此函数处理\r
@@ -2816,13 +2888,16 @@ public class protocol_ic {
                 handleBPDH(mConnection,mRuntime,cmd);\r
                 break;\r
 \r
-            case BPTQ:\r
+            case BPTQ: //天气下发\r
                 handleBPTQ(mConnection,mRuntime,cmd);\r
                 break;\r
-            case BPAT:\r
+            case BPAT://剪断开关设定\r
                 handleBPAT(mConnection,mRuntime,cmd);\r
                 break;\r
 \r
+            case BPBT://蓝牙扫描设置\r
+                handleBPBT(mConnection,mRuntime,cmd);\r
+                break;\r
 \r
         }\r
 \r
index 4e8c3eb..8d78d7a 100644 (file)
     <output-test url="file://$MODULE_DIR$/build/intermediates/javac/debugUnitTest/classes" />\r
     <exclude-output />\r
     <content url="file://$MODULE_DIR$">\r
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/ap_generated_sources/debug/out" isTestSource="false" generated="true" />\r
       <sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/debug/compileDebugAidl/out" isTestSource="false" generated="true" />\r
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/ap_generated_sources/debug/out" isTestSource="false" generated="true" />\r
       <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />\r
       <sourceFolder url="file://$MODULE_DIR$/build/generated/renderscript_source_output_dir/debug/compileDebugRenderscript/out" isTestSource="false" generated="true" />\r
       <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" generated="true" />\r
       <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" generated="true" />\r
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/ap_generated_sources/debugAndroidTest/out" isTestSource="true" generated="true" />\r
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/debugAndroidTest/compileDebugAndroidTestAidl/out" isTestSource="true" generated="true" />\r
       <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />\r
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/ap_generated_sources/debugAndroidTest/out" isTestSource="true" generated="true" />\r
       <sourceFolder url="file://$MODULE_DIR$/build/generated/renderscript_source_output_dir/debugAndroidTest/compileDebugAndroidTestRenderscript/out" isTestSource="true" generated="true" />\r
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/debugAndroidTest/compileDebugAndroidTestAidl/out" isTestSource="true" generated="true" />\r
       <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" generated="true" />\r
       <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" generated="true" />\r
       <sourceFolder url="file://$MODULE_DIR$/build/generated/ap_generated_sources/debugUnitTest/out" isTestSource="true" generated="true" />\r