-package com.enqualcomm.support.service;\r
-\r
-import android.app.AlarmManager;\r
-import android.app.PendingIntent;\r
-import android.content.BroadcastReceiver;\r
-import android.content.ComponentName;\r
-import android.content.Context;\r
-import android.content.Intent;\r
-import android.content.IntentFilter;\r
-import android.database.ContentObserver;\r
-import android.net.Uri;\r
-import android.os.Handler;\r
-import android.os.Message;\r
-import android.os.Messenger;\r
-import android.telephony.PhoneStateListener;\r
-import android.telephony.PreciseCallState;\r
-import android.telephony.TelephonyManager;\r
-\r
-import com.enqualcomm.support.Config;\r
-import com.enqualcomm.support.CoreService;\r
-import com.enqualcomm.support.ICContentProvider;\r
-import com.enqualcomm.support.MainActivity;\r
-import com.enqualcomm.support.bean.Alarm;\r
-import com.enqualcomm.support.bean.Antioff;\r
-import com.enqualcomm.support.bean.NoticeContent;\r
-import com.enqualcomm.support.bean.Runtime;\r
-import com.enqualcomm.support.bean.Silent;\r
-import com.enqualcomm.support.bean.StheartRate;\r
-\r
-import com.enqualcomm.support.service.base.AbstractInvokeHandlerService;\r
-import com.enqualcomm.support.utils.AlarmHelper;\r
-import com.enqualcomm.support.utils.Connection;\r
-import com.enqualcomm.support.utils.DBHelper;\r
-import com.enqualcomm.support.utils.ICAudioManager;\r
-import com.enqualcomm.support.utils.ICLogger;\r
-import com.enqualcomm.support.utils.MissedCallContentObserver;\r
-import com.enqualcomm.support.utils.SharPreferenceUtil;\r
-import com.enqualcomm.support.utils.TimeUtil;\r
-import com.enqualcomm.support.utils.Util;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Calendar;\r
-import java.util.Date;\r
-import java.util.Iterator;\r
-import java.util.concurrent.TimeUnit;\r
-\r
-import static android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED;\r
-import static android.telephony.TelephonyManager.CALL_STATE_OFFHOOK;\r
-import static android.telephony.TelephonyManager.CALL_STATE_RINGING;\r
-import static com.enqualcomm.support.Constants.ACTION_CARE_ALARM;\r
-import static com.enqualcomm.support.Constants.ACTION_CLOSE_UNREAD_MSG;\r
-import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\r
-import static com.enqualcomm.support.Constants.SERVICE_CLS_NAME;\r
-import static com.enqualcomm.support.Constants.SERVICE_PKG_NAME;\r
-\r
-public class SilentManager extends AbstractInvokeHandlerService {\r
- private static final long ONE_WEEK = 604800000L;\r
- private static final long ONE_DAY = 86400000L;\r
-\r
- private ArrayList<Alarm> alarms;\r
- private boolean haveHandSilence;\r
- private boolean isCalling;\r
- AlarmManager mAlarmManager;\r
- private SilentManager.AlramReceiver mAlramReceiver;\r
- Connection mConnection;\r
- ContentObserver mContentObserver = new ContentObserver(new Handler()) {\r
- public void onChange(boolean var1) {\r
- ICLogger.i("静默有变化");\r
- SilentManager.this.silentList = SilentManager.this.querySilent();\r
- SilentManager.this.getSilentListStartAndEndTime();\r
- SilentManager.this.handleSilent(mRuntime, true);\r
- }\r
- };\r
- private Context mContext;\r
- private DBHelper mDbHelper;\r
- private boolean mInSilent;\r
- private String mInterval;\r
- private boolean mIsNeedAntioff;\r
- private boolean mIsStheartRate;\r
- private MissedCallContentObserver mMissedCallContentObserver;\r
- Runtime mRuntime;\r
- private int mStheartRateInterval;\r
- private int mTodayWeek;\r
- private boolean mValue_isSilence;\r
-\r
- public static final int PRECISE_CALL_STATE_NOT_VALID = -1;\r
- public static final int PRECISE_CALL_STATE_IDLE = 0; //空闲\r
- public static final int PRECISE_CALL_STATE_ACTIVE = 1; //正在通话\r
- public static final int PRECISE_CALL_STATE_HOLDING = 2; //通话挂起\r
- public static final int PRECISE_CALL_STATE_DIALING = 3; //拨号开始\r
- public static final int PRECISE_CALL_STATE_ALERTING = 4; //正在呼出\r
- public static final int PRECISE_CALL_STATE_INCOMING = 5; //对方来电\r
- public static final int PRECISE_CALL_STATE_WAITING = 6; //第三方来电等待\r
- public static final int PRECISE_CALL_STATE_DISCONNECTED = 7; //挂断完成\r
- public static final int PRECISE_CALL_STATE_DISCONNECTING = 8; //正在挂断\r
-\r
- private static SilentManager mSilentManger=null;\r
-\r
- public static SilentManager getInstance(){\r
- if (mSilentManger==null)\r
- mSilentManger=new SilentManager();\r
- return mSilentManger;\r
- }\r
- private PhoneStateListener phoneStateListener = new PhoneStateListener() {\r
- public void onCallStateChanged(int state, String incomingNumber) {\r
- super.onCallStateChanged(state, incomingNumber);\r
-\r
- ICLogger.i("========onCallStateChanged state "+state+", incomingNumber "+incomingNumber);\r
- switch(state) {\r
- case PRECISE_CALL_STATE_DISCONNECTING: //挂电话\r
- case PRECISE_CALL_STATE_DISCONNECTED: //挂电话\r
- isCalling = false;\r
-// if (SilentManager.this.haveHandSilence) {\r
-// SilentManager.this.handSilence(SilentManager.this.mContext, SilentManager.this.mValue_isSilence);\r
-// }\r
- if(ICAudioManager.needMute==true)\r
- {\r
-// ICAudioManager.restoreVolumn(mContext); //2秒后恢复音量\r
- new Handler().postDelayed(new Runnable() {\r
- @Override\r
- public void run() {\r
- ICAudioManager.restoreVolumn(mContext); //2秒后恢复音量\r
- ICAudioManager.needMute=false;\r
- }\r
- },2000);\r
- }\r
- ICLogger.i("========Hung up!");\r
- break;\r
- case PRECISE_CALL_STATE_INCOMING: //来电\r
- case PRECISE_CALL_STATE_ALERTING:\r
- case PRECISE_CALL_STATE_DIALING:\r
- isCalling = true;\r
- Intent var3 = new Intent();\r
- var3.setAction(ACTION_CLOSE_UNREAD_MSG);\r
- mContext.sendBroadcast(var3);\r
-\r
- ICLogger.i("========Ring!");\r
- if(ICAudioManager.needMute==true)\r
- {\r
- ICAudioManager.setVolumnMute(mContext);\r
- new Handler().postDelayed(new Runnable() {\r
- @Override\r
- public void run() {\r
- ICAudioManager.setVolumnMute(mContext); //2秒后恢复音量\r
- }\r
- },2000);\r
-\r
- }\r
- break;\r
- case PRECISE_CALL_STATE_ACTIVE://接电话\r
- {\r
- if (ICAudioManager.needMute == false){\r
- if (Config.custom_name.equals("AK"))\r
- ICAudioManager.setVoiceCallMaxVolumn(mContext); //设置最大音量\r
- }\r
- }\r
- case PRECISE_CALL_STATE_HOLDING://接电话\r
- case PRECISE_CALL_STATE_WAITING:\r
- isCalling = true;\r
- ICLogger.i("========Answer Call !");\r
- if(ICAudioManager.needMute==true)\r
- {\r
- ICAudioManager.setVolumnMute(mContext);\r
- new Handler().postDelayed(new Runnable() {\r
- @Override\r
- public void run() {\r
- ICAudioManager.setVolumnMute(mContext); //2秒后恢复音量\r
- }\r
- },2000);\r
- }\r
-\r
- }\r
-\r
- }\r
- };\r
- private ArrayList<Antioff> sAntioffList;\r
- private ArrayList<Silent> silentList;\r
- private ArrayList<StheartRate> stheartRateList;\r
- private ArrayList<NoticeContent> voiceNotice;\r
-\r
- public SilentManager() {\r
- }\r
-\r
- private void callback(Messenger var1, boolean var2) {\r
- short var3;\r
- if (var2) {\r
- var3 = 600;\r
- } else {\r
- var3 = 700;\r
- }\r
-\r
- if (var1 != null) {\r
- try {\r
- var1.send(Message.obtain((Handler)null, var3));\r
- } catch (Exception e) {\r
- e.printStackTrace();\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
- }\r
-\r
- }\r
-\r
- private void cancelAlarm(ArrayList<Alarm> var1) {\r
- Iterator var2 = var1.iterator();\r
-\r
- while(var2.hasNext()) {\r
- Alarm var3 = (Alarm)var2.next();\r
- String var10 = var3.time;\r
- String var4 = var3.week;\r
- String var5 = var3.ring;\r
- String var11 = var3.name;\r
- char[] var6 = var4.toCharArray();\r
- int var7 = var6.length;\r
-\r
- for(int var8 = 1; var8 < var7; ++var8) {\r
- char var9 = var6[var8];\r
- this.mAlarmManager.cancel(this.getPendingIntent(var10, var4, var5, var11, var9 - 47));\r
- }\r
- }\r
-\r
- }\r
-\r
- private void cancelNoticeAlarm(ArrayList<NoticeContent> var1) {\r
- Iterator var2 = var1.iterator();\r
-\r
- while(var2.hasNext()) {\r
- NoticeContent var3 = (NoticeContent)var2.next();\r
- String var4 = var3.noticeTime;\r
- String var9 = var3.noticeName;\r
- String var5 = var3.noticeNumber;\r
- String var6 = var3.noticeID;\r
- String var7 = var3.noticeCategory;\r
- String var8 = var3.noticeFrequency;\r
- String var10 = var3.noticeContent;\r
- this.mAlarmManager.cancel(this.getPendingIntent(var4, var9, var5, var6, var7, var8, var10));\r
- }\r
-\r
- }\r
-\r
- private PendingIntent getPendingIntent(String var1, String var2, String var3, String var4, int var5) {\r
- StringBuilder var6 = new StringBuilder("alarm:");\r
- var6.append(var1);\r
- var6.append(",");\r
- var6.append(var2);\r
- var6.append(",");\r
- var6.append(var3);\r
- var6.append(",");\r
- var6.append(var4);\r
- var6.append(",");\r
- var6.append(var5);\r
- var2 = var6.toString();\r
- Intent var7 = new Intent(this.mContext, CoreService.class);\r
- var7.setAction(ACTION_CARE_ALARM);\r
- var7.setData(Uri.parse(var2));\r
- return PendingIntent.getService(this.mContext, 0, var7, PendingIntent.FLAG_UPDATE_CURRENT);\r
- }\r
-\r
- private PendingIntent getPendingIntent(String var1, String var2, String var3, String var4, String var5, String var6, String var7) {\r
- StringBuilder var8 = new StringBuilder("notice:");\r
- var8.append(var1);\r
- var8.append(",");\r
- var8.append(var2);\r
- var8.append(",");\r
- var8.append(var3);\r
- var8.append(",");\r
- var8.append(var4);\r
- var8.append(",");\r
- var8.append(var5);\r
- var8.append(",");\r
- var8.append(var6);\r
- var8.append(",");\r
- var8.append(var7);\r
- var1 = var8.toString();\r
- Intent var9 = new Intent(this.mContext, CoreService.class);\r
- var9.setAction("com.enqualcomm.support.ACTION_NOTICE_ALARM");\r
- var9.setData(Uri.parse(var1));\r
- return PendingIntent.getService(this.mContext, 0, var9, PendingIntent.FLAG_UPDATE_CURRENT);\r
- }\r
-\r
- private void getSilentListStartAndEndTime() {\r
- Calendar var1 = Calendar.getInstance();\r
- this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);\r
-\r
- Silent var3;\r
- for(Iterator var2 = this.silentList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {\r
- var3 = (Silent)var2.next();\r
- var1.set(Calendar.SECOND, 0);\r
- int var4 = Integer.parseInt(var3.start.substring(2, 4));\r
- int var5 = Integer.parseInt(var3.start.substring(5, 7));\r
- var1.set(Calendar.HOUR_OF_DAY, var4);\r
- var1.set(Calendar.MINUTE, var5);\r
- var3.startTimeMillis = var1.getTimeInMillis();\r
- var5 = Integer.parseInt(var3.end.substring(2, 4));\r
- var4 = Integer.parseInt(var3.end.substring(5, 7));\r
- var1.set(Calendar.HOUR_OF_DAY, var5);\r
- var1.set(Calendar.MINUTE, var4);\r
- }\r
-\r
- }\r
-\r
- private void getStartAndEndSantioffTime() {\r
- Calendar var1 = Calendar.getInstance();\r
- this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);\r
-\r
- Antioff var3;\r
- for(Iterator var2 = this.sAntioffList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {\r
- var3 = (Antioff)var2.next();\r
- var1.set(Calendar.SECOND, 0);\r
- int var4 = Integer.parseInt(var3.start.substring(2, 4));\r
- int var5 = Integer.parseInt(var3.start.substring(5, 7));\r
- var1.set(Calendar.HOUR_OF_DAY, var4);\r
- var1.set(Calendar.MINUTE, var5);\r
- var3.startTimeMillis = var1.getTimeInMillis();\r
- var4 = Integer.parseInt(var3.end.substring(2, 4));\r
- var5 = Integer.parseInt(var3.end.substring(5, 7));\r
- var1.set(Calendar.HOUR_OF_DAY, var4);\r
- var1.set(Calendar.MINUTE, var5);\r
- }\r
-\r
- }\r
-\r
- private void getStartAndEndStheartRateTime() {\r
- Calendar var1 = Calendar.getInstance();\r
- this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);\r
-\r
- StheartRate var3;\r
- for(Iterator var2 = this.stheartRateList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {\r
- var3 = (StheartRate)var2.next();\r
- var1.set(Calendar.SECOND, 0);\r
- int var4 = Integer.parseInt(var3.start.substring(2, 4));\r
- int var5 = Integer.parseInt(var3.start.substring(5, 7));\r
- var1.set(Calendar.HOUR_OF_DAY, var4);\r
- var1.set(Calendar.MINUTE, var5);\r
- var3.startTimeMillis = var1.getTimeInMillis();\r
- var4 = Integer.parseInt(var3.end.substring(2, 4));\r
- var5 = Integer.parseInt(var3.end.substring(5, 7));\r
- var1.set(Calendar.HOUR_OF_DAY, var4);\r
- var1.set(Calendar.MINUTE, var5);\r
- }\r
-\r
- }\r
-\r
- private void handSilence(Context var1, boolean var2) {\r
- this.mValue_isSilence = var2;\r
- if (this.isCalling) {\r
- this.haveHandSilence = true;\r
- } else {\r
- this.haveHandSilence = false;\r
- SharPreferenceUtil.setPrefBoolean(var1, "KEY_ISSILENCE", var2);\r
- Intent var3 = new Intent();\r
- var3.setAction("com.enqualcomm.support.ACTION_ISSILENCE2IMESSAGE");\r
- var3.putExtra("KEY_ISSILENCE", var2);\r
- var1.sendBroadcast(var3);\r
- ComponentName var4 = new ComponentName(SERVICE_PKG_NAME, SERVICE_CLS_NAME);\r
- Intent var5 = (new Intent("com.enqualcomm.support.ACTION_VIDEO_END_CALL")).setComponent(var4);\r
- this.mRuntime.getContextProxy().context.startService(var5);\r
- }\r
- }\r
-\r
- private void handleSilent(Runtime var1, boolean var2) {\r
- int var3 = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);\r
- if (var3 != this.mTodayWeek && (var3 != 1 || this.mTodayWeek != 8)) {\r
- this.getSilentListStartAndEndTime();\r
- this.queryNotice();\r
- }\r
-\r
- boolean var4 = this.isSilentTime();\r
- StringBuilder var5 = new StringBuilder();\r
- var5.append("inSilent=");\r
- var5.append(var4);\r
- ICLogger.i(var5.toString());\r
- if (!this.mInSilent && var4) {\r
- this.onSilentStateChange(true);\r
- this.handSilence(this.mContext, true);\r
- this.mDbHelper.upDateStatus("ON");\r
- } else if (this.mInSilent && !var4) {\r
- this.onSilentStateChange(false);\r
- this.mDbHelper.upDateStatus("OFF");\r
- this.handSilence(this.mContext, false);\r
- }\r
-\r
- this.mInSilent = var4;\r
- this.getStartAndEndStheartRateTime();\r
- this.isStheartRateTime(var2);\r
- }\r
-\r
- private boolean isIdle(Context context) {\r
- int callstate = ((TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE)).getCallState();\r
- boolean isidle;\r
- if (CALL_STATE_RINGING != callstate && CALL_STATE_OFFHOOK != callstate) {\r
- isidle = true;\r
- } else {\r
- isidle = false;\r
- }\r
-\r
- return isidle && !this.mInSilent && !this.mRuntime.getBatteryLow();\r
- }\r
-\r
- private boolean isAntioffTime(boolean var1) {\r
- long var2 = System.currentTimeMillis();\r
- ArrayList var4 = this.sAntioffList;\r
- int var5 = this.mTodayWeek;\r
- var1 = true;\r
- if (var5 == 1) {\r
- this.mTodayWeek += 7;\r
- }\r
-\r
- Iterator var12 = var4.iterator();\r
-\r
- while(true) {\r
- if (!var12.hasNext()) {\r
- var1 = false;\r
- break;\r
- }\r
-\r
- Antioff var6 = (Antioff)var12.next();\r
- String var7 = var6.week;\r
- StringBuilder var8 = new StringBuilder();\r
- var8.append(this.mTodayWeek - 1);\r
- var8.append("");\r
- if (var7.contains(var8.toString())) {\r
- long var9 = var6.startTimeMillis - var2;\r
- int var11;\r
- if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {\r
- var11 = Integer.parseInt(var6.start.substring(2, 4));\r
- var5 = Integer.parseInt(var6.start.substring(5, 7));\r
- AlarmHelper.setTimeAlarm(this.mContext, var11, var5, "com.enqualcomm.support.OTHER_ALARM_START");\r
- var8 = new StringBuilder();\r
- var8.append("设置起始时间=hour");\r
- var8.append(var11);\r
- var8.append("minute+");\r
- var8.append(var5);\r
- ICLogger.i(var8.toString());\r
- }\r
-\r
- var9 = var6.endTimeMillis - var2;\r
- if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {\r
- var11 = Integer.parseInt(var6.end.substring(2, 4));\r
- var5 = Integer.parseInt(var6.end.substring(5, 7));\r
- AlarmHelper.setTimeAlarm(this.mContext, var11, var5, "com.enqualcomm.support.OTHER_ALARM_END");\r
- var8 = new StringBuilder();\r
- var8.append("设置结束时间=hour");\r
- var8.append(var11);\r
- var8.append("minute+");\r
- var8.append(var5);\r
- ICLogger.i(var8.toString());\r
- }\r
-\r
- if (var6.startTimeMillis <= var2 && var6.endTimeMillis > var2) {\r
- break;\r
- }\r
- }\r
- }\r
-\r
- this.mRuntime.setNeedAntioff(var1);\r
- return var1;\r
- }\r
-\r
- private boolean isSilentTime() {\r
- long var1 = System.currentTimeMillis();\r
- ArrayList var3 = this.silentList;\r
- int var4 = this.mTodayWeek;\r
- boolean var5 = false; //默认不在silent时间段\r
- if (var4 == 1) {\r
- this.mTodayWeek += 7;\r
- }\r
-\r
- Iterator var6 = var3.iterator();\r
-\r
- while(true) {\r
- if (!var6.hasNext()) {\r
- var5 = false;\r
- break;\r
- }\r
-\r
- Silent var12 = (Silent)var6.next();\r
- String var7 = var12.week;\r
- StringBuilder var8 = new StringBuilder();\r
- var8.append(this.mTodayWeek - 1);\r
- var8.append("");\r
- if (var7.contains(var8.toString())) {\r
- long var9 = var12.startTimeMillis - var1;\r
- int var11;\r
- StringBuilder var13;\r
- if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {\r
- var11 = Integer.parseInt(var12.start.substring(2, 4));\r
- var4 = Integer.parseInt(var12.start.substring(5, 7));\r
- AlarmHelper.setTimeAlarm(this.mContext, var11, var4, "com.enqualcomm.support.OTHER_ALARM_START");\r
- var13 = new StringBuilder();\r
- var13.append("设置起始时间=hour");\r
- var13.append(var11);\r
- var13.append("minute+");\r
- var13.append(var4);\r
- ICLogger.i(var13.toString());\r
- }\r
-\r
- var9 = var12.endTimeMillis - var1;\r
- if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {\r
- var11 = Integer.parseInt(var12.end.substring(2, 4));\r
- var4 = Integer.parseInt(var12.end.substring(5, 7));\r
- AlarmHelper.setTimeAlarm(this.mContext, var11, var4, "com.enqualcomm.support.OTHER_ALARM_END");\r
- var13 = new StringBuilder();\r
- var13.append("设置结束时间=hour");\r
- var13.append(var11);\r
- var13.append("minute+");\r
- var13.append(var4);\r
- ICLogger.i(var13.toString());\r
- }\r
-\r
- if (var12.startTimeMillis <= var1 && var12.endTimeMillis > var1) {\r
- break;\r
- }\r
- }\r
- }\r
-\r
- return var5;\r
- }\r
-\r
- private boolean isStheartRateTime(boolean var1) {\r
- long var2 = System.currentTimeMillis();\r
- ArrayList var4 = this.stheartRateList;\r
- if (this.mTodayWeek == 1) {\r
- this.mTodayWeek += 7;\r
- }\r
-\r
- Iterator var12 = var4.iterator();\r
-\r
- while(true) {\r
- if (var12.hasNext()) {\r
- StheartRate var5 = (StheartRate)var12.next();\r
- String var6 = var5.week;\r
- StringBuilder var7 = new StringBuilder();\r
- var7.append(this.mTodayWeek - 1);\r
- var7.append("");\r
- if (!var6.contains(var7.toString())) {\r
- continue;\r
- }\r
-\r
- long var8 = var5.startTimeMillis - var2;\r
- int var10;\r
- int var11;\r
- if (var8 < (long)(CoreService.alarmCycle * 60 * 1000) && var8 > 0L) {\r
- var10 = Integer.parseInt(var5.start.substring(2, 4));\r
- var11 = Integer.parseInt(var5.start.substring(5, 7));\r
- AlarmHelper.setTimeAlarm(this.mContext, var10, var11, "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_START");\r
- }\r
-\r
- var8 = var5.endTimeMillis - var2;\r
- if (var8 < (long)(CoreService.alarmCycle * 60 * 1000) && var8 > 0L) {\r
- var10 = Integer.parseInt(var5.end.substring(2, 4));\r
- var11 = Integer.parseInt(var5.end.substring(5, 7));\r
- AlarmHelper.setTimeAlarm(this.mContext, var10, var11, "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_END");\r
- }\r
-\r
- if (var5.startTimeMillis > var2 || var5.endTimeMillis <= var2) {\r
- continue;\r
- }\r
-\r
- this.mInterval = var5.interval;\r
- if (!var1) {\r
-// AlarmHelper.setRealTimeAlarm(this.mContext, Integer.parseInt(this.mInterval), ACTION_HEATR_RATE_START);\r
-// this.mRuntime.getContextProxy().sendStheartRateBroadcast(ACTION_HEATR_RATE_START, 0);\r
- }\r
-\r
- var1 = true;\r
- break;\r
- }\r
-\r
- var1 = false;\r
- break;\r
- }\r
-\r
- return var1;\r
- }\r
-\r
- private void onSilentStateChange(boolean var1) {\r
- if (this.alarms != null) {\r
- if (var1) {\r
- this.cancelAlarm(this.alarms);\r
- } else {\r
- this.setNewAlarm(this.alarms);\r
- }\r
- }\r
-\r
- if (this.voiceNotice != null) {\r
- if (var1) {\r
- this.cancelNoticeAlarm(this.voiceNotice);\r
- } else {\r
- this.setNewNoticeAlarm(this.voiceNotice);\r
- }\r
- }\r
-\r
- }\r
-\r
- private ArrayList<Alarm> queryAlarm() {\r
- ArrayList var1 = this.mDbHelper.queryAlarm();\r
- if (!this.mInSilent) {\r
- if (this.alarms != null) {\r
- this.cancelAlarm(this.alarms);\r
- }\r
-\r
- this.setNewAlarm(var1);\r
- }\r
-\r
- return var1;\r
- }\r
-\r
- private ArrayList<Antioff> queryAntioff() {\r
- return this.mDbHelper.queryAntioff(true);\r
- }\r
-\r
- private ArrayList<NoticeContent> queryNotice() {\r
- String var1 = TimeUtil.getSystemTime4();\r
- ArrayList var2 = this.mDbHelper.queryNotice(var1);\r
- if (!this.mInSilent) {\r
- if (this.voiceNotice != null) {\r
- this.cancelNoticeAlarm(this.voiceNotice);\r
- }\r
-\r
- this.setNewNoticeAlarm(var2);\r
- }\r
-\r
- return var2;\r
- }\r
-\r
- private ArrayList<Silent> querySilent() {\r
- return this.mDbHelper.querySilence(true);\r
- }\r
-\r
- private ArrayList<StheartRate> queryStheartRate() {\r
- return this.mDbHelper.queryStheartRate(true);\r
- }\r
-\r
- private void setNewAlarm(ArrayList<Alarm> alarmArrayList) {\r
- Calendar calendar = Calendar.getInstance();\r
- calendar.set(Calendar.SECOND, 0);\r
- long currentTime = System.currentTimeMillis();\r
- Iterator itAlarm = alarmArrayList.iterator();\r
-\r
-\r
- while (itAlarm.hasNext()){\r
- Alarm alarm = (Alarm)itAlarm.next();\r
- if ("ON".equals(alarm.status)) {\r
- int hour = Integer.parseInt(alarm.time.substring(2, 4));\r
- int minute = Integer.parseInt(alarm.time.substring(5, 7));\r
- calendar.set(Calendar.HOUR_OF_DAY, hour);\r
- calendar.set(Calendar.MINUTE, minute);\r
-\r
- char[] weeklist = alarm.week.toCharArray();\r
- int weeklistlen = weeklist.length;\r
- ICLogger.i("repeat = "+alarm.week+", list size = "+weeklistlen);\r
- if (weeklistlen>1) {\r
- //如果week大于0 则证明有循环,没有循环就证明只是一次的闹铃。\r
- for (int i = 1; i < weeklistlen; i++) {\r
-\r
- long tmpTimeInMillis;\r
- int dayofweek = weeklist[i] - 47;\r
- calendar.set(Calendar.DAY_OF_WEEK, dayofweek);\r
- tmpTimeInMillis = calendar.getTimeInMillis();\r
- if (tmpTimeInMillis <= currentTime) {\r
- tmpTimeInMillis += ONE_WEEK;\r
- }\r
- Date date = new Date(tmpTimeInMillis);\r
- ICLogger.i("set date "+date.toLocaleString());\r
- PendingIntent pendingIntent = this.getPendingIntent(alarm.time, alarm.week, alarm.ring, alarm.name, dayofweek);\r
- AlarmHelper.setAlarm(this.mAlarmManager, tmpTimeInMillis, pendingIntent);\r
- }\r
- }else{\r
- //只是一次的闹铃\r
- long tmpTimeInMillis;\r
-// int dayofweek = weeklist[i] - 47;\r
-// calendar.set(Calendar.DAY_OF_WEEK, dayofweek);\r
-// tmpTimeInMillis = calendar.getTimeInMillis();\r
-\r
- Date date = new Date(System.currentTimeMillis());\r
- ICLogger.i("date "+date.toLocaleString());\r
- Calendar c = Calendar.getInstance();\r
- c.setTime(date);\r
- int wek = c.get(Calendar.DAY_OF_WEEK);\r
- calendar.set(Calendar.DAY_OF_WEEK, wek);\r
- tmpTimeInMillis = calendar.getTimeInMillis();\r
- if (tmpTimeInMillis <= currentTime) {\r
- tmpTimeInMillis += ONE_DAY;\r
- }\r
- date = new Date(tmpTimeInMillis);\r
- c = Calendar.getInstance();\r
- c.setTime(date);\r
- wek = c.get(Calendar.DAY_OF_WEEK);\r
-\r
- ICLogger.i("set date "+date.toLocaleString());\r
-\r
- PendingIntent pendingIntent = this.getPendingIntent(alarm.time, alarm.week, alarm.ring, alarm.name, wek);\r
- AlarmHelper.setAlarmOnce(this.mAlarmManager, tmpTimeInMillis, pendingIntent);\r
- }\r
-\r
- }\r
- }\r
- }\r
-\r
- private void setNewNoticeAlarm(ArrayList<NoticeContent> var1) {\r
- Iterator var19 = var1.iterator();\r
-\r
- while(var19.hasNext()) {\r
- NoticeContent var2 = (NoticeContent)var19.next();\r
- String var3 = var2.noticeTime;\r
- String var4 = var2.noticeName;\r
- String var5 = var2.noticeNumber;\r
- String var6 = var2.noticeID;\r
- String var7 = var2.noticeCategory;\r
- String var8 = var2.noticeFrequency;\r
- String var9 = var2.noticeContent;\r
- Calendar var10 = Calendar.getInstance();\r
- long var11 = System.currentTimeMillis();\r
- var10.set(Calendar.SECOND, 0);\r
- if (var3 != null) {\r
- String var13 = var3.substring(0, 4);\r
- String var20 = var3.substring(4, 6);\r
- String var14 = var3.substring(6, 8);\r
- String var15 = var3.substring(8, 10);\r
- String var16 = var3.substring(10, 12);\r
- var10.set(Calendar.YEAR, Integer.parseInt(var13));\r
- var10.set(Calendar.MONTH, Integer.parseInt(var20) - 1);\r
- var10.set(Calendar.DATE, Integer.parseInt(var14));\r
- var10.set(Calendar.HOUR_OF_DAY, Integer.parseInt(var15));\r
- var10.set(Calendar.MINUTE, Integer.parseInt(var16));\r
- long var17 = var10.getTimeInMillis();\r
- if (var17 >= var11) {\r
- PendingIntent var21 = this.getPendingIntent(var3, var4, var5, var6, var7, var8, var9);\r
- AlarmHelper.setAlarm(this.mAlarmManager, var17, var21);\r
- }\r
- }\r
- }\r
-\r
- }\r
-\r
- public void onAlarmClock(Connection var1, Runtime var2) {\r
- this.handleSilent(var2, true);\r
- }\r
-\r
- public void onAttach(Connection var1, Runtime var2) {\r
- this.mRuntime = var2;\r
- this.mConnection = var1;\r
- this.mContext = var2.getContextProxy().context;\r
- this.mAlarmManager = (AlarmManager)this.mContext.getSystemService(Context.ALARM_SERVICE);\r
- this.mDbHelper = var2.getDbHelper();\r
- this.silentList = this.querySilent();\r
- this.getSilentListStartAndEndTime();\r
- this.mInSilent = this.isSilentTime();\r
- DBHelper var3 = this.mDbHelper;\r
- String var4;\r
- if (this.mInSilent) {\r
- var4 = "ON";\r
- } else {\r
- var4 = "OFF";\r
- }\r
-\r
- var3.upDateorInsertDeviceStatus(var4);\r
- this.handSilence(this.mContext, this.mInSilent);\r
- this.stheartRateList = this.queryStheartRate();\r
- this.getStartAndEndStheartRateTime();\r
- this.mIsStheartRate = this.isStheartRateTime(false);\r
- this.alarms = this.queryAlarm();\r
- this.voiceNotice = this.queryNotice();\r
- var2.getContextProxy().context.getContentResolver().registerContentObserver(ICContentProvider.SILENT_URI, false, this.mContentObserver);\r
- this.mAlramReceiver = new SilentManager.AlramReceiver();\r
- IntentFilter var5 = new IntentFilter();\r
- var5.addAction("com.enqualcomm.support.ACTION_NOTICE_ALARM_CHANGE");\r
- var5.addAction("com.enqualcomm.support.ACTION_ALARM_ALARM_CHANGE");\r
- var5.addAction("com.enqualcomm.support.STHEART_RATE_ALARM_CHANGE");\r
- var5.addAction("com.eqc.heartrate.action.RESULT");\r
- this.mContext.registerReceiver(this.mAlramReceiver, var5);\r
- var2.getContextProxy().getTelephonyManager().listen(this.phoneStateListener, 32);\r
- }\r
-\r
- public void onDetach(Connection var1, Runtime var2) {\r
- var2.getContextProxy().context.getContentResolver().unregisterContentObserver(this.mContentObserver);\r
- this.mContext.unregisterReceiver(this.mAlramReceiver);\r
- }\r
-\r
- @Override\r
- public boolean onUserRequest(Intent var1, Connection var2, Runtime var3) {\r
- String action = var1.getAction();\r
- if (ACTION_CARE_ALARM.equals(action)) {\r
- String alarmTime = var1.getDataString(); //alarm:ST00.43,W,CON,闹铃,2\r
- String currentTime = TimeUtil.getSystemTime();\r
- alarmTime.substring(6).split("\\.");\r
- int alarmTime_minutes = Integer.parseInt(alarmTime.substring(6).split("\\.")[1].substring(0, 2));\r
- int alarmTime_hour = Integer.parseInt(alarmTime.substring(6).split("\\.")[0].substring(2));\r
- String[] currentTimeArray = currentTime.split(";")[1].split(":");\r
- int currentTime_hour = Integer.parseInt(currentTimeArray[0]);\r
- int currentTime_minutes = Integer.parseInt(currentTimeArray[1]);\r
- ICLogger.i("alarm time["+alarmTime_hour+":"+alarmTime_minutes+"], current time["+currentTime_hour+":"+currentTime_minutes+"]");\r
- if (alarmTime_hour != currentTime_hour || alarmTime_minutes != currentTime_minutes) {\r
- return false;\r
- }\r
-\r
- if (this.isIdle(this.mContext)) {\r
- try {\r
- Intent intent = new Intent("com.enqualcomm.icare.ALARM", Uri.parse(alarmTime));\r
- intent.putExtra("closeAlarm", 0);\r
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
- this.mContext.startActivity(intent);\r
- } catch (Exception e) {\r
- e.printStackTrace();\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
- }\r
- } else if ("com.enqualcomm.support.ACTION_NOTICE_ALARM".equals(action)) {\r
- String alarmTime = var1.getDataString();\r
- if (this.isIdle(this.mContext)) {\r
- try {\r
- var1 = new Intent("com.enqualcomm.icare.NOTICE", Uri.parse(alarmTime));\r
- var1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
- this.mContext.startActivity(var1);\r
- } catch (Exception e) {\r
- e.printStackTrace();\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
- }\r
- } else {\r
- ICLogger.i("静默闹钟来了");\r
- boolean var4;\r
- if (!"com.eqc.heartrate.action.SILENT_START".equals(action) && !"com.enqualcomm.support.OTHER_HEARTRATE_ALARM_START".equals(action)) {\r
- var4 = false;\r
- } else {\r
- var4 = true;\r
- }\r
-\r
- this.handleSilent(var3, var4 ^ true);\r
- }\r
-\r
- return false;\r
- }\r
-\r
- @Override\r
- public boolean onUserRequest(Message paramMessage, Connection paramConnection, Runtime paramRuntime) {\r
- return false;\r
- }\r
-\r
- class AlramReceiver extends BroadcastReceiver {\r
- AlramReceiver() {\r
- }\r
-\r
- public void onReceive(Context var1, Intent var2) {\r
- String var6 = var2.getAction();\r
- StringBuilder var3 = new StringBuilder();\r
- var3.append("action = ");\r
- var3.append(var6);\r
- ICLogger.i(var3.toString());\r
- if ("com.enqualcomm.support.ACTION_NOTICE_ALARM_CHANGE".equals(var6)) {\r
- SilentManager.this.voiceNotice = SilentManager.this.queryNotice();\r
- } else if ("com.enqualcomm.support.ACTION_ALARM_ALARM_CHANGE".equals(var6)) {\r
- SilentManager.this.alarms = SilentManager.this.queryAlarm();\r
- } else if ("com.enqualcomm.support.STHEART_RATE_ALARM_CHANGE".equals(var6)) {\r
- SilentManager.this.stheartRateList = SilentManager.this.queryStheartRate();\r
- SilentManager.this.getStartAndEndStheartRateTime();\r
- SilentManager.this.isStheartRateTime(false);\r
- } else if ("com.eqc.heartrate.action.RESULT".equals(var6)) {\r
- var6 = var2.getStringExtra("time");\r
- int var4 = var2.getIntExtra("value", 0);\r
- int var5 = var2.getIntExtra("type", 0);\r
- StringBuilder var7 = new StringBuilder();\r
- var7.append("(");\r
- var7.append(var6);\r
- var7.append("@");\r
- var7.append(var4);\r
- var7.append("@");\r
- var7.append(var5);\r
- var7.append(")");\r
- var6 = var7.toString();\r
-// SilentManager.this.mConnection.send(API.H60(SilentManager.this.mRuntime, var6));\r
- } else if ("com.enqualcomm.support.ACTION_ANTIOFF_ALARM_CHANGE".equals(var6)) {\r
- SilentManager.this.sAntioffList = SilentManager.this.queryAntioff();\r
- SilentManager.this.getStartAndEndSantioffTime();\r
- SilentManager.this.mIsNeedAntioff = SilentManager.this.isAntioffTime(false);\r
- }\r
-\r
- }\r
- }\r
+package com.enqualcomm.support.service;
+
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Messenger;
+import android.telephony.PhoneStateListener;
+import android.telephony.PreciseCallState;
+import android.telephony.TelephonyManager;
+
+import com.enqualcomm.support.Config;
+import com.enqualcomm.support.CoreService;
+import com.enqualcomm.support.ICContentProvider;
+import com.enqualcomm.support.MainActivity;
+import com.enqualcomm.support.bean.Alarm;
+import com.enqualcomm.support.bean.Antioff;
+import com.enqualcomm.support.bean.NoticeContent;
+import com.enqualcomm.support.bean.Runtime;
+import com.enqualcomm.support.bean.Silent;
+import com.enqualcomm.support.bean.StheartRate;
+
+import com.enqualcomm.support.service.base.AbstractInvokeHandlerService;
+import com.enqualcomm.support.utils.AlarmHelper;
+import com.enqualcomm.support.utils.Connection;
+import com.enqualcomm.support.utils.DBHelper;
+import com.enqualcomm.support.utils.ICAudioManager;
+import com.enqualcomm.support.utils.ICLogger;
+import com.enqualcomm.support.utils.MissedCallContentObserver;
+import com.enqualcomm.support.utils.SharPreferenceUtil;
+import com.enqualcomm.support.utils.TimeUtil;
+import com.enqualcomm.support.utils.Util;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.concurrent.TimeUnit;
+
+import static android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED;
+import static android.telephony.TelephonyManager.CALL_STATE_OFFHOOK;
+import static android.telephony.TelephonyManager.CALL_STATE_RINGING;
+import static com.enqualcomm.support.Constants.ACTION_CARE_ALARM;
+import static com.enqualcomm.support.Constants.ACTION_CLOSE_UNREAD_MSG;
+import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;
+import static com.enqualcomm.support.Constants.SERVICE_CLS_NAME;
+import static com.enqualcomm.support.Constants.SERVICE_PKG_NAME;
+
+public class SilentManager extends AbstractInvokeHandlerService {
+ private static final long ONE_WEEK = 604800000L;
+ private static final long ONE_DAY = 86400000L;
+
+ private ArrayList<Alarm> alarms;
+ private boolean haveHandSilence;
+ private boolean isCalling;
+ AlarmManager mAlarmManager;
+ private SilentManager.AlramReceiver mAlramReceiver;
+ Connection mConnection;
+ ContentObserver mContentObserver = new ContentObserver(new Handler()) {
+ public void onChange(boolean var1) {
+ ICLogger.i("静默有变化");
+ SilentManager.this.silentList = SilentManager.this.querySilent();
+ SilentManager.this.getSilentListStartAndEndTime();
+ SilentManager.this.handleSilent(mRuntime, true);
+ }
+ };
+ private Context mContext;
+ private DBHelper mDbHelper;
+ private boolean mInSilent;
+ private String mInterval;
+ private boolean mIsNeedAntioff;
+ private boolean mIsStheartRate;
+ private MissedCallContentObserver mMissedCallContentObserver;
+ Runtime mRuntime;
+ private int mStheartRateInterval;
+ private int mTodayWeek;
+ private boolean mValue_isSilence;
+
+ public static final int PRECISE_CALL_STATE_NOT_VALID = -1;
+ public static final int PRECISE_CALL_STATE_IDLE = 0; //空闲
+ public static final int PRECISE_CALL_STATE_ACTIVE = 1; //正在通话
+ public static final int PRECISE_CALL_STATE_HOLDING = 2; //通话挂起
+ public static final int PRECISE_CALL_STATE_DIALING = 3; //拨号开始
+ public static final int PRECISE_CALL_STATE_ALERTING = 4; //正在呼出
+ public static final int PRECISE_CALL_STATE_INCOMING = 5; //对方来电
+ public static final int PRECISE_CALL_STATE_WAITING = 6; //第三方来电等待
+ public static final int PRECISE_CALL_STATE_DISCONNECTED = 7; //挂断完成
+ public static final int PRECISE_CALL_STATE_DISCONNECTING = 8; //正在挂断
+
+ private static SilentManager mSilentManger=null;
+
+ public static SilentManager getInstance(){
+ if (mSilentManger==null)
+ mSilentManger=new SilentManager();
+ return mSilentManger;
+ }
+ private PhoneStateListener phoneStateListener = new PhoneStateListener() {
+ public void onCallStateChanged(int state, String incomingNumber) {
+ super.onCallStateChanged(state, incomingNumber);
+
+ ICLogger.i("========onCallStateChanged state "+state+", incomingNumber "+incomingNumber);
+ switch(state) {
+ case PRECISE_CALL_STATE_DISCONNECTING: //挂电话
+ case PRECISE_CALL_STATE_DISCONNECTED: //挂电话
+ isCalling = false;
+// if (SilentManager.this.haveHandSilence) {
+// SilentManager.this.handSilence(SilentManager.this.mContext, SilentManager.this.mValue_isSilence);
+// }
+ if(ICAudioManager.needMute==true)
+ {
+// ICAudioManager.restoreVolumn(mContext); //2秒后恢复音量
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ ICAudioManager.restoreVolumn(mContext); //2秒后恢复音量
+ ICAudioManager.needMute=false;
+ }
+ },2000);
+ }
+ ICLogger.i("========Hung up!");
+ break;
+ case PRECISE_CALL_STATE_INCOMING: //来电
+ case PRECISE_CALL_STATE_ALERTING:
+ case PRECISE_CALL_STATE_DIALING:
+ isCalling = true;
+ Intent var3 = new Intent();
+ var3.setAction(ACTION_CLOSE_UNREAD_MSG);
+ mContext.sendBroadcast(var3);
+
+ ICLogger.i("========Ring!");
+ if(ICAudioManager.needMute==true)
+ {
+ ICAudioManager.setVolumnMute(mContext);
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ ICAudioManager.setVolumnMute(mContext); //2秒后恢复音量
+ }
+ },2000);
+
+ }
+ break;
+ case PRECISE_CALL_STATE_ACTIVE://接电话
+ {
+ if (ICAudioManager.needMute == false){
+ if (Config.custom_name.equals("AK"))
+ ICAudioManager.setVoiceCallMaxVolumn(mContext); //设置最大音量
+ }
+ }
+ case PRECISE_CALL_STATE_HOLDING://接电话
+ case PRECISE_CALL_STATE_WAITING:
+ isCalling = true;
+ ICLogger.i("========Answer Call !");
+ if(ICAudioManager.needMute==true)
+ {
+ ICAudioManager.setVolumnMute(mContext);
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ ICAudioManager.setVolumnMute(mContext); //2秒后恢复音量
+ }
+ },2000);
+ }
+
+ }
+
+ }
+ };
+ private ArrayList<Antioff> sAntioffList;
+ private ArrayList<Silent> silentList;
+ private ArrayList<StheartRate> stheartRateList;
+ private ArrayList<NoticeContent> voiceNotice;
+
+ public SilentManager() {
+ }
+
+ private void callback(Messenger var1, boolean var2) {
+ short var3;
+ if (var2) {
+ var3 = 600;
+ } else {
+ var3 = 700;
+ }
+
+ if (var1 != null) {
+ try {
+ var1.send(Message.obtain((Handler)null, var3));
+ } catch (Exception e) {
+ e.printStackTrace();
+ ICLogger.e(e.getMessage(),e);
+ }
+ }
+
+ }
+
+ private void cancelAlarm(ArrayList<Alarm> var1) {
+ Iterator var2 = var1.iterator();
+
+ while(var2.hasNext()) {
+ Alarm var3 = (Alarm)var2.next();
+ String var10 = var3.time;
+ String var4 = var3.week;
+ String var5 = var3.ring;
+ String var11 = var3.name;
+ char[] var6 = var4.toCharArray();
+ int var7 = var6.length;
+
+ for(int var8 = 1; var8 < var7; ++var8) {
+ char var9 = var6[var8];
+ this.mAlarmManager.cancel(this.getPendingIntent(var10, var4, var5, var11, var9 - 47));
+ }
+ }
+
+ }
+
+ private void cancelNoticeAlarm(ArrayList<NoticeContent> var1) {
+ Iterator var2 = var1.iterator();
+
+ while(var2.hasNext()) {
+ NoticeContent var3 = (NoticeContent)var2.next();
+ String var4 = var3.noticeTime;
+ String var9 = var3.noticeName;
+ String var5 = var3.noticeNumber;
+ String var6 = var3.noticeID;
+ String var7 = var3.noticeCategory;
+ String var8 = var3.noticeFrequency;
+ String var10 = var3.noticeContent;
+ this.mAlarmManager.cancel(this.getPendingIntent(var4, var9, var5, var6, var7, var8, var10));
+ }
+
+ }
+
+ private PendingIntent getPendingIntent(String var1, String var2, String var3, String var4, int var5) {
+ StringBuilder var6 = new StringBuilder("alarm:");
+ var6.append(var1);
+ var6.append(",");
+ var6.append(var2);
+ var6.append(",");
+ var6.append(var3);
+ var6.append(",");
+ var6.append(var4);
+ var6.append(",");
+ var6.append(var5);
+ var2 = var6.toString();
+ Intent intent = new Intent(this.mContext, CoreService.class);
+ intent.setAction(ACTION_CARE_ALARM);
+ intent.setData(Uri.parse(var2));
+ return PendingIntent.getService(this.mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+ }
+
+ private PendingIntent getPendingIntent(String var1, String var2, String var3, String var4, String var5, String var6, String var7) {
+ StringBuilder var8 = new StringBuilder("notice:");
+ var8.append(var1);
+ var8.append(",");
+ var8.append(var2);
+ var8.append(",");
+ var8.append(var3);
+ var8.append(",");
+ var8.append(var4);
+ var8.append(",");
+ var8.append(var5);
+ var8.append(",");
+ var8.append(var6);
+ var8.append(",");
+ var8.append(var7);
+ var1 = var8.toString();
+ Intent var9 = new Intent(this.mContext, CoreService.class);
+ var9.setAction("com.enqualcomm.support.ACTION_NOTICE_ALARM");
+ var9.setData(Uri.parse(var1));
+ return PendingIntent.getService(this.mContext, 0, var9, PendingIntent.FLAG_UPDATE_CURRENT);
+ }
+
+ private void getSilentListStartAndEndTime() {
+ Calendar var1 = Calendar.getInstance();
+ this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);
+
+ Silent var3;
+ for(Iterator var2 = this.silentList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {
+ var3 = (Silent)var2.next();
+ var1.set(Calendar.SECOND, 0);
+ int var4 = Integer.parseInt(var3.start.substring(2, 4));
+ int var5 = Integer.parseInt(var3.start.substring(5, 7));
+ var1.set(Calendar.HOUR_OF_DAY, var4);
+ var1.set(Calendar.MINUTE, var5);
+ var3.startTimeMillis = var1.getTimeInMillis();
+ var5 = Integer.parseInt(var3.end.substring(2, 4));
+ var4 = Integer.parseInt(var3.end.substring(5, 7));
+ var1.set(Calendar.HOUR_OF_DAY, var5);
+ var1.set(Calendar.MINUTE, var4);
+ }
+
+ }
+
+ private void getStartAndEndSantioffTime() {
+ Calendar var1 = Calendar.getInstance();
+ this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);
+
+ Antioff var3;
+ for(Iterator var2 = this.sAntioffList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {
+ var3 = (Antioff)var2.next();
+ var1.set(Calendar.SECOND, 0);
+ int var4 = Integer.parseInt(var3.start.substring(2, 4));
+ int var5 = Integer.parseInt(var3.start.substring(5, 7));
+ var1.set(Calendar.HOUR_OF_DAY, var4);
+ var1.set(Calendar.MINUTE, var5);
+ var3.startTimeMillis = var1.getTimeInMillis();
+ var4 = Integer.parseInt(var3.end.substring(2, 4));
+ var5 = Integer.parseInt(var3.end.substring(5, 7));
+ var1.set(Calendar.HOUR_OF_DAY, var4);
+ var1.set(Calendar.MINUTE, var5);
+ }
+
+ }
+
+ private void getStartAndEndStheartRateTime() {
+ Calendar var1 = Calendar.getInstance();
+ this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);
+
+ StheartRate var3;
+ for(Iterator var2 = this.stheartRateList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {
+ var3 = (StheartRate)var2.next();
+ var1.set(Calendar.SECOND, 0);
+ int var4 = Integer.parseInt(var3.start.substring(2, 4));
+ int var5 = Integer.parseInt(var3.start.substring(5, 7));
+ var1.set(Calendar.HOUR_OF_DAY, var4);
+ var1.set(Calendar.MINUTE, var5);
+ var3.startTimeMillis = var1.getTimeInMillis();
+ var4 = Integer.parseInt(var3.end.substring(2, 4));
+ var5 = Integer.parseInt(var3.end.substring(5, 7));
+ var1.set(Calendar.HOUR_OF_DAY, var4);
+ var1.set(Calendar.MINUTE, var5);
+ }
+
+ }
+
+ private void handSilence(Context var1, boolean var2) {
+ this.mValue_isSilence = var2;
+ if (this.isCalling) {
+ this.haveHandSilence = true;
+ } else {
+ this.haveHandSilence = false;
+ SharPreferenceUtil.setPrefBoolean(var1, "KEY_ISSILENCE", var2);
+ Intent var3 = new Intent();
+ var3.setAction("com.enqualcomm.support.ACTION_ISSILENCE2IMESSAGE");
+ var3.putExtra("KEY_ISSILENCE", var2);
+ var1.sendBroadcast(var3);
+ ComponentName var4 = new ComponentName(SERVICE_PKG_NAME, SERVICE_CLS_NAME);
+ Intent var5 = (new Intent("com.enqualcomm.support.ACTION_VIDEO_END_CALL")).setComponent(var4);
+ this.mRuntime.getContextProxy().context.startService(var5);
+ }
+ }
+
+ private void handleSilent(Runtime var1, boolean var2) {
+ int var3 = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
+ if (var3 != this.mTodayWeek && (var3 != 1 || this.mTodayWeek != 8)) {
+ this.getSilentListStartAndEndTime();
+ this.queryNotice();
+ }
+
+ boolean var4 = this.isSilentTime();
+ StringBuilder var5 = new StringBuilder();
+ var5.append("inSilent=");
+ var5.append(var4);
+ ICLogger.i(var5.toString());
+ if (!this.mInSilent && var4) {
+ this.onSilentStateChange(true);
+ this.handSilence(this.mContext, true);
+ this.mDbHelper.upDateStatus("ON");
+ } else if (this.mInSilent && !var4) {
+ this.onSilentStateChange(false);
+ this.mDbHelper.upDateStatus("OFF");
+ this.handSilence(this.mContext, false);
+ }
+
+ this.mInSilent = var4;
+ this.getStartAndEndStheartRateTime();
+ this.isStheartRateTime(var2);
+ }
+
+ private boolean isIdle(Context context) {
+ int callstate = ((TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE)).getCallState();
+ boolean isidle;
+ if (CALL_STATE_RINGING != callstate && CALL_STATE_OFFHOOK != callstate) {
+ isidle = true;
+ } else {
+ isidle = false;
+ }
+
+ return isidle && !this.mInSilent && !this.mRuntime.getBatteryLow();
+ }
+
+ private boolean isAntioffTime(boolean var1) {
+ long var2 = System.currentTimeMillis();
+ ArrayList var4 = this.sAntioffList;
+ int var5 = this.mTodayWeek;
+ var1 = true;
+ if (var5 == 1) {
+ this.mTodayWeek += 7;
+ }
+
+ Iterator var12 = var4.iterator();
+
+ while(true) {
+ if (!var12.hasNext()) {
+ var1 = false;
+ break;
+ }
+
+ Antioff var6 = (Antioff)var12.next();
+ String var7 = var6.week;
+ StringBuilder var8 = new StringBuilder();
+ var8.append(this.mTodayWeek - 1);
+ var8.append("");
+ if (var7.contains(var8.toString())) {
+ long var9 = var6.startTimeMillis - var2;
+ int var11;
+ if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {
+ var11 = Integer.parseInt(var6.start.substring(2, 4));
+ var5 = Integer.parseInt(var6.start.substring(5, 7));
+ AlarmHelper.setTimeAlarm(this.mContext, var11, var5, "com.enqualcomm.support.OTHER_ALARM_START");
+ var8 = new StringBuilder();
+ var8.append("设置起始时间=hour");
+ var8.append(var11);
+ var8.append("minute+");
+ var8.append(var5);
+ ICLogger.i(var8.toString());
+ }
+
+ var9 = var6.endTimeMillis - var2;
+ if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {
+ var11 = Integer.parseInt(var6.end.substring(2, 4));
+ var5 = Integer.parseInt(var6.end.substring(5, 7));
+ AlarmHelper.setTimeAlarm(this.mContext, var11, var5, "com.enqualcomm.support.OTHER_ALARM_END");
+ var8 = new StringBuilder();
+ var8.append("设置结束时间=hour");
+ var8.append(var11);
+ var8.append("minute+");
+ var8.append(var5);
+ ICLogger.i(var8.toString());
+ }
+
+ if (var6.startTimeMillis <= var2 && var6.endTimeMillis > var2) {
+ break;
+ }
+ }
+ }
+
+ this.mRuntime.setNeedAntioff(var1);
+ return var1;
+ }
+
+ private boolean isSilentTime() {
+ long var1 = System.currentTimeMillis();
+ ArrayList var3 = this.silentList;
+ int var4 = this.mTodayWeek;
+ boolean var5 = false; //默认不在silent时间段
+ if (var4 == 1) {
+ this.mTodayWeek += 7;
+ }
+
+ Iterator var6 = var3.iterator();
+
+ while(true) {
+ if (!var6.hasNext()) {
+ var5 = false;
+ break;
+ }
+
+ Silent var12 = (Silent)var6.next();
+ String var7 = var12.week;
+ StringBuilder var8 = new StringBuilder();
+ var8.append(this.mTodayWeek - 1);
+ var8.append("");
+ if (var7.contains(var8.toString())) {
+ long var9 = var12.startTimeMillis - var1;
+ int var11;
+ StringBuilder var13;
+ if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {
+ var11 = Integer.parseInt(var12.start.substring(2, 4));
+ var4 = Integer.parseInt(var12.start.substring(5, 7));
+ AlarmHelper.setTimeAlarm(this.mContext, var11, var4, "com.enqualcomm.support.OTHER_ALARM_START");
+ var13 = new StringBuilder();
+ var13.append("设置起始时间=hour");
+ var13.append(var11);
+ var13.append("minute+");
+ var13.append(var4);
+ ICLogger.i(var13.toString());
+ }
+
+ var9 = var12.endTimeMillis - var1;
+ if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {
+ var11 = Integer.parseInt(var12.end.substring(2, 4));
+ var4 = Integer.parseInt(var12.end.substring(5, 7));
+ AlarmHelper.setTimeAlarm(this.mContext, var11, var4, "com.enqualcomm.support.OTHER_ALARM_END");
+ var13 = new StringBuilder();
+ var13.append("设置结束时间=hour");
+ var13.append(var11);
+ var13.append("minute+");
+ var13.append(var4);
+ ICLogger.i(var13.toString());
+ }
+
+ if (var12.startTimeMillis <= var1 && var12.endTimeMillis > var1) {
+ break;
+ }
+ }
+ }
+
+ return var5;
+ }
+
+ private boolean isStheartRateTime(boolean var1) {
+ long var2 = System.currentTimeMillis();
+ ArrayList var4 = this.stheartRateList;
+ if (this.mTodayWeek == 1) {
+ this.mTodayWeek += 7;
+ }
+
+ Iterator var12 = var4.iterator();
+
+ while(true) {
+ if (var12.hasNext()) {
+ StheartRate var5 = (StheartRate)var12.next();
+ String var6 = var5.week;
+ StringBuilder var7 = new StringBuilder();
+ var7.append(this.mTodayWeek - 1);
+ var7.append("");
+ if (!var6.contains(var7.toString())) {
+ continue;
+ }
+
+ long var8 = var5.startTimeMillis - var2;
+ int var10;
+ int var11;
+ if (var8 < (long)(CoreService.alarmCycle * 60 * 1000) && var8 > 0L) {
+ var10 = Integer.parseInt(var5.start.substring(2, 4));
+ var11 = Integer.parseInt(var5.start.substring(5, 7));
+ AlarmHelper.setTimeAlarm(this.mContext, var10, var11, "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_START");
+ }
+
+ var8 = var5.endTimeMillis - var2;
+ if (var8 < (long)(CoreService.alarmCycle * 60 * 1000) && var8 > 0L) {
+ var10 = Integer.parseInt(var5.end.substring(2, 4));
+ var11 = Integer.parseInt(var5.end.substring(5, 7));
+ AlarmHelper.setTimeAlarm(this.mContext, var10, var11, "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_END");
+ }
+
+ if (var5.startTimeMillis > var2 || var5.endTimeMillis <= var2) {
+ continue;
+ }
+
+ this.mInterval = var5.interval;
+ if (!var1) {
+// AlarmHelper.setRealTimeAlarm(this.mContext, Integer.parseInt(this.mInterval), ACTION_HEATR_RATE_START);
+// this.mRuntime.getContextProxy().sendStheartRateBroadcast(ACTION_HEATR_RATE_START, 0);
+ }
+
+ var1 = true;
+ break;
+ }
+
+ var1 = false;
+ break;
+ }
+
+ return var1;
+ }
+
+ private void onSilentStateChange(boolean var1) {
+ if (this.alarms != null) {
+ if (var1) {
+ this.cancelAlarm(this.alarms);
+ } else {
+ this.setNewAlarm(this.alarms);
+ }
+ }
+
+ if (this.voiceNotice != null) {
+ if (var1) {
+ this.cancelNoticeAlarm(this.voiceNotice);
+ } else {
+ this.setNewNoticeAlarm(this.voiceNotice);
+ }
+ }
+
+ }
+
+ private ArrayList<Alarm> queryAlarm() {
+ ArrayList var1 = this.mDbHelper.queryAlarm();
+ if (!this.mInSilent) {
+ if (this.alarms != null) {
+ this.cancelAlarm(this.alarms);
+ }
+
+ this.setNewAlarm(var1);
+ }
+
+ return var1;
+ }
+
+ private ArrayList<Antioff> queryAntioff() {
+ return this.mDbHelper.queryAntioff(true);
+ }
+
+ private ArrayList<NoticeContent> queryNotice() {
+ String var1 = TimeUtil.getSystemTime4();
+ ArrayList var2 = this.mDbHelper.queryNotice(var1);
+ if (!this.mInSilent) {
+ if (this.voiceNotice != null) {
+ this.cancelNoticeAlarm(this.voiceNotice);
+ }
+
+ this.setNewNoticeAlarm(var2);
+ }
+
+ return var2;
+ }
+
+ private ArrayList<Silent> querySilent() {
+ return this.mDbHelper.querySilence(true);
+ }
+
+ private ArrayList<StheartRate> queryStheartRate() {
+ return this.mDbHelper.queryStheartRate(true);
+ }
+
+ private void setNewAlarm(ArrayList<Alarm> alarmArrayList) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.SECOND, 0);
+ long currentTime = System.currentTimeMillis();
+ Iterator itAlarm = alarmArrayList.iterator();
+
+
+ while (itAlarm.hasNext()){
+ Alarm alarm = (Alarm)itAlarm.next();
+ if ("ON".equals(alarm.status)) {
+ int hour = Integer.parseInt(alarm.time.substring(2, 4));
+ int minute = Integer.parseInt(alarm.time.substring(5, 7));
+ calendar.set(Calendar.HOUR_OF_DAY, hour);
+ calendar.set(Calendar.MINUTE, minute);
+
+ char[] weeklist = alarm.week.toCharArray();
+ int weeklistlen = weeklist.length;
+ ICLogger.i("repeat = "+alarm.week+", list size = "+weeklistlen);
+ if (weeklistlen>1) {
+ //如果week大于0 则证明有循环,没有循环就证明只是一次的闹铃。
+ for (int i = 1; i < weeklistlen; i++) {
+
+ long tmpTimeInMillis;
+ int dayofweek = weeklist[i] - 47;
+ calendar.set(Calendar.DAY_OF_WEEK, dayofweek);
+ tmpTimeInMillis = calendar.getTimeInMillis();
+ if (tmpTimeInMillis <= currentTime) {
+ tmpTimeInMillis += ONE_WEEK;
+ }
+ Date date = new Date(tmpTimeInMillis);
+ ICLogger.i("set date "+date.toLocaleString());
+ PendingIntent pendingIntent = this.getPendingIntent(alarm.time, alarm.week, alarm.ring, alarm.name, dayofweek);
+ AlarmHelper.setAlarm(this.mAlarmManager, tmpTimeInMillis, pendingIntent);
+ }
+ }else{
+ //只是一次的闹铃
+ long tmpTimeInMillis;
+// int dayofweek = weeklist[i] - 47;
+// calendar.set(Calendar.DAY_OF_WEEK, dayofweek);
+// tmpTimeInMillis = calendar.getTimeInMillis();
+
+ Date date = new Date(System.currentTimeMillis());
+ ICLogger.i("date "+date.toLocaleString());
+ Calendar c = Calendar.getInstance();
+ c.setTime(date);
+ int wek = c.get(Calendar.DAY_OF_WEEK);
+ calendar.set(Calendar.DAY_OF_WEEK, wek);
+ tmpTimeInMillis = calendar.getTimeInMillis();
+ if (tmpTimeInMillis <= currentTime) {
+ tmpTimeInMillis += ONE_DAY;
+ }
+ date = new Date(tmpTimeInMillis);
+ c = Calendar.getInstance();
+ c.setTime(date);
+ wek = c.get(Calendar.DAY_OF_WEEK);
+
+ ICLogger.i("set date "+date.toLocaleString());
+
+ PendingIntent pendingIntent = this.getPendingIntent(alarm.time, alarm.week, alarm.ring, alarm.name, wek);
+ AlarmHelper.setAlarmOnce(this.mAlarmManager, tmpTimeInMillis, pendingIntent);
+ }
+
+ }
+ }
+ }
+
+ private void setNewNoticeAlarm(ArrayList<NoticeContent> var1) {
+ Iterator var19 = var1.iterator();
+
+ while(var19.hasNext()) {
+ NoticeContent var2 = (NoticeContent)var19.next();
+ String var3 = var2.noticeTime;
+ String var4 = var2.noticeName;
+ String var5 = var2.noticeNumber;
+ String var6 = var2.noticeID;
+ String var7 = var2.noticeCategory;
+ String var8 = var2.noticeFrequency;
+ String var9 = var2.noticeContent;
+ Calendar var10 = Calendar.getInstance();
+ long var11 = System.currentTimeMillis();
+ var10.set(Calendar.SECOND, 0);
+ if (var3 != null) {
+ String var13 = var3.substring(0, 4);
+ String var20 = var3.substring(4, 6);
+ String var14 = var3.substring(6, 8);
+ String var15 = var3.substring(8, 10);
+ String var16 = var3.substring(10, 12);
+ var10.set(Calendar.YEAR, Integer.parseInt(var13));
+ var10.set(Calendar.MONTH, Integer.parseInt(var20) - 1);
+ var10.set(Calendar.DATE, Integer.parseInt(var14));
+ var10.set(Calendar.HOUR_OF_DAY, Integer.parseInt(var15));
+ var10.set(Calendar.MINUTE, Integer.parseInt(var16));
+ long var17 = var10.getTimeInMillis();
+ if (var17 >= var11) {
+ PendingIntent var21 = this.getPendingIntent(var3, var4, var5, var6, var7, var8, var9);
+ AlarmHelper.setAlarm(this.mAlarmManager, var17, var21);
+ }
+ }
+ }
+
+ }
+
+ public void onAlarmClock(Connection var1, Runtime var2) {
+ this.handleSilent(var2, true);
+ }
+
+ public void onAttach(Connection var1, Runtime var2) {
+ this.mRuntime = var2;
+ this.mConnection = var1;
+ this.mContext = var2.getContextProxy().context;
+ this.mAlarmManager = (AlarmManager)this.mContext.getSystemService(Context.ALARM_SERVICE);
+ this.mDbHelper = var2.getDbHelper();
+ this.silentList = this.querySilent();
+ this.getSilentListStartAndEndTime();
+ this.mInSilent = this.isSilentTime();
+ DBHelper var3 = this.mDbHelper;
+ String var4;
+ if (this.mInSilent) {
+ var4 = "ON";
+ } else {
+ var4 = "OFF";
+ }
+
+ var3.upDateorInsertDeviceStatus(var4);
+ this.handSilence(this.mContext, this.mInSilent);
+ this.stheartRateList = this.queryStheartRate();
+ this.getStartAndEndStheartRateTime();
+ this.mIsStheartRate = this.isStheartRateTime(false);
+ this.alarms = this.queryAlarm();
+ this.voiceNotice = this.queryNotice();
+ var2.getContextProxy().context.getContentResolver().registerContentObserver(ICContentProvider.SILENT_URI, false, this.mContentObserver);
+ this.mAlramReceiver = new SilentManager.AlramReceiver();
+ IntentFilter var5 = new IntentFilter();
+ var5.addAction("com.enqualcomm.support.ACTION_NOTICE_ALARM_CHANGE");
+ var5.addAction("com.enqualcomm.support.ACTION_ALARM_ALARM_CHANGE");
+ var5.addAction("com.enqualcomm.support.STHEART_RATE_ALARM_CHANGE");
+ var5.addAction("com.eqc.heartrate.action.RESULT");
+ this.mContext.registerReceiver(this.mAlramReceiver, var5);
+ var2.getContextProxy().getTelephonyManager().listen(this.phoneStateListener, 32);
+ }
+
+ public void onDetach(Connection var1, Runtime var2) {
+ var2.getContextProxy().context.getContentResolver().unregisterContentObserver(this.mContentObserver);
+ this.mContext.unregisterReceiver(this.mAlramReceiver);
+ }
+
+ @Override
+ public boolean onUserRequest(Intent var1, Connection var2, Runtime var3) {
+ String action = var1.getAction();
+ if (ACTION_CARE_ALARM.equals(action)) {
+ String alarmTime = var1.getDataString(); //alarm:ST00.43,W,CON,闹铃,2
+ String currentTime = TimeUtil.getSystemTime();
+ alarmTime.substring(6).split("\\.");
+ int alarmTime_minutes = Integer.parseInt(alarmTime.substring(6).split("\\.")[1].substring(0, 2));
+ int alarmTime_hour = Integer.parseInt(alarmTime.substring(6).split("\\.")[0].substring(2));
+ String[] currentTimeArray = currentTime.split(";")[1].split(":");
+ int currentTime_hour = Integer.parseInt(currentTimeArray[0]);
+ int currentTime_minutes = Integer.parseInt(currentTimeArray[1]);
+ ICLogger.i("alarm time["+alarmTime_hour+":"+alarmTime_minutes+"], current time["+currentTime_hour+":"+currentTime_minutes+"]");
+ if (alarmTime_hour != currentTime_hour || alarmTime_minutes != currentTime_minutes) {
+ return false;
+ }
+
+ if (this.isIdle(this.mContext)) {
+ try {
+ Intent intent = new Intent("com.enqualcomm.icare.ALARM", Uri.parse(alarmTime));
+ intent.putExtra("closeAlarm", 0);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ this.mContext.startActivity(intent);
+ } catch (Exception e) {
+ e.printStackTrace();
+ ICLogger.e(e.getMessage(),e);
+ }
+ }
+ } else if ("com.enqualcomm.support.ACTION_NOTICE_ALARM".equals(action)) {
+ String alarmTime = var1.getDataString();
+ if (this.isIdle(this.mContext)) {
+ try {
+ var1 = new Intent("com.enqualcomm.icare.NOTICE", Uri.parse(alarmTime));
+ var1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ this.mContext.startActivity(var1);
+ } catch (Exception e) {
+ e.printStackTrace();
+ ICLogger.e(e.getMessage(),e);
+ }
+ }
+ } else {
+ ICLogger.i("静默闹钟来了");
+ boolean var4;
+ if (!"com.eqc.heartrate.action.SILENT_START".equals(action) && !"com.enqualcomm.support.OTHER_HEARTRATE_ALARM_START".equals(action)) {
+ var4 = false;
+ } else {
+ var4 = true;
+ }
+
+ this.handleSilent(var3, var4 ^ true);
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean onUserRequest(Message paramMessage, Connection paramConnection, Runtime paramRuntime) {
+ return false;
+ }
+
+ class AlramReceiver extends BroadcastReceiver {
+ AlramReceiver() {
+ }
+
+ public void onReceive(Context var1, Intent var2) {
+ String var6 = var2.getAction();
+ StringBuilder var3 = new StringBuilder();
+ var3.append("action = ");
+ var3.append(var6);
+ ICLogger.i(var3.toString());
+ if ("com.enqualcomm.support.ACTION_NOTICE_ALARM_CHANGE".equals(var6)) {
+ SilentManager.this.voiceNotice = SilentManager.this.queryNotice();
+ } else if ("com.enqualcomm.support.ACTION_ALARM_ALARM_CHANGE".equals(var6)) {
+ SilentManager.this.alarms = SilentManager.this.queryAlarm();
+ } else if ("com.enqualcomm.support.STHEART_RATE_ALARM_CHANGE".equals(var6)) {
+ SilentManager.this.stheartRateList = SilentManager.this.queryStheartRate();
+ SilentManager.this.getStartAndEndStheartRateTime();
+ SilentManager.this.isStheartRateTime(false);
+ } else if ("com.eqc.heartrate.action.RESULT".equals(var6)) {
+ var6 = var2.getStringExtra("time");
+ int var4 = var2.getIntExtra("value", 0);
+ int var5 = var2.getIntExtra("type", 0);
+ StringBuilder var7 = new StringBuilder();
+ var7.append("(");
+ var7.append(var6);
+ var7.append("@");
+ var7.append(var4);
+ var7.append("@");
+ var7.append(var5);
+ var7.append(")");
+ var6 = var7.toString();
+// SilentManager.this.mConnection.send(API.H60(SilentManager.this.mRuntime, var6));
+ } else if ("com.enqualcomm.support.ACTION_ANTIOFF_ALARM_CHANGE".equals(var6)) {
+ SilentManager.this.sAntioffList = SilentManager.this.queryAntioff();
+ SilentManager.this.getStartAndEndSantioffTime();
+ SilentManager.this.mIsNeedAntioff = SilentManager.this.isAntioffTime(false);
+ }
+
+ }
+ }
}
\ No newline at end of file
-package com.ic.protocols;\r
-\r
-import android.content.ComponentName;\r
-import android.content.Context;\r
-import android.content.Intent;\r
-import android.net.Uri;\r
-import android.os.Environment;\r
-import android.os.Handler;\r
-\r
-import com.enqualcomm.support.Config;\r
-import com.enqualcomm.support.Constants;\r
-import com.enqualcomm.support.CoreService;\r
-import com.enqualcomm.support.R;\r
-import com.enqualcomm.support.bean.Alarm;\r
-import com.enqualcomm.support.bean.Contact;\r
-import com.enqualcomm.support.bean.Content;\r
-import com.enqualcomm.support.bean.ICLocation;\r
-import com.enqualcomm.support.bean.Runtime;\r
-import com.enqualcomm.support.bean.StringMessage;\r
-import com.enqualcomm.support.bean.VoiceContent;\r
-import com.enqualcomm.support.bean.voicePacket;\r
-import com.enqualcomm.support.service.HeartRateManager;\r
-import com.enqualcomm.support.utils.CameraUtil;\r
-import com.enqualcomm.support.utils.Connection;\r
-import com.enqualcomm.support.utils.ICAudioManager;\r
-import com.enqualcomm.support.utils.ICLogger;\r
-import com.enqualcomm.support.utils.TemperatureUtil;\r
-import com.enqualcomm.support.utils.TimeUtil;\r
-import com.enqualcomm.support.utils.Util;\r
-import com.enqualcomm.support.utils.VibrateUtil;\r
-import com.enqualcomm.support.utils.WakeLockUtil;\r
-\r
-import java.io.File;\r
-import java.io.FileOutputStream;\r
-import java.util.ArrayList;\r
-import java.util.Date;\r
-import java.util.HashMap;\r
-import java.util.Locale;\r
-\r
-import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;\r
-import static android.content.Intent.FLAG_INCLUDE_STOPPED_PACKAGES;\r
-import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\r
-import static com.enqualcomm.support.Constants.ACTION_REMOTE_CAMERA;\r
-import static com.enqualcomm.support.Constants.DIALOG_ACTION;\r
-import static com.enqualcomm.support.LocationClient.LOCATION_MODE;\r
-import static com.enqualcomm.support.bean.Contact.GROUP_ALL;\r
-import static java.lang.Math.abs;\r
-\r
-public class protocol_ic {\r
- private static final String TAG = "ICSrv." + protocol_ic.class.getSimpleName();\r
-\r
- private static final String CMDHEADER = "IW";\r
- private static final String CMDEND = "#";\r
- private static final String CMDSPLIT = ",";\r
- public static final String defaultServerIP="watch.jiai.pro";\r
- public static final int defaultServerPort=8090;\r
- public enum CMD_TYPE {\r
- /*终端发起*/\r
- AP00,//登录包\r
- BP00,\r
- AP01,//混合定位\r
- BP01,\r
- AP02,//多基站定位\r
- BP02,\r
- AP92,//CDMA 混合定位\r
- BP92,\r
- AP94,\r
- BP94,\r
- AP03,//心跳包\r
- BP03,\r
- AP05,//语音查询接收\r
- BP05,\r
- AP07,//语音上行\r
- BP07,\r
- AP10,//报警与地址回复\r
- BP10,\r
- AP49,//心率上传\r
- BP49,\r
- APHT,//心率血压上传\r
- BPHT,\r
- APTM,//基站校时及获取定位\r
- BPTM,\r
- APCH,//充电提示\r
- BPCH,\r
- APBR,//上传蓝牙扫描结果\r
- BPBR,\r
- /* 服务器发起*/\r
- AP12,\r
- BP12,//SOS 号码设置\r
- AP14,\r
- BP14,//设置联系人白名单\r
- AP15,\r
- BP15,//设置定位周期\r
- AP16,\r
- BP16,//立即定位\r
- AP17,\r
- BP17,//恢复出厂设置\r
- AP18,\r
- BP18,//重启设备\r
- AP21,\r
- BP21,//设置计步开关\r
- AP28,\r
- BP28, //语音下行\r
- AP31,\r
- BP31,//关机\r
- AP33,\r
- BP33,//工作模式\r
- AP34,\r
- BP34,//自定义工作模式\r
- AP40,\r
- BP40,//下发文本\r
- AP68,\r
- BP68,//绑定解绑\r
- APXL,\r
- BPXL,//测量心率\r
- APXY,\r
- BPXY,//测量血压\r
- APJZ,\r
- BPJZ,//血压校准\r
- AP84,\r
- BP84,//白名单开关\r
- AP85,\r
- BP85,//设置闹钟\r
- AP86,\r
- BP86,//绑定解绑\r
- AP87,\r
- BP87,//二维码更新\r
- AP88,\r
- BP88,//查找手表\r
- AP89,\r
- BP89,//心率血压阀值设置\r
- APTE,\r
- BPTE,//体温间隔设置\r
- APTP,\r
- BPTP,//体温上行\r
- APX1,\r
- BPX1,//心率血压血氧修正\r
- APS4,\r
- BPS4,//提醒设置(时间段)\r
- APHP,//上报心率血压血氧\r
- BPHP,\r
- APDE,//进出围栏通知\r
- BPDE,\r
- APDG,//体温阀值设置\r
- BPDG,\r
- APTU,//上传语音图片\r
- BPTU,\r
- APSL,//上传睡眠数据\r
- BPSL,\r
- AP46,//立即拍照\r
- BP46,\r
- APDH,//聆听\r
- BPDH,\r
- AP99,//监听电话\r
- BP99,\r
- APTQ,//天气\r
- BPTQ,\r
- APAT,//剪断消息开关\r
- BPAT,\r
- APBT,\r
- BPBT,//设置蓝牙扫描间隔\r
- APWL,\r
- BPWL,//设置白名单\r
- AP65,\r
- BP65,//设置音量\r
- AP47,\r
- BP47,//设置震动\r
- UNKNOWN_CMD,\r
- }\r
-\r
- private static HashMap<CMD_TYPE, String> cmdMap = null;\r
-\r
- static {\r
- cmdMap = new HashMap<CMD_TYPE, String>();\r
- cmdMap.put(CMD_TYPE.AP00, "AP00");\r
- cmdMap.put(CMD_TYPE.BP00, "BP00");\r
- cmdMap.put(CMD_TYPE.AP01, "AP01");\r
- cmdMap.put(CMD_TYPE.BP01, "BP01");\r
- cmdMap.put(CMD_TYPE.AP02, "AP02");\r
- cmdMap.put(CMD_TYPE.BP02, "BP02");\r
- cmdMap.put(CMD_TYPE.AP92, "AP92");\r
- cmdMap.put(CMD_TYPE.BP92, "BP92");\r
- cmdMap.put(CMD_TYPE.AP94, "AP94");\r
- cmdMap.put(CMD_TYPE.BP94, "BP94");\r
- cmdMap.put(CMD_TYPE.AP03, "AP03");\r
- cmdMap.put(CMD_TYPE.BP03, "BP03");\r
- cmdMap.put(CMD_TYPE.AP05, "AP05");\r
- cmdMap.put(CMD_TYPE.BP05, "BP05");\r
- cmdMap.put(CMD_TYPE.AP07, "AP07");\r
- cmdMap.put(CMD_TYPE.BP07, "BP07");\r
- cmdMap.put(CMD_TYPE.AP10, "AP10");\r
- cmdMap.put(CMD_TYPE.BP10, "BP10");\r
- cmdMap.put(CMD_TYPE.AP49, "AP49");\r
- cmdMap.put(CMD_TYPE.BP49, "BP49");\r
- cmdMap.put(CMD_TYPE.APHT, "APHT");\r
- cmdMap.put(CMD_TYPE.BPHT, "BPHT");\r
- cmdMap.put(CMD_TYPE.APTM, "APTM");\r
- cmdMap.put(CMD_TYPE.BPTM, "BPTM");\r
- cmdMap.put(CMD_TYPE.APCH, "APCH");\r
- cmdMap.put(CMD_TYPE.BPCH, "BPCH");\r
- cmdMap.put(CMD_TYPE.APBR, "APBR");\r
- cmdMap.put(CMD_TYPE.BPBR, "BPBR");\r
- /* 服务器发起*/\r
- cmdMap.put(CMD_TYPE.AP12, "AP12");\r
- cmdMap.put(CMD_TYPE.BP12, "BP12");\r
- cmdMap.put(CMD_TYPE.AP14, "AP14");\r
- cmdMap.put(CMD_TYPE.BP14, "BP14");\r
- cmdMap.put(CMD_TYPE.AP15, "AP15");\r
- cmdMap.put(CMD_TYPE.BP15, "BP15");\r
- cmdMap.put(CMD_TYPE.AP16, "AP16");\r
- cmdMap.put(CMD_TYPE.BP16, "BP16");\r
- cmdMap.put(CMD_TYPE.AP17, "AP17");\r
- cmdMap.put(CMD_TYPE.BP17, "BP17");\r
- cmdMap.put(CMD_TYPE.AP18, "AP18");\r
- cmdMap.put(CMD_TYPE.BP18, "BP18");\r
- cmdMap.put(CMD_TYPE.AP21, "AP21");\r
- cmdMap.put(CMD_TYPE.BP21, "BP21");\r
- cmdMap.put(CMD_TYPE.AP28, "AP28");\r
- cmdMap.put(CMD_TYPE.BP28, "BP28");\r
- cmdMap.put(CMD_TYPE.AP31, "AP31");\r
- cmdMap.put(CMD_TYPE.BP31, "BP31");\r
- cmdMap.put(CMD_TYPE.AP33, "AP33");\r
- cmdMap.put(CMD_TYPE.BP33, "BP33");\r
- cmdMap.put(CMD_TYPE.AP34, "AP34");\r
- cmdMap.put(CMD_TYPE.BP34, "BP34");\r
- cmdMap.put(CMD_TYPE.AP40, "AP40");\r
- cmdMap.put(CMD_TYPE.BP40, "BP40");\r
- cmdMap.put(CMD_TYPE.AP68, "AP68");\r
- cmdMap.put(CMD_TYPE.BP68, "BP68");\r
- cmdMap.put(CMD_TYPE.APXL, "APXL");\r
- cmdMap.put(CMD_TYPE.BPXL, "BPXL");\r
- cmdMap.put(CMD_TYPE.APXY, "APXY");\r
- cmdMap.put(CMD_TYPE.BPXY, "BPXY");\r
- cmdMap.put(CMD_TYPE.APJZ, "APJZ");\r
- cmdMap.put(CMD_TYPE.BPJZ, "BPJZ");\r
- cmdMap.put(CMD_TYPE.AP84, "AP84");\r
- cmdMap.put(CMD_TYPE.BP84, "BP84");\r
- cmdMap.put(CMD_TYPE.AP85, "AP85");\r
- cmdMap.put(CMD_TYPE.BP85, "BP85");\r
- cmdMap.put(CMD_TYPE.AP86, "AP86");\r
- cmdMap.put(CMD_TYPE.BP86, "BP86");\r
- cmdMap.put(CMD_TYPE.AP87, "AP87");\r
- cmdMap.put(CMD_TYPE.BP87, "BP87");\r
- cmdMap.put(CMD_TYPE.AP88, "AP88");\r
- cmdMap.put(CMD_TYPE.BP88, "BP88");\r
- cmdMap.put(CMD_TYPE.AP89, "AP89");\r
- cmdMap.put(CMD_TYPE.BP89, "BP89");\r
- cmdMap.put(CMD_TYPE.APTE, "APTE");\r
- cmdMap.put(CMD_TYPE.BPTE, "BPTE");\r
- cmdMap.put(CMD_TYPE.APTP, "APTP");\r
- cmdMap.put(CMD_TYPE.BPTP, "BPTP");\r
- cmdMap.put(CMD_TYPE.APX1, "APX1");\r
- cmdMap.put(CMD_TYPE.BPX1, "BPX1");\r
- cmdMap.put(CMD_TYPE.APS4, "APS4");\r
- cmdMap.put(CMD_TYPE.BPS4, "BPS4");\r
- cmdMap.put(CMD_TYPE.APHP, "APHP");\r
- cmdMap.put(CMD_TYPE.BPHP, "BPHP");\r
- cmdMap.put(CMD_TYPE.APDE, "APDE");\r
- cmdMap.put(CMD_TYPE.BPDE, "BPDE");\r
- cmdMap.put(CMD_TYPE.APDG, "APDG");\r
- cmdMap.put(CMD_TYPE.BPDG, "BPDG");\r
- cmdMap.put(CMD_TYPE.APTU, "APTU");\r
- cmdMap.put(CMD_TYPE.BPTU, "BPTU");\r
- cmdMap.put(CMD_TYPE.APSL, "APSL");\r
- cmdMap.put(CMD_TYPE.BPSL, "BPSL");\r
- cmdMap.put(CMD_TYPE.AP46, "AP46");\r
- cmdMap.put(CMD_TYPE.BP46, "BP46");\r
- cmdMap.put(CMD_TYPE.APDH, "APDH");\r
- cmdMap.put(CMD_TYPE.BPDH, "BPDH");\r
- cmdMap.put(CMD_TYPE.AP99, "AP99");\r
- cmdMap.put(CMD_TYPE.BP99, "BP99");\r
- cmdMap.put(CMD_TYPE.APTQ, "APTQ");\r
- cmdMap.put(CMD_TYPE.BPTQ, "BPTQ");\r
- cmdMap.put(CMD_TYPE.APAT, "APAT");\r
- cmdMap.put(CMD_TYPE.BPAT, "BPAT");\r
- cmdMap.put(CMD_TYPE.APBT, "APBT");\r
- cmdMap.put(CMD_TYPE.BPBT, "BPBT");\r
- cmdMap.put(CMD_TYPE.APWL, "APWL");\r
- cmdMap.put(CMD_TYPE.BPWL, "BPWL");\r
- cmdMap.put(CMD_TYPE.AP65, "AP65");\r
- cmdMap.put(CMD_TYPE.BP65, "BP65");\r
- cmdMap.put(CMD_TYPE.AP47, "AP47");\r
- cmdMap.put(CMD_TYPE.BP47, "BP47");\r
- }\r
-\r
-\r
- private Connection mConnection=null;\r
- private Runtime mRuntime=null;\r
-\r
- public protocol_ic(Connection connect, Runtime runtime) {\r
- mConnection=connect;\r
- mRuntime=runtime;\r
-\r
- }\r
-\r
- private StringBuffer cmdbuf = new StringBuffer();\r
-\r
- /*\r
- 输入的字符串,如果有完整命令,返回 命令名\r
- 否则返回 空字符串\r
- */\r
- public static String isCmdStr(String msg) {\r
-\r
- int head_index = msg.indexOf(CMDHEADER);\r
- if (head_index >= 0) {\r
- int end_index = msg.indexOf("#", head_index);\r
- if (end_index < 0) {\r
-\r
- return "";\r
- }\r
- }else{\r
- return "";\r
- }\r
-\r
- for (CMD_TYPE key : cmdMap.keySet()) {\r
- if (msg.startsWith(CMDHEADER + cmdMap.get(key))) {\r
- ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key));\r
- return cmdMap.get(key);\r
- }\r
- }\r
-\r
- return "";\r
- }\r
-\r
- private void log(String msg) {\r
- ICLogger.log(TAG, msg);\r
- }\r
-\r
- private void log(String function, String msg) {\r
- ICLogger.log(TAG, function, msg);\r
- }\r
-\r
-\r
-\r
- /**/\r
- public static StringMessage genStringMessage(String cmdName, String msg){\r
- StringMessage sm=new StringMessage(new String[]{cmdName,msg});\r
- sm.refresh(msg);\r
- sm.setDate(TimeUtil.getSystemDateYYMMDD(),TimeUtil.getSystemTimeHHmmss());\r
- return sm;\r
- }\r
- /*\r
- 返回true 表示 cmd 全部解析成功\r
- 返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用\r
- 字符串通过#号进行识别。\r
- 每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃\r
- */\r
- public boolean parserCmd(byte[] bytes) {\r
- boolean iscmdComplete = false;\r
- boolean ret = true;\r
- String last_inCompletecmd = "";\r
- String cmd_msgbuf=new String(bytes);\r
- log("bytes.size "+bytes.length);\r
-// cmdbuf.append(cmd_msgbuf);\r
- cmdbuf.append(cmd_msgbuf);\r
- log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString());\r
- /*\r
- 如果不是 #结尾,就认为 接收数据不全,置位。\r
- */\r
- if (cmdbuf.toString().endsWith(CMDEND)) {\r
- iscmdComplete = true;\r
- }\r
- String[] cmdlist = cmd_msgbuf.split(CMDEND);\r
- int listlen = cmdlist.length;\r
- log("listlen "+listlen);\r
- /*\r
- 如果解析出来的cmdlist不是空,且数据不是完整cmd则保留 最后一条数据到last_inCompletecmd\r
- */\r
- if (cmdlist.length > 0 && iscmdComplete == false) {\r
- listlen -= 1;\r
- last_inCompletecmd = cmdlist[listlen];\r
- log("cmd not complete , " + last_inCompletecmd);\r
- }\r
- for (int i = 0; i < listlen; i++) {\r
- for (CMD_TYPE key : cmdMap.keySet()) {\r
- if (cmdlist[i].startsWith(CMDHEADER + cmdMap.get(key))) {\r
- log("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdlist[i]);\r
- if (key == CMD_TYPE.BP28) {\r
- //如果是BP28则 后面的数据是音频,需要保留\r
- byte[] amrBuf;\r
- int amrLen = getBP28Amrlen(cmdlist[i] );\r
- if (bytes.length > amrLen) {\r
- handleCmd(key, cmdlist[i], bytes);\r
- }\r
- } else {\r
- handleCmd(key, cmdlist[i]);\r
- }\r
- }\r
- }\r
- }\r
-\r
- cmdbuf = new StringBuffer().append(last_inCompletecmd);\r
- return ret;\r
- }\r
- public int getBP28Amrlen(String cmd) {\r
-\r
- String Name;\r
- String appendIndex;\r
- int packetCount;\r
- int currentId;\r
- int packetLen;\r
-\r
-\r
- String[] msg=cmd.split(CMDSPLIT);\r
- if (msg.length>=6){\r
- try {\r
- Name = msg[1];\r
- appendIndex = msg[2];\r
- packetCount = Integer.parseInt(msg[3]);\r
- currentId = Integer.parseInt(msg[4]);\r
- packetLen = Integer.parseInt(msg[5]);\r
-\r
- StringBuffer stringBuffer = new StringBuffer();\r
- stringBuffer.append("getBP28AmrLen name = ").append(Name)\r
- .append(",appendIndex = ").append(appendIndex)\r
- .append(",packetCount = ").append(packetCount)\r
- .append(",currentId = ").append(currentId)\r
- .append(",packetLen = ").append(packetLen);\r
-\r
-\r
- log(stringBuffer.toString());\r
- return packetLen;\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
-\r
- }else{\r
- log("getBP28AmrLen","format Error");\r
-\r
- }\r
- return -1;\r
- }\r
- /*登录*/\r
- public static StringMessage AP00(Runtime ds) {\r
- //示例数据:IWAP00867155030001063#\r
- return genStringMessage(cmdMap.get(CMD_TYPE.AP00),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP00)).append(ds.IMEI()).append(CMDEND).toString());\r
- }\r
-\r
- //处理 登录 BP00\r
- public void handleBP00(Runtime runtime,String cmd){\r
- String[] msg=cmd.split(CMDSPLIT);\r
-// get Msg :IWBP00,20191229171933,8# (size)24\r
-// 12-30 01:19:33.861 6492-6492/com.enqualcomm.support I/ICSrv.protocolAPIHelper: found cmd keyid=BP00 ,keyname=BP00 , IWBP00,20191229171933,8\r
-\r
- if (msg.length>=3) {\r
- log("handleBP00", "Set Datetime " + msg[1]);\r
- log("handleBP00", "Set TimeZone " + msg[2]);\r
- try {\r
- Date datetime = TimeUtil.parseDatetiime(msg[1]);\r
- int timezone = Integer.parseInt(msg[2]);\r
- if (datetime != null) {\r
- ICLogger.i("===" + TimeUtil.getDefaultTimeZone());\r
- TimeUtil.setTimeZone(timezone);\r
-\r
-\r
- ICLogger.i("===" + TimeUtil.getDefaultTimeZone());\r
- TimeUtil.setSysDateTime(runtime.getContextProxy().context, datetime, timezone);\r
- ICLogger.i("===" + TimeUtil.getDefaultTimeZone());\r
-\r
- }\r
- }catch (Exception e) {\r
- ICLogger.e(e.getMessage(), e);\r
- }\r
-// Set Datetime 20200505112734\r
-// Set TimeZone 8\r
-\r
- }else{\r
- log("handleBP00","format Error");\r
- }\r
- }\r
-\r
-\r
- public static StringMessage AP03(Runtime ds) {\r
- //示例数据:IWAP03,06000908000102,5555,30# IWAP03,000000null00000,0,0#\r
- //IW: 标识符\r
- //AP03:命令字\r
- //设备在静止时,可以通过该指令与平台保持连接和解决静态漂移\r
- //06000908000102:\r
- //060为GSM信号,\r
- //009为参与定位的卫星数,\r
- //080为电池电量,\r
- //0 为保留位,\r
- //01为设防状态,此处由两位十六进制表示,无取值时为 00 ,长度必需为两位,一共 8个bit 表示8种状态,各bit定义如下:(未列出的为当前未使用, 1表示有效 ,0 表示无效)\r
- //Bit0 设防状态<手表无效>\r
- //Bit1 为 1 表示夜灯为开,为0 夜灯为 关\r
- //02为工作模式 ,(设防,工作模式如果为00,则代表无或未设置)\r
- //5555: 计步步数,每次到达 9999 后重 0 开始计 (此处 9999 为示例,可以为2字节int 然后溢出归零)\r
- //30: 翻滚次数\r
- return genStringMessage(cmdMap.get(CMD_TYPE.AP03),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP03)).append(CMDSPLIT).append(String.format("%03d",abs(ds.getSignalStrength())))\r
- .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append(ds.isPowerConnected()?"1":"0")\r
- .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)\r
- .append(ds.getTotalStepCount()).append(CMDSPLIT).append(ds.getRolltimes()).append(CMDEND).toString());\r
- }\r
- //处理 心跳 BP03\r
- public void handleBP03(String cmd){\r
-\r
- log("BP03心跳接收成功");\r
- }\r
-\r
-\r
- public static StringMessage AP10(Runtime ds){\r
-\r
- /**\r
- * IWAP10080524A2232.9806N11404.9355E000.1061830323.8706000908000502,\r
- * 460,0,9520,3671,\r
- * 00,zh-cn,00,\r
- * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05:剪断报警,06:跌倒报警,07:心率异常, 08:心率过高, 09:心率过低,10:收缩压过高,11:收缩压过低,12:舒张压过高,13:舒张压过低,14:久坐提醒,15:非法解锁(剪断报警),16:锁定提醒(佩戴提醒),17:体温过高,18体温过低)\r
- * zh-cn:设备语言\r
- * 00:第一个0:是否需要回复地址信息,0:不回复,1回复.\r
- * HOME|74-DE-2B-44-88-8C|97&HOME1|74-DE-2B-44-88-8C|97&HOME2|74-DE-2B-44-88-8C|97&HOME3|74-DE-2B-44-88-8C|97#\r
- */\r
- return genStringMessage(cmdMap.get(CMD_TYPE.AP10),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP10)).append(TimeUtil.getShortDate())\r
- .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading())\r
- .append(String.format("%03d",abs(ds.getSignalStrength())))\r
- .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")\r
- .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)\r
- .append(ds.getLBSData()).append(CMDSPLIT)\r
- .append(ds.getAlarmType()).append(CMDSPLIT)\r
- .append(ds.getLanguage()).append(CMDSPLIT)\r
- .append("00").append(CMDSPLIT) //不回复地址\r
- .append(ds.getWifiInfo()).append(CMDEND).toString());\r
-\r
- }\r
-\r
- /*LBS+GPS混合定位*/\r
- public static StringMessage AP01(Runtime ds) {\r
- //示例数据:IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102,\r
- // 460,0,9520,3671,\r
- // Home|74-DE-2B-44-88-8C|97& Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97& Home3|74-DE-2B-44-88-8C|97#\r
-// IWAP01191230A2232.9807N11404.9355E000.1161320000.0006000910000000,460,00,9520,3671,#\r
- return genStringMessage(cmdMap.get(CMD_TYPE.AP01),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP01)).append(TimeUtil.getShortDate())\r
- .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength())))\r
- .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")\r
- .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)\r
- .append(ds.getLBSData()).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString());\r
- }\r
-\r
- //处理 定位 BP01\r
- public void handleBP01(String cmd){\r
- log("BP01定位接收成功");\r
- }\r
-\r
-\r
-\r
- /*LBS+WiFi混合定位*/\r
- public static StringMessage AP02(Runtime ds) {\r
- //示例数据:IWAP02,\r
- // zh_cn,\r
- // 0,\r
- // 7,\r
- // 460,0,\r
- // 9520|3671|13,9520|3672|12,9520|3673|11,9520|3674|10,9520|3675|9,9520|3676|8,9520|3677|7,\r
- // 4,\r
- // 1|D8-24-BD-79-FA-1F|59&2|3C-46-D8-6D-CE-01|81&3|0C-4C-39-1A-7C-65|69&4|70-A8-E3-5D-D7-C0|65#\r
-// IW标识符\r
-// AP02:命令字\r
-// zh_cn: 语言标志\r
-// 0:回复标识,为0时不回复地址,为 1 时,服务器回复地址信息\r
-// 7: 表示共有7组基站\r
-// 460: MCC 国家码\r
-// 0: MNC运营商代码\r
-// 9520|3671|10: LAC|CID|dbm表示一组基站信息,后面数量需和基站组数地应 10:dbm为信号强度多基站信号强度建议从高到低排列后上传,信号强度转正数:150 – abs(dbm)\r
-// 4: 表示WIFI组数,\r
-// 1|D8-24-BD-79-FA-1F|59: ssid|mac地址|信号强度,信号强度转正数:150 – abs(信号强度)\r
-\r
- int apsum=0;\r
- String wifiinfo=ds.getWifiInfo();\r
- if (!wifiinfo.isEmpty()) {\r
- String[] list = wifiinfo.split("&");\r
- apsum = list.length;\r
- }\r
-\r
- ICLogger.i("Wifi ap sum "+apsum);\r
- return genStringMessage(cmdMap.get(CMD_TYPE.AP02),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP02)).append(CMDSPLIT)\r
- .append(ds.getLanguage()).append(CMDSPLIT)\r
- .append(0).append(CMDSPLIT) //为0时不回复地址\r
- .append(ds.getLBSMultiStationData()).append(CMDSPLIT) //基站信息数据\r
- .append(apsum).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString()); //wifi信息数据\r
- }\r
-\r
- //处理 定位 BP01\r
- public void handleBP02(String cmd){\r
- log("BP02定位接收成功");\r
- }\r
-\r
-\r
-\r
- public static StringMessage APXL(String id){\r
-//设备响应: IWAPXL,080835#\r
- //080835:指令流水号\r
- return genStringMessage(cmdMap.get(CMD_TYPE.APXL),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXL))\r
- .append(CMDSPLIT).append(id)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- /**\r
- * 测量心率\r
- * @param cmd\r
- * @param connection\r
- */\r
- public void handleBPXL(String cmd, Connection connection){\r
- //IWBPXL,353456789012345,080835#\r
- //说明:\r
- //IW:标识符\r
- //BPXL : 命令字符\r
- //353456789012345:IMEI号,设备唯一ID\r
- //080835 :指令流水号\r
- //设备响应: IWAPXL,080835#\r
- //080835:指令流水号\r
- String[] list=cmd.split(CMDSPLIT);\r
- if (list.length==3){\r
- String index=list[2];\r
- String imei=list[1];\r
- ICLogger.i("Handle BPXL IMEI "+imei+",index "+index);\r
- connection.send(APXL(index));\r
- }else{\r
- ICLogger.i("BPXL format error!");\r
- }\r
-\r
- }\r
-\r
- public static StringMessage APXY(String id){\r
-//设备响应: IWAPXY,080835#\r
- //080835:指令流水号\r
- return genStringMessage(cmdMap.get(CMD_TYPE.APXY),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXY))\r
- .append(CMDSPLIT).append(id)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- /**\r
- * 测量血压\r
- * @param cmd\r
- * @param connection\r
- */\r
- public void handleBPXY(String cmd,Connection connection){\r
- //IWBPXY,353456789012345,080835#\r
- //说明:\r
- //IW:标识符\r
- //BPXL : 命令字符\r
- //353456789012345:IMEI号,设备唯一ID\r
- //080835 :指令流水号\r
- //设备响应: IWAPXY,080835#\r
- //080835:指令流水号\r
- String[] list=cmd.split(CMDSPLIT);\r
- if (list.length==3){\r
- String index=list[2];\r
- String imei=list[1];\r
- ICLogger.i("Handle BPXY IMEI "+imei+",index "+index);\r
- connection.send(APXY(index));\r
- }else{\r
- ICLogger.i("BPXY format error!");\r
- }\r
-\r
- }\r
-\r
-\r
-\r
- public static StringMessage APJZ(String id,String BPH,String BPL,String Age,String Sex){\r
- //设备响应: IWAPJZ,792997,120,85,42,1#\r
- //792997:指令流水号\r
- // 高压120,低压85,年龄42,1 男性\r
- return genStringMessage(cmdMap.get(CMD_TYPE.APJZ),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APJZ))\r
- .append(CMDSPLIT).append(id)\r
- .append(CMDSPLIT).append(BPH)\r
- .append(CMDSPLIT).append(BPL)\r
- .append(CMDSPLIT).append(Age)\r
- .append(CMDSPLIT).append(Sex)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- /**\r
- *\r
- * @param cmd\r
- * @param connection\r
- * @param runtime\r
- */\r
- public void handleBPJZ(String cmd,Connection connection,Runtime runtime){\r
- //cmdbuf.size 42 IWBPJZ,867155030001063,199600,120,85,45,1# 高压120,低压85,年龄45,男性\r
-// cmdbuf.size 42 IWBPJZ,867155030001063,909957,120,85,42,0# 高压120,低压85,年龄42,女性\r
- //IWBPJZ,353456789012345,080835,110,75#\r
- //说明:\r
- //IW:标识符\r
- //BPJZ : 命令字符\r
- //353456789012345:IMEI号,设备唯一ID\r
- //110:高压值\r
- //75:低压值\r
- //080835 :指令流水号\r
- //设备响应: IWAPJZ,792997,120,85,42,1#\r
- //792997:指令流水号\r
- String[] list=cmd.split(CMDSPLIT);\r
- if (list.length==7){\r
- try {\r
- String index = list[2];\r
- String imei = list[1];\r
- String strBPH = list[3];\r
- String strBPL = list[4];\r
- String strAge = list[5];\r
- String strSex = list[6];\r
-\r
- connection.send(APJZ(index, strBPH, strBPL, strAge, strSex));\r
- runtime.getHRS().setXY_Ref(Integer.parseInt(strBPH), Integer.parseInt(strBPL), Integer.parseInt(strAge), Integer.parseInt(strSex));\r
- ICLogger.i("Handle BPJZ IMEI " + imei + ",index " + index + ", BPH " + strBPH + ", BPL " + strBPL + ", Age " + strAge + ", Sex " + (strSex.equals("1") ? "男" : "女"));\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
- }else{\r
- ICLogger.i("BPXY format error!");\r
- }\r
- }\r
-\r
-\r
-\r
- //重启\r
-\r
-\r
- public static StringMessage AP18(String index){\r
- return genStringMessage(cmdMap.get(CMD_TYPE.AP18),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP18))\r
- .append(CMDSPLIT).append(index)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- public void handleBP18(Connection connection,String cmd) {\r
-\r
- // IWBP18,867155030001063,161723\r
- String[] cmdlist=cmd.split(CMDSPLIT);\r
- if (cmdlist.length==3) {\r
-\r
- connection.send(AP18(cmdlist[2]));\r
-\r
- }\r
- }\r
- //恢复出厂设置\r
-\r
- public static StringMessage AP17(String index){\r
- return genStringMessage(cmdMap.get(CMD_TYPE.AP17),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP17))\r
- .append(CMDSPLIT).append(index)\r
- .append(CMDEND).toString());\r
- }\r
- public void handleBP17(Connection connection,String cmd) {\r
-\r
- // IWBP17,867155030001063,161723\r
- String[] cmdlist=cmd.split(CMDSPLIT);\r
- if (cmdlist.length==3) {\r
-\r
- connection.send(AP17(cmdlist[2]));\r
-\r
- }\r
- }\r
-\r
- //关机\r
-\r
-\r
- public static StringMessage AP31(String index){\r
- return genStringMessage("AP31",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP31))\r
- .append(CMDSPLIT).append(index)\r
- .append(CMDEND).toString());\r
- }\r
- public void handleBP31(Connection connection,String cmd) {\r
-\r
- // IWBP31,867155030001063,161723\r
- String[] cmdlist=cmd.split(CMDSPLIT);\r
- if (cmdlist.length==3) {\r
-\r
- connection.send(AP31(cmdlist[2]));\r
-\r
- }\r
- }\r
-\r
- //设置SOS号码\r
- public static StringMessage AP12(String index,String phNum1,String phNum2,String phNum3){\r
- return genStringMessage("AP12",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP12))\r
- .append(CMDSPLIT).append(index)\r
- .append(CMDSPLIT).append(phNum1)\r
- .append(CMDSPLIT).append(phNum2)\r
- .append(CMDSPLIT).append(phNum3)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- //设置SOS号码\r
- public void handleBP12(Connection connection,String cmd,Runtime runtime){\r
- // IWBP12,353456789012345,080835,135XXXXXXXX,135XXXXXXXX,135XXXXXXXX#\r
- String[] cmdlist=cmd.split(CMDSPLIT);\r
- if (cmdlist.length>=3){\r
- String index=cmdlist[2];\r
- String phNum1=cmdlist.length==3?"":cmdlist[3];\r
- String phNum2=cmdlist.length>3?(cmdlist.length==4?"":cmdlist[4]):"";\r
- String phNum3=(cmdlist.length>4)?(cmdlist.length==5? "":cmdlist[5]):"";\r
- ICLogger.i(new StringBuffer().append("get Emegency Numbs "+phNum1+","+phNum2+","+phNum3).toString());\r
- connection.send(AP12(index,phNum1,phNum2,phNum3));\r
-\r
- ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
-// if(Config.custom_branch_name.equals("AK")){\r
-//\r
-// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", "07522312120"));\r
-// if (!phNum1.isEmpty())\r
-// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos2", phNum1));\r
-// if (!phNum2.isEmpty())\r
-// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum2));\r
-// }else {\r
- if (!phNum1.isEmpty())\r
- contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", phNum1));\r
- if (!phNum2.isEmpty())\r
- contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos2", phNum2));\r
- if (!phNum3.isEmpty())\r
- contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum3));\r
-// }\r
- runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);\r
- }else{\r
- ICLogger.i(" BP12 format error!");\r
- }\r
- }\r
-\r
-\r
- public static StringMessage AP14(String index,String[] phnumbs){\r
- return genStringMessage("AP14",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14))\r
- .append(CMDSPLIT).append(index)\r
- .append(CMDSPLIT).append(phnumbs[0])\r
- .append(CMDSPLIT).append(phnumbs[1])\r
- .append(CMDSPLIT).append(phnumbs[2])\r
- .append(CMDSPLIT).append(phnumbs[3])\r
- .append(CMDSPLIT).append(phnumbs[4])\r
- .append(CMDSPLIT).append(phnumbs[5])\r
- .append(CMDSPLIT).append(phnumbs[6])\r
- .append(CMDSPLIT).append(phnumbs[7])\r
- .append(CMDSPLIT).append(phnumbs[8])\r
- .append(CMDSPLIT).append(phnumbs[9])\r
- .append(CMDEND).toString());\r
- }\r
- //设置通讯录,白名单(10个)\r
- public void handleBP14(Connection connection,String cmd , Runtime runtime){\r
-// IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,,\r
-/**\r
- * IWBP14,353456789012345,080835,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx#\r
- */\r
- String[] cmdlist=cmd.split(CMDSPLIT);\r
- String[] phnums=new String[]{"","","","","","","","","",""};\r
- StringBuffer sb=new StringBuffer().append("recv phone Numbs ");\r
- if (cmdlist.length>=3){\r
- switch (cmdlist.length){\r
- case 13:\r
- phnums[9]=cmdlist[12];\r
- sb.append(phnums[9]).append(",");\r
- case 12:\r
- phnums[8]=cmdlist[11];\r
- sb.append(phnums[8]).append(",");\r
- case 11:\r
- phnums[7]=cmdlist[10];\r
- sb.append(phnums[7]).append(",");\r
- case 10:\r
- phnums[6]=cmdlist[9];\r
- sb.append(phnums[6]).append(",");\r
- case 9:\r
- phnums[5]=cmdlist[8];\r
- sb.append(phnums[5]).append(",");\r
- case 8:\r
- phnums[4]=cmdlist[7];\r
- sb.append(phnums[4]).append(",");\r
- case 7:\r
- phnums[3]=cmdlist[6];\r
- sb.append(phnums[3]).append(",");\r
- case 6:\r
- phnums[2]=cmdlist[5];\r
- sb.append(phnums[2]).append(",");\r
- case 5:\r
- phnums[1]=cmdlist[4];\r
- sb.append(phnums[1]).append(",");\r
- case 4:\r
- phnums[0]=cmdlist[3];\r
- sb.append(phnums[0]).append(",");\r
-\r
- }\r
-\r
- String index=cmdlist[2];\r
- ICLogger.i(sb.toString());\r
- connection.send(AP14(index,phnums));\r
- ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
-\r
- if(Config.custom_name.equals("YT")) {\r
- ICLogger.i("=====add hotline 96885 ");\r
- contactArray.add(new Contact(Contact.CATEGORY_CALL, runtime.getContextProxy().context.getResources().getString(R.string.hotline), "96885"));\r
- }\r
- for (int i=0; i< phnums.length;i++){\r
- String[] tmp= phnums[i].split("\\|");\r
- if (tmp.length==2){\r
- String name= Util.decodeUnicode2Utf8(tmp[0]);\r
- String phonem=tmp[1];\r
- ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem);\r
- contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));\r
- }else{\r
- ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length);\r
-\r
- }\r
- }\r
-// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666"));\r
-// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666"));\r
-// contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666"));\r
-// contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666"));\r
-\r
- runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false);\r
-\r
- }else{\r
- ICLogger.i(" BP14 format error!");\r
- }\r
-\r
- }\r
-\r
-\r
-\r
- public static StringMessage AP85(Runtime ds,String cmddata){\r
-//示例数据:IWAP49,68##\r
- return genStringMessage("AP85",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP85))\r
- .append(CMDSPLIT).append(cmddata)\r
- .append(CMDEND).toString());\r
-\r
- }\r
- //设置闹钟\r
- public void handleBP85(String cmd , Connection connection,Runtime runtime){\r
-// IWBP85,867155030001063,155312,1,1,0235,12,1,1\r
-// IWBP85,867155030002145,945166,1,0,\r
-// IWBP85,867155030001064,265960,1,1,1130,,1,1\r
-// IWBP85,353456789012345,080835,1,3, 0900,135,1,1@0900 ,135,1,2@0900 ,135,1,3#\r
-//353456789012345:IMEI号,设备唯一ID\r
-//080835 :指令流水号\r
-//1: 表示闹钟总开关,1为开,0 为关\r
-//3: 表示闹钟个数\r
-//0900 ,135,1,1,表示一组闹钟,0900表示早上09:00, 135表示周一周三周五,使用24小时制\r
-//1表示该组闹钟开启或关闭状态 1表示开启 0表示关闭\r
-//1表示吃药提醒\r
-//2 表示喝水提醒\r
-//3 表示久坐提醒\r
-//多组闹钟之间用”@”符号分隔\r
-\r
- String imei="",cmdindex="0"/*指令流水号*/;\r
- int all_alarmswitch=0 /*总开关 1为开,0 为关*/,\r
- alarmswitch=0 /*1为开,0 为关*/,\r
- alarmcount=0 /*表示闹钟个数*/;\r
- String alarmtime="";//0900表示早上09:00\r
- int alarmtype=1; //1表示吃药提醒 , 2 表示喝水提醒 ,3 表示久坐提醒\r
- String repeat="";// 135表示周一周三周五,使用24小时制\r
- String[] datalist= cmd.split("@");\r
- ArrayList<Alarm> alarmlist=new ArrayList<>();\r
- if (datalist.length >0){\r
- for (int i =0 ; i< datalist.length;i++){\r
- String [] cmdarglist=datalist[i].split(",");\r
-\r
- if (i == 0){\r
- if (cmdarglist.length == 9){\r
- try {\r
- imei = cmdarglist[1];\r
- cmdindex = cmdarglist[2];\r
- all_alarmswitch = Integer.parseInt(cmdarglist[3]);\r
- alarmcount = Integer.parseInt(cmdarglist[4]);\r
- alarmtime = cmdarglist[5];\r
- repeat = cmdarglist[6];\r
- alarmswitch = Integer.parseInt(cmdarglist[7]);\r
- alarmtype = Integer.parseInt(cmdarglist[8]);\r
- log(new StringBuilder("imei ").append(imei)\r
- .append(", cmdindex ").append(cmdindex)\r
- .append(", allswitch=").append(all_alarmswitch)\r
- .append(", all alarm count=").append(alarmcount)\r
- .toString()\r
- );\r
-\r
- log(new StringBuilder("alarmtime ").append(alarmtime)\r
- .append(", relpeat ").append(repeat)\r
- .append(", switch=").append(alarmswitch)\r
- .append(", alarmtype=").append(alarmtype)\r
- .toString()\r
- );\r
- alarmlist.add(new Alarm("ST" + alarmtime.substring(0, 2) + "." + alarmtime.substring(2), "W" + repeat, "CON", alarmswitch == 1 ? "ON" : "OFF", "闹铃"));\r
- }catch (Exception e) {\r
- ICLogger.e(e.getMessage(), e);\r
- }\r
- }else if (cmdarglist.length == 5) {\r
- try {\r
- imei = cmdarglist[1];\r
- cmdindex = cmdarglist[2];\r
- all_alarmswitch = Integer.parseInt(cmdarglist[3]);\r
- alarmcount = Integer.parseInt(cmdarglist[4]);\r
- }catch (Exception e) {\r
- ICLogger.e(e.getMessage(), e);\r
- }\r
- }else{\r
- log("data len is too small!");\r
- }\r
- }else{\r
- if (cmdarglist.length == 4){\r
- try {\r
- alarmtime = cmdarglist[0];\r
- repeat = cmdarglist[1];\r
- alarmswitch = Integer.parseInt(cmdarglist[2]);\r
- alarmtype = Integer.parseInt(cmdarglist[3]);\r
-\r
- log(new StringBuilder("set alarmtime ").append(alarmtime)\r
- .append(", relpeat ").append(repeat)\r
- .append(", switch=").append(alarmswitch)\r
- .append(", alarmtype=").append(alarmtype)\r
- .toString()\r
- );\r
-\r
- alarmlist.add(new Alarm("ST" + alarmtime.substring(0, 2) + "." + alarmtime.substring(2), "W" + repeat, "CON", alarmswitch == 1 ? "ON" : "OFF", "闹铃"));\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
- }else{\r
- log("data len is too small!");\r
- }\r
-\r
- }\r
- }//循环获取alarm数据结束\r
- runtime.getDbHelper().saveAlarm(alarmlist);\r
-\r
- //do clean and set alarm things\r
-\r
- }\r
-//IWBP85,867155030002145,410385,1,0,#\r
-\r
- String replacement=new StringBuilder("IWBP85,").append(imei).append(",").toString();\r
- String replycmd = cmd.replace(replacement,"");\r
- ICLogger.i("gen reply "+replacement+" "+replycmd);\r
- connection.send(AP85(runtime,replycmd));\r
- }\r
-\r
-\r
-// AP05命令L02服务器不适用\r
-// public static String AP05(boolean recvFlag){\r
-//\r
-//// IWAP05,1#\r
-// return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP05))\r
-// .append(CMDSPLIT).append(recvFlag?1:0)\r
-// .append(CMDEND).toString();\r
-//\r
-// }\r
-//\r
-//\r
-// public void handleBP05(String cmd){\r
-//// IWBP05,6#\r
-// String[] cmdlist=cmd.split(CMDSPLIT);\r
-// if (cmdlist.length>1){\r
-// ICLogger.i(" 服务器有 " +cmdlist[1]+" 条语音未接收!");\r
-// }\r
-// }\r
-\r
-\r
-\r
-\r
- public static byte[] AP07(String packetTime,int count,int index,int datalen,byte[] amrdata){\r
-//IWAP07,20140818064408,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#\r
-//说明:\r
-//IW:标识符\r
-//AP07 : 命令字符\r
-//20140818064408 :yyyyMMddHHmmss 格式的年月日时分秒,设备录音时间\r
-//6:语音包分包总数\r
-//1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同\r
-//1024 :语音包长度\r
-//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数\r
-//语音包上传规则:\r
-//按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。\r
-//收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。\r
-//如果设备回复确认数据包接收失败状态,则重复发送上一个数据包\r
-\r
-\r
- String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP07))\r
- .append(CMDSPLIT).append(packetTime)\r
- .append(CMDSPLIT).append(count)\r
- .append(CMDSPLIT).append(index)\r
- .append(CMDSPLIT).append(datalen)\r
- .append(CMDSPLIT).toString();\r
-\r
- byte[] sentbuf=new byte[sb.length()+datalen+1];\r
- System.arraycopy(sb.getBytes(),0,sentbuf,0,sb.length());\r
- System.arraycopy(amrdata,0,sentbuf,sb.length(),datalen);\r
- sentbuf[sb.length()+datalen]='#';\r
-\r
- return sentbuf;\r
-\r
- }\r
-\r
-\r
- public void handleBP07(String cmd , Connection connection ){\r
-//平台响应: IWBP07,20140818064408,6,1,1#\r
-//20140818064408:设备语音时间,yyyyMMddHHmmss 格式的年月日时分秒\r
-//6:语音包分包总数\r
-//1:当前设备收到的是第几个包\r
-//1:表示服务器接受数据成功,0表示服务器接受数据失败\r
- String[] cmdlist=cmd.split(CMDSPLIT);\r
- if (cmdlist.length==5){\r
- try {\r
- String time = cmdlist[1];\r
- int packetCount = Integer.parseInt(cmdlist[2]);\r
- int packetIndex = Integer.parseInt(cmdlist[3]);\r
- int receiveSuccess = Integer.parseInt(cmdlist[4]);\r
- ICLogger.i("服务器在" + time + " 收到语音 " + packetIndex + "/" + packetCount + " " + (receiveSuccess == 1 ? "成功" : "失敗"));\r
- if (receiveSuccess == 1) {\r
- //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送\r
- voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);\r
- }\r
- //发送消息,再次检查要发送的语音包,确认其发送完毕\r
- connection.DeliverCMDMessageToSystem("SentVoicePacket", "SentVoicePacket");\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
- }else{\r
- ICLogger.i(" BP07 Format error!");\r
- }\r
- }\r
-\r
-\r
-\r
- public static StringMessage AP33(String cmdindex,int workMode){\r
-//IWAP33,080835,1#\r
-//080835:指令流水号\r
-//1:设置信息,供服务器同步\r
- return genStringMessage("AP33",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP33))\r
- .append(CMDSPLIT).append(cmdindex)\r
- .append(CMDSPLIT).append(workMode)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- //设置工作模式\r
- public void handleBP33(Connection connection,Runtime runtime,String cmd){\r
-\r
-// IWBP33,867155030001063,560555,1\r
-// IW:标识符\r
-// BP33 : 命令字符\r
-// 353456789012345:IMEI号,设备唯一ID\r
-// 080835:指令流水号\r
-// 1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式\r
-\r
- String[] cmdlist=cmd.split(",");\r
- if (cmdlist.length == 4){\r
-\r
-\r
- log("work mode "+cmdlist[3]);\r
- try {\r
- int mod = Integer.parseInt(cmdlist[3]);\r
- int Cycle = 900;\r
- switch (mod) {\r
- case ICLocation.NORMAL_MOD:\r
- Cycle = 900;\r
- break;\r
- case ICLocation.LOWPOWER_MOD:\r
- Cycle = 3600;\r
- break;\r
- case ICLocation.EMERGNECY_MOD:\r
- case ICLocation.REALTIME_MOD:\r
- Cycle = 60;\r
- break;\r
-\r
- }\r
-\r
- StringMessage msg = AP33(cmdlist[2], mod);\r
- //设定当前工作模式及循环频率\r
- connection.send(msg);\r
- log("reply msg " + msg);\r
- log("LOCATION_MODE " + LOCATION_MODE + " mod " + mod);\r
- Config.setLocationMode(runtime.getContextProxy().context, mod);\r
- Config.setLocationCycle(runtime.getContextProxy().context, Cycle);\r
- runtime.getLocationInstance().setLocation_cycle(Cycle);\r
- runtime.getLocationInstance().setWorkingMod(mod);\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
-// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
- //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。\r
- }\r
-\r
- }\r
-\r
-\r
- public static StringMessage AP34(String cmdindex,int workMode){\r
-//IWAP34,588854,1#\r
-//080835:指令流水号\r
-//8:模式\r
- return genStringMessage("AP34",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP34))\r
- .append(CMDSPLIT).append(cmdindex)\r
- .append(CMDSPLIT).append(workMode)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- //设置自定义工作模式\r
- public void handleBP34(Connection connection,Runtime runtime,String cmd){\r
-\r
-// IWBP34,867155030001063,588854,8,900,1#\r
-// IW:标识符\r
-// BP33 : 命令字符\r
-// 353456789012345:IMEI号,设备唯一ID\r
-// 080835:指令流水号\r
-// 1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式\r
-\r
- String[] cmdlist=cmd.split(",");\r
- if (cmdlist.length == 6){\r
-\r
-\r
- log("work mode "+cmdlist[3]);\r
- try {\r
- int mod = Integer.parseInt(cmdlist[3]);\r
- int Cycle = Integer.parseInt(cmdlist[4]);\r
- int gpson = Integer.parseInt(cmdlist[5]);\r
-\r
- StringMessage msg = AP34(cmdlist[2], mod);\r
- //设定当前工作模式及循环频率\r
- connection.send(msg);\r
-\r
- if (gpson == 1) {\r
- mod = ICLocation.CUSTOM_MOD8_GPS;\r
- } else {\r
- mod = ICLocation.CUSTOM_MOD8_WIFI;\r
- }\r
- log("reply msg " + msg.isFromCache());\r
- log("LOCATION_MODE " + LOCATION_MODE + " mod " + mod + ", cycle = " + Cycle + ", GPS On= " + gpson);\r
- Config.setLocationMode(runtime.getContextProxy().context, mod);\r
- Config.setLocationCycle(runtime.getContextProxy().context, Cycle);\r
- runtime.getLocationInstance().setLocation_cycle(Cycle);\r
- runtime.getLocationInstance().setWorkingMod(mod);\r
-// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
- //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
- }\r
-\r
- }\r
- public void handleBP40(Connection connection,Runtime runtime,String cmd){\r
-\r
-// IWBP40,353456789012345,080835,XXXXXXXXXXXXXX#\r
-// IW:标识符\r
-// BP40 : 命令字符\r
-// 353456789012345:IMEI号,设备唯一ID\r
-// 080835 :指令流水号\r
-// XXXXXXXXXXXX : 表示文字内容GB2312编码\r
-\r
-\r
- String[] cmdlist=cmd.split(",");\r
- if (cmdlist.length == 4){\r
- String cmdindex=cmdlist[2];\r
- String txtmsg=cmdlist[3];\r
- StringBuilder sb=new StringBuilder();\r
- runtime.PushtxtMsg_srv_index=cmdindex;//给回复AP94用\r
- sb.append(cmdindex).append(CMDSPLIT).append(TimeUtil.getSystemTimeyyyyMMddHHmmss()).append(CMDSPLIT).append(txtmsg);\r
- if (Config.custom_name.equals("VitracK")){\r
-\r
- }else{\r
-// txtmsg = Util.decodeUnicode2Utf8(txtmsg);\r
- txtmsg = Util.UrlGB2312ToUTF8(txtmsg);\r
- }\r
- StringMessage msg=AP40(cmdindex,1);\r
- //设定当前工作模式及循环频率\r
- connection.send(msg);\r
- ICLogger.i("received Txt Msg "+txtmsg);\r
- if(!Config.noPushTxtReadReply) {\r
- Config.setLastUnReadMessage(runtime.getContextProxy().context, sb.toString());\r
- runtime.getContextProxy().sendMsgBroadcast(txtmsg,3);//msgType 3需要回复,0不需要回复\r
- }else{\r
- runtime.getContextProxy().sendMsgBroadcast(txtmsg,0);//msgType 3需要回复,0不需要回复\r
- }\r
- runtime.getContextProxy().saveMstToSMSDB(txtmsg);\r
- }else{\r
- ICLogger.i("BP40 format error!");\r
- }\r
- }\r
- public static StringMessage AP40(String cmdindex,int success){\r
-\r
-// IWAP40,080835,1#\r
-// 080835:指令流水号\r
-// 1:表示设备接受数据成功,0表示设备接受数据失败\r
- return genStringMessage("AP40",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP40))\r
- .append(CMDSPLIT).append(cmdindex)\r
- .append(CMDSPLIT).append(success)\r
- .append(CMDEND).toString());\r
- }\r
-\r
-\r
- /**\r
- * 心率上传,返回协议字串\r
- * @param ds\r
- * @return\r
- */\r
- public static StringMessage AP49(Runtime ds){\r
- //示例数据:IWAP49,68##\r
- return genStringMessage(cmdMap.get(CMD_TYPE.AP49),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP49))\r
- .append(CMDSPLIT).append(ds.getHRS().getPPG())\r
- .append(CMDEND).toString());\r
-\r
- }\r
-\r
-\r
-\r
-\r
- /**\r
- * 返回上传心率血压的协议字串\r
- * @param ds\r
- * @return\r
- */\r
- public static StringMessage APHT(Runtime ds){\r
- //IWAPHT,60,130,85#\r
- //说明:\r
- //IW:标识符\r
- //APHT : 命令字符\r
- //60 : 表示心率\r
- //130: 血压高压 [收缩压]\r
- //85 : 血压低压 [舒张压]\r
- //平台响应: IWBPHT#\r
- //表示平台已接收,可不作响应\r
- return genStringMessage(cmdMap.get(CMD_TYPE.APHT),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT))\r
- .append(CMDSPLIT).append(ds.getHRS().getPPG())\r
- .append(CMDSPLIT).append(ds.getHRS().getBPH())\r
- .append(CMDSPLIT).append(ds.getHRS().getBPL())\r
- .append(CMDEND).toString());\r
- }\r
- public static StringMessage APHT(int ppg,int bph,int bpl){\r
- //IWAPHT,60,130,85#\r
- //说明:\r
- //IW:标识符\r
- //APHT : 命令字符\r
- //60 : 表示心率\r
- //130: 血压高压 [收缩压]\r
- //85 : 血压低压 [舒张压]\r
- //平台响应: IWBPHT#\r
- //表示平台已接收,可不作响应\r
- return genStringMessage(cmdMap.get(CMD_TYPE.APHT),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT))\r
- .append(CMDSPLIT).append(ppg)\r
- .append(CMDSPLIT).append(bph)\r
- .append(CMDSPLIT).append(bpl)\r
- .append(CMDEND).toString());\r
- }\r
-\r
-\r
- //立即定位反馈\r
- public static StringMessage AP16(String cmdindex){\r
-//IWAP16,080835#\r
-//080835:指令流水号\r
- return genStringMessage(cmdMap.get(CMD_TYPE.AP16),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP16))\r
- .append(CMDSPLIT).append(cmdindex)\r
- .append(CMDEND).toString());\r
- }\r
- // 立即定位指令(长链接有效)\r
- public void handleBP16(Connection connection,Runtime runtime,String cmd){\r
- //示例数据:IWBP16,867155030001063,335386\r
-// IWBP16,353456789012345,080835#\r
-// 说明:\r
-// IW:标识符\r
-// BP16 : 命令字符\r
-// 353456789012345:IMEI号,设备唯一ID\r
-// 080835 :指令流水号\r
- String[] cmdlist = cmd.split(",");\r
- if(cmdlist.length==3){\r
- log("imei "+cmdlist[1]+", cmdindex "+cmdlist[2]);\r
-\r
- connection.send(AP16(cmdlist[2]));\r
- }else{\r
- log("error BP16 format");\r
- }\r
- }\r
-\r
-\r
- /*通过基站获取时间和坐标*/\r
- public static StringMessage APTM(Runtime ds){\r
- //示例数据:IWAPTM,460,0,9750,3613#\r
- //说明:\r
- //IW:标识符\r
- //APTM : 命令字符\r
- //460:MCC\r
- //0: MNC\r
- //9750: LAC\r
- //3613: CID\r
-\r
- return genStringMessage(cmdMap.get(CMD_TYPE.APTM),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTM))\r
- .append(CMDSPLIT).append(ds.getLocationInstance().getMCC())\r
- .append(CMDSPLIT).append(ds.getLocationInstance().getMNC())\r
- .append(CMDSPLIT).append(ds.getLocationInstance().getLAC())\r
- .append(CMDSPLIT).append(ds.getLocationInstance().getGSMStationCID())\r
- .append(CMDEND).toString());\r
-\r
- }\r
-\r
- public void handleBPTM(String cmd){\r
- //平台响应: IWBPTM,20160225090909,22.123456,113.654321#\r
- //返回时间,格式为:yyyyMMddHHmmss ,为UTC0 时间\r
- //经纬度保留六位小数,若没取到则返回 0\r
- String[] list=cmd.split(CMDSPLIT);\r
-\r
- if(list.length==4){\r
-\r
- String time=list[1];\r
- String lat=list[2];\r
- String lon=list[3];\r
- ICLogger.i("BPTM , time="+time+", lat="+lat+", lon="+lon);\r
- }else{\r
- ICLogger.i("BPTM format error");\r
- }\r
-\r
-\r
- }\r
-\r
- public static StringMessage AP15(String index){\r
-//IWAP15, 080835#\r
-//080835:指令流水号\r
- return genStringMessage("AP15",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP15))\r
- .append(CMDSPLIT).append(index)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- //设置定位周期\r
- public void handleBP15(String cmd ,Connection connection,Runtime runtime){\r
-// IWBP15, 353456789012345, 080835, 30#\r
-// 353456789012345:IMEI号,设备唯一ID\r
-// 080835 :指令流水号\r
-// 30: 表示频率为30分钟\r
-\r
- String[] list=cmd.split(CMDSPLIT);\r
-\r
- if(list.length==4){\r
- String index=list[2];\r
- String time=list[3];\r
- connection.send(AP15(index));\r
- ICLogger.i("BP15 , 定位周期="+time+"秒");\r
-\r
- try {\r
- Config.setLocationMode(runtime.getContextProxy().context, ICLocation.CUSTOM_MOD8_GPS);\r
- Config.setLocationCycle(runtime.getContextProxy().context, Integer.parseInt(time) );\r
- runtime.getLocationInstance().setWorkingMod(Config.getLocationMode(runtime.getContextProxy().context));\r
- runtime.getLocationInstance().setLocation_cycle(Config.getLocationCycle(runtime.getContextProxy().context));\r
- //set AlarmCycle and trigger Location\r
- CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
- }else{\r
- ICLogger.i("BP15 format error");\r
- }\r
-\r
- }\r
-\r
-\r
-\r
-\r
-\r
-\r
- /*语音下行反馈*/\r
- public static StringMessage AP28(String name, String msg, int packagecount, int currentpackageindex, int received_success) {\r
- //示例数据:IWAP28,D3590D54,xxxx,6,1,1#\r
- return genStringMessage("AP28",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP28))\r
- .append(CMDSPLIT).append(name)\r
- .append(CMDSPLIT).append(msg)\r
- .append(CMDSPLIT).append(packagecount)\r
- .append(CMDSPLIT).append(currentpackageindex)\r
- .append(CMDSPLIT).append(received_success)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- //处理 BP28 语音消息\r
- public void handleBP28(Connection connection,String cmd,Runtime runtime,byte[] bytes) {\r
- //log("handleBP28 msg"+cmd);\r
-/**\r
- * IWBP28, D3590D54,XXXX,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#\r
- * 说明:\r
- * IW:标识符\r
- * BP28 : 命令字符\r
- * D3590D54:UNICODE编码,发送者名称\r
- * XXXX: 附加信息,在响应数据包时,将附加信息原样响应,类似流水号\r
- * 6:语音包分包总数\r
- * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同\r
- * 1024 :语音包长度\r
- * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数\r
- * 语音包上传规则:\r
- * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。\r
- * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。\r
- * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包\r
- * 设备响应: IWAP28,D3590D54,XXXX,6,1,1#\r
- * D3590D54:UNICODE编码,发送者名称\r
- * XXXX: 附加信息,原样返回\r
- * 6:语音包分包总数\r
- * 1:当前设备收到的是第几个包\r
- * 1:表示设备接受数据成功,0表示设备接受数据失败\r
- */\r
- String Name;\r
- String appendIndex;\r
- int packetCount;\r
- int currentId;\r
- int packetLen;\r
- byte[] packetData;\r
-\r
- String[] msg= cmd.split(CMDSPLIT);\r
- if (msg.length>=6){\r
-\r
- try {\r
- Name = msg[1];\r
- appendIndex = msg[2];\r
- packetCount = Integer.parseInt(msg[3]);\r
- currentId = Integer.parseInt(msg[4]);\r
- packetLen = Integer.parseInt(msg[5]);\r
- packetData = Util.subArray(bytes, msg[0].length() + msg[1].length() + msg[2].length() + msg[3].length() + msg[4].length() + msg[5].length() + 6, bytes.length - 1);\r
-\r
- StringBuffer stringBuffer = new StringBuffer();\r
- stringBuffer.append("recv BP28 name = ").append(Name)\r
- .append(",appendIndex = ").append(appendIndex)\r
- .append(",packetCount = ").append(packetCount)\r
- .append(",currentId = ").append(currentId)\r
- .append(",packetLen = ").append(packetLen)\r
- .append(",packetDatalen = ").append(packetData.length);\r
-\r
- log(stringBuffer.toString());\r
- connection.send(AP28(Name, appendIndex, packetCount, currentId, 1));\r
- voicePacket.getInstance().appendVoice(Name, appendIndex, packetCount, currentId, packetLen, packetData);\r
- log("================" + voicePacket.getInstance().toString());\r
- if (voicePacket.getInstance().isFinished()) {\r
-\r
- String dir = Environment.getExternalStorageDirectory() + "/Android/VoiceCache";\r
- String amrFilepath = Util.saveFile(voicePacket.getInstance().getVoicePacketBytes(), 0, voicePacket.getInstance().getVoicePacketLen(), new File(dir), "receive_" + voicePacket.getInstance().getPacketTime() + ".amr");\r
- ICLogger.i("save Amr file to " + amrFilepath);\r
- voicePacket.getInstance().clearPacket();\r
- VoiceContent voiceContent = VoiceContent.placeHolderIn(Content.CONTACT_CATEGORY_GROUP, GROUP_ALL, amrFilepath);\r
-\r
-\r
- final Uri uri2 = runtime.getDbHelper().insertMessage(voiceContent);\r
-\r
- //回复UI消息,表示已经接收到\r
- voiceContent.status = 3;\r
- voiceContent.serverTime = TimeUtil.getSystemTime3();\r
- voiceContent.preview = String.valueOf(Util.getDuration(voiceContent.content));\r
- runtime.getDbHelper().updateMessage(voiceContent, uri2);\r
-\r
-// runtime.getContextProxy().sendBroadcast(ACTION_IMESSAGE, runtime);\r
-\r
- connection.DeliverCMDMessageToSystem("NewVoice", amrFilepath);//通知下面线程状态变化\r
- }\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
-\r
- }else{\r
- log("handleBP28","format Error");\r
-// connection.send(genStringMessage("AP28",AP28(Name,appendIndex,packetCount,currentId,0)));\r
-\r
- }\r
-\r
- }\r
-\r
- public void sendBroadcast(String cmd, Runtime dev) {\r
-\r
- ComponentName componentName = new ComponentName("com.eqc.watch", "com.eqc.watch.launcher.ChatActivity");\r
- Intent intent = new Intent("android.intent.action.MAIN");\r
-// intent.putExtra("ACTIVITY_TYPE", 2);\r
-// intent.addCategory("android.intent.category.DEFAULT");\r
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
- intent.setComponent(componentName);\r
- dev.getContextProxy().context.startActivity(intent);\r
- }\r
-\r
- //白名单开关(下行协议号:BP84,响应:AP84)\r
- public static StringMessage AP84(String index,int success){\r
-\r
- //设备响应: IWAP80,080835,1#\r
- //080835:指令流水号\r
- //1:表示设备执行成功,0 表示设备执行失败\r
- return genStringMessage("AP84",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP84))\r
- .append(CMDSPLIT).append(index)\r
- .append(CMDSPLIT).append(success)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- public void handleBP84(String cmd,Connection connection){\r
-//示例:\r
- //IWBP84,353456789012345,080835,1#\r
- //说明:\r
- //IW:标识符\r
- //BP84 : 命令字符\r
- //353456789012345:IMEI号,设备唯一ID\r
- //080835 :指令流水号\r
- //1: 表示白名单开,0 表示白名单关\r
- String[] list=cmd.split(CMDSPLIT);\r
-\r
- if (list.length==4){\r
- String index=list[2];\r
- String whitelist_switch=list[3];\r
- connection.send(AP84(index,1));\r
-\r
- if (whitelist_switch.equals("1")){\r
- Util.setSystemProperties("persist.sys.whitelist.enable","true");\r
- }else{\r
- Util.setSystemProperties("persist.sys.whitelist.enable","false");\r
- }\r
- ICLogger.i("收到服务器指令:白名单"+(whitelist_switch.equals("1")?"开":"关"));\r
-\r
- }else{\r
-\r
- ICLogger.i("BP84 format error!");\r
- }\r
-\r
- }\r
-\r
- //17.绑定解绑(下行协议号:BP68,响应:AP68)\r
- public static StringMessage AP68(String index,String cmd){\r
-\r
- //设备响应: IWAP86, 080835,1#\r
- //080835:指令流水号\r
- return genStringMessage("AP86",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP68))\r
- .append(CMDSPLIT).append(index)\r
- .append(CMDSPLIT).append(cmd)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- public void handleBP68(String cmd,Connection connection,Runtime runtime){\r
-\r
- //示例:\r
- //IWBP68,353456789012345,080835,1#\r
- //说明:\r
- //IW:标识符\r
- //BP68 : 命令字符\r
- //353456789012345:IMEI号,设备唯一ID\r
- //080835 :指令流水号\r
- //1 : 表示设备为激活状态(绑定成功) 0:表示设备为未激活状态(解绑成功)\r
-\r
- String[] list=cmd.split(CMDSPLIT);\r
-\r
- if (list.length==4){\r
- String index=list[2];\r
- String type=list[3];\r
- connection.send(AP68(index,type));\r
- ICLogger.i("收到服务器消息:"+(type.equals("1")?"绑定成功 ":"未激活或者解绑"));\r
- if (Config.custom_name.equals("YQ")||Config.custom_name.equals("YQ_EN")) {//AK-YQ\r
- if (type.equals("1")) {\r
- WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);\r
-// runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success), 2);\r
- Util.ShowToast(runtime,runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success));\r
- Config.setNeedAntiOff(runtime.getContextProxy().context,true);\r
- Config.setNeedCutOff(runtime.getContextProxy().context,true);\r
- runtime.setNeedAntioff(true);\r
- runtime.setNeddReportCutoff(true);\r
- } else {\r
- WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);\r
- runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_unbind_success), 2);\r
- Config.setNeedAntiOff(runtime.getContextProxy().context,false);\r
- Config.setNeedCutOff(runtime.getContextProxy().context,false);\r
- runtime.setNeedAntioff(false);\r
- runtime.setNeddReportCutoff(false);\r
- //1 分钟后重置\r
- new Handler().postDelayed(new Runnable() {\r
- @Override\r
- public void run() {\r
- Util.doMasterClear(runtime.getContextProxy().context);\r
- }\r
- },5000);\r
- }\r
- }\r
-\r
- }else{\r
- ICLogger.i("BP86 format error!");\r
- }\r
-\r
- }\r
-\r
-\r
-\r
- //17.设置心率/血压测量周期(下行协议号:BP86,响应:AP86)\r
- public static StringMessage AP86(String index){\r
-\r
- //设备响应: IWAP86, 080835#\r
- //080835:指令流水号\r
- return genStringMessage("AP86",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP86))\r
- .append(CMDSPLIT).append(index)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- public void handleBP86(String cmd,Connection connection,Runtime runtime){\r
-\r
- //示例:\r
- //IWBP86, 353456789012345, 080835,1,720#\r
- //说明:IWBP86,867400020316612,858663,1,30\r
- //IW:标识符\r
- //BP86 : 命令字符\r
- //353456789012345:IMEI号,设备唯一ID\r
- //080835 :指令流水号\r
- //1: 表示心率周期;2 :表示血压周期\r
- //720: 表示720分钟\r
-\r
- String[] list=cmd.split(CMDSPLIT);\r
-\r
- if (list.length==5){\r
- String index=list[2];\r
- String type=list[3];\r
- String cycle=list[4];\r
- connection.send(AP86(index));\r
- ICLogger.i("收到服务器指令:设置"+(type.equals("1")?"心率周期 ":"血压周期 ")+cycle+"分钟");\r
-\r
- try {\r
- //发送重置PPGCycle的广播,会在CoreServer里面执行\r
- Intent intent = new Intent();\r
- intent.putExtra("PPGTestCycle", Integer.parseInt(cycle));\r
- intent.setFlags(FLAG_INCLUDE_STOPPED_PACKAGES);\r
- intent.setFlags(FLAG_ACTIVITY_NEW_TASK);\r
- runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent);\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
- }else{\r
- ICLogger.i("BP86 format error!");\r
- }\r
-\r
- }\r
-\r
- //IWBP87,http://cn.map20000.com/physicalReport.html?lang=zh-CN&imeis=866671044898063#\r
- public static StringMessage AP87(){\r
-\r
- //设备响应: IWAP86, 080835#\r
- //080835:指令流水号\r
- return genStringMessage("AP87",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP87))\r
- .append(CMDEND).toString());\r
- }\r
-\r
- public void handleBP87(String cmd,Connection connection,Runtime runtime){\r
-\r
- //IWBP87,http://cn.map20000.com/physicalReport.html?lang=zh-CN&imeis=866671044898063#\r
-\r
- String[] list=cmd.split(CMDSPLIT);\r
-\r
- if (list.length==2){\r
- String furl=list[1];//.replace("#","");\r
- ICLogger.i("收到服务器指令 BP87:Qrcode url "+furl);\r
-// connection.send(AP87());\r
- try {\r
- String qrfilepath=Util.getLogfilePath(runtime,TimeUtil.getSystemDateYYMMDD());\r
- Util.setSystemProperties(Config.KeyQRURIFILE,qrfilepath);\r
- FileOutputStream fos=new FileOutputStream(new File(qrfilepath));\r
- fos.write(furl.getBytes());\r
- fos.close();\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
- }else{\r
- ICLogger.i("BP87 format error!");\r
- }\r
-\r
- }\r
- public static StringMessage AP88(String index){\r
- //设备响应: IWAP88, 080835#\r
- //080835:指令流水号\r
- return genStringMessage("AP88",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP88))\r
- .append(CMDSPLIT).append(index)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- public static void handleBP88(String cmd,Connection connection){\r
-// IWBP88,080835#\r
- String[] list=cmd.split(CMDSPLIT);\r
-\r
- if (list.length==2){\r
- String index=list[1];\r
- connection.send(AP88(index));\r
- ICLogger.i("收到服务器消息:查询设备");\r
-\r
- }else{\r
- ICLogger.i("BP88 format error!");\r
- }\r
- }\r
-\r
- //18.18.设置心率/血压阀值(下行协议号:BP89,响应:AP89)\r
- public static StringMessage AP89(String index){\r
-\r
- //设备响应: IWAP89, 080835#\r
- //080835:指令流水号\r
- return genStringMessage("AP89",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP89))\r
- .append(CMDSPLIT).append(index)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- public void handleBP89(String cmd,Connection connection){\r
-\r
- //示例:\r
- //IWBP89, 353456789012345, 080835,50,90,80,90,110,140#\r
- //说明:\r
- //IW:标识符\r
- //BP89 : 命令字符\r
- //353456789012345:IMEI号,设备唯一ID\r
- //080835 :指令流水号\r
- //50: 心率低阀值,低于该阀值上传心率,如果未设置,则留空\r
- //90: 心率高阀值,高于该阀值上传心率,如果未设置,则留空\r
- //80: 低压阀值,低压低于该阀值上传血压,如果未设置,则留空\r
- //90: 低压阀值,低压高于该阀值上传血压,如果未设置,则留空\r
- //110: 高压阀值,高压低于该阀值上传血压,如果未设置,则留空\r
- //140: 高压阀值,高压高于该阀值上传血压,如果未设置,则留空\r
- String[] list=cmd.split(CMDSPLIT);\r
- if (list.length==9){\r
- String index=list[2];\r
- String PPGH=list[3];\r
- String PPGL=list[4];\r
- String BPH_H=list[5];\r
- String BPH_L=list[6];\r
- String BPL_H=list[7];\r
- String BPL_L=list[8];\r
- connection.send(AP89(index));\r
-\r
-\r
- \r
- ICLogger.i("收到服务器指令:心率/血压阀值 "+PPGH+","+PPGL+","+BPH_H+","+BPH_L+","+BPL_H+","+BPL_L);\r
- }else{\r
- ICLogger.i("BP89 format error!");\r
- }\r
-\r
- }\r
-\r
- //体温间隔测量 (后台测试体温)(下行协议号:BPTE,响应:APTE)\r
- public static StringMessage APTE(String index,int freq){\r
-\r
- //设备响应: IWAPTE,080835,60#\r
- //080835:指令流水号\r
- //1:表示设备接受数据成功,0表示设备接受数据失败\r
- return genStringMessage("APTE",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTE))\r
- .append(CMDSPLIT).append(index)\r
- .append(CMDSPLIT).append(freq)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- public void handleBPTE(String cmd,Connection connection,Runtime runtime){\r
-\r
- //示例:\r
- //IWBPTE,353456789012345,080835,60#\r
- //说明:\r
- //IW:标识符\r
- //BPTE : 命令字符\r
- //353456789012345:IMEI号,设备唯一ID\r
- //080835 :指令流水号\r
- //60 : 上传间隔,单位分钟(60分钟上传一次体温,终端收到后立即开始测量一次并重置定时器)\r
- String[] list=cmd.split(CMDSPLIT);\r
- if (list.length==4){\r
- try {\r
- String index = list[2];\r
- String freqstr = list[3];\r
- int freq = Integer.parseInt(freqstr);\r
- connection.send(APTE(index, freq));\r
- ICLogger.i("收到服务器指令:测量体温 " + freq + "分钟一次。");\r
- Config.setTemperatureTestCycle(runtime, freq * 60);\r
- CoreService.getInstance().setTempAlarm();\r
-\r
-\r
- if(runtime.check_stat_do_temp_test()) TemperatureUtil.doTempTestInThread();\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
- }else{\r
- ICLogger.i("BPTE format error!");\r
- }\r
-\r
- }\r
-\r
- //体温上行(上行协议号:APTP,响应:BPTP)\r
- public static StringMessage APTP(double wrist_temp,double body_temp,double tempout){\r
-\r
- //设备: IWAPTP,36.3,33,132#\r
- //IW:标识符\r
- //APTP : 命令字符\r
- //35.3:测量体温 (摄氏度)\r
- //33,132:温补用的参数,此处不用,可以用0 来代替。\r
- return genStringMessage(cmdMap.get(CMD_TYPE.APTP),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTP))\r
- .append(CMDSPLIT).append(String.format("%1$.2f",wrist_temp))\r
- .append(CMDSPLIT).append(String.format("%1$.2f",body_temp))\r
- .append(CMDSPLIT).append(String.format("%1$.2f",tempout))\r
- .append(CMDEND).toString());\r
- }\r
-\r
- public void handleBPTP(){\r
-\r
- ICLogger.d("BPTP 服务器收到体温数据!");\r
-\r
- }\r
-\r
-\r
- public static StringMessage APX1(String id){\r
- //设备响应: IWAPX1, 080835#\r
- //080835:指令流水号\r
- return genStringMessage("APX1",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APX1))\r
- .append(CMDSPLIT).append(id)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- /**\r
- *\r
- * @param cmd\r
- * @param connection\r
- * @param runtime\r
- */\r
- public void handleBPX1(String cmd,Connection connection,Runtime runtime){\r
- //IWBPX1,353456789012345,080835,2,1,-3,0#\r
- //说明:\r
-// IW:标识符\r
-// BPX1 : 命令字符\r
-// 353456789012345:IMEI号,设备唯一ID\r
-// 080835 :指令流水号\r
-// 2: 心率修正值\r
-// 1:高压修正值\r
-// -3:低压修正值\r
-// 0:血氧修正值\r
- String[] list=cmd.split(CMDSPLIT);\r
- if (list.length==7){\r
- String index=list[2];\r
- String imei=list[1];\r
- String strXL=list[3];\r
- String strBPH=list[4];\r
- String strBPL=list[5];\r
- String strSpO2=list[6];\r
-\r
- connection.send(APX1(index));\r
-\r
- try {\r
- int ppg_adjust, bph_adjust, bpl_adjust, spo2_adjust;\r
- ppg_adjust = Integer.parseInt(strXL);\r
- bph_adjust = Integer.parseInt(strBPH);\r
- bpl_adjust = Integer.parseInt(strBPL);\r
- spo2_adjust = Integer.parseInt(strSpO2);\r
-\r
- runtime.getHRS().setAdjust(ppg_adjust, bph_adjust, bpl_adjust, spo2_adjust);\r
- Config.setPPGAdjust(mRuntime.getContextProxy().context, ppg_adjust);\r
- Config.setBPHAdjust(mRuntime.getContextProxy().context, bph_adjust);\r
- Config.setBPLAdjust(mRuntime.getContextProxy().context, bpl_adjust);\r
- Config.setSPo2Adjust(mRuntime.getContextProxy().context, spo2_adjust);\r
- String ShareAdjValue = new StringBuilder().append(ppg_adjust).append(CMDSPLIT)\r
- .append(bph_adjust).append(CMDSPLIT)\r
- .append(bpl_adjust).append(CMDSPLIT)\r
- .append(spo2_adjust).append(CMDSPLIT).toString();\r
- Config.setPPG_ECG_adjustValue(ShareAdjValue);\r
- ICLogger.i("Handle BPX1 IMEI " + imei + ",index " + index + ", BPH " + strBPH + ", BPL " + strBPL + ", PPG " + strXL + ", Sp02 " + strSpO2 + " , Shared Adjust Value " + ShareAdjValue);\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
- }else{\r
- ICLogger.i("BPX1 format error!");\r
- }\r
- }\r
-\r
-\r
-\r
- public static StringMessage APS4(String id){\r
- //设备响应: IWAPS4,080835#\r
- //080835:指令流水号\r
- return genStringMessage("APS4",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APS4))\r
- .append(CMDSPLIT).append(id)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- /**\r
- * 主要为久坐设置提醒时长。\r
- * @param cmd\r
- * @param connection\r
- * @param runtime\r
- */\r
- public void handleBPS4(String cmd,Connection connection,Runtime runtime){\r
- //IWBPS4,353456789012345,080835,1|1234567|0900|1100|180, 2|1234567|0900|1100|180, 1|1234567|0900|1100|180#\r
- //说明:\r
-// IW:标识符\r
-// BPS4: 命令字符\r
-// 353456789012345:设备IMEI或者ID\r
-// 080835 :指令流水号\r
-// 1|1234567|0900|1100|180:类型(1久坐,2喝水)|重复周期|开始时间|结束时间|时间间隔(单位秒)\r
-// 重复周期、开始结束时间格式 参考BP85闹钟设置,\r
-//#:结尾标识符\r
- String[] list=cmd.split(CMDSPLIT);\r
- if (list.length>=4){\r
-\r
- String index=list[2];\r
- String imei=list[1];\r
- connection.send(APS4(index));\r
-\r
- String setting1;\r
- switch(list.length){\r
- case 10:\r
- setting1=list[9];\r
- ICLogger.i("set 7th alarm "+setting1);\r
- case 9:\r
- setting1=list[8];\r
- ICLogger.i("set 6th alarm "+setting1);\r
- case 8:\r
- setting1=list[7];\r
- ICLogger.i("set 5th alarm "+setting1);\r
- case 7:\r
- setting1=list[6];\r
- ICLogger.i("set 4th alarm "+setting1);\r
- case 6:\r
- setting1=list[5];\r
- ICLogger.i("set 3rd alarm "+setting1);\r
- case 5:\r
- setting1=list[4];\r
- ICLogger.i("set 2nt alarm "+setting1);\r
- case 4:\r
- setting1=list[3];\r
- ICLogger.i("set 1st alarm "+setting1);\r
- break;\r
- }\r
-\r
- ICLogger.i("Handle BPX1 IMEI "+imei+",index "+index+", get "+(list.length-3) +" settings");\r
- }else{\r
- ICLogger.i("BPX1 format error!");\r
- }\r
- }\r
-\r
- public static StringMessage APHP(Runtime ds){\r
- //IWAPHP,60,130,85,95,90, , , , , , , , #\r
- //IW:标识符\r
- //APHT : 命令字符\r
- //60 : 表示心率\r
- //130: 血压高压 [收缩压]\r
- //85 : 血压低压 [舒张压]\r
- //95:血氧\r
- //90:血糖\r
-// 本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空\r
- return genStringMessage(cmdMap.get(CMD_TYPE.APHP),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHP))\r
- .append(CMDSPLIT).append(ds.getHRS().getPPG())\r
- .append(CMDSPLIT).append(ds.getHRS().getBPH())\r
- .append(CMDSPLIT).append(ds.getHRS().getBPL())\r
- .append(CMDSPLIT).append(ds.getHRS().getSpo2())\r
- .append(CMDSPLIT).append(0)\r
- .append(CMDSPLIT)\r
- .append(CMDSPLIT)\r
- .append(CMDSPLIT)\r
- .append(CMDSPLIT)\r
- .append(CMDSPLIT)\r
- .append(CMDSPLIT)\r
- .append(CMDSPLIT)\r
- .append(CMDSPLIT)\r
- .append(CMDEND).toString());\r
- }\r
- public static StringMessage APHP(int ppg,int bph, int bpl, int spo2){\r
- //IWAPHP,60,130,85,95,90, , , , , , , , #\r
- //IW:标识符\r
- //APHT : 命令字符\r
- //60 : 表示心率\r
- //130: 血压高压 [收缩压]\r
- //85 : 血压低压 [舒张压]\r
- //95:血氧\r
- //90:血糖\r
-// 本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空\r
- return genStringMessage(cmdMap.get(CMD_TYPE.APHP),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHP))\r
- .append(CMDSPLIT).append(ppg)\r
- .append(CMDSPLIT).append(bph)\r
- .append(CMDSPLIT).append(bpl)\r
- .append(CMDSPLIT).append(spo2)\r
- .append(CMDSPLIT).append(0)\r
- .append(CMDSPLIT)\r
- .append(CMDSPLIT)\r
- .append(CMDSPLIT)\r
- .append(CMDSPLIT)\r
- .append(CMDSPLIT)\r
- .append(CMDSPLIT)\r
- .append(CMDSPLIT)\r
- .append(CMDSPLIT)\r
- .append(CMDEND).toString());\r
- }\r
-\r
-\r
- public void handleBPHP(){\r
-\r
- ICLogger.i("服务器收到APHP 心率血压血氧 !");\r
-\r
- }\r
-\r
- public static StringMessage APDE(String id){\r
- /***\r
- * 示例:\r
- * 设备响应: IWAPDE,080835#\r
- * 080835:指令流水号\r
- * 说明: 本消息适用所有终端\r
- */\r
- return genStringMessage("APDE",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APDE))\r
- .append(CMDSPLIT).append(id)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- public void handleBPDE(Connection connection,String cmd,Runtime runtime){\r
-/***\r
- * 示例:\r
- * IWBPDE,867400020316612,853676,0\r
- * 说明:\r
- * IW:标识符\r
- * BPDE: 命令字符\r
- * 353456789012345:设备IMEI或者ID\r
- * 080835 :指令流水号\r
- * 0:进入禁止区域 1离开禁止区域\r
- * #:结尾标识符\r
- * 设备响应: IWAPDE,080835#\r
- * 080835:指令流水号\r
- * 说明: 本消息适用所有终端\r
- */\r
- String[] list=cmd.split(CMDSPLIT);\r
- if (list.length==4){\r
-\r
- String index=list[2];\r
- String msg=list[3];\r
- connection.send(APDE(index));\r
- try {\r
- if (Integer.parseInt(msg) == 0) {\r
- ICLogger.i("Handle BPDE index " + index + ", 进入禁止区域 ");\r
- runtime.Fence_Warning_flag = 1;\r
- WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);\r
- runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_out_wall), 2);\r
- } else {\r
- ICLogger.i("Handle BPDE index " + index + ", 离开禁止区域 ");\r
- runtime.Fence_Warning_flag = 0;\r
-// Util.ShowToast(runtime,"");\r
- runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_cross_boundary), 0);\r
- }\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
- }else{\r
- ICLogger.i("BPDE format error!");\r
- }\r
-\r
-\r
- }\r
- public static StringMessage APDG(String id){\r
- return genStringMessage("APDG",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APDG))\r
- .append(CMDSPLIT).append(id)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- public void handleBPDG(Connection connection,String cmd,Runtime runtime){\r
-/**\r
- * 示例:\r
- * IWBPDG,353456789012345,1,30.0,37.3 #\r
- * 说明:IWBPDG,867400020316612,502102,1,33,44\r
- * IW:标识符\r
- * BPDG: 命令字符\r
- * 353456789012345:设备IMEI或者ID\r
- * 080835 :指令流水号\r
- * 1:开关 1开, 0 关\r
- * 30.0: 低温阀值\r
- * 37.3: 高温阀值\r
- * #:结尾标识符\r
- * */\r
- String[] list=cmd.split(CMDSPLIT);\r
- if (list.length==6){\r
-\r
- try {\r
- String index = list[2];\r
- String switch_on = list[3];\r
- String min_temp = list[4];\r
- String max_temp = list[5];\r
- connection.send(APDG(index));\r
- if (Integer.parseInt(switch_on) == 1) {\r
- ICLogger.i("Handle BPDG index " + index + ", 体温报警阈值开 min=" + min_temp + ",max=" + max_temp);\r
- runtime.tempInfo.setBodyTempThreshold(Double.valueOf(max_temp), Double.valueOf(min_temp));\r
- Config.needTemperature_abnormal_alarm = true;\r
- } else {\r
- ICLogger.i("Handle BPDG index " + index + ", 体温报警阈值关 ");\r
- Config.needTemperature_abnormal_alarm = false;\r
- }\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
-\r
- }else{\r
- ICLogger.i("BPDG format error!");\r
- }\r
- }\r
-\r
- /***\r
- *\r
- * @param packetTime 做指令流水号用\r
- * @param filetype 文件类型, 1语音,2图片\r
- * @param datatype 数据内容类型,例如和文件类型相关,例如 监听语音,sos语音,签到图片等等\r
- * @param count 内容分包总数\r
- * @param index 当前分包数\r
- * @param datalen 分包数据长度,最长1024,不足按照实际大小。\r
- * @param amrdata 文件分包内容数据\r
- * @return\r
- */\r
- public static byte[] APTU(String packetTime,int filetype, int datatype ,int count,int index,int datalen,byte[] amrdata){\r
- /**\r
- * 10.设备录音图片(设备上行)(上行协议:APTU,响应:BPTU)\r
- * 示例:\r
- * IWAPTU,6654111,080835,1,1,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#\r
- * 说明:\r
- * IW:标识符\r
- * BPCU : 命令字符\r
- * 6654111:语音图片文字目标 (同步监护人列表的用户唯一标识ID)<扩展字段目前不需要,可以传空字符>\r
- * 080835 :指令流水号\r
- * 1:文件类型\r
- * 1:内容类型 类型说明如下表\r
- * 文件类型 内容类型\r
- * 1 语音—— 1.监听语音 * 2.SOS语音 * 3.扩展\r
- * 2 图片—— 1.签到图片 * 2.指令图片 * 3.设备图片 * 4.扩展\r
- * 6:内容包分包总数\r
- * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同\r
- * 1024 :语音包长度\r
- * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数\r
- * 语音包上传规则:\r
- * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。\r
- * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。\r
- * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包\r
- */\r
- String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTU))\r
- .append(CMDSPLIT)\r
- .append(CMDSPLIT).append(packetTime)\r
- .append(CMDSPLIT).append(filetype)\r
- .append(CMDSPLIT).append(datatype)\r
- .append(CMDSPLIT).append(count)\r
- .append(CMDSPLIT).append(index)\r
- .append(CMDSPLIT).append(datalen*2)\r
- .append(CMDSPLIT).toString();\r
-\r
- byte[] sentbuf=new byte[sb.length()+datalen*2+1];\r
- byte[] amrdata2=Util.bytesToHexString(amrdata).getBytes();\r
- System.arraycopy(sb.getBytes(),0,sentbuf,0,sb.length());\r
- System.arraycopy(amrdata2,0,sentbuf,sb.length(),datalen*2);\r
- sentbuf[sb.length()+datalen*2]='#';\r
- return sentbuf;\r
- }\r
-\r
-\r
- public void handleBPTU(String cmd , Connection connection ){\r
-/***\r
- * 平台响应\r
- * IWBPTU,6654111,080835,1,1,6,1,1#\r
- * IW:标识符\r
- * APCU : 命令字符\r
- * 6654111:语音图片文字目标\r
- * 080835 :流水号\r
- * 1:文件类型\r
- * 1:内容类型\r
- * 6:内容总包数\r
- * 1:当前包序号\r
- * 1:成功 (0:失败)\r
- */\r
- String[] cmdlist=cmd.split(CMDSPLIT);\r
- if (cmdlist.length==8){\r
- try {\r
- String time = cmdlist[2];\r
- String filetype = cmdlist[3];\r
- String datatype = cmdlist[4];\r
- String count = cmdlist[5];\r
- String index = cmdlist[6];\r
- String success = cmdlist[7];\r
- int ftype = Integer.parseInt(filetype);\r
- int dtype = Integer.parseInt(datatype);\r
- int packetCount = Integer.parseInt(count);\r
- int packetIndex = Integer.parseInt(index);\r
- int receiveSuccess = Integer.parseInt(success);\r
- ICLogger.i("服务器在收到 index " + time + ", 文件类型 " + ftype + ",内容类型 " + dtype + " " + packetIndex + "/" + packetCount + " " + (receiveSuccess == 1 ? "成功" : "失敗"));\r
- if (receiveSuccess == 1) {\r
- //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送\r
- voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);\r
- //voicePacket.getInstanceSent().setFileType(ftype,dtype);\r
- }\r
- //发送消息,再次检查要发送的语音包,确认其发送完毕\r
- connection.DeliverCMDMessageToSystem("SentVoicePacket", "SentBPFilePacket");\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
- }else{\r
- ICLogger.i(" BPTU Format error!");\r
- }\r
- }\r
-\r
- public static StringMessage APSL(String date,int deepsleep,int lightsleep,int score){\r
-/***\r
- * 示例:\r
- * IWAPSL,20200803,240,120,90#\r
- * 说明:睡眠计算时间 当日21:00至 次日 9:00, 睡眠时间记录为当日时间。如2020-8-3的睡眠时间段为 2020-8-3 21:00 ~ 2020-8-4 09:00\r
- * IW:标识符\r
- * APSL:命令字\r
- * 202008003:睡眠时间 (手表本地时间)\r
- * 240:深睡时间 (手表本地时间),单位分钟\r
- * 120:浅睡时间(手表本地时间),单位分钟\r
- * 90睡眠分数\r
- * 睡眠算法\r
- * 使用记步同样的算法,计算翻身次数\r
- * 平均每60秒记录一次\r
- * 深睡眠,通过加速度传感器,在60秒内翻身次数小于6\r
- * 浅睡眠,通过加速度传感器,在60秒内翻身次数大于等于6, 且小于12 ,否则认为未睡\r
- * 换算分数后发送到服务器\r
- * #:结束符\r
- */\r
- String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APSL))\r
- .append(CMDSPLIT).append(date)\r
- .append(CMDSPLIT).append(deepsleep)\r
- .append(CMDSPLIT).append(lightsleep)\r
- .append(CMDSPLIT).append(score)\r
- .append(CMDEND).toString();\r
- return genStringMessage(cmdMap.get(CMD_TYPE.APSL),sb);\r
- }\r
-\r
- public static StringMessage AP46(String id,String cmd)\r
- {\r
- return genStringMessage(cmdMap.get(CMD_TYPE.AP46),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP46))\r
- .append(CMDSPLIT).append(id)\r
- .append(CMDSPLIT).append(cmd)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- public void handleBP46(String cmd , Connection connection,Runtime runtime) {\r
-/***\r
- * IWBP46,353456789012345,080835,1,[参数]#\r
- * 说明:\r
- * IW:标识符\r
- * BP46 : 命令字符\r
- * 353456789012345:IMEI号,设备唯一ID\r
- * 080835 :指令流水号\r
- * 1: 表示立即拍照\r
- * [参数]: 此为可选项。根据不同类型设备扩展\r
- * #:结尾标识符\r
- * 设备响应: IWAP46,080835,1#\r
- * 080835:指令流水号\r
- * 1 成功 0失败\r
- * # 结尾标识符\r
- */\r
- String[] cmdlist=cmd.split(CMDSPLIT);\r
-\r
- if (cmdlist.length>=4 ){\r
- String imei=cmdlist[1];\r
- String id=cmdlist[2];\r
- String cdd=cmdlist[3];\r
- if (cmdlist.length==5) {\r
- String tmp = cmdlist[4];\r
- }\r
- connection.send(AP46(id,cdd));\r
- Context context = mRuntime.getContextProxy().context.getApplicationContext();\r
- if (cdd.equals("1")) {\r
- //delay 启动\r
-\r
-// Intent intent = new Intent(context, com.enqualcomm.support.CoreService.class);\r
-// intent.setAction(ACTION_REMOTE_CAMERA);\r
-// intent.putExtra("remote_number", id);\r
-// context.startService(intent);\r
-// runtime.getContextProxy().context.sendBroadcast(intent);\r
- new Handler().post(new Runnable() {\r
- @Override\r
- public void run() {\r
- (new CameraUtil(context)).getPictur(id);\r
- }\r
- });\r
-\r
- }else if(cdd.equals("2")){\r
- Intent intent = new Intent();\r
- intent.setAction(DIALOG_ACTION);\r
- intent.putExtra("takephoto", "Take Photo !");\r
- context.sendBroadcast(intent);\r
- }\r
- }else{\r
- ICLogger.i(" BP46 Format error!");\r
- }\r
-\r
- }\r
-\r
-\r
- public static StringMessage APDH(String id,String cmd)\r
- {\r
- return genStringMessage("APDH",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APDH))\r
- .append(CMDSPLIT).append(id)\r
- .append(CMDSPLIT).append(cmd)\r
- .append(CMDEND).toString());\r
- }\r
-\r
-\r
- public void handleBPDH( Connection connection,Runtime runtime,String cmd) {\r
- /***\r
- * IWBPDH,353456789012345,080835,1,[参数]#\r
- * 说明:\r
- * IW:标识符\r
- * BPDH : 命令字符\r
- * 353456789012345:IMEI号,设备唯一ID\r
- * 080835 :指令流水号\r
- * 1: 表示立即聆听 可扩展\r
- * [参数]: 此为可选项。录音时间 为空默认15秒\r
- * #:结尾标识符\r
- * 设备响应: IWAPDH,080835,1#\r
- * 080835:指令流水号\r
- * 1 成功 0失败\r
- * # 结尾标识符\r
- */\r
-\r
- String[] cmdlist=cmd.split(CMDSPLIT);\r
- if (cmdlist.length==5){\r
- String imei=cmdlist[1];\r
- String id=cmdlist[2];\r
- String cdd=cmdlist[3];\r
- String tmp=cmdlist[4];\r
-\r
- tmp=tmp.replace(CMDEND,"").trim();\r
-\r
- if (tmp.isEmpty()) tmp="15";\r
- connection.send(APDH(id,cdd));\r
-\r
- if (cdd.equals("1")) {\r
- //delay 启动\r
-// Context context = mRuntime.getContextProxy().context.getApplicationContext();\r
- CoreService.getInstance().DevliverStringMessage("StartMonitor",tmp);\r
- }\r
- }else{\r
- ICLogger.i(" BPDH Format error!");\r
- }\r
- }\r
-\r
- public static StringMessage APTQ(Runtime runtime)\r
- {\r
- /**\r
- * IWAPTQ,460,0,9520,3671,0#\r
- * APTQ : 命令字符\r
- * 460,0,9520,3671基站信息\r
- * 0:语言标志位 0 默认为中文,1为英文\r
- */\r
- //或者仅仅使用 locale = Locale.getDefault(); 不需要考虑接口 deprecated(弃用)问题\r
- Locale locale = Locale.getDefault();\r
- String lang = locale.getLanguage() + "-" + locale.getCountry();\r
- int language=0;\r
- if(!lang.contains("zh"))\r
- {\r
- language=1;\r
- }\r
- return genStringMessage("APTQ",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTQ))\r
- .append(CMDSPLIT).append(runtime.getLocationInstance().getMCC())\r
- .append(CMDSPLIT).append(runtime.getLocationInstance().getMNC())\r
- .append(CMDSPLIT).append(runtime.getLocationInstance().getLAC())\r
- .append(CMDSPLIT).append(runtime.getLocationInstance().getGSMStationCID())\r
- .append(CMDSPLIT).append(language)\r
- .append(CMDEND).toString());\r
- }\r
-\r
-\r
- public void handleBPTQ( Connection connection,Runtime runtime,String cmd) {\r
- /***\r
- *\r
- * IWBPTQ,20-10-11,19:32:02,6674,32,27,22,30,20-10-12,19:32:02,6674,32,27,22,30,20-10-13,19:32:02,6674,32,27,22,30,53575C71533A\r
- * IWBPTQ, 16-09-24,11:00:00,b6e0d4c6,2,-5,-12,22,16-09-25,11:00:00,b6e0d4c6,2,-5,-12,22,16-09-26,11:00:00,b6e0d4c6,2,-5,-12,22,316df15733#\r
- * 年-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,年-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,年-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,城市名\r
- * 注:天气描述用Unicode编码,城市名使用Unicode编码, 第一组为当天,后2组依次为后续2天天气\r
- * 如天气编号及描述对应如下(天气描述不需要发送括号内的白天晚上)\r
- * 0:龙卷风\r
- * 1:热带风暴\r
- * 2:飓风\r
- * 3:严重的雷暴\r
- * 4:雷暴\r
- * 5:混合雨雪\r
- * 6:混合降雨和冰雹\r
- * 7:混合雪和雨夹雪\r
- * 8:冻结小雨\r
- * 9:小雨\r
- * 10:冻雨\r
- * 11:阵雨\r
- * 12:阵雨\r
- * 13:雪飘雪\r
- * 14:小雪阵雨\r
- * 15:吹雪\r
- * 16:雪\r
- * 17:冰雹\r
- * 18:雨夹雪\r
- * 19:尘埃\r
- * 20:雾\r
- * 21:霾\r
- * 22:黑烟\r
- * 23:大风\r
- * 24:风\r
- * 25:低温\r
- * 26:多云\r
- * 27:多云(晚上)\r
- * 28:多云(白天)\r
- * 29:局部多云(晚上)\r
- * 30:局部多云(天)\r
- * 31:清爽(晚)\r
- * 32:晴天\r
- * 33:晴朗(晚)\r
- * 34:晴朗(天)\r
- * 35:混合雨和冰雹\r
- * 36:热\r
- * 37:局部地区性雷暴\r
- * 38:零星雷暴\r
- * 39:零星雷暴\r
- * 40:零星阵雨\r
- * 41:大雪\r
- * 42:零星阵雪\r
- * 43:大雪\r
- * 44:多云\r
- * 45:雷阵雨\r
- * 46:阵雪\r
- * 47:局部雷阵雨\r
- */\r
-\r
- log("BPTQ "+cmd);\r
- String[] cmdlist=cmd.split(CMDSPLIT);\r
- if (cmdlist.length==23){\r
-\r
- StringBuilder sb=new StringBuilder();\r
- StringBuilder msg=new StringBuilder();\r
- for(int i=0;i<3;i++) {\r
- String DayTime = cmdlist[1+i*7] + " " + cmdlist[2+i*7];\r
- String date= "20"+cmdlist[1+i*7].trim();\r
- String weather_name = Util.decodeUnicode2Utf8(cmdlist[3+i*7].trim());\r
- String weather_id = cmdlist[4+i*7];\r
- String temp_current = cmdlist[5+i*7];\r
- String temp_high = cmdlist[6+i*7];\r
- String temp_low = cmdlist[7+i*7];\r
-\r
- sb.append(" "+DayTime);\r
- sb.append(",天气:"+weather_name);\r
- sb.append(",ID "+weather_id);\r
- sb.append(",当前温度 "+temp_current);\r
- sb.append(",最高温度 "+temp_high);\r
- sb.append(",最低温度 "+temp_low);\r
- sb.append("\n");\r
-\r
- msg.append(date);\r
- msg.append(","+weather_name);\r
- msg.append(","+weather_id);\r
- msg.append(","+temp_current);\r
- msg.append(","+temp_high);\r
- msg.append(","+temp_low);\r
- msg.append(";");\r
- }\r
- String City=Util.decodeUnicode2Utf8(cmdlist[22]);\r
-\r
- ICLogger.i(City+" \n"+sb.toString());\r
-\r
- msg.insert(0,City+";");\r
- String weatherstr=msg.toString();\r
- if (weatherstr.endsWith(";"))\r
- {\r
- weatherstr=weatherstr.substring(0,weatherstr.lastIndexOf(";"));\r
- }\r
- Intent intent=new Intent(Constants.ACTION_WEATHER_RECEIVED);\r
- intent.putExtra(Constants.KEY_Weather,weatherstr);\r
- ICLogger.i("send Broadcast "+ Constants.ACTION_WEATHER_RECEIVED +"\n"+weatherstr+"\n");\r
- CoreService.getInstance().sendBroadcast(intent);\r
-\r
- }else{\r
- ICLogger.i(" BPTQ Format error!");\r
- }\r
- }\r
-\r
-\r
-\r
- public static StringMessage AP94( ){\r
- /***\r
- * 15确认已读文字(上行协议号:AP94,响应:BP94)\r
- * 示例:\r
- * IWAP94,123456,1#\r
- * 说明:\r
- * IWAP94:标识符\r
- * APHCI: 命令字符\r
- * 123456: 文字来源系统流水号\r
- * 1:确认阅读、0:取消阅读\r
- * 平台响应: IWBP94#\r
- * 表示平台已接收,可不作响应\r
- * 说明: 本消息适用所有终端\r
- */\r
-\r
- //在UI逻辑中,只要有处理就都是已经阅读。所以不存在取消阅读的说法。\r
- return genStringMessage(cmdMap.get(protocol_ic.CMD_TYPE.AP94),new StringBuffer(CMDHEADER).append(cmdMap.get(protocol_ic.CMD_TYPE.AP94))\r
- .append(CMDSPLIT).append(Runtime.PushtxtMsg_srv_index)\r
- .append(CMDSPLIT).append("1")\r
- .append(CMDEND).toString());\r
-\r
- }\r
-\r
-\r
- public static StringMessage APAT(String id,String cmd)\r
- {\r
- return genStringMessage("APAT",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APAT))\r
- .append(CMDSPLIT).append(id)\r
- .append(CMDSPLIT).append(cmd)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- /***\r
- * 响应剪断开关设定消息\r
- * @param connection\r
- * @param runtime\r
- * @param cmd\r
- */\r
- public void handleBPAT( Connection connection,Runtime runtime,String cmd) {\r
-/***\r
- * IWBPAT,353456789012345,080835,1#\r
- * 说明:是否提示表带是否连接的开关,即剪断报警开关\r
- * IW:标识符\r
- * BPAT : 命令字符\r
- * 353456789012345:IMEI号,设备唯一ID\r
- * 080835:指令流水号\r
- * 1: 表示剪断报警开关,1为开,0 为关\r
- * 设备响应: IWAPAT,080835, 1#\r
- * 080835:指令流水号\r
- * 1: 剪断开关状态(实际上与下行的命令一致)\r
- */\r
-\r
- log("BPAT "+cmd);\r
- String[] cmdlist=cmd.split(CMDSPLIT);\r
- if (cmdlist.length==4){\r
-\r
- String imei=cmdlist[1];\r
- String id=cmdlist[2];\r
- String cmdid=cmdlist[3];\r
- connection.send(APAT(id,cmdid));\r
- if(cmdid.trim().equals("1")){\r
- WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);\r
-// runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success), 2);\r
- Util.ShowToast(runtime,runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success));\r
- Config.setNeedAntiOff(runtime.getContextProxy().context,true);\r
- Config.setNeedCutOff(runtime.getContextProxy().context,true);\r
- runtime.setNeedAntioff(true);\r
- runtime.setNeddReportCutoff(true);\r
- } else {\r
- WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);\r
- runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_unbind_success), 2);\r
- Config.setNeedAntiOff(runtime.getContextProxy().context,false);\r
- Config.setNeedCutOff(runtime.getContextProxy().context,false);\r
- runtime.setNeedAntioff(false);\r
- runtime.setNeddReportCutoff(false);\r
- }\r
- }else{\r
- ICLogger.i(" BPAT Format error!");\r
- }\r
- }\r
-\r
-\r
- public static StringMessage APCH(int charging)\r
- {\r
- return genStringMessage("APCH",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APCH))\r
- .append(CMDSPLIT).append(charging)\r
- .append(CMDEND).toString());\r
- }\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
- /**\r
- * #IWAPBR,353456789012345,080835,1#\r
- *\r
- * #IWBPBR#\r
- */\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(TimeUtil.getSystemTimeyyyyMMddHHmmss())\r
- .append(CMDSPLIT).append(sb.toString())\r
- .append(CMDEND).toString());\r
-\r
- }else{\r
- return null;\r
- }\r
- }\r
-\r
- /**\r
- * 85.设置联系人白名单(10个)(下行协议:BPWL,响应:APWL)\r
- * 示例:\r
- * IWBPWL,353456789012345,080835,D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx #\r
- * 说明:\r
- * IW:标识符\r
- * BPWL : 命令字符\r
- * 353456789012345:IMEI号,设备唯一ID\r
- * 080835 :指令流水号\r
- * D3590D54|135xxxxxxxxxx|9507xxxxxxxx : 一组联系人,使用|分隔名称和电话号码和绑定号码,名称使用UNICODE编码直接下发byte,多组之间使用逗号分隔,未填写的可为空,但位置仍需保留\r
- * 设备响应: IWAPWL,080835, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx, D3590D54|135xxxxxxxxxx#\r
- * 080835: 设备响应的时候带上响应流水号\r
- * D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx回复设备当前设置的主控号码供平台同步使用\r
- * 说明: 本消息适用所有终端\r
- */\r
- public static StringMessage APWL(String index,String[] phnumbs){\r
- return genStringMessage("APWL",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APWL))\r
- .append(CMDSPLIT).append(index)\r
- .append(CMDSPLIT).append(phnumbs[0])\r
- .append(CMDSPLIT).append(phnumbs[1])\r
- .append(CMDSPLIT).append(phnumbs[2])\r
- .append(CMDSPLIT).append(phnumbs[3])\r
- .append(CMDSPLIT).append(phnumbs[4])\r
- .append(CMDSPLIT).append(phnumbs[5])\r
- .append(CMDSPLIT).append(phnumbs[6])\r
- .append(CMDSPLIT).append(phnumbs[7])\r
- .append(CMDSPLIT).append(phnumbs[8])\r
- .append(CMDSPLIT).append(phnumbs[9])\r
- .append(CMDEND).toString());\r
- }\r
- //设置通讯录,白名单(10个)\r
- public void handleBPWL(Connection connection,String cmd , Runtime runtime){\r
-// IWBPWL,867155030001063,357444,9b44529b|13554820016,,,,,,,,,\r
-/**\r
- * IWBPWL,353456789012345,080835,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx#\r
- */\r
- String[] cmdlist=cmd.split(CMDSPLIT);\r
- String[] phnums=new String[]{"","","","","","","","","",""};\r
- StringBuffer sb=new StringBuffer().append("recv phone Numbs ");\r
- if (cmdlist.length>=3){\r
- switch (cmdlist.length){\r
- case 13:\r
- phnums[9]=cmdlist[12];\r
- sb.append(phnums[9]).append(",");\r
- case 12:\r
- phnums[8]=cmdlist[11];\r
- sb.append(phnums[8]).append(",");\r
- case 11:\r
- phnums[7]=cmdlist[10];\r
- sb.append(phnums[7]).append(",");\r
- case 10:\r
- phnums[6]=cmdlist[9];\r
- sb.append(phnums[6]).append(",");\r
- case 9:\r
- phnums[5]=cmdlist[8];\r
- sb.append(phnums[5]).append(",");\r
- case 8:\r
- phnums[4]=cmdlist[7];\r
- sb.append(phnums[4]).append(",");\r
- case 7:\r
- phnums[3]=cmdlist[6];\r
- sb.append(phnums[3]).append(",");\r
- case 6:\r
- phnums[2]=cmdlist[5];\r
- sb.append(phnums[2]).append(",");\r
- case 5:\r
- phnums[1]=cmdlist[4];\r
- sb.append(phnums[1]).append(",");\r
- case 4:\r
- phnums[0]=cmdlist[3];\r
- sb.append(phnums[0]).append(",");\r
-\r
- }\r
-\r
- String index=cmdlist[2];\r
- ICLogger.i(sb.toString());\r
- connection.send(AP14(index,phnums));\r
- ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
-\r
- if(Config.custom_name.equals("YT")) {\r
- ICLogger.i("=====add hotline 96885 ");\r
- contactArray.add(new Contact(Contact.CATEGORY_CALL, runtime.getContextProxy().context.getResources().getString(R.string.hotline), "96885"));\r
- }\r
- for (int i=0; i< phnums.length;i++){\r
- String[] tmp= phnums[i].split("\\|");\r
- if (tmp.length==2){\r
- String name= Util.decodeUnicode2Utf8(tmp[0]);\r
- String phonem=tmp[1];\r
- ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem);\r
- contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));\r
- }else{\r
- ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length);\r
-\r
- }\r
- }\r
-// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666"));\r
-// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666"));\r
-// contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666"));\r
-// contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666"));\r
-\r
- runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false);\r
-\r
- }else{\r
- ICLogger.i(" BPWL format error!");\r
- }\r
-\r
- }\r
-\r
-\r
-\r
-\r
- public static StringMessage AP65(String id,String cy)\r
- {\r
- return genStringMessage("AP65",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP65))\r
- .append(CMDSPLIT).append(id)\r
- .append(CMDSPLIT).append(cy)\r
- .append(CMDEND).toString());\r
- }\r
-\r
- public void handleBP65( Connection connection,Runtime runtime,String cmd) {\r
-/***\r
- * 36.音量设置(下行协议:BP65,响应:AP65)\r
- * 示例:\r
- * IWBP65,353456789012345,080835,1#\r
- * 说明:\r
- * IW:标识符\r
- * BP65: 命令字符\r
- * 353456789012345:IMEI号,设备唯一ID\r
- * 080835 :指令流水号\r
- * 1 : 表示音量等级为1\r
- * 设备响应: IWAP65,080835, 1#\r
- * 080835: 设备响应的时候带上响应流水号\r
- * 1: 表示指令执行成功,音量等级为1\r
- */\r
-\r
- log("BP65 "+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(AP65(id,cycle));\r
-\r
- if(Util.isNumeric(cycle)){\r
- int mastervolume=Integer.parseInt(cycle);\r
-\r
- ICLogger.i("设置音量 "+mastervolume);\r
- //实际设备音量 0~15 协议音量0~7需要转换\r
- int volume=mastervolume*2;\r
- if (volume<0)volume=0;\r
- if(volume>=14) volume=15;\r
- Config.setMasterVolume(runtime.getContextProxy().context,mastervolume*2);\r
- ICAudioManager.setMasterVolumn(runtime.getContextProxy().context,mastervolume*2);\r
-\r
- }else{\r
- ICLogger.i(" BP65 Format error!");\r
- }\r
-\r
- }else{\r
- ICLogger.i(" BP65 Format error!");\r
- }\r
- }\r
-\r
- public static StringMessage AP47(String id,String cycle)\r
- {\r
- return genStringMessage("AP47",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP47))\r
- .append(CMDSPLIT).append(id)\r
- .append(CMDSPLIT).append(cycle)\r
- .append(CMDEND).toString());\r
- }\r
-\r
-\r
- public void handleBP47( Connection connection,Runtime runtime,String cmd) {\r
-/***\r
- * 37.震动设置(下行协议号:BP47,响应:AP47)\r
- * 示例:\r
- * IWBP47,353456789012345,080835,10#\r
- * 说明:\r
- * IW:标识符\r
- * BP47 : 命令字符\r
- * 353456789012345:IMEI号,设备唯一ID\r
- * 080835 :指令流水号\r
- * 10: 表示震动时长,此处单位为称,表示震动10秒钟\r
- * 设备响应: IWAP47,080835,1#\r
- * 080835:指令流水号\r
- * 1:表示设备执行成功,0 表示设备执行失败\r
- */\r
-\r
- log("BP47 "+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(AP47(id,cycle));\r
-\r
- if(Util.isNumeric(cycle)){\r
- int vibduration=Integer.parseInt(cycle);\r
- ICLogger.i("设置震动时长 "+vibduration+" 秒");\r
- Config.setDurationOfVibration(runtime.getContextProxy().context,vibduration);\r
- VibrateUtil.setVibPattern(vibduration*1000);\r
-\r
- }else{\r
- ICLogger.i(" BP47 Format error!");\r
- }\r
-\r
- }else{\r
- ICLogger.i(" BP47 Format error!");\r
- }\r
- }\r
- public boolean handleCmd(CMD_TYPE type, String cmd) {\r
-\r
- //普通非二进制命令用此函数处理\r
- boolean ret=true;\r
- ICLogger.i("handleCmd "+type.name() + " strLen="+cmd.length());\r
- if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd);\r
- cmd=cmd.replace(" ","");\r
- switch (type){\r
- case BP00: //登录包\r
- handleBP00(mRuntime,cmd);\r
- ICLogger.i("服务器收到登录包AP00");\r
- mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化\r
- break;\r
- case BP01: //gps定位包\r
- handleBP01(cmd);\r
- ICLogger.i("服务器收到定位AP01");\r
- mConnection.DeliverCMDMessageToSystem("AP01",cmd);//通知下面线程状态变化\r
- break;\r
- case BP02:// wifi定位包\r
- handleBP02(cmd);\r
- ICLogger.i("服务器收到定位AP02");\r
- mConnection.DeliverCMDMessageToSystem("AP02",cmd);//通知下面线程状态变化\r
- break;\r
- case BP03: //心跳包\r
- handleBP03(cmd);\r
- ICLogger.i("服务器收到心跳包AP03");\r
- mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化\r
- break;\r
-\r
- case BP07:\r
- //收到发送的语音包\r
- handleBP07(cmd,mConnection);\r
- break;\r
- case BP10:\r
- //报警包\r
- mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化\r
- break;\r
-\r
- case BPTM:\r
- //校时命令\r
- handleBPTM(cmd);\r
- ICLogger.i("服务器收到校时命令APTM");\r
- mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程状态变化\r
- break;\r
- case BP85://设置闹钟\r
- handleBP85(cmd,mConnection,mRuntime);\r
- ICLogger.i("收到服务器设置闹钟命令BP85");\r
- mConnection.DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程状态变化\r
- break;\r
-\r
- case BP87:\r
- handleBP87(cmd,mConnection,mRuntime);\r
- ICLogger.i("收到服务器 QRCode uri BP87");\r
- break;\r
- case BP33:\r
- //设置工作模式\r
- handleBP33(mConnection,mRuntime,cmd);\r
- mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化\r
-\r
- break;\r
- case BP34:\r
- //设置工作模式\r
- handleBP34(mConnection,mRuntime,cmd);\r
- mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化\r
- break;\r
- case BP16:\r
- //立即定位指令(长链接有效)\r
- handleBP16(mConnection,mRuntime,cmd);\r
- mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化\r
- break;\r
-\r
- case BP46: //立即拍照\r
- ICLogger.i("立即拍照!");\r
- handleBP46(cmd,mConnection,mRuntime);\r
- break;\r
-\r
- case BP12:\r
- //收到设置SOS号码\r
- handleBP12(mConnection,cmd,mRuntime);\r
- ICLogger.i("收到服务器设置SOS号码命令BP12");\r
- break;\r
- case BP14:\r
- //收到设置白名单号码\r
- handleBP14(mConnection,cmd,mRuntime);\r
- ICLogger.i("收到服务器设置白名单号码命令BP14");\r
- break;\r
- case BPWL:\r
- //收到设置白名单号码\r
- handleBPWL(mConnection,cmd,mRuntime);\r
- ICLogger.i("收到服务器设置白名单号码命令BPWL");\r
- break;\r
- case BP15:\r
- handleBP15(cmd,mConnection,mRuntime);\r
- ICLogger.i("收到服务器设置定位命令BP15");\r
- break;\r
- case BP17:\r
- //收到恢复出厂设置\r
- handleBP17(mConnection,cmd);\r
- ICLogger.i("收到服务器恢复出厂设置命令BP17");\r
- mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化\r
- break;\r
-\r
- case BP18:\r
- //收到重启\r
- handleBP18(mConnection,cmd);\r
- ICLogger.i("收到服务器重启命令BP18");\r
- mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化\r
- break;\r
-\r
- case BP31:\r
- //收到关机\r
- handleBP31(mConnection,cmd);\r
- ICLogger.i("收到服务器关机命令BP31");\r
- mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化\r
- break;\r
- case BP40:\r
- //服务器推送文本\r
- handleBP40(mConnection,mRuntime,cmd);\r
- ICLogger.i("收到服务器推送文本消息");\r
- mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化\r
- break;\r
-\r
- case BPXL:\r
- handleBPXL(cmd,mConnection);\r
- ICLogger.i("收到服务器心率检测命令");\r
- if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();\r
- break;\r
- case BPXY:\r
- handleBPXY(cmd,mConnection);\r
- ICLogger.i("收到服务器血压检测命令");\r
- if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();\r
- break;\r
- case BPJZ:\r
- handleBPJZ(cmd,mConnection,mRuntime);\r
- ICLogger.i("收到服务器血压校准命令");\r
- break;\r
- case BPHT:\r
- ICLogger.i("服务器收到上传的心率血压");\r
- mConnection.DeliverCMDMessageToSystem("APHT",cmd);//通知下面线程状态变化\r
- break;\r
- case BP84:\r
- handleBP84(cmd,mConnection);\r
- ICLogger.i("收到服务器白名单命令");\r
- break;\r
-\r
- case BP86:\r
- //心率周期\r
- handleBP86(cmd,mConnection,mRuntime);\r
- mConnection.DeliverCMDMessageToSystem("AP86",cmd);//通知下面线程状态变化\r
-\r
- break;\r
- case BP68: //绑定解绑\r
- handleBP68(cmd,mConnection,mRuntime);\r
- break;\r
- case BP88:\r
- //收到查找设备消息\r
- handleBP88(cmd,mConnection);\r
- mConnection.DeliverCMDMessageToSystem("findDev",cmd);//通知下面线程状态变化\r
- break;\r
- case BP89:\r
- //心率/血压阀值\r
- handleBP89(cmd,mConnection);\r
- mConnection.DeliverCMDMessageToSystem("AP89",cmd);//通知下面线程状态变化\r
- break;\r
-\r
- case BPTE: //设置测试体温\r
- handleBPTE(cmd,mConnection,mRuntime);\r
- mConnection.DeliverCMDMessageToSystem("APTE",cmd);//通知下面线程状态变化\r
- break;\r
-\r
- case BPTP:\r
- handleBPTP();\r
- mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化\r
- break;\r
- case BPHP:\r
- handleBPHP();\r
- mConnection.DeliverCMDMessageToSystem("APHP",cmd);//通知下面线程状态变化\r
- break;\r
- case BPX1://设置 心率血压血氧修正值\r
- handleBPX1(cmd,mConnection,mRuntime);\r
- ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1");\r
- mConnection.DeliverCMDMessageToSystem("APX1",cmd);//通知下面线程状态变化\r
- break;\r
-\r
- case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。\r
- handleBPS4(cmd,mConnection,mRuntime);\r
- ICLogger.i("收到 提醒设置(时间段)");\r
- mConnection.DeliverCMDMessageToSystem("APS4",cmd);//通知下面线程状态变化\r
- break;\r
- case BPDE:\r
- handleBPDE(mConnection,cmd,mRuntime);\r
- ICLogger.i(" 收到 进出围栏通知!");\r
- mConnection.DeliverCMDMessageToSystem("APDE",cmd);//通知下面线程状态变化\r
- break;\r
-\r
- case BPTU:\r
- handleBPTU(cmd, mConnection);\r
- ICLogger.i("收到服务器 图片语音 消息 BPTU");\r
- // mConnection.DeliverCMDMessageToSystem("APTU", "");//通知下面线程状态变化\r
- break;\r
- case BPDG:\r
- handleBPDG(mConnection,cmd,mRuntime);\r
- ICLogger.i(" 收到 体温阈值设置!");\r
- mConnection.DeliverCMDMessageToSystem("APDG",cmd);//通知下面线程状态变化\r
- break;\r
- case BPSL:\r
- ICLogger.i("睡眠数据上传完毕!");\r
- mConnection.DeliverCMDMessageToSystem("APSL",cmd);//通知下面线程状态变化\r
- break;\r
-\r
- case BPDH:\r
- ICLogger.i("聆听");\r
- handleBPDH(mConnection,mRuntime,cmd);\r
- break;\r
-\r
- case BPTQ: //天气下发\r
- handleBPTQ(mConnection,mRuntime,cmd);\r
- break;\r
- case BPAT://剪断开关设定\r
- handleBPAT(mConnection,mRuntime,cmd);\r
- break;\r
-\r
- case BPBT://蓝牙扫描设置\r
- handleBPBT(mConnection,mRuntime,cmd);\r
- break;\r
-\r
- case BP65://声音设置\r
- handleBP65(mConnection,mRuntime,cmd);\r
- break;\r
- case BP47://震动设置\r
- handleBP47(mConnection,mRuntime,cmd);\r
- break;\r
-\r
- }\r
-\r
- return ret;\r
-\r
- }\r
-\r
-\r
- public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) {\r
-\r
- //只有需要传递二进制数据的才需要这个函数,目前只有BP28需要\r
- boolean ret=true;\r
- ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length );\r
- if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes));\r
- switch (type) {\r
- case BP28:\r
- handleBP28(mConnection,cmd, mRuntime,bytes);\r
- ICLogger.i("收到服务器语音BP28");\r
-// mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化\r
- break;\r
- }\r
- return ret;\r
- }\r
-}\r
+package com.ic.protocols;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Environment;
+import android.os.Handler;
+
+import com.enqualcomm.support.Config;
+import com.enqualcomm.support.Constants;
+import com.enqualcomm.support.CoreService;
+import com.enqualcomm.support.R;
+import com.enqualcomm.support.bean.Alarm;
+import com.enqualcomm.support.bean.Contact;
+import com.enqualcomm.support.bean.Content;
+import com.enqualcomm.support.bean.ICLocation;
+import com.enqualcomm.support.bean.Runtime;
+import com.enqualcomm.support.bean.StringMessage;
+import com.enqualcomm.support.bean.VoiceContent;
+import com.enqualcomm.support.bean.voicePacket;
+import com.enqualcomm.support.service.HeartRateManager;
+import com.enqualcomm.support.utils.CameraUtil;
+import com.enqualcomm.support.utils.Connection;
+import com.enqualcomm.support.utils.ICAudioManager;
+import com.enqualcomm.support.utils.ICLogger;
+import com.enqualcomm.support.utils.TemperatureUtil;
+import com.enqualcomm.support.utils.TimeUtil;
+import com.enqualcomm.support.utils.Util;
+import com.enqualcomm.support.utils.VibrateUtil;
+import com.enqualcomm.support.utils.WakeLockUtil;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Locale;
+
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+import static android.content.Intent.FLAG_INCLUDE_STOPPED_PACKAGES;
+import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;
+import static com.enqualcomm.support.Constants.ACTION_REMOTE_CAMERA;
+import static com.enqualcomm.support.Constants.DIALOG_ACTION;
+import static com.enqualcomm.support.LocationClient.LOCATION_MODE;
+import static com.enqualcomm.support.bean.Contact.GROUP_ALL;
+import static java.lang.Math.abs;
+
+public class protocol_ic {
+ private static final String TAG = "ICSrv." + protocol_ic.class.getSimpleName();
+
+ private static final String CMDHEADER = "IW";
+ private static final String CMDEND = "#";
+ private static final String CMDSPLIT = ",";
+ public static final String defaultServerIP="watch.jiai.pro";
+ public static final int defaultServerPort=8090;
+ public enum CMD_TYPE {
+ /*终端发起*/
+ AP00,//登录包
+ BP00,
+ AP01,//混合定位
+ BP01,
+ AP02,//多基站定位
+ BP02,
+ AP92,//CDMA 混合定位
+ BP92,
+ AP94,
+ BP94,
+ AP03,//心跳包
+ BP03,
+ AP05,//语音查询接收
+ BP05,
+ AP07,//语音上行
+ BP07,
+ AP10,//报警与地址回复
+ BP10,
+ AP49,//心率上传
+ BP49,
+ APHT,//心率血压上传
+ BPHT,
+ APTM,//基站校时及获取定位
+ BPTM,
+ APCH,//充电提示
+ BPCH,
+ APBR,//上传蓝牙扫描结果
+ BPBR,
+ /* 服务器发起*/
+ AP12,
+ BP12,//SOS 号码设置
+ AP14,
+ BP14,//设置联系人白名单
+ AP15,
+ BP15,//设置定位周期
+ AP16,
+ BP16,//立即定位
+ AP17,
+ BP17,//恢复出厂设置
+ AP18,
+ BP18,//重启设备
+ AP21,
+ BP21,//设置计步开关
+ AP28,
+ BP28, //语音下行
+ AP31,
+ BP31,//关机
+ AP33,
+ BP33,//工作模式
+ AP34,
+ BP34,//自定义工作模式
+ AP40,
+ BP40,//下发文本
+ AP68,
+ BP68,//绑定解绑
+ APXL,
+ BPXL,//测量心率
+ APXY,
+ BPXY,//测量血压
+ APJZ,
+ BPJZ,//血压校准
+ AP84,
+ BP84,//白名单开关
+ AP85,
+ BP85,//设置闹钟
+ AP86,
+ BP86,//绑定解绑
+ AP87,
+ BP87,//二维码更新
+ AP88,
+ BP88,//查找手表
+ AP89,
+ BP89,//心率血压阀值设置
+ APTE,
+ BPTE,//体温间隔设置
+ APTP,
+ BPTP,//体温上行
+ APX1,
+ BPX1,//心率血压血氧修正
+ APS4,
+ BPS4,//提醒设置(时间段)
+ APHP,//上报心率血压血氧
+ BPHP,
+ APDE,//进出围栏通知
+ BPDE,
+ APDG,//体温阀值设置
+ BPDG,
+ APTU,//上传语音图片
+ BPTU,
+ APSL,//上传睡眠数据
+ BPSL,
+ AP46,//立即拍照
+ BP46,
+ APDH,//聆听
+ BPDH,
+ AP99,//监听电话
+ BP99,
+ APTQ,//天气
+ BPTQ,
+ APAT,//剪断消息开关
+ BPAT,
+ APBT,
+ BPBT,//设置蓝牙扫描间隔
+ APWL,
+ BPWL,//设置白名单
+ AP65,
+ BP65,//设置音量
+ AP47,
+ BP47,//设置震动
+ UNKNOWN_CMD,
+ }
+
+ private static HashMap<CMD_TYPE, String> cmdMap = null;
+
+ static {
+ cmdMap = new HashMap<CMD_TYPE, String>();
+ cmdMap.put(CMD_TYPE.AP00, "AP00");
+ cmdMap.put(CMD_TYPE.BP00, "BP00");
+ cmdMap.put(CMD_TYPE.AP01, "AP01");
+ cmdMap.put(CMD_TYPE.BP01, "BP01");
+ cmdMap.put(CMD_TYPE.AP02, "AP02");
+ cmdMap.put(CMD_TYPE.BP02, "BP02");
+ cmdMap.put(CMD_TYPE.AP92, "AP92");
+ cmdMap.put(CMD_TYPE.BP92, "BP92");
+ cmdMap.put(CMD_TYPE.AP94, "AP94");
+ cmdMap.put(CMD_TYPE.BP94, "BP94");
+ cmdMap.put(CMD_TYPE.AP03, "AP03");
+ cmdMap.put(CMD_TYPE.BP03, "BP03");
+ cmdMap.put(CMD_TYPE.AP05, "AP05");
+ cmdMap.put(CMD_TYPE.BP05, "BP05");
+ cmdMap.put(CMD_TYPE.AP07, "AP07");
+ cmdMap.put(CMD_TYPE.BP07, "BP07");
+ cmdMap.put(CMD_TYPE.AP10, "AP10");
+ cmdMap.put(CMD_TYPE.BP10, "BP10");
+ cmdMap.put(CMD_TYPE.AP49, "AP49");
+ cmdMap.put(CMD_TYPE.BP49, "BP49");
+ cmdMap.put(CMD_TYPE.APHT, "APHT");
+ cmdMap.put(CMD_TYPE.BPHT, "BPHT");
+ cmdMap.put(CMD_TYPE.APTM, "APTM");
+ cmdMap.put(CMD_TYPE.BPTM, "BPTM");
+ cmdMap.put(CMD_TYPE.APCH, "APCH");
+ cmdMap.put(CMD_TYPE.BPCH, "BPCH");
+ cmdMap.put(CMD_TYPE.APBR, "APBR");
+ cmdMap.put(CMD_TYPE.BPBR, "BPBR");
+ /* 服务器发起*/
+ cmdMap.put(CMD_TYPE.AP12, "AP12");
+ cmdMap.put(CMD_TYPE.BP12, "BP12");
+ cmdMap.put(CMD_TYPE.AP14, "AP14");
+ cmdMap.put(CMD_TYPE.BP14, "BP14");
+ cmdMap.put(CMD_TYPE.AP15, "AP15");
+ cmdMap.put(CMD_TYPE.BP15, "BP15");
+ cmdMap.put(CMD_TYPE.AP16, "AP16");
+ cmdMap.put(CMD_TYPE.BP16, "BP16");
+ cmdMap.put(CMD_TYPE.AP17, "AP17");
+ cmdMap.put(CMD_TYPE.BP17, "BP17");
+ cmdMap.put(CMD_TYPE.AP18, "AP18");
+ cmdMap.put(CMD_TYPE.BP18, "BP18");
+ cmdMap.put(CMD_TYPE.AP21, "AP21");
+ cmdMap.put(CMD_TYPE.BP21, "BP21");
+ cmdMap.put(CMD_TYPE.AP28, "AP28");
+ cmdMap.put(CMD_TYPE.BP28, "BP28");
+ cmdMap.put(CMD_TYPE.AP31, "AP31");
+ cmdMap.put(CMD_TYPE.BP31, "BP31");
+ cmdMap.put(CMD_TYPE.AP33, "AP33");
+ cmdMap.put(CMD_TYPE.BP33, "BP33");
+ cmdMap.put(CMD_TYPE.AP34, "AP34");
+ cmdMap.put(CMD_TYPE.BP34, "BP34");
+ cmdMap.put(CMD_TYPE.AP40, "AP40");
+ cmdMap.put(CMD_TYPE.BP40, "BP40");
+ cmdMap.put(CMD_TYPE.AP68, "AP68");
+ cmdMap.put(CMD_TYPE.BP68, "BP68");
+ cmdMap.put(CMD_TYPE.APXL, "APXL");
+ cmdMap.put(CMD_TYPE.BPXL, "BPXL");
+ cmdMap.put(CMD_TYPE.APXY, "APXY");
+ cmdMap.put(CMD_TYPE.BPXY, "BPXY");
+ cmdMap.put(CMD_TYPE.APJZ, "APJZ");
+ cmdMap.put(CMD_TYPE.BPJZ, "BPJZ");
+ cmdMap.put(CMD_TYPE.AP84, "AP84");
+ cmdMap.put(CMD_TYPE.BP84, "BP84");
+ cmdMap.put(CMD_TYPE.AP85, "AP85");
+ cmdMap.put(CMD_TYPE.BP85, "BP85");
+ cmdMap.put(CMD_TYPE.AP86, "AP86");
+ cmdMap.put(CMD_TYPE.BP86, "BP86");
+ cmdMap.put(CMD_TYPE.AP87, "AP87");
+ cmdMap.put(CMD_TYPE.BP87, "BP87");
+ cmdMap.put(CMD_TYPE.AP88, "AP88");
+ cmdMap.put(CMD_TYPE.BP88, "BP88");
+ cmdMap.put(CMD_TYPE.AP89, "AP89");
+ cmdMap.put(CMD_TYPE.BP89, "BP89");
+ cmdMap.put(CMD_TYPE.APTE, "APTE");
+ cmdMap.put(CMD_TYPE.BPTE, "BPTE");
+ cmdMap.put(CMD_TYPE.APTP, "APTP");
+ cmdMap.put(CMD_TYPE.BPTP, "BPTP");
+ cmdMap.put(CMD_TYPE.APX1, "APX1");
+ cmdMap.put(CMD_TYPE.BPX1, "BPX1");
+ cmdMap.put(CMD_TYPE.APS4, "APS4");
+ cmdMap.put(CMD_TYPE.BPS4, "BPS4");
+ cmdMap.put(CMD_TYPE.APHP, "APHP");
+ cmdMap.put(CMD_TYPE.BPHP, "BPHP");
+ cmdMap.put(CMD_TYPE.APDE, "APDE");
+ cmdMap.put(CMD_TYPE.BPDE, "BPDE");
+ cmdMap.put(CMD_TYPE.APDG, "APDG");
+ cmdMap.put(CMD_TYPE.BPDG, "BPDG");
+ cmdMap.put(CMD_TYPE.APTU, "APTU");
+ cmdMap.put(CMD_TYPE.BPTU, "BPTU");
+ cmdMap.put(CMD_TYPE.APSL, "APSL");
+ cmdMap.put(CMD_TYPE.BPSL, "BPSL");
+ cmdMap.put(CMD_TYPE.AP46, "AP46");
+ cmdMap.put(CMD_TYPE.BP46, "BP46");
+ cmdMap.put(CMD_TYPE.APDH, "APDH");
+ cmdMap.put(CMD_TYPE.BPDH, "BPDH");
+ cmdMap.put(CMD_TYPE.AP99, "AP99");
+ cmdMap.put(CMD_TYPE.BP99, "BP99");
+ cmdMap.put(CMD_TYPE.APTQ, "APTQ");
+ cmdMap.put(CMD_TYPE.BPTQ, "BPTQ");
+ cmdMap.put(CMD_TYPE.APAT, "APAT");
+ cmdMap.put(CMD_TYPE.BPAT, "BPAT");
+ cmdMap.put(CMD_TYPE.APBT, "APBT");
+ cmdMap.put(CMD_TYPE.BPBT, "BPBT");
+ cmdMap.put(CMD_TYPE.APWL, "APWL");
+ cmdMap.put(CMD_TYPE.BPWL, "BPWL");
+ cmdMap.put(CMD_TYPE.AP65, "AP65");
+ cmdMap.put(CMD_TYPE.BP65, "BP65");
+ cmdMap.put(CMD_TYPE.AP47, "AP47");
+ cmdMap.put(CMD_TYPE.BP47, "BP47");
+ }
+
+
+ private Connection mConnection=null;
+ private Runtime mRuntime=null;
+
+ public protocol_ic(Connection connect, Runtime runtime) {
+ mConnection=connect;
+ mRuntime=runtime;
+
+ }
+
+ private StringBuffer cmdbuf = new StringBuffer();
+
+ /*
+ 输入的字符串,如果有完整命令,返回 命令名
+ 否则返回 空字符串
+ */
+ public static String isCmdStr(String msg) {
+
+ int head_index = msg.indexOf(CMDHEADER);
+ if (head_index >= 0) {
+ int end_index = msg.indexOf("#", head_index);
+ if (end_index < 0) {
+
+ return "";
+ }
+ }else{
+ return "";
+ }
+
+ for (CMD_TYPE key : cmdMap.keySet()) {
+ if (msg.startsWith(CMDHEADER + cmdMap.get(key))) {
+ ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key));
+ return cmdMap.get(key);
+ }
+ }
+
+ return "";
+ }
+
+ private void log(String msg) {
+ ICLogger.log(TAG, msg);
+ }
+
+ private void log(String function, String msg) {
+ ICLogger.log(TAG, function, msg);
+ }
+
+
+
+ /**/
+ public static StringMessage genStringMessage(String cmdName, String msg){
+ StringMessage sm=new StringMessage(new String[]{cmdName,msg});
+ sm.refresh(msg);
+ sm.setDate(TimeUtil.getSystemDateYYMMDD(),TimeUtil.getSystemTimeHHmmss());
+ return sm;
+ }
+ /*
+ 返回true 表示 cmd 全部解析成功
+ 返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用
+ 字符串通过#号进行识别。
+ 每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃
+ */
+ public boolean parserCmd(byte[] bytes) {
+ boolean iscmdComplete = false;
+ boolean ret = true;
+ String last_inCompletecmd = "";
+ String cmd_msgbuf=new String(bytes);
+ log("bytes.size "+bytes.length);
+// cmdbuf.append(cmd_msgbuf);
+ cmdbuf.append(cmd_msgbuf);
+ log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString());
+ /*
+ 如果不是 #结尾,就认为 接收数据不全,置位。
+ */
+ if (cmdbuf.toString().endsWith(CMDEND)) {
+ iscmdComplete = true;
+ }
+ String[] cmdlist = cmd_msgbuf.split(CMDEND);
+ int listlen = cmdlist.length;
+ log("listlen "+listlen);
+ /*
+ 如果解析出来的cmdlist不是空,且数据不是完整cmd则保留 最后一条数据到last_inCompletecmd
+ */
+ if (cmdlist.length > 0 && iscmdComplete == false) {
+ listlen -= 1;
+ last_inCompletecmd = cmdlist[listlen];
+ log("cmd not complete , " + last_inCompletecmd);
+ }
+ for (int i = 0; i < listlen; i++) {
+ for (CMD_TYPE key : cmdMap.keySet()) {
+ if (cmdlist[i].startsWith(CMDHEADER + cmdMap.get(key))) {
+ log("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdlist[i]);
+ if (key == CMD_TYPE.BP28) {
+ //如果是BP28则 后面的数据是音频,需要保留
+ byte[] amrBuf;
+ int amrLen = getBP28Amrlen(cmdlist[i] );
+ if (bytes.length > amrLen) {
+ handleCmd(key, cmdlist[i], bytes);
+ }
+ } else {
+ handleCmd(key, cmdlist[i]);
+ }
+ }
+ }
+ }
+
+ cmdbuf = new StringBuffer().append(last_inCompletecmd);
+ return ret;
+ }
+ public int getBP28Amrlen(String cmd) {
+
+ String Name;
+ String appendIndex;
+ int packetCount;
+ int currentId;
+ int packetLen;
+
+
+ String[] msg=cmd.split(CMDSPLIT);
+ if (msg.length>=6){
+ try {
+ Name = msg[1];
+ appendIndex = msg[2];
+ packetCount = Integer.parseInt(msg[3]);
+ currentId = Integer.parseInt(msg[4]);
+ packetLen = Integer.parseInt(msg[5]);
+
+ StringBuffer stringBuffer = new StringBuffer();
+ stringBuffer.append("getBP28AmrLen name = ").append(Name)
+ .append(",appendIndex = ").append(appendIndex)
+ .append(",packetCount = ").append(packetCount)
+ .append(",currentId = ").append(currentId)
+ .append(",packetLen = ").append(packetLen);
+
+
+ log(stringBuffer.toString());
+ return packetLen;
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+
+ }else{
+ log("getBP28AmrLen","format Error");
+
+ }
+ return -1;
+ }
+ /*登录*/
+ public static StringMessage AP00(Runtime ds) {
+ //示例数据:IWAP00867155030001063#
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP00),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP00)).append(ds.IMEI()).append(CMDEND).toString());
+ }
+
+ //处理 登录 BP00
+ public void handleBP00(Runtime runtime,String cmd){
+ String[] msg=cmd.split(CMDSPLIT);
+// get Msg :IWBP00,20191229171933,8# (size)24
+// 12-30 01:19:33.861 6492-6492/com.enqualcomm.support I/ICSrv.protocolAPIHelper: found cmd keyid=BP00 ,keyname=BP00 , IWBP00,20191229171933,8
+
+ if (msg.length>=3) {
+ log("handleBP00", "Set Datetime " + msg[1]);
+ log("handleBP00", "Set TimeZone " + msg[2]);
+ try {
+ Date datetime = TimeUtil.parseDatetiime(msg[1]);
+ int timezone = Integer.parseInt(msg[2]);
+ if (datetime != null) {
+ ICLogger.i("===" + TimeUtil.getDefaultTimeZone());
+ TimeUtil.setTimeZone(timezone);
+
+
+ ICLogger.i("===" + TimeUtil.getDefaultTimeZone());
+ TimeUtil.setSysDateTime(runtime.getContextProxy().context, datetime, timezone);
+ ICLogger.i("===" + TimeUtil.getDefaultTimeZone());
+
+ }
+ }catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+// Set Datetime 20200505112734
+// Set TimeZone 8
+
+ }else{
+ log("handleBP00","format Error");
+ }
+ }
+
+
+ public static StringMessage AP03(Runtime ds) {
+ //示例数据:IWAP03,06000908000102,5555,30# IWAP03,000000null00000,0,0#
+ //IW: 标识符
+ //AP03:命令字
+ //设备在静止时,可以通过该指令与平台保持连接和解决静态漂移
+ //06000908000102:
+ //060为GSM信号,
+ //009为参与定位的卫星数,
+ //080为电池电量,
+ //0 为保留位,
+ //01为设防状态,此处由两位十六进制表示,无取值时为 00 ,长度必需为两位,一共 8个bit 表示8种状态,各bit定义如下:(未列出的为当前未使用, 1表示有效 ,0 表示无效)
+ //Bit0 设防状态<手表无效>
+ //Bit1 为 1 表示夜灯为开,为0 夜灯为 关
+ //02为工作模式 ,(设防,工作模式如果为00,则代表无或未设置)
+ //5555: 计步步数,每次到达 9999 后重 0 开始计 (此处 9999 为示例,可以为2字节int 然后溢出归零)
+ //30: 翻滚次数
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP03),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP03)).append(CMDSPLIT).append(String.format("%03d",abs(ds.getSignalStrength())))
+ .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append(ds.isPowerConnected()?"1":"0")
+ .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)
+ .append(ds.getTotalStepCount()).append(CMDSPLIT).append(ds.getRolltimes()).append(CMDEND).toString());
+ }
+ //处理 心跳 BP03
+ public void handleBP03(String cmd){
+
+ log("BP03心跳接收成功");
+ }
+
+
+ public static StringMessage AP10(Runtime ds){
+
+ /**
+ * IWAP10080524A2232.9806N11404.9355E000.1061830323.8706000908000502,
+ * 460,0,9520,3671,
+ * 00,zh-cn,00,
+ * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05:剪断报警,06:跌倒报警,07:心率异常, 08:心率过高, 09:心率过低,10:收缩压过高,11:收缩压过低,12:舒张压过高,13:舒张压过低,14:久坐提醒,15:非法解锁(剪断报警),16:锁定提醒(佩戴提醒),17:体温过高,18体温过低)
+ * zh-cn:设备语言
+ * 00:第一个0:是否需要回复地址信息,0:不回复,1回复.
+ * HOME|74-DE-2B-44-88-8C|97&HOME1|74-DE-2B-44-88-8C|97&HOME2|74-DE-2B-44-88-8C|97&HOME3|74-DE-2B-44-88-8C|97#
+ */
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP10),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP10)).append(TimeUtil.getShortDate())
+ .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading())
+ .append(String.format("%03d",abs(ds.getSignalStrength())))
+ .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")
+ .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)
+ .append(ds.getLBSData()).append(CMDSPLIT)
+ .append(ds.getAlarmType()).append(CMDSPLIT)
+ .append(ds.getLanguage()).append(CMDSPLIT)
+ .append("00").append(CMDSPLIT) //不回复地址
+ .append(ds.getWifiInfo()).append(CMDEND).toString());
+
+ }
+
+ /*LBS+GPS混合定位*/
+ public static StringMessage AP01(Runtime ds) {
+ //示例数据:IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102,
+ // 460,0,9520,3671,
+ // Home|74-DE-2B-44-88-8C|97& Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97& Home3|74-DE-2B-44-88-8C|97#
+// IWAP01191230A2232.9807N11404.9355E000.1161320000.0006000910000000,460,00,9520,3671,#
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP01),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP01)).append(TimeUtil.getShortDate())
+ .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength())))
+ .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")
+ .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)
+ .append(ds.getLBSData()).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString());
+ }
+
+ //处理 定位 BP01
+ public void handleBP01(String cmd){
+ log("BP01定位接收成功");
+ }
+
+
+
+ /*LBS+WiFi混合定位*/
+ public static StringMessage AP02(Runtime ds) {
+ //示例数据:IWAP02,
+ // zh_cn,
+ // 0,
+ // 7,
+ // 460,0,
+ // 9520|3671|13,9520|3672|12,9520|3673|11,9520|3674|10,9520|3675|9,9520|3676|8,9520|3677|7,
+ // 4,
+ // 1|D8-24-BD-79-FA-1F|59&2|3C-46-D8-6D-CE-01|81&3|0C-4C-39-1A-7C-65|69&4|70-A8-E3-5D-D7-C0|65#
+// IW标识符
+// AP02:命令字
+// zh_cn: 语言标志
+// 0:回复标识,为0时不回复地址,为 1 时,服务器回复地址信息
+// 7: 表示共有7组基站
+// 460: MCC 国家码
+// 0: MNC运营商代码
+// 9520|3671|10: LAC|CID|dbm表示一组基站信息,后面数量需和基站组数地应 10:dbm为信号强度多基站信号强度建议从高到低排列后上传,信号强度转正数:150 – abs(dbm)
+// 4: 表示WIFI组数,
+// 1|D8-24-BD-79-FA-1F|59: ssid|mac地址|信号强度,信号强度转正数:150 – abs(信号强度)
+
+ int apsum=0;
+ String wifiinfo=ds.getWifiInfo();
+ if (!wifiinfo.isEmpty()) {
+ String[] list = wifiinfo.split("&");
+ apsum = list.length;
+ }
+
+ ICLogger.i("Wifi ap sum "+apsum);
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP02),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP02)).append(CMDSPLIT)
+ .append(ds.getLanguage()).append(CMDSPLIT)
+ .append(0).append(CMDSPLIT) //为0时不回复地址
+ .append(ds.getLBSMultiStationData()).append(CMDSPLIT) //基站信息数据
+ .append(apsum).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString()); //wifi信息数据
+ }
+
+ //处理 定位 BP01
+ public void handleBP02(String cmd){
+ log("BP02定位接收成功");
+ }
+
+
+
+ public static StringMessage APXL(String id){
+//设备响应: IWAPXL,080835#
+ //080835:指令流水号
+ return genStringMessage(cmdMap.get(CMD_TYPE.APXL),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXL))
+ .append(CMDSPLIT).append(id)
+ .append(CMDEND).toString());
+ }
+
+ /**
+ * 测量心率
+ * @param cmd
+ * @param connection
+ */
+ public void handleBPXL(String cmd, Connection connection){
+ //IWBPXL,353456789012345,080835#
+ //说明:
+ //IW:标识符
+ //BPXL : 命令字符
+ //353456789012345:IMEI号,设备唯一ID
+ //080835 :指令流水号
+ //设备响应: IWAPXL,080835#
+ //080835:指令流水号
+ String[] list=cmd.split(CMDSPLIT);
+ if (list.length==3){
+ String index=list[2];
+ String imei=list[1];
+ ICLogger.i("Handle BPXL IMEI "+imei+",index "+index);
+ connection.send(APXL(index));
+ }else{
+ ICLogger.i("BPXL format error!");
+ }
+
+ }
+
+ public static StringMessage APXY(String id){
+//设备响应: IWAPXY,080835#
+ //080835:指令流水号
+ return genStringMessage(cmdMap.get(CMD_TYPE.APXY),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXY))
+ .append(CMDSPLIT).append(id)
+ .append(CMDEND).toString());
+ }
+
+ /**
+ * 测量血压
+ * @param cmd
+ * @param connection
+ */
+ public void handleBPXY(String cmd,Connection connection){
+ //IWBPXY,353456789012345,080835#
+ //说明:
+ //IW:标识符
+ //BPXL : 命令字符
+ //353456789012345:IMEI号,设备唯一ID
+ //080835 :指令流水号
+ //设备响应: IWAPXY,080835#
+ //080835:指令流水号
+ String[] list=cmd.split(CMDSPLIT);
+ if (list.length==3){
+ String index=list[2];
+ String imei=list[1];
+ ICLogger.i("Handle BPXY IMEI "+imei+",index "+index);
+ connection.send(APXY(index));
+ }else{
+ ICLogger.i("BPXY format error!");
+ }
+
+ }
+
+
+
+ public static StringMessage APJZ(String id,String BPH,String BPL,String Age,String Sex){
+ //设备响应: IWAPJZ,792997,120,85,42,1#
+ //792997:指令流水号
+ // 高压120,低压85,年龄42,1 男性
+ return genStringMessage(cmdMap.get(CMD_TYPE.APJZ),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APJZ))
+ .append(CMDSPLIT).append(id)
+ .append(CMDSPLIT).append(BPH)
+ .append(CMDSPLIT).append(BPL)
+ .append(CMDSPLIT).append(Age)
+ .append(CMDSPLIT).append(Sex)
+ .append(CMDEND).toString());
+ }
+
+ /**
+ *
+ * @param cmd
+ * @param connection
+ * @param runtime
+ */
+ public void handleBPJZ(String cmd,Connection connection,Runtime runtime){
+ //cmdbuf.size 42 IWBPJZ,867155030001063,199600,120,85,45,1# 高压120,低压85,年龄45,男性
+// cmdbuf.size 42 IWBPJZ,867155030001063,909957,120,85,42,0# 高压120,低压85,年龄42,女性
+ //IWBPJZ,353456789012345,080835,110,75#
+ //说明:
+ //IW:标识符
+ //BPJZ : 命令字符
+ //353456789012345:IMEI号,设备唯一ID
+ //110:高压值
+ //75:低压值
+ //080835 :指令流水号
+ //设备响应: IWAPJZ,792997,120,85,42,1#
+ //792997:指令流水号
+ String[] list=cmd.split(CMDSPLIT);
+ if (list.length==7){
+ try {
+ String index = list[2];
+ String imei = list[1];
+ String strBPH = list[3];
+ String strBPL = list[4];
+ String strAge = list[5];
+ String strSex = list[6];
+
+ connection.send(APJZ(index, strBPH, strBPL, strAge, strSex));
+ runtime.getHRS().setXY_Ref(Integer.parseInt(strBPH), Integer.parseInt(strBPL), Integer.parseInt(strAge), Integer.parseInt(strSex));
+ ICLogger.i("Handle BPJZ IMEI " + imei + ",index " + index + ", BPH " + strBPH + ", BPL " + strBPL + ", Age " + strAge + ", Sex " + (strSex.equals("1") ? "男" : "女"));
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+ }else{
+ ICLogger.i("BPXY format error!");
+ }
+ }
+
+
+
+ //重启
+
+
+ public static StringMessage AP18(String index){
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP18),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP18))
+ .append(CMDSPLIT).append(index)
+ .append(CMDEND).toString());
+ }
+
+ public void handleBP18(Connection connection,String cmd) {
+
+ // IWBP18,867155030001063,161723
+ String[] cmdlist=cmd.split(CMDSPLIT);
+ if (cmdlist.length==3) {
+
+ connection.send(AP18(cmdlist[2]));
+
+ }
+ }
+ //恢复出厂设置
+
+ public static StringMessage AP17(String index){
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP17),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP17))
+ .append(CMDSPLIT).append(index)
+ .append(CMDEND).toString());
+ }
+ public void handleBP17(Connection connection,String cmd) {
+
+ // IWBP17,867155030001063,161723
+ String[] cmdlist=cmd.split(CMDSPLIT);
+ if (cmdlist.length==3) {
+
+ connection.send(AP17(cmdlist[2]));
+
+ }
+ }
+
+ //关机
+
+
+ public static StringMessage AP31(String index){
+ return genStringMessage("AP31",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP31))
+ .append(CMDSPLIT).append(index)
+ .append(CMDEND).toString());
+ }
+ public void handleBP31(Connection connection,String cmd) {
+
+ // IWBP31,867155030001063,161723
+ String[] cmdlist=cmd.split(CMDSPLIT);
+ if (cmdlist.length==3) {
+
+ connection.send(AP31(cmdlist[2]));
+
+ }
+ }
+
+ //设置SOS号码
+ public static StringMessage AP12(String index,String phNum1,String phNum2,String phNum3){
+ return genStringMessage("AP12",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP12))
+ .append(CMDSPLIT).append(index)
+ .append(CMDSPLIT).append(phNum1)
+ .append(CMDSPLIT).append(phNum2)
+ .append(CMDSPLIT).append(phNum3)
+ .append(CMDEND).toString());
+ }
+
+ //设置SOS号码
+ public void handleBP12(Connection connection,String cmd,Runtime runtime){
+ // IWBP12,353456789012345,080835,135XXXXXXXX,135XXXXXXXX,135XXXXXXXX#
+ String[] cmdlist=cmd.split(CMDSPLIT);
+ if (cmdlist.length>=3){
+ String index=cmdlist[2];
+ String phNum1=cmdlist.length==3?"":cmdlist[3];
+ String phNum2=cmdlist.length>3?(cmdlist.length==4?"":cmdlist[4]):"";
+ String phNum3=(cmdlist.length>4)?(cmdlist.length==5? "":cmdlist[5]):"";
+ ICLogger.i(new StringBuffer().append("get Emegency Numbs "+phNum1+","+phNum2+","+phNum3).toString());
+ connection.send(AP12(index,phNum1,phNum2,phNum3));
+
+ ArrayList<Contact> contactArray=new ArrayList<Contact>();
+// if(Config.custom_branch_name.equals("AK")){
+//
+// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", "07522312120"));
+// if (!phNum1.isEmpty())
+// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos2", phNum1));
+// if (!phNum2.isEmpty())
+// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum2));
+// }else {
+ if (!phNum1.isEmpty())
+ contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", phNum1));
+ if (!phNum2.isEmpty())
+ contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos2", phNum2));
+ if (!phNum3.isEmpty())
+ contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum3));
+// }
+ runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);
+ }else{
+ ICLogger.i(" BP12 format error!");
+ }
+ }
+
+
+ public static StringMessage AP14(String index,String[] phnumbs){
+ return genStringMessage("AP14",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14))
+ .append(CMDSPLIT).append(index)
+ .append(CMDSPLIT).append(phnumbs[0])
+ .append(CMDSPLIT).append(phnumbs[1])
+ .append(CMDSPLIT).append(phnumbs[2])
+ .append(CMDSPLIT).append(phnumbs[3])
+ .append(CMDSPLIT).append(phnumbs[4])
+ .append(CMDSPLIT).append(phnumbs[5])
+ .append(CMDSPLIT).append(phnumbs[6])
+ .append(CMDSPLIT).append(phnumbs[7])
+ .append(CMDSPLIT).append(phnumbs[8])
+ .append(CMDSPLIT).append(phnumbs[9])
+ .append(CMDEND).toString());
+ }
+ //设置通讯录,白名单(10个)
+ public void handleBP14(Connection connection,String cmd , Runtime runtime){
+// IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,,
+/**
+ * IWBP14,353456789012345,080835,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx#
+ */
+ String[] cmdlist=cmd.split(CMDSPLIT);
+ String[] phnums=new String[]{"","","","","","","","","",""};
+ StringBuffer sb=new StringBuffer().append("recv phone Numbs ");
+ if (cmdlist.length>=3){
+ switch (cmdlist.length){
+ case 13:
+ phnums[9]=cmdlist[12];
+ sb.append(phnums[9]).append(",");
+ case 12:
+ phnums[8]=cmdlist[11];
+ sb.append(phnums[8]).append(",");
+ case 11:
+ phnums[7]=cmdlist[10];
+ sb.append(phnums[7]).append(",");
+ case 10:
+ phnums[6]=cmdlist[9];
+ sb.append(phnums[6]).append(",");
+ case 9:
+ phnums[5]=cmdlist[8];
+ sb.append(phnums[5]).append(",");
+ case 8:
+ phnums[4]=cmdlist[7];
+ sb.append(phnums[4]).append(",");
+ case 7:
+ phnums[3]=cmdlist[6];
+ sb.append(phnums[3]).append(",");
+ case 6:
+ phnums[2]=cmdlist[5];
+ sb.append(phnums[2]).append(",");
+ case 5:
+ phnums[1]=cmdlist[4];
+ sb.append(phnums[1]).append(",");
+ case 4:
+ phnums[0]=cmdlist[3];
+ sb.append(phnums[0]).append(",");
+
+ }
+
+ String index=cmdlist[2];
+ ICLogger.i(sb.toString());
+ connection.send(AP14(index,phnums));
+ ArrayList<Contact> contactArray=new ArrayList<Contact>();
+
+ if(Config.custom_name.equals("YT")) {
+ ICLogger.i("=====add hotline 96885 ");
+ contactArray.add(new Contact(Contact.CATEGORY_CALL, runtime.getContextProxy().context.getResources().getString(R.string.hotline), "96885"));
+ }
+ for (int i=0; i< phnums.length;i++){
+ String[] tmp= phnums[i].split("\\|");
+ if (tmp.length==2){
+ String name= Util.decodeUnicode2Utf8(tmp[0]);
+ String phonem=tmp[1];
+ ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem);
+ contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));
+ }else{
+ ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length);
+
+ }
+ }
+// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666"));
+// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666"));
+// contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666"));
+// contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666"));
+
+ runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false);
+
+ }else{
+ ICLogger.i(" BP14 format error!");
+ }
+
+ }
+
+
+
+ public static StringMessage AP85(Runtime ds,String cmddata){
+//示例数据:IWAP49,68##
+ return genStringMessage("AP85",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP85))
+ .append(CMDSPLIT).append(cmddata)
+ .append(CMDEND).toString());
+
+ }
+ //设置闹钟
+ public void handleBP85(String cmd , Connection connection,Runtime runtime){
+// IWBP85,867155030001063,155312,1,1,0235,12,1,1
+// IWBP85,867155030002145,945166,1,0,
+// IWBP85,867155030001064,265960,1,1,1130,,1,1
+// IWBP85,353456789012345,080835,1,3, 0900,135,1,1@0900 ,135,1,2@0900 ,135,1,3#
+//353456789012345:IMEI号,设备唯一ID
+//080835 :指令流水号
+//1: 表示闹钟总开关,1为开,0 为关
+//3: 表示闹钟个数
+//0900 ,135,1,1,表示一组闹钟,0900表示早上09:00, 135表示周一周三周五,使用24小时制
+//1表示该组闹钟开启或关闭状态 1表示开启 0表示关闭
+//1表示吃药提醒
+//2 表示喝水提醒
+//3 表示久坐提醒
+//多组闹钟之间用”@”符号分隔
+
+ String imei="",cmdindex="0"/*指令流水号*/;
+ int all_alarmswitch=0 /*总开关 1为开,0 为关*/,
+ alarmswitch=0 /*1为开,0 为关*/,
+ alarmcount=0 /*表示闹钟个数*/;
+ String alarmtime="";//0900表示早上09:00
+ int alarmtype=1; //1表示吃药提醒 , 2 表示喝水提醒 ,3 表示久坐提醒
+ String repeat="";// 135表示周一周三周五,使用24小时制
+ String[] datalist= cmd.split("@");
+ ArrayList<Alarm> alarmlist=new ArrayList<>();
+ if (datalist.length >0){
+ for (int i =0 ; i< datalist.length;i++){
+ String [] cmdarglist=datalist[i].split(",");
+
+ if (i == 0){
+ if (cmdarglist.length == 9){
+ try {
+ imei = cmdarglist[1];
+ cmdindex = cmdarglist[2];
+ all_alarmswitch = Integer.parseInt(cmdarglist[3]);
+ alarmcount = Integer.parseInt(cmdarglist[4]);
+ alarmtime = cmdarglist[5];
+ repeat = cmdarglist[6];
+ alarmswitch = Integer.parseInt(cmdarglist[7]);
+ alarmtype = Integer.parseInt(cmdarglist[8]);
+ log(new StringBuilder("imei ").append(imei)
+ .append(", cmdindex ").append(cmdindex)
+ .append(", allswitch=").append(all_alarmswitch)
+ .append(", all alarm count=").append(alarmcount)
+ .toString()
+ );
+
+ log(new StringBuilder("alarmtime ").append(alarmtime)
+ .append(", relpeat ").append(repeat)
+ .append(", switch=").append(alarmswitch)
+ .append(", alarmtype=").append(alarmtype)
+ .toString()
+ );
+ alarmlist.add(new Alarm("ST" + alarmtime.substring(0, 2) + "." + alarmtime.substring(2), "W" + repeat, "CON", alarmswitch == 1 ? "ON" : "OFF", "闹铃"));
+ }catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+ }else if (cmdarglist.length == 5) {
+ try {
+ imei = cmdarglist[1];
+ cmdindex = cmdarglist[2];
+ all_alarmswitch = Integer.parseInt(cmdarglist[3]);
+ alarmcount = Integer.parseInt(cmdarglist[4]);
+ }catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+ }else{
+ log("data len is too small!");
+ }
+ }else{
+ if (cmdarglist.length == 4){
+ try {
+ alarmtime = cmdarglist[0];
+ repeat = cmdarglist[1];
+ alarmswitch = Integer.parseInt(cmdarglist[2]);
+ alarmtype = Integer.parseInt(cmdarglist[3]);
+
+ log(new StringBuilder("set alarmtime ").append(alarmtime)
+ .append(", relpeat ").append(repeat)
+ .append(", switch=").append(alarmswitch)
+ .append(", alarmtype=").append(alarmtype)
+ .toString()
+ );
+
+ alarmlist.add(new Alarm("ST" + alarmtime.substring(0, 2) + "." + alarmtime.substring(2), "W" + repeat, "CON", alarmswitch == 1 ? "ON" : "OFF", "闹铃"));
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+ }else{
+ log("data len is too small!");
+ }
+
+ }
+ }//循环获取alarm数据结束
+ runtime.getDbHelper().saveAlarm(alarmlist);
+
+ //do clean and set alarm things
+
+ }
+//IWBP85,867155030002145,410385,1,0,#
+
+ String replacement=new StringBuilder("IWBP85,").append(imei).append(",").toString();
+ String replycmd = cmd.replace(replacement,"");
+ ICLogger.i("gen reply "+replacement+" "+replycmd);
+ connection.send(AP85(runtime,replycmd));
+ }
+
+
+// AP05命令L02服务器不适用
+// public static String AP05(boolean recvFlag){
+//
+//// IWAP05,1#
+// return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP05))
+// .append(CMDSPLIT).append(recvFlag?1:0)
+// .append(CMDEND).toString();
+//
+// }
+//
+//
+// public void handleBP05(String cmd){
+//// IWBP05,6#
+// String[] cmdlist=cmd.split(CMDSPLIT);
+// if (cmdlist.length>1){
+// ICLogger.i(" 服务器有 " +cmdlist[1]+" 条语音未接收!");
+// }
+// }
+
+
+
+
+ public static byte[] AP07(String packetTime,int count,int index,int datalen,byte[] amrdata){
+//IWAP07,20140818064408,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#
+//说明:
+//IW:标识符
+//AP07 : 命令字符
+//20140818064408 :yyyyMMddHHmmss 格式的年月日时分秒,设备录音时间
+//6:语音包分包总数
+//1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同
+//1024 :语音包长度
+//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数
+//语音包上传规则:
+//按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。
+//收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。
+//如果设备回复确认数据包接收失败状态,则重复发送上一个数据包
+
+
+ String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP07))
+ .append(CMDSPLIT).append(packetTime)
+ .append(CMDSPLIT).append(count)
+ .append(CMDSPLIT).append(index)
+ .append(CMDSPLIT).append(datalen)
+ .append(CMDSPLIT).toString();
+
+ byte[] sentbuf=new byte[sb.length()+datalen+1];
+ System.arraycopy(sb.getBytes(),0,sentbuf,0,sb.length());
+ System.arraycopy(amrdata,0,sentbuf,sb.length(),datalen);
+ sentbuf[sb.length()+datalen]='#';
+
+ return sentbuf;
+
+ }
+
+
+ public void handleBP07(String cmd , Connection connection ){
+//平台响应: IWBP07,20140818064408,6,1,1#
+//20140818064408:设备语音时间,yyyyMMddHHmmss 格式的年月日时分秒
+//6:语音包分包总数
+//1:当前设备收到的是第几个包
+//1:表示服务器接受数据成功,0表示服务器接受数据失败
+ String[] cmdlist=cmd.split(CMDSPLIT);
+ if (cmdlist.length==5){
+ try {
+ String time = cmdlist[1];
+ int packetCount = Integer.parseInt(cmdlist[2]);
+ int packetIndex = Integer.parseInt(cmdlist[3]);
+ int receiveSuccess = Integer.parseInt(cmdlist[4]);
+ ICLogger.i("服务器在" + time + " 收到语音 " + packetIndex + "/" + packetCount + " " + (receiveSuccess == 1 ? "成功" : "失敗"));
+ if (receiveSuccess == 1) {
+ //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送
+ voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);
+ }
+ //发送消息,再次检查要发送的语音包,确认其发送完毕
+ connection.DeliverCMDMessageToSystem("SentVoicePacket", "SentVoicePacket");
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+ }else{
+ ICLogger.i(" BP07 Format error!");
+ }
+ }
+
+
+
+ public static StringMessage AP33(String cmdindex,int workMode){
+//IWAP33,080835,1#
+//080835:指令流水号
+//1:设置信息,供服务器同步
+ return genStringMessage("AP33",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP33))
+ .append(CMDSPLIT).append(cmdindex)
+ .append(CMDSPLIT).append(workMode)
+ .append(CMDEND).toString());
+ }
+
+ //设置工作模式
+ public void handleBP33(Connection connection,Runtime runtime,String cmd){
+
+// IWBP33,867155030001063,560555,1
+// IW:标识符
+// BP33 : 命令字符
+// 353456789012345:IMEI号,设备唯一ID
+// 080835:指令流水号
+// 1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式
+
+ String[] cmdlist=cmd.split(",");
+ if (cmdlist.length == 4){
+
+
+ log("work mode "+cmdlist[3]);
+ try {
+ int mod = Integer.parseInt(cmdlist[3]);
+ int Cycle = 900;
+ switch (mod) {
+ case ICLocation.NORMAL_MOD:
+ Cycle = 900;
+ break;
+ case ICLocation.LOWPOWER_MOD:
+ Cycle = 3600;
+ break;
+ case ICLocation.EMERGNECY_MOD:
+ case ICLocation.REALTIME_MOD:
+ Cycle = 60;
+ break;
+
+ }
+
+ StringMessage msg = AP33(cmdlist[2], mod);
+ //设定当前工作模式及循环频率
+ connection.send(msg);
+ log("reply msg " + msg);
+ log("LOCATION_MODE " + LOCATION_MODE + " mod " + mod);
+ Config.setLocationMode(runtime.getContextProxy().context, mod);
+ Config.setLocationCycle(runtime.getContextProxy().context, Cycle);
+ runtime.getLocationInstance().setLocation_cycle(Cycle);
+ runtime.getLocationInstance().setWorkingMod(mod);
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());
+ //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。
+ }
+
+ }
+
+
+ public static StringMessage AP34(String cmdindex,int workMode){
+//IWAP34,588854,1#
+//080835:指令流水号
+//8:模式
+ return genStringMessage("AP34",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP34))
+ .append(CMDSPLIT).append(cmdindex)
+ .append(CMDSPLIT).append(workMode)
+ .append(CMDEND).toString());
+ }
+
+ //设置自定义工作模式
+ public void handleBP34(Connection connection,Runtime runtime,String cmd){
+
+// IWBP34,867155030001063,588854,8,900,1#
+// IW:标识符
+// BP33 : 命令字符
+// 353456789012345:IMEI号,设备唯一ID
+// 080835:指令流水号
+// 1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式
+
+ String[] cmdlist=cmd.split(",");
+ if (cmdlist.length == 6){
+
+
+ log("work mode "+cmdlist[3]);
+ try {
+ int mod = Integer.parseInt(cmdlist[3]);
+ int Cycle = Integer.parseInt(cmdlist[4]);
+ int gpson = Integer.parseInt(cmdlist[5]);
+
+ StringMessage msg = AP34(cmdlist[2], mod);
+ //设定当前工作模式及循环频率
+ connection.send(msg);
+
+ if (gpson == 1) {
+ mod = ICLocation.CUSTOM_MOD8_GPS;
+ } else {
+ mod = ICLocation.CUSTOM_MOD8_WIFI;
+ }
+ log("reply msg " + msg.isFromCache());
+ log("LOCATION_MODE " + LOCATION_MODE + " mod " + mod + ", cycle = " + Cycle + ", GPS On= " + gpson);
+ Config.setLocationMode(runtime.getContextProxy().context, mod);
+ Config.setLocationCycle(runtime.getContextProxy().context, Cycle);
+ runtime.getLocationInstance().setLocation_cycle(Cycle);
+ runtime.getLocationInstance().setWorkingMod(mod);
+// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());
+ //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+ }
+
+ }
+ public void handleBP40(Connection connection,Runtime runtime,String cmd){
+
+// IWBP40,353456789012345,080835,XXXXXXXXXXXXXX#
+// IW:标识符
+// BP40 : 命令字符
+// 353456789012345:IMEI号,设备唯一ID
+// 080835 :指令流水号
+// XXXXXXXXXXXX : 表示文字内容GB2312编码
+
+
+ String[] cmdlist=cmd.split(",");
+ if (cmdlist.length == 4){
+ String cmdindex=cmdlist[2];
+ String txtmsg=cmdlist[3];
+ StringBuilder sb=new StringBuilder();
+ runtime.PushtxtMsg_srv_index=cmdindex;//给回复AP94用
+ sb.append(cmdindex).append(CMDSPLIT).append(TimeUtil.getSystemTimeyyyyMMddHHmmss()).append(CMDSPLIT).append(txtmsg);
+ if (Config.custom_name.equals("VitracK")){
+
+ }else{
+// txtmsg = Util.decodeUnicode2Utf8(txtmsg);
+ txtmsg = Util.UrlGB2312ToUTF8(txtmsg);
+ }
+ StringMessage msg=AP40(cmdindex,1);
+ //设定当前工作模式及循环频率
+ connection.send(msg);
+ ICLogger.i("received Txt Msg "+txtmsg);
+ if(!Config.noPushTxtReadReply) {
+ Config.setLastUnReadMessage(runtime.getContextProxy().context, sb.toString());
+ runtime.getContextProxy().sendMsgBroadcast(txtmsg,3);//msgType 3需要回复,0不需要回复
+ }else{
+ runtime.getContextProxy().sendMsgBroadcast(txtmsg,0);//msgType 3需要回复,0不需要回复
+ }
+ runtime.getContextProxy().saveMstToSMSDB(txtmsg);
+ }else{
+ ICLogger.i("BP40 format error!");
+ }
+ }
+ public static StringMessage AP40(String cmdindex,int success){
+
+// IWAP40,080835,1#
+// 080835:指令流水号
+// 1:表示设备接受数据成功,0表示设备接受数据失败
+ return genStringMessage("AP40",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP40))
+ .append(CMDSPLIT).append(cmdindex)
+ .append(CMDSPLIT).append(success)
+ .append(CMDEND).toString());
+ }
+
+
+ /**
+ * 心率上传,返回协议字串
+ * @param ds
+ * @return
+ */
+ public static StringMessage AP49(Runtime ds){
+ //示例数据:IWAP49,68##
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP49),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP49))
+ .append(CMDSPLIT).append(ds.getHRS().getPPG())
+ .append(CMDEND).toString());
+
+ }
+
+
+
+
+ /**
+ * 返回上传心率血压的协议字串
+ * @param ds
+ * @return
+ */
+ public static StringMessage APHT(Runtime ds){
+ //IWAPHT,60,130,85#
+ //说明:
+ //IW:标识符
+ //APHT : 命令字符
+ //60 : 表示心率
+ //130: 血压高压 [收缩压]
+ //85 : 血压低压 [舒张压]
+ //平台响应: IWBPHT#
+ //表示平台已接收,可不作响应
+ return genStringMessage(cmdMap.get(CMD_TYPE.APHT),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT))
+ .append(CMDSPLIT).append(ds.getHRS().getPPG())
+ .append(CMDSPLIT).append(ds.getHRS().getBPH())
+ .append(CMDSPLIT).append(ds.getHRS().getBPL())
+ .append(CMDEND).toString());
+ }
+ public static StringMessage APHT(int ppg,int bph,int bpl){
+ //IWAPHT,60,130,85#
+ //说明:
+ //IW:标识符
+ //APHT : 命令字符
+ //60 : 表示心率
+ //130: 血压高压 [收缩压]
+ //85 : 血压低压 [舒张压]
+ //平台响应: IWBPHT#
+ //表示平台已接收,可不作响应
+ return genStringMessage(cmdMap.get(CMD_TYPE.APHT),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT))
+ .append(CMDSPLIT).append(ppg)
+ .append(CMDSPLIT).append(bph)
+ .append(CMDSPLIT).append(bpl)
+ .append(CMDEND).toString());
+ }
+
+
+ //立即定位反馈
+ public static StringMessage AP16(String cmdindex){
+//IWAP16,080835#
+//080835:指令流水号
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP16),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP16))
+ .append(CMDSPLIT).append(cmdindex)
+ .append(CMDEND).toString());
+ }
+ // 立即定位指令(长链接有效)
+ public void handleBP16(Connection connection,Runtime runtime,String cmd){
+ //示例数据:IWBP16,867155030001063,335386
+// IWBP16,353456789012345,080835#
+// 说明:
+// IW:标识符
+// BP16 : 命令字符
+// 353456789012345:IMEI号,设备唯一ID
+// 080835 :指令流水号
+ String[] cmdlist = cmd.split(",");
+ if(cmdlist.length==3){
+ log("imei "+cmdlist[1]+", cmdindex "+cmdlist[2]);
+
+ connection.send(AP16(cmdlist[2]));
+ }else{
+ log("error BP16 format");
+ }
+ }
+
+
+ /*通过基站获取时间和坐标*/
+ public static StringMessage APTM(Runtime ds){
+ //示例数据:IWAPTM,460,0,9750,3613#
+ //说明:
+ //IW:标识符
+ //APTM : 命令字符
+ //460:MCC
+ //0: MNC
+ //9750: LAC
+ //3613: CID
+
+ return genStringMessage(cmdMap.get(CMD_TYPE.APTM),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTM))
+ .append(CMDSPLIT).append(ds.getLocationInstance().getMCC())
+ .append(CMDSPLIT).append(ds.getLocationInstance().getMNC())
+ .append(CMDSPLIT).append(ds.getLocationInstance().getLAC())
+ .append(CMDSPLIT).append(ds.getLocationInstance().getGSMStationCID())
+ .append(CMDEND).toString());
+
+ }
+
+ public void handleBPTM(String cmd){
+ //平台响应: IWBPTM,20160225090909,22.123456,113.654321#
+ //返回时间,格式为:yyyyMMddHHmmss ,为UTC0 时间
+ //经纬度保留六位小数,若没取到则返回 0
+ String[] list=cmd.split(CMDSPLIT);
+
+ if(list.length==4){
+
+ String time=list[1];
+ String lat=list[2];
+ String lon=list[3];
+ ICLogger.i("BPTM , time="+time+", lat="+lat+", lon="+lon);
+ }else{
+ ICLogger.i("BPTM format error");
+ }
+
+
+ }
+
+ public static StringMessage AP15(String index){
+//IWAP15, 080835#
+//080835:指令流水号
+ return genStringMessage("AP15",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP15))
+ .append(CMDSPLIT).append(index)
+ .append(CMDEND).toString());
+ }
+
+ //设置定位周期
+ public void handleBP15(String cmd ,Connection connection,Runtime runtime){
+// IWBP15, 353456789012345, 080835, 30#
+// 353456789012345:IMEI号,设备唯一ID
+// 080835 :指令流水号
+// 30: 表示频率为30分钟
+
+ String[] list=cmd.split(CMDSPLIT);
+
+ if(list.length==4){
+ String index=list[2];
+ String time=list[3];
+ connection.send(AP15(index));
+ ICLogger.i("BP15 , 定位周期="+time+"秒");
+
+ try {
+ Config.setLocationMode(runtime.getContextProxy().context, ICLocation.CUSTOM_MOD8_GPS);
+ Config.setLocationCycle(runtime.getContextProxy().context, Integer.parseInt(time) );
+ runtime.getLocationInstance().setWorkingMod(Config.getLocationMode(runtime.getContextProxy().context));
+ runtime.getLocationInstance().setLocation_cycle(Config.getLocationCycle(runtime.getContextProxy().context));
+ //set AlarmCycle and trigger Location
+ CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+ }else{
+ ICLogger.i("BP15 format error");
+ }
+
+ }
+
+
+
+
+
+
+ /*语音下行反馈*/
+ public static StringMessage AP28(String name, String msg, int packagecount, int currentpackageindex, int received_success) {
+ //示例数据:IWAP28,D3590D54,xxxx,6,1,1#
+ return genStringMessage("AP28",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP28))
+ .append(CMDSPLIT).append(name)
+ .append(CMDSPLIT).append(msg)
+ .append(CMDSPLIT).append(packagecount)
+ .append(CMDSPLIT).append(currentpackageindex)
+ .append(CMDSPLIT).append(received_success)
+ .append(CMDEND).toString());
+ }
+
+ //处理 BP28 语音消息
+ public void handleBP28(Connection connection,String cmd,Runtime runtime,byte[] bytes) {
+ //log("handleBP28 msg"+cmd);
+/**
+ * IWBP28, D3590D54,XXXX,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#
+ * 说明:
+ * IW:标识符
+ * BP28 : 命令字符
+ * D3590D54:UNICODE编码,发送者名称
+ * XXXX: 附加信息,在响应数据包时,将附加信息原样响应,类似流水号
+ * 6:语音包分包总数
+ * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同
+ * 1024 :语音包长度
+ * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数
+ * 语音包上传规则:
+ * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。
+ * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。
+ * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包
+ * 设备响应: IWAP28,D3590D54,XXXX,6,1,1#
+ * D3590D54:UNICODE编码,发送者名称
+ * XXXX: 附加信息,原样返回
+ * 6:语音包分包总数
+ * 1:当前设备收到的是第几个包
+ * 1:表示设备接受数据成功,0表示设备接受数据失败
+ */
+ String Name;
+ String appendIndex;
+ int packetCount;
+ int currentId;
+ int packetLen;
+ byte[] packetData;
+
+ String[] msg= cmd.split(CMDSPLIT);
+ if (msg.length>=6){
+
+ try {
+ Name = msg[1];
+ appendIndex = msg[2];
+ packetCount = Integer.parseInt(msg[3]);
+ currentId = Integer.parseInt(msg[4]);
+ packetLen = Integer.parseInt(msg[5]);
+ packetData = Util.subArray(bytes, msg[0].length() + msg[1].length() + msg[2].length() + msg[3].length() + msg[4].length() + msg[5].length() + 6, bytes.length - 1);
+
+ StringBuffer stringBuffer = new StringBuffer();
+ stringBuffer.append("recv BP28 name = ").append(Name)
+ .append(",appendIndex = ").append(appendIndex)
+ .append(",packetCount = ").append(packetCount)
+ .append(",currentId = ").append(currentId)
+ .append(",packetLen = ").append(packetLen)
+ .append(",packetDatalen = ").append(packetData.length);
+
+ log(stringBuffer.toString());
+ connection.send(AP28(Name, appendIndex, packetCount, currentId, 1));
+ voicePacket.getInstance().appendVoice(Name, appendIndex, packetCount, currentId, packetLen, packetData);
+ log("================" + voicePacket.getInstance().toString());
+ if (voicePacket.getInstance().isFinished()) {
+
+ String dir = Environment.getExternalStorageDirectory() + "/Android/VoiceCache";
+ String amrFilepath = Util.saveFile(voicePacket.getInstance().getVoicePacketBytes(), 0, voicePacket.getInstance().getVoicePacketLen(), new File(dir), "receive_" + voicePacket.getInstance().getPacketTime() + ".amr");
+ ICLogger.i("save Amr file to " + amrFilepath);
+ voicePacket.getInstance().clearPacket();
+ VoiceContent voiceContent = VoiceContent.placeHolderIn(Content.CONTACT_CATEGORY_GROUP, GROUP_ALL, amrFilepath);
+
+
+ final Uri uri2 = runtime.getDbHelper().insertMessage(voiceContent);
+
+ //回复UI消息,表示已经接收到
+ voiceContent.status = 3;
+ voiceContent.serverTime = TimeUtil.getSystemTime3();
+ voiceContent.preview = String.valueOf(Util.getDuration(voiceContent.content));
+ runtime.getDbHelper().updateMessage(voiceContent, uri2);
+
+// runtime.getContextProxy().sendBroadcast(ACTION_IMESSAGE, runtime);
+
+ connection.DeliverCMDMessageToSystem("NewVoice", amrFilepath);//通知下面线程状态变化
+ }
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+
+ }else{
+ log("handleBP28","format Error");
+// connection.send(genStringMessage("AP28",AP28(Name,appendIndex,packetCount,currentId,0)));
+
+ }
+
+ }
+
+ public void sendBroadcast(String cmd, Runtime dev) {
+
+ ComponentName componentName = new ComponentName("com.eqc.watch", "com.eqc.watch.launcher.ChatActivity");
+ Intent intent = new Intent("android.intent.action.MAIN");
+// intent.putExtra("ACTIVITY_TYPE", 2);
+// intent.addCategory("android.intent.category.DEFAULT");
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.setComponent(componentName);
+ dev.getContextProxy().context.startActivity(intent);
+ }
+
+ //白名单开关(下行协议号:BP84,响应:AP84)
+ public static StringMessage AP84(String index,int success){
+
+ //设备响应: IWAP80,080835,1#
+ //080835:指令流水号
+ //1:表示设备执行成功,0 表示设备执行失败
+ return genStringMessage("AP84",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP84))
+ .append(CMDSPLIT).append(index)
+ .append(CMDSPLIT).append(success)
+ .append(CMDEND).toString());
+ }
+
+ public void handleBP84(String cmd,Connection connection){
+//示例:
+ //IWBP84,353456789012345,080835,1#
+ //说明:
+ //IW:标识符
+ //BP84 : 命令字符
+ //353456789012345:IMEI号,设备唯一ID
+ //080835 :指令流水号
+ //1: 表示白名单开,0 表示白名单关
+ String[] list=cmd.split(CMDSPLIT);
+
+ if (list.length==4){
+ String index=list[2];
+ String whitelist_switch=list[3];
+ connection.send(AP84(index,1));
+
+ if (whitelist_switch.equals("1")){
+ Util.setSystemProperties("persist.sys.whitelist.enable","true");
+ }else{
+ Util.setSystemProperties("persist.sys.whitelist.enable","false");
+ }
+ ICLogger.i("收到服务器指令:白名单"+(whitelist_switch.equals("1")?"开":"关"));
+
+ }else{
+
+ ICLogger.i("BP84 format error!");
+ }
+
+ }
+
+ //17.绑定解绑(下行协议号:BP68,响应:AP68)
+ public static StringMessage AP68(String index,String cmd){
+
+ //设备响应: IWAP86, 080835,1#
+ //080835:指令流水号
+ return genStringMessage("AP86",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP68))
+ .append(CMDSPLIT).append(index)
+ .append(CMDSPLIT).append(cmd)
+ .append(CMDEND).toString());
+ }
+
+ public void handleBP68(String cmd,Connection connection,Runtime runtime){
+
+ //示例:
+ //IWBP68,353456789012345,080835,1#
+ //说明:
+ //IW:标识符
+ //BP68 : 命令字符
+ //353456789012345:IMEI号,设备唯一ID
+ //080835 :指令流水号
+ //1 : 表示设备为激活状态(绑定成功) 0:表示设备为未激活状态(解绑成功)
+
+ String[] list=cmd.split(CMDSPLIT);
+
+ if (list.length==4){
+ String index=list[2];
+ String type=list[3];
+ connection.send(AP68(index,type));
+ ICLogger.i("收到服务器消息:"+(type.equals("1")?"绑定成功 ":"未激活或者解绑"));
+ if (Config.custom_name.equals("YQ")||Config.custom_name.equals("YQ_EN")) {//AK-YQ
+ if (type.equals("1")) {
+ WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);
+// runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success), 2);
+ Util.ShowToast(runtime,runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success));
+ Config.setNeedAntiOff(runtime.getContextProxy().context,true);
+ Config.setNeedCutOff(runtime.getContextProxy().context,true);
+ runtime.setNeedAntioff(true);
+ runtime.setNeddReportCutoff(true);
+ } else {
+ WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);
+ runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_unbind_success), 2);
+ Config.setNeedAntiOff(runtime.getContextProxy().context,false);
+ Config.setNeedCutOff(runtime.getContextProxy().context,false);
+ runtime.setNeedAntioff(false);
+ runtime.setNeddReportCutoff(false);
+ //1 分钟后重置
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ Util.doMasterClear(runtime.getContextProxy().context);
+ }
+ },5000);
+ }
+ }
+
+ }else{
+ ICLogger.i("BP86 format error!");
+ }
+
+ }
+
+
+
+ //17.设置心率/血压测量周期(下行协议号:BP86,响应:AP86)
+ public static StringMessage AP86(String index){
+
+ //设备响应: IWAP86, 080835#
+ //080835:指令流水号
+ return genStringMessage("AP86",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP86))
+ .append(CMDSPLIT).append(index)
+ .append(CMDEND).toString());
+ }
+
+ public void handleBP86(String cmd,Connection connection,Runtime runtime){
+
+ //示例:
+ //IWBP86, 353456789012345, 080835,1,720#
+ //说明:IWBP86,867400020316612,858663,1,30
+ //IW:标识符
+ //BP86 : 命令字符
+ //353456789012345:IMEI号,设备唯一ID
+ //080835 :指令流水号
+ //1: 表示心率周期;2 :表示血压周期
+ //720: 表示720分钟
+
+ String[] list=cmd.split(CMDSPLIT);
+
+ if (list.length==5){
+ String index=list[2];
+ String type=list[3];
+ String cycle=list[4];
+ connection.send(AP86(index));
+ ICLogger.i("收到服务器指令:设置"+(type.equals("1")?"心率周期 ":"血压周期 ")+cycle+"分钟");
+
+ try {
+ //发送重置PPGCycle的广播,会在CoreServer里面执行
+ Intent intent = new Intent();
+ intent.putExtra("PPGTestCycle", Integer.parseInt(cycle));
+ intent.setFlags(FLAG_INCLUDE_STOPPED_PACKAGES);
+ intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
+ runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent);
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+ }else{
+ ICLogger.i("BP86 format error!");
+ }
+
+ }
+
+ //IWBP87,http://cn.map20000.com/physicalReport.html?lang=zh-CN&imeis=866671044898063#
+ public static StringMessage AP87(){
+
+ //设备响应: IWAP86, 080835#
+ //080835:指令流水号
+ return genStringMessage("AP87",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP87))
+ .append(CMDEND).toString());
+ }
+
+ public void handleBP87(String cmd,Connection connection,Runtime runtime){
+
+ //IWBP87,http://cn.map20000.com/physicalReport.html?lang=zh-CN&imeis=866671044898063#
+
+ String[] list=cmd.split(CMDSPLIT);
+
+ if (list.length==2){
+ String furl=list[1];//.replace("#","");
+ ICLogger.i("收到服务器指令 BP87:Qrcode url "+furl);
+// connection.send(AP87());
+ try {
+ String qrfilepath=Util.getLogfilePath(runtime,TimeUtil.getSystemDateYYMMDD());
+ Util.setSystemProperties(Config.KeyQRURIFILE,qrfilepath);
+ FileOutputStream fos=new FileOutputStream(new File(qrfilepath));
+ fos.write(furl.getBytes());
+ fos.close();
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+ }else{
+ ICLogger.i("BP87 format error!");
+ }
+
+ }
+ public static StringMessage AP88(String index){
+ //设备响应: IWAP88, 080835#
+ //080835:指令流水号
+ return genStringMessage("AP88",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP88))
+ .append(CMDSPLIT).append(index)
+ .append(CMDEND).toString());
+ }
+
+ public static void handleBP88(String cmd,Connection connection){
+// IWBP88,080835#
+ String[] list=cmd.split(CMDSPLIT);
+
+ if (list.length==2){
+ String index=list[1];
+ connection.send(AP88(index));
+ ICLogger.i("收到服务器消息:查询设备");
+
+ }else{
+ ICLogger.i("BP88 format error!");
+ }
+ }
+
+ //18.18.设置心率/血压阀值(下行协议号:BP89,响应:AP89)
+ public static StringMessage AP89(String index){
+
+ //设备响应: IWAP89, 080835#
+ //080835:指令流水号
+ return genStringMessage("AP89",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP89))
+ .append(CMDSPLIT).append(index)
+ .append(CMDEND).toString());
+ }
+
+ public void handleBP89(String cmd,Connection connection){
+
+ //示例:
+ //IWBP89, 353456789012345, 080835,50,90,80,90,110,140#
+ //说明:
+ //IW:标识符
+ //BP89 : 命令字符
+ //353456789012345:IMEI号,设备唯一ID
+ //080835 :指令流水号
+ //50: 心率低阀值,低于该阀值上传心率,如果未设置,则留空
+ //90: 心率高阀值,高于该阀值上传心率,如果未设置,则留空
+ //80: 低压阀值,低压低于该阀值上传血压,如果未设置,则留空
+ //90: 低压阀值,低压高于该阀值上传血压,如果未设置,则留空
+ //110: 高压阀值,高压低于该阀值上传血压,如果未设置,则留空
+ //140: 高压阀值,高压高于该阀值上传血压,如果未设置,则留空
+ String[] list=cmd.split(CMDSPLIT);
+ if (list.length==9){
+ String index=list[2];
+ String PPGH=list[3];
+ String PPGL=list[4];
+ String BPH_H=list[5];
+ String BPH_L=list[6];
+ String BPL_H=list[7];
+ String BPL_L=list[8];
+ connection.send(AP89(index));
+
+
+
+ ICLogger.i("收到服务器指令:心率/血压阀值 "+PPGH+","+PPGL+","+BPH_H+","+BPH_L+","+BPL_H+","+BPL_L);
+ }else{
+ ICLogger.i("BP89 format error!");
+ }
+
+ }
+
+ //体温间隔测量 (后台测试体温)(下行协议号:BPTE,响应:APTE)
+ public static StringMessage APTE(String index,int freq){
+
+ //设备响应: IWAPTE,080835,60#
+ //080835:指令流水号
+ //1:表示设备接受数据成功,0表示设备接受数据失败
+ return genStringMessage("APTE",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTE))
+ .append(CMDSPLIT).append(index)
+ .append(CMDSPLIT).append(freq)
+ .append(CMDEND).toString());
+ }
+
+ public void handleBPTE(String cmd,Connection connection,Runtime runtime){
+
+ //示例:
+ //IWBPTE,353456789012345,080835,60#
+ //说明:
+ //IW:标识符
+ //BPTE : 命令字符
+ //353456789012345:IMEI号,设备唯一ID
+ //080835 :指令流水号
+ //60 : 上传间隔,单位分钟(60分钟上传一次体温,终端收到后立即开始测量一次并重置定时器)
+ String[] list=cmd.split(CMDSPLIT);
+ if (list.length==4){
+ try {
+ String index = list[2];
+ String freqstr = list[3];
+ int freq = Integer.parseInt(freqstr);
+ connection.send(APTE(index, freq));
+ ICLogger.i("收到服务器指令:测量体温 " + freq + "分钟一次。");
+ Config.setTemperatureTestCycle(runtime, freq * 60);
+ CoreService.getInstance().setTempAlarm();
+
+
+ if(runtime.check_stat_do_temp_test()) TemperatureUtil.doTempTestInThread();
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+ }else{
+ ICLogger.i("BPTE format error!");
+ }
+
+ }
+
+ //体温上行(上行协议号:APTP,响应:BPTP)
+ public static StringMessage APTP(double wrist_temp,double body_temp,double tempout){
+
+ //设备: IWAPTP,36.3,33,132#
+ //IW:标识符
+ //APTP : 命令字符
+ //35.3:测量体温 (摄氏度)
+ //33,132:温补用的参数,此处不用,可以用0 来代替。 目前是代表的腕温,室外温度
+ return genStringMessage(cmdMap.get(CMD_TYPE.APTP),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTP))
+ .append(CMDSPLIT).append(String.format("%1$.1f",body_temp))
+ .append(CMDSPLIT).append(String.format("%1$.1f",wrist_temp))
+ .append(CMDSPLIT).append(String.format("%1$.1f",tempout))
+ .append(CMDEND).toString());
+ }
+
+ public void handleBPTP(){
+
+ ICLogger.d("BPTP 服务器收到体温数据!");
+
+ }
+
+
+ public static StringMessage APX1(String id){
+ //设备响应: IWAPX1, 080835#
+ //080835:指令流水号
+ return genStringMessage("APX1",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APX1))
+ .append(CMDSPLIT).append(id)
+ .append(CMDEND).toString());
+ }
+
+ /**
+ *
+ * @param cmd
+ * @param connection
+ * @param runtime
+ */
+ public void handleBPX1(String cmd,Connection connection,Runtime runtime){
+ //IWBPX1,353456789012345,080835,2,1,-3,0#
+ //说明:
+// IW:标识符
+// BPX1 : 命令字符
+// 353456789012345:IMEI号,设备唯一ID
+// 080835 :指令流水号
+// 2: 心率修正值
+// 1:高压修正值
+// -3:低压修正值
+// 0:血氧修正值
+ String[] list=cmd.split(CMDSPLIT);
+ if (list.length==7){
+ String index=list[2];
+ String imei=list[1];
+ String strXL=list[3];
+ String strBPH=list[4];
+ String strBPL=list[5];
+ String strSpO2=list[6];
+
+ connection.send(APX1(index));
+
+ try {
+ int ppg_adjust, bph_adjust, bpl_adjust, spo2_adjust;
+ ppg_adjust = Integer.parseInt(strXL);
+ bph_adjust = Integer.parseInt(strBPH);
+ bpl_adjust = Integer.parseInt(strBPL);
+ spo2_adjust = Integer.parseInt(strSpO2);
+
+ runtime.getHRS().setAdjust(ppg_adjust, bph_adjust, bpl_adjust, spo2_adjust);
+ Config.setPPGAdjust(mRuntime.getContextProxy().context, ppg_adjust);
+ Config.setBPHAdjust(mRuntime.getContextProxy().context, bph_adjust);
+ Config.setBPLAdjust(mRuntime.getContextProxy().context, bpl_adjust);
+ Config.setSPo2Adjust(mRuntime.getContextProxy().context, spo2_adjust);
+ String ShareAdjValue = new StringBuilder().append(ppg_adjust).append(CMDSPLIT)
+ .append(bph_adjust).append(CMDSPLIT)
+ .append(bpl_adjust).append(CMDSPLIT)
+ .append(spo2_adjust).append(CMDSPLIT).toString();
+ Config.setPPG_ECG_adjustValue(ShareAdjValue);
+ ICLogger.i("Handle BPX1 IMEI " + imei + ",index " + index + ", BPH " + strBPH + ", BPL " + strBPL + ", PPG " + strXL + ", Sp02 " + strSpO2 + " , Shared Adjust Value " + ShareAdjValue);
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+ }else{
+ ICLogger.i("BPX1 format error!");
+ }
+ }
+
+
+
+ public static StringMessage APS4(String id){
+ //设备响应: IWAPS4,080835#
+ //080835:指令流水号
+ return genStringMessage("APS4",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APS4))
+ .append(CMDSPLIT).append(id)
+ .append(CMDEND).toString());
+ }
+
+ /**
+ * 主要为久坐设置提醒时长。
+ * @param cmd
+ * @param connection
+ * @param runtime
+ */
+ public void handleBPS4(String cmd,Connection connection,Runtime runtime){
+ //IWBPS4,353456789012345,080835,1|1234567|0900|1100|180, 2|1234567|0900|1100|180, 1|1234567|0900|1100|180#
+ //说明:
+// IW:标识符
+// BPS4: 命令字符
+// 353456789012345:设备IMEI或者ID
+// 080835 :指令流水号
+// 1|1234567|0900|1100|180:类型(1久坐,2喝水)|重复周期|开始时间|结束时间|时间间隔(单位秒)
+// 重复周期、开始结束时间格式 参考BP85闹钟设置,
+//#:结尾标识符
+ String[] list=cmd.split(CMDSPLIT);
+ if (list.length>=4){
+
+ String index=list[2];
+ String imei=list[1];
+ connection.send(APS4(index));
+
+ String setting1;
+ switch(list.length){
+ case 10:
+ setting1=list[9];
+ ICLogger.i("set 7th alarm "+setting1);
+ case 9:
+ setting1=list[8];
+ ICLogger.i("set 6th alarm "+setting1);
+ case 8:
+ setting1=list[7];
+ ICLogger.i("set 5th alarm "+setting1);
+ case 7:
+ setting1=list[6];
+ ICLogger.i("set 4th alarm "+setting1);
+ case 6:
+ setting1=list[5];
+ ICLogger.i("set 3rd alarm "+setting1);
+ case 5:
+ setting1=list[4];
+ ICLogger.i("set 2nt alarm "+setting1);
+ case 4:
+ setting1=list[3];
+ ICLogger.i("set 1st alarm "+setting1);
+ break;
+ }
+
+ ICLogger.i("Handle BPX1 IMEI "+imei+",index "+index+", get "+(list.length-3) +" settings");
+ }else{
+ ICLogger.i("BPX1 format error!");
+ }
+ }
+
+ public static StringMessage APHP(Runtime ds){
+ //IWAPHP,60,130,85,95,90, , , , , , , , #
+ //IW:标识符
+ //APHT : 命令字符
+ //60 : 表示心率
+ //130: 血压高压 [收缩压]
+ //85 : 血压低压 [舒张压]
+ //95:血氧
+ //90:血糖
+// 本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空
+ return genStringMessage(cmdMap.get(CMD_TYPE.APHP),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHP))
+ .append(CMDSPLIT).append(ds.getHRS().getPPG())
+ .append(CMDSPLIT).append(ds.getHRS().getBPH())
+ .append(CMDSPLIT).append(ds.getHRS().getBPL())
+ .append(CMDSPLIT).append(ds.getHRS().getSpo2())
+ .append(CMDSPLIT).append(0)
+ .append(CMDSPLIT)
+ .append(CMDSPLIT)
+ .append(CMDSPLIT)
+ .append(CMDSPLIT)
+ .append(CMDSPLIT)
+ .append(CMDSPLIT)
+ .append(CMDSPLIT)
+ .append(CMDSPLIT)
+ .append(CMDEND).toString());
+ }
+ public static StringMessage APHP(int ppg,int bph, int bpl, int spo2){
+ //IWAPHP,60,130,85,95,90, , , , , , , , #
+ //IW:标识符
+ //APHT : 命令字符
+ //60 : 表示心率
+ //130: 血压高压 [收缩压]
+ //85 : 血压低压 [舒张压]
+ //95:血氧
+ //90:血糖
+// 本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空
+ return genStringMessage(cmdMap.get(CMD_TYPE.APHP),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHP))
+ .append(CMDSPLIT).append(ppg)
+ .append(CMDSPLIT).append(bph)
+ .append(CMDSPLIT).append(bpl)
+ .append(CMDSPLIT).append(spo2)
+ .append(CMDSPLIT).append(0)
+ .append(CMDSPLIT)
+ .append(CMDSPLIT)
+ .append(CMDSPLIT)
+ .append(CMDSPLIT)
+ .append(CMDSPLIT)
+ .append(CMDSPLIT)
+ .append(CMDSPLIT)
+ .append(CMDSPLIT)
+ .append(CMDEND).toString());
+ }
+
+
+ public void handleBPHP(){
+
+ ICLogger.i("服务器收到APHP 心率血压血氧 !");
+
+ }
+
+ public static StringMessage APDE(String id){
+ /***
+ * 示例:
+ * 设备响应: IWAPDE,080835#
+ * 080835:指令流水号
+ * 说明: 本消息适用所有终端
+ */
+ return genStringMessage("APDE",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APDE))
+ .append(CMDSPLIT).append(id)
+ .append(CMDEND).toString());
+ }
+
+ public void handleBPDE(Connection connection,String cmd,Runtime runtime){
+/***
+ * 示例:
+ * IWBPDE,867400020316612,853676,0
+ * 说明:
+ * IW:标识符
+ * BPDE: 命令字符
+ * 353456789012345:设备IMEI或者ID
+ * 080835 :指令流水号
+ * 0:进入禁止区域 1离开禁止区域
+ * #:结尾标识符
+ * 设备响应: IWAPDE,080835#
+ * 080835:指令流水号
+ * 说明: 本消息适用所有终端
+ */
+ String[] list=cmd.split(CMDSPLIT);
+ if (list.length==4){
+
+ String index=list[2];
+ String msg=list[3];
+ connection.send(APDE(index));
+ try {
+ if (Integer.parseInt(msg) == 0) {
+ ICLogger.i("Handle BPDE index " + index + ", 进入禁止区域 ");
+ runtime.Fence_Warning_flag = 1;
+ WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);
+ runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_out_wall), 2);
+ } else {
+ ICLogger.i("Handle BPDE index " + index + ", 离开禁止区域 ");
+ runtime.Fence_Warning_flag = 0;
+// Util.ShowToast(runtime,"");
+ runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_cross_boundary), 0);
+ }
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+ }else{
+ ICLogger.i("BPDE format error!");
+ }
+
+
+ }
+ public static StringMessage APDG(String id){
+ return genStringMessage("APDG",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APDG))
+ .append(CMDSPLIT).append(id)
+ .append(CMDEND).toString());
+ }
+
+ public void handleBPDG(Connection connection,String cmd,Runtime runtime){
+/**
+ * 示例:
+ * IWBPDG,353456789012345,1,30.0,37.3 #
+ * 说明:IWBPDG,867400020316612,502102,1,33,44
+ * IW:标识符
+ * BPDG: 命令字符
+ * 353456789012345:设备IMEI或者ID
+ * 080835 :指令流水号
+ * 1:开关 1开, 0 关
+ * 30.0: 低温阀值
+ * 37.3: 高温阀值
+ * #:结尾标识符
+ * */
+ String[] list=cmd.split(CMDSPLIT);
+ if (list.length==6){
+
+ try {
+ String index = list[2];
+ String switch_on = list[3];
+ String min_temp = list[4];
+ String max_temp = list[5];
+ connection.send(APDG(index));
+ if (Integer.parseInt(switch_on) == 1) {
+ ICLogger.i("Handle BPDG index " + index + ", 体温报警阈值开 min=" + min_temp + ",max=" + max_temp);
+ runtime.tempInfo.setBodyTempThreshold(Double.valueOf(max_temp), Double.valueOf(min_temp));
+ Config.needTemperature_abnormal_alarm = true;
+ } else {
+ ICLogger.i("Handle BPDG index " + index + ", 体温报警阈值关 ");
+ Config.needTemperature_abnormal_alarm = false;
+ }
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+
+ }else{
+ ICLogger.i("BPDG format error!");
+ }
+ }
+
+ /***
+ *
+ * @param packetTime 做指令流水号用
+ * @param filetype 文件类型, 1语音,2图片
+ * @param datatype 数据内容类型,例如和文件类型相关,例如 监听语音,sos语音,签到图片等等
+ * @param count 内容分包总数
+ * @param index 当前分包数
+ * @param datalen 分包数据长度,最长1024,不足按照实际大小。
+ * @param amrdata 文件分包内容数据
+ * @return
+ */
+ public static byte[] APTU(String packetTime,int filetype, int datatype ,int count,int index,int datalen,byte[] amrdata){
+ /**
+ * 10.设备录音图片(设备上行)(上行协议:APTU,响应:BPTU)
+ * 示例:
+ * IWAPTU,6654111,080835,1,1,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#
+ * 说明:
+ * IW:标识符
+ * BPCU : 命令字符
+ * 6654111:语音图片文字目标 (同步监护人列表的用户唯一标识ID)<扩展字段目前不需要,可以传空字符>
+ * 080835 :指令流水号
+ * 1:文件类型
+ * 1:内容类型 类型说明如下表
+ * 文件类型 内容类型
+ * 1 语音—— 1.监听语音 * 2.SOS语音 * 3.扩展
+ * 2 图片—— 1.签到图片 * 2.指令图片 * 3.设备图片 * 4.扩展
+ * 6:内容包分包总数
+ * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同
+ * 1024 :语音包长度
+ * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数
+ * 语音包上传规则:
+ * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。
+ * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。
+ * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包
+ */
+ String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTU))
+ .append(CMDSPLIT)
+ .append(CMDSPLIT).append(packetTime)
+ .append(CMDSPLIT).append(filetype)
+ .append(CMDSPLIT).append(datatype)
+ .append(CMDSPLIT).append(count)
+ .append(CMDSPLIT).append(index)
+ .append(CMDSPLIT).append(datalen*2)
+ .append(CMDSPLIT).toString();
+
+ byte[] sentbuf=new byte[sb.length()+datalen*2+1];
+ byte[] amrdata2=Util.bytesToHexString(amrdata).getBytes();
+ System.arraycopy(sb.getBytes(),0,sentbuf,0,sb.length());
+ System.arraycopy(amrdata2,0,sentbuf,sb.length(),datalen*2);
+ sentbuf[sb.length()+datalen*2]='#';
+ return sentbuf;
+ }
+
+
+ public void handleBPTU(String cmd , Connection connection ){
+/***
+ * 平台响应
+ * IWBPTU,6654111,080835,1,1,6,1,1#
+ * IW:标识符
+ * APCU : 命令字符
+ * 6654111:语音图片文字目标
+ * 080835 :流水号
+ * 1:文件类型
+ * 1:内容类型
+ * 6:内容总包数
+ * 1:当前包序号
+ * 1:成功 (0:失败)
+ */
+ String[] cmdlist=cmd.split(CMDSPLIT);
+ if (cmdlist.length==8){
+ try {
+ String time = cmdlist[2];
+ String filetype = cmdlist[3];
+ String datatype = cmdlist[4];
+ String count = cmdlist[5];
+ String index = cmdlist[6];
+ String success = cmdlist[7];
+ int ftype = Integer.parseInt(filetype);
+ int dtype = Integer.parseInt(datatype);
+ int packetCount = Integer.parseInt(count);
+ int packetIndex = Integer.parseInt(index);
+ int receiveSuccess = Integer.parseInt(success);
+ ICLogger.i("服务器在收到 index " + time + ", 文件类型 " + ftype + ",内容类型 " + dtype + " " + packetIndex + "/" + packetCount + " " + (receiveSuccess == 1 ? "成功" : "失敗"));
+ if (receiveSuccess == 1) {
+ //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送
+ voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);
+ //voicePacket.getInstanceSent().setFileType(ftype,dtype);
+ }
+ //发送消息,再次检查要发送的语音包,确认其发送完毕
+ connection.DeliverCMDMessageToSystem("SentVoicePacket", "SentBPFilePacket");
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+ }else{
+ ICLogger.i(" BPTU Format error!");
+ }
+ }
+
+ public static StringMessage APSL(String date,int deepsleep,int lightsleep,int score){
+/***
+ * 示例:
+ * IWAPSL,20200803,240,120,90#
+ * 说明:睡眠计算时间 当日21:00至 次日 9:00, 睡眠时间记录为当日时间。如2020-8-3的睡眠时间段为 2020-8-3 21:00 ~ 2020-8-4 09:00
+ * IW:标识符
+ * APSL:命令字
+ * 202008003:睡眠时间 (手表本地时间)
+ * 240:深睡时间 (手表本地时间),单位分钟
+ * 120:浅睡时间(手表本地时间),单位分钟
+ * 90睡眠分数
+ * 睡眠算法
+ * 使用记步同样的算法,计算翻身次数
+ * 平均每60秒记录一次
+ * 深睡眠,通过加速度传感器,在60秒内翻身次数小于6
+ * 浅睡眠,通过加速度传感器,在60秒内翻身次数大于等于6, 且小于12 ,否则认为未睡
+ * 换算分数后发送到服务器
+ * #:结束符
+ */
+ String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APSL))
+ .append(CMDSPLIT).append(date)
+ .append(CMDSPLIT).append(deepsleep)
+ .append(CMDSPLIT).append(lightsleep)
+ .append(CMDSPLIT).append(score)
+ .append(CMDEND).toString();
+ return genStringMessage(cmdMap.get(CMD_TYPE.APSL),sb);
+ }
+
+ public static StringMessage AP46(String id,String cmd)
+ {
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP46),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP46))
+ .append(CMDSPLIT).append(id)
+ .append(CMDSPLIT).append(cmd)
+ .append(CMDEND).toString());
+ }
+
+ public void handleBP46(String cmd , Connection connection,Runtime runtime) {
+/***
+ * IWBP46,353456789012345,080835,1,[参数]#
+ * 说明:
+ * IW:标识符
+ * BP46 : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835 :指令流水号
+ * 1: 表示立即拍照
+ * [参数]: 此为可选项。根据不同类型设备扩展
+ * #:结尾标识符
+ * 设备响应: IWAP46,080835,1#
+ * 080835:指令流水号
+ * 1 成功 0失败
+ * # 结尾标识符
+ */
+ String[] cmdlist=cmd.split(CMDSPLIT);
+
+ if (cmdlist.length>=4 ){
+ String imei=cmdlist[1];
+ String id=cmdlist[2];
+ String cdd=cmdlist[3];
+ if (cmdlist.length==5) {
+ String tmp = cmdlist[4];
+ }
+ connection.send(AP46(id,cdd));
+ Context context = mRuntime.getContextProxy().context.getApplicationContext();
+ if (cdd.equals("1")) {
+ //delay 启动
+
+// Intent intent = new Intent(context, com.enqualcomm.support.CoreService.class);
+// intent.setAction(ACTION_REMOTE_CAMERA);
+// intent.putExtra("remote_number", id);
+// context.startService(intent);
+// runtime.getContextProxy().context.sendBroadcast(intent);
+ new Handler().post(new Runnable() {
+ @Override
+ public void run() {
+ (new CameraUtil(context)).getPictur(id);
+ }
+ });
+
+ }else if(cdd.equals("2")){
+ Intent intent = new Intent();
+ intent.setAction(DIALOG_ACTION);
+ intent.putExtra("takephoto", "Take Photo !");
+ context.sendBroadcast(intent);
+ }
+ }else{
+ ICLogger.i(" BP46 Format error!");
+ }
+
+ }
+
+
+ public static StringMessage APDH(String id,String cmd)
+ {
+ return genStringMessage("APDH",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APDH))
+ .append(CMDSPLIT).append(id)
+ .append(CMDSPLIT).append(cmd)
+ .append(CMDEND).toString());
+ }
+
+
+ public void handleBPDH( Connection connection,Runtime runtime,String cmd) {
+ /***
+ * IWBPDH,353456789012345,080835,1,[参数]#
+ * 说明:
+ * IW:标识符
+ * BPDH : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835 :指令流水号
+ * 1: 表示立即聆听 可扩展
+ * [参数]: 此为可选项。录音时间 为空默认15秒
+ * #:结尾标识符
+ * 设备响应: IWAPDH,080835,1#
+ * 080835:指令流水号
+ * 1 成功 0失败
+ * # 结尾标识符
+ */
+
+ String[] cmdlist=cmd.split(CMDSPLIT);
+ if (cmdlist.length==5){
+ String imei=cmdlist[1];
+ String id=cmdlist[2];
+ String cdd=cmdlist[3];
+ String tmp=cmdlist[4];
+
+ tmp=tmp.replace(CMDEND,"").trim();
+
+ if (tmp.isEmpty()) tmp="15";
+ connection.send(APDH(id,cdd));
+
+ if (cdd.equals("1")) {
+ //delay 启动
+// Context context = mRuntime.getContextProxy().context.getApplicationContext();
+ CoreService.getInstance().DevliverStringMessage("StartMonitor",tmp);
+ }
+ }else{
+ ICLogger.i(" BPDH Format error!");
+ }
+ }
+
+ public static StringMessage APTQ(Runtime runtime)
+ {
+ /**
+ * IWAPTQ,460,0,9520,3671,0#
+ * APTQ : 命令字符
+ * 460,0,9520,3671基站信息
+ * 0:语言标志位 0 默认为中文,1为英文
+ */
+ //或者仅仅使用 locale = Locale.getDefault(); 不需要考虑接口 deprecated(弃用)问题
+ Locale locale = Locale.getDefault();
+ String lang = locale.getLanguage() + "-" + locale.getCountry();
+ int language=0;
+ if(!lang.contains("zh"))
+ {
+ language=1;
+ }
+ return genStringMessage("APTQ",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTQ))
+ .append(CMDSPLIT).append(runtime.getLocationInstance().getMCC())
+ .append(CMDSPLIT).append(runtime.getLocationInstance().getMNC())
+ .append(CMDSPLIT).append(runtime.getLocationInstance().getLAC())
+ .append(CMDSPLIT).append(runtime.getLocationInstance().getGSMStationCID())
+ .append(CMDSPLIT).append(language)
+ .append(CMDEND).toString());
+ }
+
+
+ public void handleBPTQ( Connection connection,Runtime runtime,String cmd) {
+ /***
+ *
+ * IWBPTQ,20-10-11,19:32:02,6674,32,27,22,30,20-10-12,19:32:02,6674,32,27,22,30,20-10-13,19:32:02,6674,32,27,22,30,53575C71533A
+ * IWBPTQ, 16-09-24,11:00:00,b6e0d4c6,2,-5,-12,22,16-09-25,11:00:00,b6e0d4c6,2,-5,-12,22,16-09-26,11:00:00,b6e0d4c6,2,-5,-12,22,316df15733#
+ * 年-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,年-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,年-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,城市名
+ * 注:天气描述用Unicode编码,城市名使用Unicode编码, 第一组为当天,后2组依次为后续2天天气
+ * 如天气编号及描述对应如下(天气描述不需要发送括号内的白天晚上)
+ * 0:龙卷风
+ * 1:热带风暴
+ * 2:飓风
+ * 3:严重的雷暴
+ * 4:雷暴
+ * 5:混合雨雪
+ * 6:混合降雨和冰雹
+ * 7:混合雪和雨夹雪
+ * 8:冻结小雨
+ * 9:小雨
+ * 10:冻雨
+ * 11:阵雨
+ * 12:阵雨
+ * 13:雪飘雪
+ * 14:小雪阵雨
+ * 15:吹雪
+ * 16:雪
+ * 17:冰雹
+ * 18:雨夹雪
+ * 19:尘埃
+ * 20:雾
+ * 21:霾
+ * 22:黑烟
+ * 23:大风
+ * 24:风
+ * 25:低温
+ * 26:多云
+ * 27:多云(晚上)
+ * 28:多云(白天)
+ * 29:局部多云(晚上)
+ * 30:局部多云(天)
+ * 31:清爽(晚)
+ * 32:晴天
+ * 33:晴朗(晚)
+ * 34:晴朗(天)
+ * 35:混合雨和冰雹
+ * 36:热
+ * 37:局部地区性雷暴
+ * 38:零星雷暴
+ * 39:零星雷暴
+ * 40:零星阵雨
+ * 41:大雪
+ * 42:零星阵雪
+ * 43:大雪
+ * 44:多云
+ * 45:雷阵雨
+ * 46:阵雪
+ * 47:局部雷阵雨
+ */
+
+ log("BPTQ "+cmd);
+ String[] cmdlist=cmd.split(CMDSPLIT);
+ if (cmdlist.length==23){
+
+ StringBuilder sb=new StringBuilder();
+ StringBuilder msg=new StringBuilder();
+ for(int i=0;i<3;i++) {
+ String DayTime = cmdlist[1+i*7] + " " + cmdlist[2+i*7];
+ String date= "20"+cmdlist[1+i*7].trim();
+ String weather_name = Util.decodeUnicode2Utf8(cmdlist[3+i*7].trim());
+ String weather_id = cmdlist[4+i*7];
+ String temp_current = cmdlist[5+i*7];
+ String temp_high = cmdlist[6+i*7];
+ String temp_low = cmdlist[7+i*7];
+
+ sb.append(" "+DayTime);
+ sb.append(",天气:"+weather_name);
+ sb.append(",ID "+weather_id);
+ sb.append(",当前温度 "+temp_current);
+ sb.append(",最高温度 "+temp_high);
+ sb.append(",最低温度 "+temp_low);
+ sb.append("\n");
+
+ msg.append(date);
+ msg.append(","+weather_name);
+ msg.append(","+weather_id);
+ msg.append(","+temp_current);
+ msg.append(","+temp_high);
+ msg.append(","+temp_low);
+ msg.append(";");
+ }
+ String City=Util.decodeUnicode2Utf8(cmdlist[22]);
+
+ ICLogger.i(City+" \n"+sb.toString());
+
+ msg.insert(0,City+";");
+ String weatherstr=msg.toString();
+ if (weatherstr.endsWith(";"))
+ {
+ weatherstr=weatherstr.substring(0,weatherstr.lastIndexOf(";"));
+ }
+ Intent intent=new Intent(Constants.ACTION_WEATHER_RECEIVED);
+ intent.putExtra(Constants.KEY_Weather,weatherstr);
+ ICLogger.i("send Broadcast "+ Constants.ACTION_WEATHER_RECEIVED +"\n"+weatherstr+"\n");
+ CoreService.getInstance().sendBroadcast(intent);
+
+ }else{
+ ICLogger.i(" BPTQ Format error!");
+ }
+ }
+
+
+
+ public static StringMessage AP94( ){
+ /***
+ * 15确认已读文字(上行协议号:AP94,响应:BP94)
+ * 示例:
+ * IWAP94,123456,1#
+ * 说明:
+ * IWAP94:标识符
+ * APHCI: 命令字符
+ * 123456: 文字来源系统流水号
+ * 1:确认阅读、0:取消阅读
+ * 平台响应: IWBP94#
+ * 表示平台已接收,可不作响应
+ * 说明: 本消息适用所有终端
+ */
+
+ //在UI逻辑中,只要有处理就都是已经阅读。所以不存在取消阅读的说法。
+ return genStringMessage(cmdMap.get(protocol_ic.CMD_TYPE.AP94),new StringBuffer(CMDHEADER).append(cmdMap.get(protocol_ic.CMD_TYPE.AP94))
+ .append(CMDSPLIT).append(Runtime.PushtxtMsg_srv_index)
+ .append(CMDSPLIT).append("1")
+ .append(CMDEND).toString());
+
+ }
+
+
+ public static StringMessage APAT(String id,String cmd)
+ {
+ return genStringMessage("APAT",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APAT))
+ .append(CMDSPLIT).append(id)
+ .append(CMDSPLIT).append(cmd)
+ .append(CMDEND).toString());
+ }
+
+ /***
+ * 响应剪断开关设定消息
+ * @param connection
+ * @param runtime
+ * @param cmd
+ */
+ public void handleBPAT( Connection connection,Runtime runtime,String cmd) {
+/***
+ * IWBPAT,353456789012345,080835,1#
+ * 说明:是否提示表带是否连接的开关,即剪断报警开关
+ * IW:标识符
+ * BPAT : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835:指令流水号
+ * 1: 表示剪断报警开关,1为开,0 为关
+ * 设备响应: IWAPAT,080835, 1#
+ * 080835:指令流水号
+ * 1: 剪断开关状态(实际上与下行的命令一致)
+ */
+
+ log("BPAT "+cmd);
+ String[] cmdlist=cmd.split(CMDSPLIT);
+ if (cmdlist.length==4){
+
+ String imei=cmdlist[1];
+ String id=cmdlist[2];
+ String cmdid=cmdlist[3];
+ connection.send(APAT(id,cmdid));
+ if(cmdid.trim().equals("1")){
+ WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);
+// runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success), 2);
+ Util.ShowToast(runtime,runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success));
+ Config.setNeedAntiOff(runtime.getContextProxy().context,true);
+ Config.setNeedCutOff(runtime.getContextProxy().context,true);
+ runtime.setNeedAntioff(true);
+ runtime.setNeddReportCutoff(true);
+ } else {
+ WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);
+ runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_unbind_success), 2);
+ Config.setNeedAntiOff(runtime.getContextProxy().context,false);
+ Config.setNeedCutOff(runtime.getContextProxy().context,false);
+ runtime.setNeedAntioff(false);
+ runtime.setNeddReportCutoff(false);
+ }
+ }else{
+ ICLogger.i(" BPAT Format error!");
+ }
+ }
+
+
+ public static StringMessage APCH(int charging)
+ {
+ return genStringMessage("APCH",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APCH))
+ .append(CMDSPLIT).append(charging)
+ .append(CMDEND).toString());
+ }
+
+
+
+ public static StringMessage APBT(String id,String cycle)
+ {
+ return genStringMessage("APBT",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APBT))
+ .append(CMDSPLIT).append(id)
+ .append(CMDSPLIT).append(cycle)
+ .append(CMDEND).toString());
+ }
+
+ /***
+ * 响应蓝牙扫描周期设定
+ * @param connection
+ * @param runtime
+ * @param cmd
+ */
+ public void handleBPBT( Connection connection,Runtime runtime,String cmd) {
+/***
+ * IWBPBT,353456789012345,080835,1#
+ * 说明:设置蓝牙扫描周期,单位时间分钟
+ * IW:标识符
+ * BPBT : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835:指令流水号
+ * 1: 扫描周期,对应单位为分钟
+ * 设备响应: IWAPBT,080835, 1#
+ * 080835:指令流水号
+ * 1: 剪断开关状态(实际上与下行的命令一致)
+ */
+
+ log("BPBT "+cmd);
+ String[] cmdlist=cmd.split(CMDSPLIT);
+ if (cmdlist.length==4){
+ String id=cmdlist[2];
+ String cycle=cmdlist[3].replace("#","");
+ connection.send(APBT(id,cycle));
+
+ if(Util.isNumeric(cycle)){
+ int intcycle=Integer.parseInt(cycle);
+ Config.setBleScanCycle(runtime.getContextProxy().context,intcycle);
+ runtime.bleInfo.bleScanCycle=intcycle;
+ ICLogger.i("设置蓝牙扫描周期 "+intcycle+" 分钟");
+ CoreService.getInstance().setBleScanAlarm(intcycle);
+ }else{
+ ICLogger.i(" BPBT Format error!");
+ }
+
+ }else{
+ ICLogger.i(" BPBT Format error!");
+ }
+ }
+
+ /***
+ * 发送蓝牙扫描结果
+ * @param runtime
+ * @return
+ */
+ public static StringMessage APBR(Runtime runtime) {
+ /**
+ * #IWAPBR,353456789012345,080835,1#
+ *
+ * #IWBPBR#
+ */
+ if (runtime.bleInfo.btScanResult.size() > 0) {
+ StringBuffer sb=new StringBuffer();
+ sb.append(runtime.bleInfo.btScanResult.size());
+ for(String it:runtime.bleInfo.btScanResult){
+ sb.append(CMDSPLIT).append(it);
+ }
+ return genStringMessage("APBR", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APBR))
+ .append(CMDSPLIT).append(TimeUtil.getSystemTimeyyyyMMddHHmmss())
+ .append(CMDSPLIT).append(sb.toString())
+ .append(CMDEND).toString());
+
+ }else{
+ return null;
+ }
+ }
+
+ /**
+ * 85.设置联系人白名单(10个)(下行协议:BPWL,响应:APWL)
+ * 示例:
+ * IWBPWL,353456789012345,080835,D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx #
+ * 说明:
+ * IW:标识符
+ * BPWL : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835 :指令流水号
+ * D3590D54|135xxxxxxxxxx|9507xxxxxxxx : 一组联系人,使用|分隔名称和电话号码和绑定号码,名称使用UNICODE编码直接下发byte,多组之间使用逗号分隔,未填写的可为空,但位置仍需保留
+ * 设备响应: IWAPWL,080835, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx, D3590D54|135xxxxxxxxxx#
+ * 080835: 设备响应的时候带上响应流水号
+ * D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx回复设备当前设置的主控号码供平台同步使用
+ * 说明: 本消息适用所有终端
+ */
+ public static StringMessage APWL(String index,String[] phnumbs){
+ return genStringMessage("APWL",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APWL))
+ .append(CMDSPLIT).append(index)
+ .append(CMDSPLIT).append(phnumbs[0])
+ .append(CMDSPLIT).append(phnumbs[1])
+ .append(CMDSPLIT).append(phnumbs[2])
+ .append(CMDSPLIT).append(phnumbs[3])
+ .append(CMDSPLIT).append(phnumbs[4])
+ .append(CMDSPLIT).append(phnumbs[5])
+ .append(CMDSPLIT).append(phnumbs[6])
+ .append(CMDSPLIT).append(phnumbs[7])
+ .append(CMDSPLIT).append(phnumbs[8])
+ .append(CMDSPLIT).append(phnumbs[9])
+ .append(CMDEND).toString());
+ }
+ //设置通讯录,白名单(10个)
+ public void handleBPWL(Connection connection,String cmd , Runtime runtime){
+// IWBPWL,867155030001063,357444,9b44529b|13554820016,,,,,,,,,
+/**
+ * IWBPWL,353456789012345,080835,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx#
+ */
+ String[] cmdlist=cmd.split(CMDSPLIT);
+ String[] phnums=new String[]{"","","","","","","","","",""};
+ StringBuffer sb=new StringBuffer().append("recv phone Numbs ");
+ if (cmdlist.length>=3){
+ switch (cmdlist.length){
+ case 13:
+ phnums[9]=cmdlist[12];
+ sb.append(phnums[9]).append(",");
+ case 12:
+ phnums[8]=cmdlist[11];
+ sb.append(phnums[8]).append(",");
+ case 11:
+ phnums[7]=cmdlist[10];
+ sb.append(phnums[7]).append(",");
+ case 10:
+ phnums[6]=cmdlist[9];
+ sb.append(phnums[6]).append(",");
+ case 9:
+ phnums[5]=cmdlist[8];
+ sb.append(phnums[5]).append(",");
+ case 8:
+ phnums[4]=cmdlist[7];
+ sb.append(phnums[4]).append(",");
+ case 7:
+ phnums[3]=cmdlist[6];
+ sb.append(phnums[3]).append(",");
+ case 6:
+ phnums[2]=cmdlist[5];
+ sb.append(phnums[2]).append(",");
+ case 5:
+ phnums[1]=cmdlist[4];
+ sb.append(phnums[1]).append(",");
+ case 4:
+ phnums[0]=cmdlist[3];
+ sb.append(phnums[0]).append(",");
+
+ }
+
+ String index=cmdlist[2];
+ ICLogger.i(sb.toString());
+ connection.send(AP14(index,phnums));
+ ArrayList<Contact> contactArray=new ArrayList<Contact>();
+
+ if(Config.custom_name.equals("YT")) {
+ ICLogger.i("=====add hotline 96885 ");
+ contactArray.add(new Contact(Contact.CATEGORY_CALL, runtime.getContextProxy().context.getResources().getString(R.string.hotline), "96885"));
+ }
+ for (int i=0; i< phnums.length;i++){
+ String[] tmp= phnums[i].split("\\|");
+ if (tmp.length==2){
+ String name= Util.decodeUnicode2Utf8(tmp[0]);
+ String phonem=tmp[1];
+ ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem);
+ contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));
+ }else{
+ ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length);
+
+ }
+ }
+// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666"));
+// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666"));
+// contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666"));
+// contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666"));
+
+ runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false);
+
+ }else{
+ ICLogger.i(" BPWL format error!");
+ }
+
+ }
+
+
+
+
+ public static StringMessage AP65(String id,String cy)
+ {
+ return genStringMessage("AP65",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP65))
+ .append(CMDSPLIT).append(id)
+ .append(CMDSPLIT).append(cy)
+ .append(CMDEND).toString());
+ }
+
+ public void handleBP65( Connection connection,Runtime runtime,String cmd) {
+/***
+ * 36.音量设置(下行协议:BP65,响应:AP65)
+ * 示例:
+ * IWBP65,353456789012345,080835,1#
+ * 说明:
+ * IW:标识符
+ * BP65: 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835 :指令流水号
+ * 1 : 表示音量等级为1
+ * 设备响应: IWAP65,080835, 1#
+ * 080835: 设备响应的时候带上响应流水号
+ * 1: 表示指令执行成功,音量等级为1
+ */
+
+ log("BP65 "+cmd);
+ String[] cmdlist=cmd.split(CMDSPLIT);
+ if (cmdlist.length==4){
+ String id=cmdlist[2];
+ String cycle=cmdlist[3].replace("#","");
+ connection.send(AP65(id,cycle));
+
+ if(Util.isNumeric(cycle)){
+ int mastervolume=Integer.parseInt(cycle);
+
+ ICLogger.i("设置音量 "+mastervolume);
+ //实际设备音量 0~15 协议音量0~7需要转换
+ int volume=mastervolume*2;
+ if (volume<0)volume=0;
+ if(volume>=14) volume=15;
+ Config.setMasterVolume(runtime.getContextProxy().context,mastervolume*2);
+ ICAudioManager.setMasterVolumn(runtime.getContextProxy().context,mastervolume*2);
+
+ }else{
+ ICLogger.i(" BP65 Format error!");
+ }
+
+ }else{
+ ICLogger.i(" BP65 Format error!");
+ }
+ }
+
+ public static StringMessage AP47(String id,String cycle)
+ {
+ return genStringMessage("AP47",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP47))
+ .append(CMDSPLIT).append(id)
+ .append(CMDSPLIT).append(cycle)
+ .append(CMDEND).toString());
+ }
+
+
+ public void handleBP47( Connection connection,Runtime runtime,String cmd) {
+/***
+ * 37.震动设置(下行协议号:BP47,响应:AP47)
+ * 示例:
+ * IWBP47,353456789012345,080835,10#
+ * 说明:
+ * IW:标识符
+ * BP47 : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835 :指令流水号
+ * 10: 表示震动时长,此处单位为称,表示震动10秒钟
+ * 设备响应: IWAP47,080835,1#
+ * 080835:指令流水号
+ * 1:表示设备执行成功,0 表示设备执行失败
+ */
+
+ log("BP47 "+cmd);
+ String[] cmdlist=cmd.split(CMDSPLIT);
+ if (cmdlist.length==4){
+ String id=cmdlist[2];
+ String cycle=cmdlist[3].replace("#","");
+ connection.send(AP47(id,cycle));
+
+ if(Util.isNumeric(cycle)){
+ int vibduration=Integer.parseInt(cycle);
+ ICLogger.i("设置震动时长 "+vibduration+" 秒");
+ Config.setDurationOfVibration(runtime.getContextProxy().context,vibduration);
+ VibrateUtil.setVibPattern(vibduration*1000);
+
+ }else{
+ ICLogger.i(" BP47 Format error!");
+ }
+
+ }else{
+ ICLogger.i(" BP47 Format error!");
+ }
+ }
+ public boolean handleCmd(CMD_TYPE type, String cmd) {
+
+ //普通非二进制命令用此函数处理
+ boolean ret=true;
+ ICLogger.i("handleCmd "+type.name() + " strLen="+cmd.length());
+ if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd);
+ cmd=cmd.replace(" ","");
+ switch (type){
+ case BP00: //登录包
+ handleBP00(mRuntime,cmd);
+ ICLogger.i("服务器收到登录包AP00");
+ mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化
+ break;
+ case BP01: //gps定位包
+ handleBP01(cmd);
+ ICLogger.i("服务器收到定位AP01");
+ mConnection.DeliverCMDMessageToSystem("AP01",cmd);//通知下面线程状态变化
+ break;
+ case BP02:// wifi定位包
+ handleBP02(cmd);
+ ICLogger.i("服务器收到定位AP02");
+ mConnection.DeliverCMDMessageToSystem("AP02",cmd);//通知下面线程状态变化
+ break;
+ case BP03: //心跳包
+ handleBP03(cmd);
+ ICLogger.i("服务器收到心跳包AP03");
+ mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化
+ break;
+
+ case BP07:
+ //收到发送的语音包
+ handleBP07(cmd,mConnection);
+ break;
+ case BP10:
+ //报警包
+ mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化
+ break;
+
+ case BPTM:
+ //校时命令
+ handleBPTM(cmd);
+ ICLogger.i("服务器收到校时命令APTM");
+ mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程状态变化
+ break;
+ case BP85://设置闹钟
+ handleBP85(cmd,mConnection,mRuntime);
+ ICLogger.i("收到服务器设置闹钟命令BP85");
+ mConnection.DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程状态变化
+ break;
+
+ case BP87:
+ handleBP87(cmd,mConnection,mRuntime);
+ ICLogger.i("收到服务器 QRCode uri BP87");
+ break;
+ case BP33:
+ //设置工作模式
+ handleBP33(mConnection,mRuntime,cmd);
+ mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化
+
+ break;
+ case BP34:
+ //设置工作模式
+ handleBP34(mConnection,mRuntime,cmd);
+ mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化
+ break;
+ case BP16:
+ //立即定位指令(长链接有效)
+ handleBP16(mConnection,mRuntime,cmd);
+ mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化
+ break;
+
+ case BP46: //立即拍照
+ ICLogger.i("立即拍照!");
+ handleBP46(cmd,mConnection,mRuntime);
+ break;
+
+ case BP12:
+ //收到设置SOS号码
+ handleBP12(mConnection,cmd,mRuntime);
+ ICLogger.i("收到服务器设置SOS号码命令BP12");
+ break;
+ case BP14:
+ //收到设置白名单号码
+ handleBP14(mConnection,cmd,mRuntime);
+ ICLogger.i("收到服务器设置白名单号码命令BP14");
+ break;
+ case BPWL:
+ //收到设置白名单号码
+ handleBPWL(mConnection,cmd,mRuntime);
+ ICLogger.i("收到服务器设置白名单号码命令BPWL");
+ break;
+ case BP15:
+ handleBP15(cmd,mConnection,mRuntime);
+ ICLogger.i("收到服务器设置定位命令BP15");
+ break;
+ case BP17:
+ //收到恢复出厂设置
+ handleBP17(mConnection,cmd);
+ ICLogger.i("收到服务器恢复出厂设置命令BP17");
+ mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化
+ break;
+
+ case BP18:
+ //收到重启
+ handleBP18(mConnection,cmd);
+ ICLogger.i("收到服务器重启命令BP18");
+ mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化
+ break;
+
+ case BP31:
+ //收到关机
+ handleBP31(mConnection,cmd);
+ ICLogger.i("收到服务器关机命令BP31");
+ mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化
+ break;
+ case BP40:
+ //服务器推送文本
+ handleBP40(mConnection,mRuntime,cmd);
+ ICLogger.i("收到服务器推送文本消息");
+ mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化
+ break;
+
+ case BPXL:
+ handleBPXL(cmd,mConnection);
+ ICLogger.i("收到服务器心率检测命令");
+ if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();
+ break;
+ case BPXY:
+ handleBPXY(cmd,mConnection);
+ ICLogger.i("收到服务器血压检测命令");
+ if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();
+ break;
+ case BPJZ:
+ handleBPJZ(cmd,mConnection,mRuntime);
+ ICLogger.i("收到服务器血压校准命令");
+ break;
+ case BPHT:
+ ICLogger.i("服务器收到上传的心率血压");
+ mConnection.DeliverCMDMessageToSystem("APHT",cmd);//通知下面线程状态变化
+ break;
+ case BP84:
+ handleBP84(cmd,mConnection);
+ ICLogger.i("收到服务器白名单命令");
+ break;
+
+ case BP86:
+ //心率周期
+ handleBP86(cmd,mConnection,mRuntime);
+ mConnection.DeliverCMDMessageToSystem("AP86",cmd);//通知下面线程状态变化
+
+ break;
+ case BP68: //绑定解绑
+ handleBP68(cmd,mConnection,mRuntime);
+ break;
+ case BP88:
+ //收到查找设备消息
+ handleBP88(cmd,mConnection);
+ mConnection.DeliverCMDMessageToSystem("findDev",cmd);//通知下面线程状态变化
+ break;
+ case BP89:
+ //心率/血压阀值
+ handleBP89(cmd,mConnection);
+ mConnection.DeliverCMDMessageToSystem("AP89",cmd);//通知下面线程状态变化
+ break;
+
+ case BPTE: //设置测试体温
+ handleBPTE(cmd,mConnection,mRuntime);
+ mConnection.DeliverCMDMessageToSystem("APTE",cmd);//通知下面线程状态变化
+ break;
+
+ case BPTP:
+ handleBPTP();
+ mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化
+ break;
+ case BPHP:
+ handleBPHP();
+ mConnection.DeliverCMDMessageToSystem("APHP",cmd);//通知下面线程状态变化
+ break;
+ case BPX1://设置 心率血压血氧修正值
+ handleBPX1(cmd,mConnection,mRuntime);
+ ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1");
+ mConnection.DeliverCMDMessageToSystem("APX1",cmd);//通知下面线程状态变化
+ break;
+
+ case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。
+ handleBPS4(cmd,mConnection,mRuntime);
+ ICLogger.i("收到 提醒设置(时间段)");
+ mConnection.DeliverCMDMessageToSystem("APS4",cmd);//通知下面线程状态变化
+ break;
+ case BPDE:
+ handleBPDE(mConnection,cmd,mRuntime);
+ ICLogger.i(" 收到 进出围栏通知!");
+ mConnection.DeliverCMDMessageToSystem("APDE",cmd);//通知下面线程状态变化
+ break;
+
+ case BPTU:
+ handleBPTU(cmd, mConnection);
+ ICLogger.i("收到服务器 图片语音 消息 BPTU");
+ // mConnection.DeliverCMDMessageToSystem("APTU", "");//通知下面线程状态变化
+ break;
+ case BPDG:
+ handleBPDG(mConnection,cmd,mRuntime);
+ ICLogger.i(" 收到 体温阈值设置!");
+ mConnection.DeliverCMDMessageToSystem("APDG",cmd);//通知下面线程状态变化
+ break;
+ case BPSL:
+ ICLogger.i("睡眠数据上传完毕!");
+ mConnection.DeliverCMDMessageToSystem("APSL",cmd);//通知下面线程状态变化
+ break;
+
+ case BPDH:
+ ICLogger.i("聆听");
+ handleBPDH(mConnection,mRuntime,cmd);
+ break;
+
+ case BPTQ: //天气下发
+ handleBPTQ(mConnection,mRuntime,cmd);
+ break;
+ case BPAT://剪断开关设定
+ handleBPAT(mConnection,mRuntime,cmd);
+ break;
+
+ case BPBT://蓝牙扫描设置
+ handleBPBT(mConnection,mRuntime,cmd);
+ break;
+
+ case BP65://声音设置
+ handleBP65(mConnection,mRuntime,cmd);
+ break;
+ case BP47://震动设置
+ handleBP47(mConnection,mRuntime,cmd);
+ break;
+
+ }
+
+ return ret;
+
+ }
+
+
+ public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) {
+
+ //只有需要传递二进制数据的才需要这个函数,目前只有BP28需要
+ boolean ret=true;
+ ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length );
+ if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes));
+ switch (type) {
+ case BP28:
+ handleBP28(mConnection,cmd, mRuntime,bytes);
+ ICLogger.i("收到服务器语音BP28");
+// mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化
+ break;
+ }
+ return ret;
+ }
+}