release L02protocolV2 V722
authorsnickersun <scy@incartech.cn>
Thu, 3 Dec 2020 01:55:02 +0000 (09:55 +0800)
committersnickersun <scy@incartech.cn>
Thu, 3 Dec 2020 01:55:02 +0000 (09:55 +0800)
1、蓝牙上报,去掉mac中的:
2、protocol_ic 蓝牙APBR收到服务器反馈处理,
3、放走丢的AL, PRACTICE 协议同样需要处理服务器反馈。

app/release/ICSer_V722_2012030950_release.apk [moved from app/release/ICSer_V720_2012011924_release.apk with 78% similarity]
app/release/output.json
app/src/main/java/com/ic/protocols/protocol_fzd.java
app/src/main/java/com/ic/protocols/protocol_ic.java
app/src/main/java/com/ic/protocols/protocol_mqtt.java
app/version_code.properties

similarity index 78%
rename from app/release/ICSer_V720_2012011924_release.apk
rename to app/release/ICSer_V722_2012030950_release.apk
index a8a8f39..3754824 100644 (file)
Binary files a/app/release/ICSer_V720_2012011924_release.apk and b/app/release/ICSer_V722_2012030950_release.apk differ
index 3814e48..7a6e6f1 100644 (file)
@@ -1 +1 @@
-[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":720,"versionName":"2012011924","enabled":true,"outputFile":"ICSer_V720_2012011924_release.apk","fullName":"release","baseName":"release"},"path":"ICSer_V720_2012011924_release.apk","properties":{}}]
\ No newline at end of file
+[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":722,"versionName":"2012030950","enabled":true,"outputFile":"ICSer_V722_2012030950_release.apk","fullName":"release","baseName":"release"},"path":"ICSer_V722_2012030950_release.apk","properties":{}}]
\ No newline at end of file
index e211033..5d396c9 100644 (file)
-package com.ic.protocols;\r
-\r
-import android.content.ComponentName;\r
-//import android.content.IClipboard;\r
-import android.content.Intent;\r
-import android.net.Uri;\r
-import android.os.Environment;\r
-\r
-//import com.android.internal.telephony.uicc.RuimFileHandler;\r
-import com.enqualcomm.support.Config;\r
-import com.enqualcomm.support.CoreService;\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.HealthInfo;\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.Connection;\r
-import com.enqualcomm.support.utils.ICLogger;\r
-import com.enqualcomm.support.utils.MD5;\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.regexUtil;\r
-\r
-import java.io.File;\r
-import java.util.ArrayList;\r
-import java.util.Date;\r
-import java.util.HashMap;\r
-\r
-import chestnut.utils.PhoneUtils;\r
-\r
-import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\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_fzd {\r
-    private static final String TAG = "ICSrv." + protocol_fzd.class.getSimpleName();\r
-    private static final String PrivKEY = "XMQcHi0lGIdru6xzW7lygBwBT8N0c09P";\r
-    private static final String CMDHEADER = "[";\r
-    private static final String CMDCOMPANY="IC";\r
-    private static final String CMDEND = "]";\r
-    private static final String CMDHEADERSPLIT = "*";\r
-    private static final String CMDSPLIT = ",";\r
-\r
-    public static final String defaultServerIP="api.xcloudtech.com";\r
-    public static final int defaultServerPort=9000;\r
-\r
-    public enum CMD_TYPE {\r
-        /*终端发起*/\r
-        //链路保持数据\r
-        LK,//登录\r
-        PING,//绑定查询\r
-        KA,//心跳包\r
-        UD,//位置上传\r
-        UD2,//盲点位置上传\r
-        AL,//报警数据上传\r
-        LGZONE,//获取服务器时区时间\r
-        WT,//获取天气\r
-        img,//上传图片\r
-        VOICE,//上传语音\r
-        WG,//请求位置信息\r
-        DLT,//解绑\r
-        temp,//体温上传\r
-        /* 服务器发起*/\r
-        UPLOAD,//数据上传间隔设置\r
-        CENTER,//中心号码设置\r
-        CALL, //拨打电话\r
-        MONITOR,//监听\r
-        SOS,//SOS 号码设置\r
-        FACTORY,//恢复出厂设置\r
-        SOSSMS,//SOS 短信报警开关\r
-        LOWBAT,//低电短信报警开关\r
-        VERNO,//版本查询\r
-        CR,//定位指令\r
-        POWEROFF,//关机指令\r
-        REMOVE,//取下手环报警开关\r
-        REMOVESMS,//取下手表短信报警开关\r
-        PEDO,//计步功能开关\r
-        SILENCETIME,//免打扰时间段设置\r
-        SILENCETIME2, //免打扰时间段设置\r
-        SLEEPTIME,//翻转检测时间段设置\r
-        FIND,//找手表指令\r
-        REMIND,//闹钟设置指令\r
-        TK,//对讲功能(微聊发送语音)\r
-        PHL,//设置电话本+白名单(最多 50 条)\r
-        wdstart,//远程测温\r
-        bldstart,//远程测血压\r
-        hrtstart,//远程测量心率\r
-        BOOTOFF,//定时关机\r
-        oxygen,//血氧上传\r
-        blood,//血压上传\r
-        heart,//心率上传\r
-        PRACTICE,//自由锻炼数据上传\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.LK, "LK");\r
-        cmdMap.put(CMD_TYPE.PING, "PING");\r
-        cmdMap.put(CMD_TYPE.KA, "KA");\r
-        cmdMap.put(CMD_TYPE.UD, "UD");\r
-        cmdMap.put(CMD_TYPE.UD2, "UD2");\r
-        cmdMap.put(CMD_TYPE.AL, "AL");\r
-        cmdMap.put(CMD_TYPE.LGZONE, "LGZONE");\r
-        cmdMap.put(CMD_TYPE.WT, "WT");\r
-        cmdMap.put(CMD_TYPE.img, "img");\r
-        cmdMap.put(CMD_TYPE.VOICE, "VOICE");\r
-        cmdMap.put(CMD_TYPE.WG, "WG");\r
-        cmdMap.put(CMD_TYPE.DLT, "DLT");\r
-        cmdMap.put(CMD_TYPE.temp, "temp");\r
-        cmdMap.put(CMD_TYPE.UPLOAD, "UPLOAD");\r
-        cmdMap.put(CMD_TYPE.CENTER, "CENTER");\r
-        cmdMap.put(CMD_TYPE.CALL, "CALL");\r
-        cmdMap.put(CMD_TYPE.MONITOR, "MONITOR");\r
-        cmdMap.put(CMD_TYPE.SOS, "SOS");\r
-        cmdMap.put(CMD_TYPE.FACTORY, "FACTORY");\r
-        cmdMap.put(CMD_TYPE.SOSSMS, "SOSSMS");\r
-        cmdMap.put(CMD_TYPE.LOWBAT, "LOWBAT");\r
-        cmdMap.put(CMD_TYPE.VERNO, "VERNO");\r
-        cmdMap.put(CMD_TYPE.CR, "CR");\r
-        cmdMap.put(CMD_TYPE.POWEROFF, "POWEROFF");\r
-        cmdMap.put(CMD_TYPE.REMOVE, "REMOVE");\r
-        cmdMap.put(CMD_TYPE.REMOVESMS, "REMOVESMS");\r
-        cmdMap.put(CMD_TYPE.PEDO, "PEDO");\r
-        cmdMap.put(CMD_TYPE.SILENCETIME, "SILENCETIME");\r
-        cmdMap.put(CMD_TYPE.SILENCETIME2, "SILENCETIME2");\r
-        cmdMap.put(CMD_TYPE.SLEEPTIME, "SLEEPTIME");\r
-        cmdMap.put(CMD_TYPE.FIND, "FIND");\r
-        cmdMap.put(CMD_TYPE.REMIND, "REMIND");\r
-        cmdMap.put(CMD_TYPE.TK, "TK");\r
-        cmdMap.put(CMD_TYPE.PHL, "PHL");\r
-        cmdMap.put(CMD_TYPE.wdstart, "wdstart");\r
-        cmdMap.put(CMD_TYPE.bldstart, "bldstart");\r
-        cmdMap.put(CMD_TYPE.hrtstart, "hrtstart");\r
-        cmdMap.put(CMD_TYPE.BOOTOFF, "BOOTOFF");\r
-        cmdMap.put(CMD_TYPE.oxygen, "oxygen");\r
-        cmdMap.put(CMD_TYPE.blood, "blood");\r
-        cmdMap.put(CMD_TYPE.heart, "heart");\r
-        cmdMap.put(CMD_TYPE.PRACTICE, "PRACTICE");\r
-    }\r
-\r
-    private Connection mConnection=null;\r
-    private Runtime mRuntime=null;\r
-\r
-    public protocol_fzd(Connection connect, Runtime runtime) {\r
-        mConnection=connect;\r
-        mRuntime=runtime;\r
-\r
-    }\r
-\r
-    private StringBuffer cmdbuf = new StringBuffer();\r
-\r
-//    /*\r
-//    输入的字符串,如果有完整命令,返回 true\r
-//    否则返回 false\r
-//     */\r
-//    public boolean isCmdStr(String msg) {\r
-//        /***\r
-//         * IC*334588000000156*LEN*FALLDOWN\r
-//         */\r
-//        String cmd;\r
-//        int index=msg.indexOf(CMDSPLIT);\r
-//        if (index > 0){\r
-//            cmd = msg.substring(0,index);\r
-//        }else{\r
-//            cmd = msg;\r
-//        }\r
-//        if (regexUtil.isFZDCMD(cmd) ) {\r
-//            return true;\r
-//        }\r
-//        return false;\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
-    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
-    /*\r
-    输入的字符串,如果有完整命令,返回 命令名\r
-    否则返回 空字符串\r
-     */\r
-    public static String isCmdStr(String msg) {\r
-        String cmd_msgbuf=msg;\r
-        int  cmdindex =cmd_msgbuf.indexOf(CMDCOMPANY+CMDHEADERSPLIT);\r
-        if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据\r
-            String cmd=cmd_msgbuf.substring(cmdindex);\r
-            cmd_msgbuf=cmd;\r
-        }\r
-        cmdindex=cmd_msgbuf.indexOf(CMDEND);\r
-        if(cmdindex>0){\r
-            String cmd=cmd_msgbuf.substring(0,cmdindex);\r
-            cmd_msgbuf=cmd;\r
-        }\r
-        cmdindex=cmd_msgbuf.indexOf(CMDSPLIT);\r
-        if(cmdindex>0){\r
-            String cmd=cmd_msgbuf.substring(0,cmdindex);\r
-            cmd_msgbuf=cmd;\r
-        }\r
-\r
-        if (regexUtil.isFZDCMD(cmd_msgbuf)) {\r
-            for (CMD_TYPE key : cmdMap.keySet()) {\r
-                if (regexUtil.isFZDCMD(cmdMap.get(key), cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动\r
-                    ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key));\r
-                    return cmdMap.get(key);\r
-                }\r
-            }\r
-            return "";\r
-        }else\r
-            return "";\r
-    }\r
-    /*\r
-    返回true 表示 cmd 全部解析成功\r
-    返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用\r
-    字符串通过#号进行识别。\r
-    每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃\r
-     */\r
-    public boolean parserCmd(byte[] bytes) {\r
-        String cmd_msgbuf=new String(bytes);\r
-        log("bytes.size "+bytes.length);\r
-        cmdbuf.append(cmd_msgbuf);\r
-        log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString());\r
-        int  cmdindex =cmd_msgbuf.indexOf(CMDCOMPANY+CMDHEADERSPLIT);\r
-        if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据\r
-            String cmd=cmd_msgbuf.substring(cmdindex);\r
-            cmd_msgbuf=cmd;\r
-        }\r
-        cmdindex=cmd_msgbuf.indexOf(CMDEND);\r
-        if(cmdindex>0){\r
-            String cmd=cmd_msgbuf.substring(0,cmdindex);\r
-            cmd_msgbuf=cmd;\r
-        }\r
-        cmdindex=cmd_msgbuf.indexOf(CMDSPLIT);\r
-        if(cmdindex>0){\r
-            String cmd=cmd_msgbuf.substring(0,cmdindex);\r
-            cmd_msgbuf=cmd;\r
-        }\r
-        if (cmdbuf.toString().split(CMDCOMPANY+CMDHEADERSPLIT).length>1)\r
-        {\r
-            ICLogger.i("More than 1 cmd in buffer ! just log it");\r
-        }\r
-            for (CMD_TYPE key : cmdMap.keySet()) {\r
-               // ICLogger.i("key "+cmdMap.get(key)+" cmdbuf "+cmd_msgbuf);\r
-                if (regexUtil.isFZDCMD(cmdMap.get(key),cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动\r
-                    String data=cmdbuf.toString().replace(CMDHEADER,"").replace(cmd_msgbuf,"").replace(CMDEND,"");\r
-//                    ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " ,  " + cmdbuf.toString() + "  "+cmd_msgbuf  + " data "+data );\r
-//                    if (key == CMD_TYPE.TK) {\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
-                        if (data.startsWith(CMDSPLIT)) data=data.substring(1);\r
-                        handleCmd(key, cmd_msgbuf,data);\r
-                        cmdbuf.delete(0,cmdbuf.length());//处理后清空\r
-//                    }\r
-                }\r
-            }\r
-        return true;\r
-    }\r
-\r
-    private static String getHexLen(int len){\r
-        StringBuilder sb=new StringBuilder();\r
-        int v = len & 0xFFFF;\r
-        String hv = Integer.toHexString(v);\r
-        if (hv.length() ==1 ) {\r
-            sb.append(0).append(0).append(0);\r
-        }else if (hv.length()==2){\r
-            sb.append(0).append(0);\r
-        }else if (hv.length()==3){\r
-            sb.append(0);\r
-        }\r
-        sb.append(hv);\r
-        return sb.toString();\r
-    }\r
-    private static String genHeader(int len,String cmd){\r
-\r
-        if (CoreService.getInstance()==null)\r
-            return "";\r
-\r
-        String imei =CoreService.getInstance().getRuntime().IMEI();\r
-        return new StringBuilder().append(CMDCOMPANY).append(CMDHEADERSPLIT)\r
-                .append(imei).append(CMDHEADERSPLIT)\r
-                .append(getHexLen(len)).append(CMDHEADERSPLIT).append(cmd).toString();\r
-    }\r
-\r
-    private static String keyheader(String cmd,int len){\r
-        String header=genHeader(len,cmd);\r
-        String key= MD5.getCMDStringMD5(header+PrivKEY);\r
-        return key;\r
-    }\r
-\r
-    public static StringMessage genFZDCMD( String CMD){\r
-        StringBuilder sb=new StringBuilder();\r
-        int len=CMD.length();\r
-        String header=genHeader(len,CMD);\r
-        String keyheader=keyheader(CMD,len);\r
-        sb.append(CMDHEADER).append(keyheader).append(header).append(CMDEND);\r
-        return genStringMessage(CMD,sb.toString());\r
-    }\r
-    public static StringMessage genFZDCMD( String CMD,String data){\r
-        StringBuilder sb=new StringBuilder();\r
-        String data_buf=CMD+CMDSPLIT+data;\r
-        int data_buf_len=data_buf.length();\r
-        String header=genHeader(data_buf_len,CMD);\r
-        String keyheader=keyheader(CMD,data_buf_len);//计算header md5值\r
-        sb.append(CMDHEADER).append(keyheader).append(header).append(CMDSPLIT).append(data).append(CMDEND);\r
-        return genStringMessage(CMD,sb.toString());\r
-    }\r
-    /*登录*/\r
-    public static StringMessage LK() {\r
-        /*IC*YYYYYYYYYYYYYYY*LEN*LK*/\r
-        return genFZDCMD(cmdMap.get(CMD_TYPE.LK));\r
-    }\r
-\r
-    /**\r
-     * 绑定\r
-     * */\r
-    public static StringMessage PING(){\r
-//        IC*YYYYYYYYYYYYYYY*LEN*PING\r
-        return genFZDCMD(cmdMap.get(CMD_TYPE.PING));\r
-    }\r
-\r
-\r
-    public static void handlePing(Runtime runtime,String data){\r
-//        [IC*YYYYYYYYYYYYYYY*LEN*PING,是否绑定(0 表示未绑定,1 表示绑定)]\r
-//        实例:[IC*334588000000156*0006*PING,0]或[IC*334588000000156*0006*PING,1]\r
-        try {\r
-            int bind = Integer.parseInt(data);\r
-            if (bind == 0) {\r
-                ICLogger.i("设备未绑定!");\r
-                runtime.BindingStatus = false;\r
-            } else {\r
-                ICLogger.i("设备已绑定!");\r
-                runtime.BindingStatus = true;\r
-            }\r
-        }catch (Exception e){\r
-            ICLogger.e(e.getMessage(),e);\r
-        }\r
-\r
-    }\r
-\r
-    public static StringMessage KA(Runtime runtime){\r
-//[IC*YYYYYYYYYYYYYYY*LEN*KA,日期,步数,翻滚次数,电量百分数] 实例:[IC*334588000000156*0014*KA,120414,50,100,100]\r
-        StringBuilder sb=new StringBuilder();\r
-        String cmd=cmdMap.get(CMD_TYPE.KA);\r
-        sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT)\r
-        .append(runtime.getTotalStepCount()).append(CMDSPLIT)\r
-        .append(runtime.getRolltimes()).append(CMDSPLIT)\r
-        .append(runtime.getBattery());\r
-        return genFZDCMD(cmd,sb.toString());\r
-    }\r
-\r
-\r
-    public void handleKA(Runtime runtime,String data){\r
-\r
-    }\r
-\r
-\r
-    public static StringMessage LGZONE(Runtime runtime) {\r
-       return genFZDCMD(cmdMap.get(CMD_TYPE.LGZONE));\r
-    }\r
-    public void handleLGZONE(Runtime runtime, String data){\r
-\r
-        /***\r
-         *  平台回复:[XT*YYYYYYYYYYYYYYY*LEN*LGZONE,时区,时间,日期]\r
-         *  实例: [XT*1234567890*001D*LGZONE,+8,08:00:00,2016-01-12]\r
-         */\r
-        String[] list=data.split(CMDSPLIT);\r
-        if (list.length==3){\r
-            String timeZone=list[0].trim();\r
-            String date=list[2].trim();\r
-            String time=list[1].trim();\r
-            Date datetime= TimeUtil.parseDatetiime(date,time);\r
-            int timezone;\r
-            try\r
-            {\r
-                timezone=Integer.parseInt(timeZone.replace("+","").trim());\r
-            }catch (Exception e){\r
-                ICLogger.e("timezone",e);\r
-                timezone=8;\r
-            }\r
-\r
-            if (datetime!=null){\r
-                ICLogger.i("==="+timezone+" "+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
-//            Set Datetime 20200505112734\r
-//            Set TimeZone 8\r
-\r
-        }else{\r
-            ICLogger.i("LGZONE Format Error!");\r
-        }\r
-\r
-\r
-    }\r
-\r
-\r
-    /*LBS+GPS混合定位*/\r
-    public static StringMessage UD(Runtime runtime) {\r
-        /***\r
-         * [IC*334588000000156*00CD*UD,180916,025723,A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6,100, 60,0,0,00000010,7,255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,95\r
-         * 29,21242,124,9529,21151,120,9529,63556,119,0]\r
-         * 说明:\r
-         * 数据内容:\r
-         * UD,命令号\r
-         * 180916,日期(年月日)(0 时区),表示 0 时区的二零一八年九月十六号\r
-         *\r
-         * 025723,时间(时分秒)(0 时区),表示 0 时区的两点五十七分二十三秒A,gps 定位有效\r
-         * 22.570733,纬度\r
-         * N,纬度表示113.8626083,经度\r
-         * E,经度表示0.00,速度\r
-         * 249.5,方向\r
-         * 0.0,海拔\r
-         * 6,卫星个数\r
-         *\r
-         * 100,gsm 信号强度\r
-         * 60,电量\r
-         * 0,计步数\r
-         * 0,翻转次数\r
-         * 00000010,终端状态,数据为 16 进制,解析成二进制为 0000 0000 0000 0000 0000 0000 0001 0000\r
-         * 前面 4 个字节表示状态,后面 4 个字节表示报警,数据中第 4 位为 1,对照文档最后的数据解析,表示手表静止状态。详细可参看文档最后部分。\r
-         * 7,基站个数\r
-         * 255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,\r
-         * 21151,120,9529,63556,119,基站信息\r
-         * 0,WiFi 个数\r
-         *\r
-         */\r
-\r
-\r
-        StringBuilder sb=new StringBuilder();\r
-        String cmd=cmdMap.get(CMD_TYPE.UD);\r
-        sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT)\r
-                .append(TimeUtil.getSystemTimeHHmmss()).append(CMDSPLIT)\r
-                .append(runtime.getFZDGPSData()).append(CMDSPLIT)\r
-                .append(String.format("%03d",abs(runtime.getSignalStrength()))).append(CMDSPLIT)\r
-                .append(runtime.getBattery()).append(CMDSPLIT)\r
-                .append(runtime.getTotalStepCount()).append(CMDSPLIT)\r
-                .append(runtime.getRolltimes()).append(CMDSPLIT)\r
-                .append(runtime.getFZDDevStatus(runtime)).append(CMDSPLIT)\r
-                .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT)\r
-                .append(runtime.getFZDWifiData());\r
-\r
-        return genFZDCMD(cmd,sb.toString());\r
-    }\r
-\r
-\r
-    /*LBS+WiFi混合定位*/\r
-    public static String UD2(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 new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.LK)).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 handleUD2(String cmd){\r
-        log("BP02定位接收成功");\r
-    }\r
-\r
-\r
-    public static StringMessage AL(Runtime runtime){\r
-        /***\r
-         * [IC*334588000000156*00CD*AL,180916,064153,A,22.570512,N,113.8623267,E,0.00,154.8,0.0,11,10 0,100,0,0,00100018,7,0,460,1,9529,21809,155,9529,21242,132,9529,21405,131,9529,63554,131,9\r
-         * 529,63555,130,9529,63556,118,9529,21869,116,0,12.4]\r
-         * 平台回复:\r
-         * [IC*YYYYYYYYYYYYYYY*LEN*AL]\r
-         * 实例:[IC*334588000000156*0002*AL]\r
-         * 说明:终端产生警情后发送报警信息到平台,若终端没有收到回复,则定时上报直到收到报警确认为止.\r
-         */\r
-\r
-        StringBuilder sb=new StringBuilder();\r
-        String cmd=cmdMap.get(CMD_TYPE.AL);\r
-        sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT)\r
-                .append(TimeUtil.getSystemTimeHHmmss()).append(CMDSPLIT)\r
-                .append(runtime.getFZDGPSData()).append(CMDSPLIT)\r
-                .append(String.format("%03d",abs(runtime.getSignalStrength()))).append(CMDSPLIT)\r
-                .append(runtime.getBattery()).append(CMDSPLIT)\r
-                .append(runtime.getTotalStepCount()).append(CMDSPLIT)\r
-                .append(runtime.getRolltimes()).append(CMDSPLIT)\r
-                .append(runtime.getFZDDevStatus(runtime)).append(CMDSPLIT)\r
-                .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT)\r
-                .append(runtime.getFZDWifiData());\r
-\r
-        return genFZDCMD(cmd,sb.toString());\r
-    }\r
-\r
-    public static StringMessage UPLOAD(){\r
-\r
-        return  genFZDCMD(cmdMap.get(CMD_TYPE.UPLOAD));\r
-    }\r
-\r
-    public void handleUPLOAD(Connection connection,Runtime runtime,String cmd,String data){\r
-            connection.send(UPLOAD());\r
-        try {\r
-            int timesecond = Integer.parseInt(data);\r
-            int mod = runtime.getLocationInstance().getWorkingMod();\r
-            log("LOCATION_MODE  " + LOCATION_MODE + " mod " + mod);\r
-            Config.setLocationMode(runtime.getContextProxy().context, mod);\r
-            Config.setLocationCycle(runtime.getContextProxy().context, timesecond);\r
-            runtime.getLocationInstance().setLocation_cycle(timesecond);\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
-    public static StringMessage heart(int hrt){\r
-        return genFZDCMD(cmdMap.get(CMD_TYPE.heart),String.valueOf(hrt));\r
-    }\r
-    public static StringMessage oxygen(int ox){\r
-        return genFZDCMD(cmdMap.get(CMD_TYPE.oxygen),String.valueOf(ox));\r
-    }\r
-\r
-    public static StringMessage blood(int pbl,int pbh){\r
-        String data=pbh+CMDSPLIT+pbl;\r
-        return genFZDCMD(cmdMap.get(CMD_TYPE.blood),data);\r
-    }\r
-\r
-    public static StringMessage temp(double temp){\r
-        return genFZDCMD(cmdMap.get(CMD_TYPE.temp),String.format("%.1f",temp));\r
-    }\r
-    public static StringMessage POWEROFF(){\r
-        return genFZDCMD(cmdMap.get(CMD_TYPE.POWEROFF));\r
-    }\r
-    public void handlePOWEROFF(Connection connection) {\r
-\r
-        connection.send(POWEROFF());\r
-    }\r
-    public static StringMessage CR(){\r
-        return genFZDCMD(cmdMap.get(CMD_TYPE.CR));\r
-    }\r
-    public void handleCR(Connection connection) {\r
-\r
-        connection.send(CR());\r
-    }\r
-    public static StringMessage bldstart(){\r
-        return genFZDCMD(cmdMap.get(CMD_TYPE.bldstart));\r
-    }\r
-    public void handleBldstart(Connection connection) {\r
-\r
-        connection.send(bldstart());\r
-    }\r
-    public static StringMessage wdstart(){\r
-        return genFZDCMD(cmdMap.get(CMD_TYPE.wdstart));\r
-    }\r
-    public void handleWdstart(Connection connection,Runtime runtime ,String data) {\r
-\r
-        connection.send(wdstart());\r
-        try {\r
-            int freq = Integer.parseInt(data);\r
-\r
-\r
-            Config.setTemperatureTestCycle(runtime, freq);\r
-            CoreService.getInstance().setTempAlarm();\r
-\r
-            if(runtime.check_stat_do_temp_test())  TemperatureUtil.doTempTestInThread();\r
-        }catch (Exception e){\r
-            ICLogger.e(e.getMessage(),e);\r
-        }\r
-//\r
-//        double wrist_temp,body_temp;\r
-//        wrist_temp= TemperatureUtil.get_temp_value_adjusted();\r
-//        body_temp=TemperatureUtil.getBodyTemp(wrist_temp,26.0f);\r
-//        String temperatureMsg=temp(body_temp);\r
-//        connection.send(genStringMessage("temp",temperatureMsg));\r
-    }\r
-    public static StringMessage hrtstart(){\r
-        return genFZDCMD(cmdMap.get(CMD_TYPE.hrtstart));\r
-    }\r
-    public void handleHrtstart(Connection connection) {\r
-\r
-        connection.send(hrtstart());\r
-    }\r
-    public static StringMessage FIND(){\r
-        return genFZDCMD(cmdMap.get(CMD_TYPE.FIND));\r
-    }\r
-    public void handleFIND(Connection connection) {\r
-\r
-        connection.send(FIND());\r
-    }\r
-    public static StringMessage SOS(){\r
-        return genFZDCMD(cmdMap.get(CMD_TYPE.SOS));\r
-    }\r
-\r
-\r
-    public void handleSOS(Connection connection,Runtime runtime,String cmd,String data) {\r
-\r
-        connection.send(SOS());\r
-        if (data!=null && data.length()>0) {\r
-            String list[] = data.split(CMDSPLIT);\r
-            if (list.length==1){\r
-                ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
-                if (regexUtil.isMobileNumber( list[0]) || regexUtil.isPhoneNumber(list[0]))\r
-               {\r
-                   contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[0]));\r
-                   ICLogger.i("find SOS1 number "+list[0]);\r
-               }\r
-            }else if (list.length==2){\r
-\r
-                ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
-                if (regexUtil.isMobileNumber( list[0]) || regexUtil.isPhoneNumber(list[0]))\r
-                {\r
-                    contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[0]));\r
-                    ICLogger.i("find SOS1 number "+list[0]);\r
-                }\r
-                if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1]))\r
-                {\r
-                    contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",list[1]));\r
-                    ICLogger.i("find SOS2 number "+list[1]);\r
-                }\r
-\r
-                runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);\r
-\r
-            }\r
-        }\r
-\r
-\r
-    }\r
-    public static StringMessage PHL(){\r
-        return genFZDCMD(cmdMap.get(CMD_TYPE.PHL));\r
-    }\r
-\r
-    public void handlePHL(Connection connection,Runtime runtime,String cmd,String data){\r
-        /***\r
-         * [IC*334588000000156*len*PHL,号码,名字,号码,名字,号码,名字,号码,名字,号码,名字] len:发送长度 16 进制表示 占用 2 个字节\r
-         * 号码:ascii 字符 名字:Unicode 编码\r
-         * 该接口融合了白名单和电话本的功能,最多对应 50 组号码与名字,号码不超过 20 个 ascii 字符, 姓名不超过 10 个 Unicode 字符。\r
-         * 示 例 : [IC*334588000000156*0010*PHL,110,5F204E09]\r
-         * 5F204E09--->张三,是使用 unicode 编码\r
-         * 终端回复:[IC*334588000000156*0003*PHL]\r
-         */\r
-\r
-            String list[]=data.split(CMDSPLIT);\r
-            int listlen=list.length;\r
-            boolean ispared=  (( listlen >0) && (listlen%2 == 0));\r
-            if (ispared){\r
-                ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
-                for(int i=0; i<listlen;i+=2){\r
-                    String phonem=list[i];\r
-                    String name = Util.decodeUnicode2Utf8(list[i+1]);\r
-                    ICLogger.i(i/2 +" 姓名 "+name+", 电话 "+phonem);\r
-                    contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));\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
-            }else{\r
-                ICLogger.i("没有电话本!执行清除操作!");\r
-            }\r
-            connection.send(PHL());\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
-    public static StringMessage PRACTICE(HealthInfo healthInfo){\r
-        if (healthInfo!=null && healthInfo.getInfoCount()>0)\r
-            return genFZDCMD(cmdMap.get(CMD_TYPE.PRACTICE),String.valueOf(healthInfo.getBufferDataStr()));\r
-        else\r
-            return null;\r
-    }\r
-\r
-    public boolean handleCmd(CMD_TYPE type, String cmd , String data) {\r
-\r
-        //普通非二进制命令用此函数处理\r
-        boolean ret=true;\r
-        ICLogger.i("handleCmd "+type.name() + " strLen="+data.length());\r
-        if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd +" "+ data);\r
-        switch (type){\r
-            case LK: //登录包\r
-                ICLogger.i("服务器收到登录包LK");\r
-                mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化\r
-                break;\r
-            case KA:\r
-                ICLogger.i("服务器收到心跳包KA");\r
-                mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case PING:\r
-                handlePing(mRuntime,data);\r
-                ICLogger.i("服务器返回Ping绑定信息");\r
-                break;\r
-            case CR:\r
-                //立即定位指令(长链接有效)\r
-                handleCR(mConnection);\r
-                mConnection.DeliverCMDMessageToSystem("StartLocate",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
-            case UPLOAD:\r
-                //设置工作模式\r
-                handleUPLOAD(mConnection,mRuntime,cmd,data);\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
-//\r
-////                            case BP05: //L02服务器不适用\r
-////                                //查询服务器语音 返回信息\r
-////                                API.handleBP05(cmd);\r
-////                                break;\r
-//\r
-            case SOS:\r
-                //收到设置SOS号码\r
-                handleSOS(mConnection,mRuntime,cmd,data);\r
-                ICLogger.i("收到服务器设置SOS号码命令BP12");\r
-                break;\r
-            case PHL:\r
-                //收到设置白名单号码\r
-                ICLogger.i("收到服务器设置白名单号码命令BP14");\r
-                handlePHL(mConnection,mRuntime,cmd,data);\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 POWEROFF:\r
-                //收到关机\r
-                handlePOWEROFF(mConnection);\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 hrtstart:\r
-                handleHrtstart(mConnection);\r
-                ICLogger.i("收到服务器心率检测命令");\r
-                if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();\r
-                break;\r
-            case bldstart:\r
-                handleBldstart(mConnection);\r
-                ICLogger.i("收到服务器血压检测命令");\r
-                if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();\r
-                break;\r
-            case wdstart:\r
-                handleWdstart(mConnection,mRuntime,data);\r
-                ICLogger.i("收到服务器体温测试及设置命令");\r
-                break;\r
-            case blood:\r
-                ICLogger.i("服务器收到上传的血压");\r
-                mConnection.DeliverCMDMessageToSystem("blood",cmd);//通知下面线程状态变化\r
-                break;\r
-            case oxygen:\r
-                ICLogger.i("服务器收到上传的血氧");\r
-                mConnection.DeliverCMDMessageToSystem("oxygen",cmd);//通知下面线程状态变化\r
-                break;\r
-            case temp:\r
-                ICLogger.i("服务器收到上传的体温");\r
-                mConnection.DeliverCMDMessageToSystem("temp",cmd);//通知下面线程状态变化\r
-                break;\r
-            case heart:\r
-                ICLogger.i("服务器收到上传的心率heart");\r
-                mConnection.DeliverCMDMessageToSystem("heart",cmd);//通知下面线程状态变化\r
-                break;\r
-            case LGZONE:\r
-                ICLogger.i("收到服务器时间 LGZONE "+data);\r
-                handleLGZONE(mRuntime,data);\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
-//\r
-            case FIND:\r
-                //收到查找设备消息\r
-                handleFIND(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("IWAPHP",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 BPDF:\r
-//                handleBPDF(mConnection,cmd,mRuntime);\r
-//                ICLogger.i(" 收到 体温阈值设置!");\r
-//                mConnection.DeliverCMDMessageToSystem("APDF",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
-\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 LK:\r
-            //    handleBP28(mConnection,cmd, mRuntime,bytes);\r
-                ICLogger.i("收到服务器语音BP28");\r
-                mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化\r
-                break;\r
-        }\r
-        return ret;\r
-    }\r
-\r
-}\r
+package com.ic.protocols;
+
+import android.content.ComponentName;
+//import android.content.IClipboard;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Environment;
+
+//import com.android.internal.telephony.uicc.RuimFileHandler;
+import com.enqualcomm.support.Config;
+import com.enqualcomm.support.CoreService;
+import com.enqualcomm.support.bean.Alarm;
+import com.enqualcomm.support.bean.Contact;
+import com.enqualcomm.support.bean.Content;
+import com.enqualcomm.support.bean.HealthInfo;
+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.Connection;
+import com.enqualcomm.support.utils.ICLogger;
+import com.enqualcomm.support.utils.MD5;
+import com.enqualcomm.support.utils.TemperatureUtil;
+import com.enqualcomm.support.utils.TimeUtil;
+import com.enqualcomm.support.utils.Util;
+import com.enqualcomm.support.utils.regexUtil;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+
+import chestnut.utils.PhoneUtils;
+
+import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;
+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_fzd {
+    private static final String TAG = "ICSrv." + protocol_fzd.class.getSimpleName();
+    private static final String PrivKEY = "XMQcHi0lGIdru6xzW7lygBwBT8N0c09P";
+    private static final String CMDHEADER = "[";
+    private static final String CMDCOMPANY="IC";
+    private static final String CMDEND = "]";
+    private static final String CMDHEADERSPLIT = "*";
+    private static final String CMDSPLIT = ",";
+
+    public static final String defaultServerIP="api.xcloudtech.com";
+    public static final int defaultServerPort=9000;
+
+    public enum CMD_TYPE {
+        /*终端发起*/
+        //链路保持数据
+        LK,//登录
+        PING,//绑定查询
+        KA,//心跳包
+        UD,//位置上传
+        UD2,//盲点位置上传
+        AL,//报警数据上传
+        LGZONE,//获取服务器时区时间
+        WT,//获取天气
+        img,//上传图片
+        VOICE,//上传语音
+        WG,//请求位置信息
+        DLT,//解绑
+        temp,//体温上传
+        /* 服务器发起*/
+        UPLOAD,//数据上传间隔设置
+        CENTER,//中心号码设置
+        CALL, //拨打电话
+        MONITOR,//监听
+        SOS,//SOS 号码设置
+        FACTORY,//恢复出厂设置
+        SOSSMS,//SOS 短信报警开关
+        LOWBAT,//低电短信报警开关
+        VERNO,//版本查询
+        CR,//定位指令
+        POWEROFF,//关机指令
+        REMOVE,//取下手环报警开关
+        REMOVESMS,//取下手表短信报警开关
+        PEDO,//计步功能开关
+        SILENCETIME,//免打扰时间段设置
+        SILENCETIME2, //免打扰时间段设置
+        SLEEPTIME,//翻转检测时间段设置
+        FIND,//找手表指令
+        REMIND,//闹钟设置指令
+        TK,//对讲功能(微聊发送语音)
+        PHL,//设置电话本+白名单(最多 50 条)
+        wdstart,//远程测温
+        bldstart,//远程测血压
+        hrtstart,//远程测量心率
+        BOOTOFF,//定时关机
+        oxygen,//血氧上传
+        blood,//血压上传
+        heart,//心率上传
+        PRACTICE,//自由锻炼数据上传
+        UNKNOWN_CMD,
+    }
+
+    private static HashMap<CMD_TYPE, String> cmdMap = null;
+
+    static {
+        cmdMap = new HashMap<CMD_TYPE, String>();
+        cmdMap.put(CMD_TYPE.LK, "LK");
+        cmdMap.put(CMD_TYPE.PING, "PING");
+        cmdMap.put(CMD_TYPE.KA, "KA");
+        cmdMap.put(CMD_TYPE.UD, "UD");
+        cmdMap.put(CMD_TYPE.UD2, "UD2");
+        cmdMap.put(CMD_TYPE.AL, "AL");
+        cmdMap.put(CMD_TYPE.LGZONE, "LGZONE");
+        cmdMap.put(CMD_TYPE.WT, "WT");
+        cmdMap.put(CMD_TYPE.img, "img");
+        cmdMap.put(CMD_TYPE.VOICE, "VOICE");
+        cmdMap.put(CMD_TYPE.WG, "WG");
+        cmdMap.put(CMD_TYPE.DLT, "DLT");
+        cmdMap.put(CMD_TYPE.temp, "temp");
+        cmdMap.put(CMD_TYPE.UPLOAD, "UPLOAD");
+        cmdMap.put(CMD_TYPE.CENTER, "CENTER");
+        cmdMap.put(CMD_TYPE.CALL, "CALL");
+        cmdMap.put(CMD_TYPE.MONITOR, "MONITOR");
+        cmdMap.put(CMD_TYPE.SOS, "SOS");
+        cmdMap.put(CMD_TYPE.FACTORY, "FACTORY");
+        cmdMap.put(CMD_TYPE.SOSSMS, "SOSSMS");
+        cmdMap.put(CMD_TYPE.LOWBAT, "LOWBAT");
+        cmdMap.put(CMD_TYPE.VERNO, "VERNO");
+        cmdMap.put(CMD_TYPE.CR, "CR");
+        cmdMap.put(CMD_TYPE.POWEROFF, "POWEROFF");
+        cmdMap.put(CMD_TYPE.REMOVE, "REMOVE");
+        cmdMap.put(CMD_TYPE.REMOVESMS, "REMOVESMS");
+        cmdMap.put(CMD_TYPE.PEDO, "PEDO");
+        cmdMap.put(CMD_TYPE.SILENCETIME, "SILENCETIME");
+        cmdMap.put(CMD_TYPE.SILENCETIME2, "SILENCETIME2");
+        cmdMap.put(CMD_TYPE.SLEEPTIME, "SLEEPTIME");
+        cmdMap.put(CMD_TYPE.FIND, "FIND");
+        cmdMap.put(CMD_TYPE.REMIND, "REMIND");
+        cmdMap.put(CMD_TYPE.TK, "TK");
+        cmdMap.put(CMD_TYPE.PHL, "PHL");
+        cmdMap.put(CMD_TYPE.wdstart, "wdstart");
+        cmdMap.put(CMD_TYPE.bldstart, "bldstart");
+        cmdMap.put(CMD_TYPE.hrtstart, "hrtstart");
+        cmdMap.put(CMD_TYPE.BOOTOFF, "BOOTOFF");
+        cmdMap.put(CMD_TYPE.oxygen, "oxygen");
+        cmdMap.put(CMD_TYPE.blood, "blood");
+        cmdMap.put(CMD_TYPE.heart, "heart");
+        cmdMap.put(CMD_TYPE.PRACTICE, "PRACTICE");
+    }
+
+    private Connection mConnection=null;
+    private Runtime mRuntime=null;
+
+    public protocol_fzd(Connection connect, Runtime runtime) {
+        mConnection=connect;
+        mRuntime=runtime;
+
+    }
+
+    private StringBuffer cmdbuf = new StringBuffer();
+
+//    /*
+//    输入的字符串,如果有完整命令,返回 true
+//    否则返回 false
+//     */
+//    public boolean isCmdStr(String msg) {
+//        /***
+//         * IC*334588000000156*LEN*FALLDOWN
+//         */
+//        String cmd;
+//        int index=msg.indexOf(CMDSPLIT);
+//        if (index > 0){
+//            cmd = msg.substring(0,index);
+//        }else{
+//            cmd = msg;
+//        }
+//        if (regexUtil.isFZDCMD(cmd) ) {
+//            return true;
+//        }
+//        return false;
+//    }
+
+    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;
+    }
+
+    /*
+    输入的字符串,如果有完整命令,返回 命令名
+    否则返回 空字符串
+     */
+    public static String isCmdStr(String msg) {
+        String cmd_msgbuf=msg;
+        int  cmdindex =cmd_msgbuf.indexOf(CMDCOMPANY+CMDHEADERSPLIT);
+        if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据
+            String cmd=cmd_msgbuf.substring(cmdindex);
+            cmd_msgbuf=cmd;
+        }
+        cmdindex=cmd_msgbuf.indexOf(CMDEND);
+        if(cmdindex>0){
+            String cmd=cmd_msgbuf.substring(0,cmdindex);
+            cmd_msgbuf=cmd;
+        }
+        cmdindex=cmd_msgbuf.indexOf(CMDSPLIT);
+        if(cmdindex>0){
+            String cmd=cmd_msgbuf.substring(0,cmdindex);
+            cmd_msgbuf=cmd;
+        }
+
+        if (regexUtil.isFZDCMD(cmd_msgbuf)) {
+            for (CMD_TYPE key : cmdMap.keySet()) {
+                if (regexUtil.isFZDCMD(cmdMap.get(key), cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动
+                    ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key));
+                    return cmdMap.get(key);
+                }
+            }
+            return "";
+        }else
+            return "";
+    }
+    /*
+    返回true 表示 cmd 全部解析成功
+    返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用
+    字符串通过#号进行识别。
+    每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃
+     */
+    public boolean parserCmd(byte[] bytes) {
+        String cmd_msgbuf=new String(bytes);
+        log("bytes.size "+bytes.length);
+        cmdbuf.append(cmd_msgbuf);
+        log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString());
+        int  cmdindex =cmd_msgbuf.indexOf(CMDCOMPANY+CMDHEADERSPLIT);
+        if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据
+            String cmd=cmd_msgbuf.substring(cmdindex);
+            cmd_msgbuf=cmd;
+        }
+        cmdindex=cmd_msgbuf.indexOf(CMDEND);
+        if(cmdindex>0){
+            String cmd=cmd_msgbuf.substring(0,cmdindex);
+            cmd_msgbuf=cmd;
+        }
+        cmdindex=cmd_msgbuf.indexOf(CMDSPLIT);
+        if(cmdindex>0){
+            String cmd=cmd_msgbuf.substring(0,cmdindex);
+            cmd_msgbuf=cmd;
+        }
+        if (cmdbuf.toString().split(CMDCOMPANY+CMDHEADERSPLIT).length>1)
+        {
+            ICLogger.i("More than 1 cmd in buffer ! just log it");
+        }
+            for (CMD_TYPE key : cmdMap.keySet()) {
+               // ICLogger.i("key "+cmdMap.get(key)+" cmdbuf "+cmd_msgbuf);
+                if (regexUtil.isFZDCMD(cmdMap.get(key),cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动
+                    String data=cmdbuf.toString().replace(CMDHEADER,"").replace(cmd_msgbuf,"").replace(CMDEND,"");
+//                    ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " ,  " + cmdbuf.toString() + "  "+cmd_msgbuf  + " data "+data );
+//                    if (key == CMD_TYPE.TK) {
+//                        //如果是BP28则 后面的数据是音频,需要保留
+//                        byte[] amrBuf;
+//                        int amrLen = getBP28Amrlen(cmdlist[i] );
+//                        if (bytes.length > amrLen) {
+//                            handleCmd(key, cmdlist[i], bytes);
+//                        }
+//                    } else {
+                        if (data.startsWith(CMDSPLIT)) data=data.substring(1);
+                        handleCmd(key, cmd_msgbuf,data);
+                        cmdbuf.delete(0,cmdbuf.length());//处理后清空
+//                    }
+                }
+            }
+        return true;
+    }
+
+    private static String getHexLen(int len){
+        StringBuilder sb=new StringBuilder();
+        int v = len & 0xFFFF;
+        String hv = Integer.toHexString(v);
+        if (hv.length() ==1 ) {
+            sb.append(0).append(0).append(0);
+        }else if (hv.length()==2){
+            sb.append(0).append(0);
+        }else if (hv.length()==3){
+            sb.append(0);
+        }
+        sb.append(hv);
+        return sb.toString();
+    }
+    private static String genHeader(int len,String cmd){
+
+        if (CoreService.getInstance()==null)
+            return "";
+
+        String imei =CoreService.getInstance().getRuntime().IMEI();
+        return new StringBuilder().append(CMDCOMPANY).append(CMDHEADERSPLIT)
+                .append(imei).append(CMDHEADERSPLIT)
+                .append(getHexLen(len)).append(CMDHEADERSPLIT).append(cmd).toString();
+    }
+
+    private static String keyheader(String cmd,int len){
+        String header=genHeader(len,cmd);
+        String key= MD5.getCMDStringMD5(header+PrivKEY);
+        return key;
+    }
+
+    public static StringMessage genFZDCMD( String CMD){
+        StringBuilder sb=new StringBuilder();
+        int len=CMD.length();
+        String header=genHeader(len,CMD);
+        String keyheader=keyheader(CMD,len);
+        sb.append(CMDHEADER).append(keyheader).append(header).append(CMDEND);
+        return genStringMessage(CMD,sb.toString());
+    }
+    public static StringMessage genFZDCMD( String CMD,String data){
+        StringBuilder sb=new StringBuilder();
+        String data_buf=CMD+CMDSPLIT+data;
+        int data_buf_len=data_buf.length();
+        String header=genHeader(data_buf_len,CMD);
+        String keyheader=keyheader(CMD,data_buf_len);//计算header md5值
+        sb.append(CMDHEADER).append(keyheader).append(header).append(CMDSPLIT).append(data).append(CMDEND);
+        return genStringMessage(CMD,sb.toString());
+    }
+    /*登录*/
+    public static StringMessage LK() {
+        /*IC*YYYYYYYYYYYYYYY*LEN*LK*/
+        return genFZDCMD(cmdMap.get(CMD_TYPE.LK));
+    }
+
+    /**
+     * 绑定
+     * */
+    public static StringMessage PING(){
+//        IC*YYYYYYYYYYYYYYY*LEN*PING
+        return genFZDCMD(cmdMap.get(CMD_TYPE.PING));
+    }
+
+
+    public static void handlePing(Runtime runtime,String data){
+//        [IC*YYYYYYYYYYYYYYY*LEN*PING,是否绑定(0 表示未绑定,1 表示绑定)]
+//        实例:[IC*334588000000156*0006*PING,0]或[IC*334588000000156*0006*PING,1]
+        try {
+            int bind = Integer.parseInt(data);
+            if (bind == 0) {
+                ICLogger.i("设备未绑定!");
+                runtime.BindingStatus = false;
+            } else {
+                ICLogger.i("设备已绑定!");
+                runtime.BindingStatus = true;
+            }
+        }catch (Exception e){
+            ICLogger.e(e.getMessage(),e);
+        }
+
+    }
+
+    public static StringMessage KA(Runtime runtime){
+//[IC*YYYYYYYYYYYYYYY*LEN*KA,日期,步数,翻滚次数,电量百分数] 实例:[IC*334588000000156*0014*KA,120414,50,100,100]
+        StringBuilder sb=new StringBuilder();
+        String cmd=cmdMap.get(CMD_TYPE.KA);
+        sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT)
+        .append(runtime.getTotalStepCount()).append(CMDSPLIT)
+        .append(runtime.getRolltimes()).append(CMDSPLIT)
+        .append(runtime.getBattery());
+        return genFZDCMD(cmd,sb.toString());
+    }
+
+
+    public void handleKA(Runtime runtime,String data){
+
+    }
+
+
+    public static StringMessage LGZONE(Runtime runtime) {
+       return genFZDCMD(cmdMap.get(CMD_TYPE.LGZONE));
+    }
+    public void handleLGZONE(Runtime runtime, String data){
+
+        /***
+         *  平台回复:[XT*YYYYYYYYYYYYYYY*LEN*LGZONE,时区,时间,日期]
+         *  实例: [XT*1234567890*001D*LGZONE,+8,08:00:00,2016-01-12]
+         */
+        String[] list=data.split(CMDSPLIT);
+        if (list.length==3){
+            String timeZone=list[0].trim();
+            String date=list[2].trim();
+            String time=list[1].trim();
+            Date datetime= TimeUtil.parseDatetiime(date,time);
+            int timezone;
+            try
+            {
+                timezone=Integer.parseInt(timeZone.replace("+","").trim());
+            }catch (Exception e){
+                ICLogger.e("timezone",e);
+                timezone=8;
+            }
+
+            if (datetime!=null){
+                ICLogger.i("==="+timezone+" "+TimeUtil.getDefaultTimeZone());
+                TimeUtil.setTimeZone(timezone);
+
+
+                ICLogger.i("==="+TimeUtil.getDefaultTimeZone());
+                TimeUtil.setSysDateTime(runtime.getContextProxy().context,datetime,timezone);
+                ICLogger.i("==="+TimeUtil.getDefaultTimeZone());
+            }
+//            Set Datetime 20200505112734
+//            Set TimeZone 8
+
+        }else{
+            ICLogger.i("LGZONE Format Error!");
+        }
+
+
+    }
+
+
+    /*LBS+GPS混合定位*/
+    public static StringMessage UD(Runtime runtime) {
+        /***
+         * [IC*334588000000156*00CD*UD,180916,025723,A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6,100, 60,0,0,00000010,7,255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,95
+         * 29,21242,124,9529,21151,120,9529,63556,119,0]
+         * 说明:
+         * 数据内容:
+         * UD,命令号
+         * 180916,日期(年月日)(0 时区),表示 0 时区的二零一八年九月十六号
+         *
+         * 025723,时间(时分秒)(0 时区),表示 0 时区的两点五十七分二十三秒A,gps 定位有效
+         * 22.570733,纬度
+         * N,纬度表示113.8626083,经度
+         * E,经度表示0.00,速度
+         * 249.5,方向
+         * 0.0,海拔
+         * 6,卫星个数
+         *
+         * 100,gsm 信号强度
+         * 60,电量
+         * 0,计步数
+         * 0,翻转次数
+         * 00000010,终端状态,数据为 16 进制,解析成二进制为 0000 0000 0000 0000 0000 0000 0001 0000
+         * 前面 4 个字节表示状态,后面 4 个字节表示报警,数据中第 4 位为 1,对照文档最后的数据解析,表示手表静止状态。详细可参看文档最后部分。
+         * 7,基站个数
+         * 255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,
+         * 21151,120,9529,63556,119,基站信息
+         * 0,WiFi 个数
+         *
+         */
+
+
+        StringBuilder sb=new StringBuilder();
+        String cmd=cmdMap.get(CMD_TYPE.UD);
+        sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT)
+                .append(TimeUtil.getSystemTimeHHmmss()).append(CMDSPLIT)
+                .append(runtime.getFZDGPSData()).append(CMDSPLIT)
+                .append(String.format("%03d",abs(runtime.getSignalStrength()))).append(CMDSPLIT)
+                .append(runtime.getBattery()).append(CMDSPLIT)
+                .append(runtime.getTotalStepCount()).append(CMDSPLIT)
+                .append(runtime.getRolltimes()).append(CMDSPLIT)
+                .append(runtime.getFZDDevStatus(runtime)).append(CMDSPLIT)
+                .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT)
+                .append(runtime.getFZDWifiData());
+
+        return genFZDCMD(cmd,sb.toString());
+    }
+
+
+    /*LBS+WiFi混合定位*/
+    public static String UD2(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 new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.LK)).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 handleUD2(String cmd){
+        log("BP02定位接收成功");
+    }
+
+
+    public static StringMessage AL(Runtime runtime){
+        /***
+         * [IC*334588000000156*00CD*AL,180916,064153,A,22.570512,N,113.8623267,E,0.00,154.8,0.0,11,10 0,100,0,0,00100018,7,0,460,1,9529,21809,155,9529,21242,132,9529,21405,131,9529,63554,131,9
+         * 529,63555,130,9529,63556,118,9529,21869,116,0,12.4]
+         * 平台回复:
+         * [IC*YYYYYYYYYYYYYYY*LEN*AL]
+         * 实例:[IC*334588000000156*0002*AL]
+         * 说明:终端产生警情后发送报警信息到平台,若终端没有收到回复,则定时上报直到收到报警确认为止.
+         */
+
+        StringBuilder sb=new StringBuilder();
+        String cmd=cmdMap.get(CMD_TYPE.AL);
+        sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT)
+                .append(TimeUtil.getSystemTimeHHmmss()).append(CMDSPLIT)
+                .append(runtime.getFZDGPSData()).append(CMDSPLIT)
+                .append(String.format("%03d",abs(runtime.getSignalStrength()))).append(CMDSPLIT)
+                .append(runtime.getBattery()).append(CMDSPLIT)
+                .append(runtime.getTotalStepCount()).append(CMDSPLIT)
+                .append(runtime.getRolltimes()).append(CMDSPLIT)
+                .append(runtime.getFZDDevStatus(runtime)).append(CMDSPLIT)
+                .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT)
+                .append(runtime.getFZDWifiData());
+
+        return genFZDCMD(cmd,sb.toString());
+    }
+
+    public static StringMessage UPLOAD(){
+
+        return  genFZDCMD(cmdMap.get(CMD_TYPE.UPLOAD));
+    }
+
+    public void handleUPLOAD(Connection connection,Runtime runtime,String cmd,String data){
+            connection.send(UPLOAD());
+        try {
+            int timesecond = Integer.parseInt(data);
+            int mod = runtime.getLocationInstance().getWorkingMod();
+            log("LOCATION_MODE  " + LOCATION_MODE + " mod " + mod);
+            Config.setLocationMode(runtime.getContextProxy().context, mod);
+            Config.setLocationCycle(runtime.getContextProxy().context, timesecond);
+            runtime.getLocationInstance().setLocation_cycle(timesecond);
+            runtime.getLocationInstance().setWorkingMod(mod);
+//            CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());
+            //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。
+        }catch (Exception e){
+            ICLogger.e(e.getMessage(),e);
+        }
+    }
+
+    public static StringMessage heart(int hrt){
+        return genFZDCMD(cmdMap.get(CMD_TYPE.heart),String.valueOf(hrt));
+    }
+    public static StringMessage oxygen(int ox){
+        return genFZDCMD(cmdMap.get(CMD_TYPE.oxygen),String.valueOf(ox));
+    }
+
+    public static StringMessage blood(int pbl,int pbh){
+        String data=pbh+CMDSPLIT+pbl;
+        return genFZDCMD(cmdMap.get(CMD_TYPE.blood),data);
+    }
+
+    public static StringMessage temp(double temp){
+        return genFZDCMD(cmdMap.get(CMD_TYPE.temp),String.format("%.1f",temp));
+    }
+    public static StringMessage POWEROFF(){
+        return genFZDCMD(cmdMap.get(CMD_TYPE.POWEROFF));
+    }
+    public void handlePOWEROFF(Connection connection) {
+
+        connection.send(POWEROFF());
+    }
+    public static StringMessage CR(){
+        return genFZDCMD(cmdMap.get(CMD_TYPE.CR));
+    }
+    public void handleCR(Connection connection) {
+
+        connection.send(CR());
+    }
+    public static StringMessage bldstart(){
+        return genFZDCMD(cmdMap.get(CMD_TYPE.bldstart));
+    }
+    public void handleBldstart(Connection connection) {
+
+        connection.send(bldstart());
+    }
+    public static StringMessage wdstart(){
+        return genFZDCMD(cmdMap.get(CMD_TYPE.wdstart));
+    }
+    public void handleWdstart(Connection connection,Runtime runtime ,String data) {
+
+        connection.send(wdstart());
+        try {
+            int freq = Integer.parseInt(data);
+
+
+            Config.setTemperatureTestCycle(runtime, freq);
+            CoreService.getInstance().setTempAlarm();
+
+            if(runtime.check_stat_do_temp_test())  TemperatureUtil.doTempTestInThread();
+        }catch (Exception e){
+            ICLogger.e(e.getMessage(),e);
+        }
+//
+//        double wrist_temp,body_temp;
+//        wrist_temp= TemperatureUtil.get_temp_value_adjusted();
+//        body_temp=TemperatureUtil.getBodyTemp(wrist_temp,26.0f);
+//        String temperatureMsg=temp(body_temp);
+//        connection.send(genStringMessage("temp",temperatureMsg));
+    }
+    public static StringMessage hrtstart(){
+        return genFZDCMD(cmdMap.get(CMD_TYPE.hrtstart));
+    }
+    public void handleHrtstart(Connection connection) {
+
+        connection.send(hrtstart());
+    }
+    public static StringMessage FIND(){
+        return genFZDCMD(cmdMap.get(CMD_TYPE.FIND));
+    }
+    public void handleFIND(Connection connection) {
+
+        connection.send(FIND());
+    }
+    public static StringMessage SOS(){
+        return genFZDCMD(cmdMap.get(CMD_TYPE.SOS));
+    }
+
+
+    public void handleSOS(Connection connection,Runtime runtime,String cmd,String data) {
+
+        connection.send(SOS());
+        if (data!=null && data.length()>0) {
+            String list[] = data.split(CMDSPLIT);
+            if (list.length==1){
+                ArrayList<Contact> contactArray=new ArrayList<Contact>();
+                if (regexUtil.isMobileNumber( list[0]) || regexUtil.isPhoneNumber(list[0]))
+               {
+                   contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[0]));
+                   ICLogger.i("find SOS1 number "+list[0]);
+               }
+            }else if (list.length==2){
+
+                ArrayList<Contact> contactArray=new ArrayList<Contact>();
+                if (regexUtil.isMobileNumber( list[0]) || regexUtil.isPhoneNumber(list[0]))
+                {
+                    contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[0]));
+                    ICLogger.i("find SOS1 number "+list[0]);
+                }
+                if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1]))
+                {
+                    contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",list[1]));
+                    ICLogger.i("find SOS2 number "+list[1]);
+                }
+
+                runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);
+
+            }
+        }
+
+
+    }
+    public static StringMessage PHL(){
+        return genFZDCMD(cmdMap.get(CMD_TYPE.PHL));
+    }
+
+    public void handlePHL(Connection connection,Runtime runtime,String cmd,String data){
+        /***
+         * [IC*334588000000156*len*PHL,号码,名字,号码,名字,号码,名字,号码,名字,号码,名字] len:发送长度 16 进制表示 占用 2 个字节
+         * 号码:ascii 字符 名字:Unicode 编码
+         * 该接口融合了白名单和电话本的功能,最多对应 50 组号码与名字,号码不超过 20 个 ascii 字符, 姓名不超过 10 个 Unicode 字符。
+         * 示 例 : [IC*334588000000156*0010*PHL,110,5F204E09]
+         * 5F204E09--->张三,是使用 unicode 编码
+         * 终端回复:[IC*334588000000156*0003*PHL]
+         */
+
+            String list[]=data.split(CMDSPLIT);
+            int listlen=list.length;
+            boolean ispared=  (( listlen >0) && (listlen%2 == 0));
+            if (ispared){
+                ArrayList<Contact> contactArray=new ArrayList<Contact>();
+                for(int i=0; i<listlen;i+=2){
+                    String phonem=list[i];
+                    String name = Util.decodeUnicode2Utf8(list[i+1]);
+                    ICLogger.i(i/2 +" 姓名 "+name+", 电话 "+phonem);
+                    contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));
+                }
+//            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("没有电话本!执行清除操作!");
+            }
+            connection.send(PHL());
+    }
+
+    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);
+    }
+
+    public static StringMessage PRACTICE(HealthInfo healthInfo){
+        if (healthInfo!=null && healthInfo.getInfoCount()>0)
+            return genFZDCMD(cmdMap.get(CMD_TYPE.PRACTICE),String.valueOf(healthInfo.getBufferDataStr()));
+        else
+            return null;
+    }
+
+    public boolean handleCmd(CMD_TYPE type, String cmd , String data) {
+
+        //普通非二进制命令用此函数处理
+        boolean ret=true;
+        ICLogger.i("handleCmd "+type.name() + " strLen="+data.length());
+        if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd +" "+ data);
+        switch (type){
+            case LK: //登录包
+                ICLogger.i("服务器收到登录包LK");
+                mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化
+                break;
+            case KA:
+                ICLogger.i("服务器收到心跳包KA");
+                mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化
+                break;
+            case AL:
+                mConnection.DeliverCMDMessageToSystem("AL",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                break;
+            case PRACTICE:
+                mConnection.DeliverCMDMessageToSystem("PRACTICE",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                break;
+            case PING:
+                handlePing(mRuntime,data);
+                ICLogger.i("服务器返回Ping绑定信息");
+                break;
+            case CR:
+                //立即定位指令(长链接有效)
+                handleCR(mConnection);
+                mConnection.DeliverCMDMessageToSystem("StartLocate",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 UPLOAD:
+                //设置工作模式
+                handleUPLOAD(mConnection,mRuntime,cmd,data);
+                mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化
+//
+//                break;
+//            case BP34:
+//                //设置工作模式
+//                handleBP34(mConnection,mRuntime,cmd);
+//                mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化
+//                break;
+//
+////                            case BP05: //L02服务器不适用
+////                                //查询服务器语音 返回信息
+////                                API.handleBP05(cmd);
+////                                break;
+//
+            case SOS:
+                //收到设置SOS号码
+                handleSOS(mConnection,mRuntime,cmd,data);
+                ICLogger.i("收到服务器设置SOS号码命令BP12");
+                break;
+            case PHL:
+                //收到设置白名单号码
+                ICLogger.i("收到服务器设置白名单号码命令BP14");
+                handlePHL(mConnection,mRuntime,cmd,data);
+                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 POWEROFF:
+                //收到关机
+                handlePOWEROFF(mConnection);
+                ICLogger.i("收到服务器关机命令BP31");
+                mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化
+                break;
+//            case BP40:
+//                //服务器推送文本
+//                handleBP40(mConnection,mRuntime,cmd);
+//                ICLogger.i("收到服务器推送文本消息");
+//                mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化
+//                break;
+//
+            case hrtstart:
+                handleHrtstart(mConnection);
+                ICLogger.i("收到服务器心率检测命令");
+                if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();
+                break;
+            case bldstart:
+                handleBldstart(mConnection);
+                ICLogger.i("收到服务器血压检测命令");
+                if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();
+                break;
+            case wdstart:
+                handleWdstart(mConnection,mRuntime,data);
+                ICLogger.i("收到服务器体温测试及设置命令");
+                break;
+            case blood:
+                ICLogger.i("服务器收到上传的血压");
+                mConnection.DeliverCMDMessageToSystem("blood",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                break;
+            case oxygen:
+                ICLogger.i("服务器收到上传的血氧");
+                mConnection.DeliverCMDMessageToSystem("oxygen",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                break;
+            case temp:
+                ICLogger.i("服务器收到上传的体温");
+                mConnection.DeliverCMDMessageToSystem("temp",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                break;
+            case heart:
+                ICLogger.i("服务器收到上传的心率heart");
+                mConnection.DeliverCMDMessageToSystem("heart",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                break;
+            case LGZONE:
+                ICLogger.i("收到服务器时间 LGZONE "+data);
+                handleLGZONE(mRuntime,data);
+                break;
+//            case BP84:
+//                handleBP84(cmd,mConnection);
+//                ICLogger.i("收到服务器白名单命令");
+//                break;
+//
+//            case BP86:
+//                //绑定解绑消息
+//                handleBP86(cmd,mConnection,mRuntime);
+//                mConnection.DeliverCMDMessageToSystem("AP86",cmd);//通知下面线程状态变化
+//
+//                break;
+//
+            case FIND:
+                //收到查找设备消息
+                handleFIND(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("IWAPHP",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 BPDF:
+//                handleBPDF(mConnection,cmd,mRuntime);
+//                ICLogger.i(" 收到 体温阈值设置!");
+//                mConnection.DeliverCMDMessageToSystem("APDF",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 LK:
+            //    handleBP28(mConnection,cmd, mRuntime,bytes);
+                ICLogger.i("收到服务器语音BP28");
+                mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化
+                break;
+        }
+        return ret;
+    }
+
+}
index 762c82b..4efc3b4 100644 (file)
@@ -3000,7 +3000,9 @@ public class protocol_ic {
                 //报警包
                 mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化
                 break;
-
+            case BPBR:
+                mConnection.DeliverCMDMessageToSystem("APBR",cmd);//通知下面线程状态变化
+                break;
             case BPTM:
                 //校时命令
                 handleBPTM(cmd);
@@ -3199,6 +3201,7 @@ public class protocol_ic {
                 handleBP47(mConnection,mRuntime,cmd);
                 break;
 
+
         }
 
         return ret;
index 35f2047..beee7ef 100644 (file)
-package com.ic.protocols;\r
-\r
-import android.content.ComponentName;\r
-import android.content.Intent;\r
-import android.text.TextUtils;\r
-\r
-import com.enqualcomm.support.Config;\r
-import com.enqualcomm.support.CoreService;\r
-import com.enqualcomm.support.adapter.BTHelper;\r
-import com.enqualcomm.support.bean.Contact;\r
-import com.enqualcomm.support.bean.Runtime;\r
-import com.enqualcomm.support.bean.StringMessage;\r
-import com.enqualcomm.support.service.HeartRateManager;\r
-import com.enqualcomm.support.utils.Connection;\r
-import com.enqualcomm.support.utils.ICLogger;\r
-import com.enqualcomm.support.utils.MD5;\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.regexUtil;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Date;\r
-import java.util.HashMap;\r
-\r
-import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\r
-import static com.enqualcomm.support.LocationClient.LOCATION_MODE;\r
-import static java.lang.Math.abs;\r
-\r
-//import android.content.IClipboard;\r
-//import com.android.internal.telephony.uicc.RuimFileHandler;\r
-\r
-public class protocol_mqtt {\r
-    private static final String TAG = "ICSrv." + protocol_mqtt.class.getSimpleName();\r
-    private static final String CMDHEADER = "[";\r
-    private static final String CMDEND = "]";\r
-    private static final String CMDSPLIT = ",";\r
-\r
-    public static final String defaultTestServerIP = "47.106.237.76";\r
-    public static final String defaultServerIP = "mq0.waveon.cn";\r
-    public static final int defaultServerPort = 1883;\r
-\r
-    public static final String projName = "WBG100";\r
-    public static final String protocolVersion = "v1";\r
-    public static final String mqttKey = "QWER15WTF156OQRT1230";\r
-    public static final String username="yq_watch";\r
-    public static final String passwd="yq_watch@yg2020";\r
-    public static String MQTT_CLIENT_TOPIC_HEADER = "";\r
-\r
-    public enum CMD_TYPE {\r
-        //   cmd_type  含义\r
-        //          终端主动上传\r
-        BREQ,       // 手表请求绑定(新增)\r
-        KA,         // 心跳连接\r
-        LGZONE,     // 获取服务器端时间\r
-        UD,         // 位置数据上报\r
-        AL,         // 报警位置数据上报\r
-        ALARM,         //      报警数据上报\r
-        temp,       // 上传体温数据\r
-        heart,      // 终端心率上传\r
-        blood,      // 上传血压数据\r
-        oxygen,     // 上传血氧数据\r
-        // 平台主动下发\r
-        UPLOAD,     // 数据上传间隔设置\r
-        hrtstart,   // 设置心率、血氧、血压上传频率\r
-        wdstart,    // 设置体温上传频率\r
-        CENTER,     // 中心号码设置\r
-        MONITOR,    // 监听\r
-        SOS,        // 设置SOS 号码\r
-        FACTORY,    // 恢复出厂设置\r
-        REMOVE,     // 取下手环报警开关\r
-        PEDO,       // 计步功能开关\r
-        MSGDOWN,    // 消息下发到指定手表(新增)\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.BREQ, "BREQ");\r
-        cmdMap.put(CMD_TYPE.KA, "KA");\r
-        cmdMap.put(CMD_TYPE.LGZONE, "LGZONE");\r
-        cmdMap.put(CMD_TYPE.UD, "UD");\r
-        cmdMap.put(CMD_TYPE.AL, "AL");\r
-        cmdMap.put(CMD_TYPE.ALARM, "ALARM");\r
-        cmdMap.put(CMD_TYPE.temp, "temp");\r
-        cmdMap.put(CMD_TYPE.heart, "heart");\r
-        cmdMap.put(CMD_TYPE.blood, "blood");\r
-        cmdMap.put(CMD_TYPE.oxygen, "oxygen");\r
-        //下发\r
-        cmdMap.put(CMD_TYPE.UPLOAD, "UPLOAD");\r
-        cmdMap.put(CMD_TYPE.hrtstart, "hrtstart");\r
-        cmdMap.put(CMD_TYPE.wdstart, "wdstart");\r
-        cmdMap.put(CMD_TYPE.CENTER, "CENTER");\r
-        cmdMap.put(CMD_TYPE.MONITOR, "MONITOR");\r
-        cmdMap.put(CMD_TYPE.SOS, "SOS");\r
-        cmdMap.put(CMD_TYPE.FACTORY, "FACTORY");\r
-        cmdMap.put(CMD_TYPE.REMOVE, "REMOVE");\r
-        cmdMap.put(CMD_TYPE.PEDO, "PEDO");\r
-        cmdMap.put(CMD_TYPE.MSGDOWN, "MSGDOWN");\r
-\r
-    }\r
-\r
-    private Connection mConnection = null;\r
-    private Runtime mRuntime = null;\r
-\r
-    public protocol_mqtt(Connection connect, Runtime runtime) {\r
-        mConnection = connect;\r
-        mRuntime = runtime;\r
-\r
-    }\r
-\r
-    private StringBuffer cmdbuf = new StringBuffer();\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
-    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
-\r
-    public static String isCmdStr(StringMessage msg) {\r
-\r
-        String imei = "";\r
-        if (CoreService.getInstance() != null)\r
-            imei = CoreService.getInstance().getRuntime().IMEI();\r
-        String cmdtype = msg.cmd().replace(projName + "/" + protocolVersion + "/", "").replace("/" + imei, "");\r
-//        ICLogger.i("mqtt isCmdStr topic " + msg.cmd() + " ,cmd " + cmdtype);\r
-        for (CMD_TYPE key : cmdMap.keySet()) {\r
-//            ICLogger.i("mqtt isCmdStr cmd " + msg.cmd()+" " +cmdtype +" key " + cmdMap.get(key));\r
-            if (cmdMap.get(key).equals(cmdtype)) {\r
-//                ICLogger.i("Find cmd "+cmdtype);\r
-                return cmdtype;\r
-            }\r
-        }\r
-        return "";\r
-    }\r
-\r
-    /*\r
-    返回true 表示 cmd 全部解析成功\r
-    返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用\r
-    字符串通过#号进行识别。\r
-    每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃\r
-     */\r
-    public boolean parserCmd(String cmdtype, byte[] bytes) {\r
-        String cmd_msgbuf = new String(bytes);\r
-        log(cmdtype+" bytes.size " + bytes.length+" "+cmd_msgbuf);\r
-//        cmdbuf.append(cmd_msgbuf);\r
-//        log("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString());\r
-\r
-//        String[] cmdlist=cmdbuf.toString().split(CMDEND+CMDHEADER);\r
-\r
-//        for ( String cmditem : cmdlist ) {\r
-            cmd_msgbuf = cmd_msgbuf.replace(CMDHEADER, "").replace(CMDEND, "").replace("'","");\r
-            for (CMD_TYPE key : cmdMap.keySet()) {\r
-                if (cmdMap.get(key).toString().equals(cmdtype)) {\r
-                    handleCmd(key, cmdtype, cmd_msgbuf);\r
-                    return true;\r
-                }\r
-            }\r
-//        }\r
-\r
-        return false;\r
-    }\r
-\r
-    private static String getHexLen(int len) {\r
-        StringBuilder sb = new StringBuilder();\r
-        int v = len & 0xFFFF;\r
-        String hv = Integer.toHexString(v);\r
-        if (hv.length() == 1) {\r
-            sb.append(0).append(0).append(0);\r
-        } else if (hv.length() == 2) {\r
-            sb.append(0).append(0);\r
-        } else if (hv.length() == 3) {\r
-            sb.append(0);\r
-        }\r
-        sb.append(hv);\r
-        return sb.toString();\r
-    }\r
-\r
-    public static StringMessage genMqttCMDMsg(String cmdtype, String data, String imei) {\r
-        StringBuilder sb = new StringBuilder();\r
-        int len = data.length() + 1;//长度计算要包括逗号\r
-        sb.append(CMDHEADER).append(getHexLen(len)).append(CMDSPLIT).append(data).append(CMDEND);\r
-        StringBuilder sbtopic = new StringBuilder();\r
-        sbtopic.append(projName)\r
-                .append("/").append(protocolVersion)\r
-                .append("/").append(cmdtype)\r
-                .append("/").append(imei)\r
-                ;\r
-        return genStringMessage(sbtopic.toString(), sb.toString());\r
-    }\r
-\r
-\r
-    /**\r
-     * 终端发布(平台订阅):\r
-     * 终端向“WBG100/v1/BREQ/ID_手表IMEI”的主题发布   [LEN,MQTT注册时的账号及密码的密文]\r
-     * <p>\r
-     * 实例: 若手表IMEI号为334588000000156,\r
-     * MQTT注册时的账号及密码的密文为:QWER15WTF156OQRT1230\r
-     * 则向WBG100/v1/BREQ/ID_334588000000156的主题发布[0016,QWER15WTF156OQRT1230]\r
-     */\r
-    public static StringMessage BREQ(Runtime runtime) {\r
-        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.BREQ), mqttKey, runtime.IMEI());\r
-    }\r
-\r
-\r
-    public static void handleBREQ(Runtime runtime, String data) {\r
-/***\r
- * 回应的消息为:[LEN,区域id,绑定的区域纬度,N/S,经度,E/W,beacon mac_1,beacon mac_2,beacon mac_3,…,beacon mac_n]\r
- *\r
- * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789,\r
- * 经纬度为:22.570512,N,113.8623267,E,\r
- * beacon  mac:0x5947ffff0001, 5947ffff0002\r
- * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应\r
- * 先判断子主题是否为:BREQ\r
- * 是,则消息为:[003F,123456789,22.570512,N,113.8623267,E,5947ffff0001, 5947ffff0002]\r
- */\r
-        String[] list = data.split(CMDSPLIT);\r
-        if (list.length >= 7) {\r
-            runtime.bleInfo.ble_area_id = list[1].trim();\r
-            runtime.bleInfo.gps_n = list[2].trim();\r
-            runtime.bleInfo.gps_e = list[4].trim();\r
-            runtime.bleInfo.btMacList.clear();\r
-            StringBuilder sb = new StringBuilder();\r
-            sb.append("登录绑定 区域码" + list[1] + " ,GPS " + list[2] + "N," + list[4] + "E, BtMacs ");\r
-            for (int i = 6; i < list.length; i++) {\r
-                runtime.bleInfo.btMacList.add(list[i].trim().toLowerCase());\r
-                sb.append(",").append(list[i]);\r
-            }\r
-            ICLogger.i(sb.toString());\r
-        }\r
-    }\r
-\r
-    public static StringMessage KA(Runtime runtime) {\r
-\r
-        /***\r
-         * 终端向“WBG100/v1/KA/ID_手表IMEI”的主题发布   [LEN, 日期,步数,翻滚次数,电量百分数,区域id]\r
-         *\r
-         * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789,\r
-         * 则向WBG100/v1/KA/ID_334588000000156的主题发布 [001B,120414,50,100,100, 123456789]\r
-         *\r
-         * 终端订阅(平台发布):\r
-         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应\r
-         * 平台发布的子主题为:KA\r
-         * 回应的消息为:[LEN,KA]\r
-         */\r
-        if(runtime.bleInfo.ble_area_id.isEmpty()){\r
-            return null;\r
-        }\r
-        StringBuilder sb = new StringBuilder();\r
-        String cmd = cmdMap.get(CMD_TYPE.KA);\r
-        sb.append(TimeUtil.getUTCSystemDateYYMMDD()).append(CMDSPLIT)\r
-                .append(runtime.getTotalStepCount()).append(CMDSPLIT)\r
-                .append(runtime.getRolltimes()).append(CMDSPLIT)\r
-                .append(runtime.getBattery()).append(CMDSPLIT)\r
-                .append(runtime.bleInfo.ble_area_id);\r
-        return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI());\r
-    }\r
-\r
-    /*LBS+GPS混合定位*/\r
-    public static StringMessage UD(Runtime runtime) {\r
-        /***\r
-         * [LEN,定位数据,区域id]\r
-         *\r
-         * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789,\r
-         * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布\r
-         * [00D7,180916,025723,A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6,100,\r
-         * 60,0,0,00000010,7,255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,21151,120,9529,63556,119,0,123456789]\r
-         * 说明:\r
-         * 数据内容:\r
-         * 180916,日期(年月日)(0 时区),表示0 时区的二零一八年九月十六号\r
-         * 025723,时间(时分秒)(0 时区),表示0 时区的两点五十七分二十三秒\r
-         * A,gps 定位有效\r
-         * 22.570733,纬度\r
-         * N,纬度表示\r
-         * 113.8626083,经度\r
-         * E,经度表示\r
-         * 0.00,速度\r
-         * 249.5,方向\r
-         * 0.0,海拔\r
-         * 6,卫星个数\r
-         * 100,gsm 信号强度\r
-         * 60,电量\r
-         * 0,计步数\r
-         * 0,翻转次数\r
-         * 00000010,终端状态,数据为16 进制,解析成二进制为0000 0000 0000 0000 0000 0000 0001 0000  前面4 个字节表示状态,后面4 个字节表示报警,数据中第4 位为1,对照文档最后的数据解析,表示手表静止状态。详细可参看文档最后部分。\r
-         * 7,基站个数\r
-         * 255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,21151,120,9529,63556,119,基站信息\r
-         * 0,WiFi 个数\r
-         * 123456789,为区域id\r
-         */\r
-\r
-        if(runtime.bleInfo.ble_area_id.isEmpty()){\r
-            ICLogger.i("not Bind, skip send Location!");\r
-            return null;\r
-        }\r
-        StringBuilder sb = new StringBuilder();\r
-        String cmd = cmdMap.get(CMD_TYPE.UD);\r
-        sb.append(TimeUtil.getUTCSystemDateYYMMDD()).append(CMDSPLIT)\r
-                .append(TimeUtil.getUTCSystemTimeHHmmss()).append(CMDSPLIT)\r
-                .append(runtime.getMqttGPSData()).append(CMDSPLIT)\r
-                .append(String.format("%03d", abs(runtime.getSignalStrength()))).append(CMDSPLIT)\r
-                .append(runtime.getBattery()).append(CMDSPLIT)\r
-                .append(runtime.getTotalStepCount()).append(CMDSPLIT)\r
-                .append(runtime.getRolltimes()).append(CMDSPLIT)\r
-                .append(runtime.getFZDDevStatus(runtime)).append(CMDSPLIT)\r
-                .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT)\r
-                .append(runtime.getFZDWifiData()).append(CMDSPLIT)\r
-                .append(runtime.bleInfo.is_in_area ? "1" : "0").append(CMDSPLIT)\r
-                .append(runtime.bleInfo.ble_area_id);\r
-        return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI());\r
-    }\r
-\r
-\r
-    //处理 定位 BP01\r
-    public void handleUD2(String cmd) {\r
-        log("BP02定位接收成功");\r
-    }\r
-\r
-    public static StringMessage LGZONE(Runtime runtime){\r
-        /***\r
-         * 获取服务器端时间(LGZONE)\r
-         * 终端发布(平台订阅):\r
-         * 终端向“WBG100/v1/LGZONE/ID_手表IMEI”的主题发布   [LEN,区域id]\r
-         *\r
-         * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789,\r
-         * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布 [0009,123456789]\r
-         *\r
-         * 终端订阅(平台发布):\r
-         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应\r
-         * 平台发布的子主题为:LGZONE\r
-         * 回应的消息为:[LEN, 时区,时间,日期]\r
-         *\r
-         * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789,\r
-         * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应\r
-         * 先判断子主题是否为:LGZONE\r
-         * 是,则消息为:[001D,+8,08:00:00,2016-01-12]\r
-         * 实例表示:东八区,上午8 点整\r
-\r
-         */\r
-        if(runtime.bleInfo.ble_area_id.isEmpty()){\r
-            return null;\r
-        }\r
-        StringBuilder sb = new StringBuilder();\r
-        String cmd = cmdMap.get(CMD_TYPE.LGZONE);\r
-        sb.append(runtime.bleInfo.ble_area_id);\r
-        return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI());\r
-\r
-    }\r
-    public void handleLGZONE(Connection connection,Runtime runtime, String data){\r
-\r
-    /***\r
-     * 获取服务器端时间(LGZONE)\r
-     * 终端发布(平台订阅):\r
-     * 终端向“WBG100/v1/LGZONE/ID_手表IMEI”的主题发布   [LEN,区域id]\r
-     *\r
-     * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789,\r
-     * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布 [0009,123456789]\r
-     *\r
-     * 终端订阅(平台发布):\r
-     * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应\r
-     * 平台发布的子主题为:LGZONE\r
-     * 回应的消息为:[LEN, 时区,时间,日期]\r
-     *\r
-     * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789,\r
-     * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应\r
-     * 先判断子主题是否为:LGZONE\r
-     * 是,则消息为:[001D,+8,08:00:00,2016-01-12]\r
-     * 实例表示:东八区,上午8 点整\r
-\r
-     */\r
-        String[] list=data.split(CMDSPLIT);\r
-        if (list.length==4){\r
-            String timeZone=list[1].trim();\r
-            String date=list[3].trim();\r
-            String time=list[2].trim();\r
-            Date datetime= TimeUtil.parseDatetiime(date,time);\r
-\r
-            int timezone;\r
-            try\r
-            {\r
-                timezone=Integer.parseInt(timeZone.replace("+","").trim());\r
-            }catch (Exception e){\r
-                ICLogger.e("timezone",e);\r
-                timezone=8;\r
-            }\r
-\r
-            if (datetime!=null){\r
-                ICLogger.i("==="+timezone+" "+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
-//            Set Datetime 20200505112734\r
-//            Set TimeZone 8\r
-\r
-        }else{\r
-            ICLogger.i("LGZONE Format Error!");\r
-        }\r
-\r
-\r
-    }\r
-\r
-    public static StringMessage AL(Runtime runtime){\r
-/***\r
- * 报警数据上报(AL)\r
- * 终端发布(平台订阅):\r
- * 终端向“WBG100/v1/AL/ID_手表IMEI”的主题发布   [LEN,位置数据(见附录一),区域id]\r
- *\r
- * 终端订阅(平台发布):\r
- * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应\r
- * 平台发布的子主题为:AL\r
- * 回应的消息为:[LEN, AL]\r
- *\r
- * 说明:终端产生警情后发送报警信息到平台,若终端没有收到回复,则定时上报直到收到报警确认为止.\r
- */\r
-        if(runtime.bleInfo.ble_area_id.isEmpty()){\r
-            return null;\r
-        }\r
-        StringBuilder sb = new StringBuilder();\r
-        String cmd = cmdMap.get(CMD_TYPE.AL);\r
-        sb.append(TimeUtil.getUTCSystemDateYYMMDD())\r
-                .append(CMDSPLIT).append(TimeUtil.getUTCSystemTimeHHmmss())\r
-                .append(CMDSPLIT).append(runtime.getMqttGPSData())\r
-                .append(CMDSPLIT).append(String.format("%03d", abs(runtime.getSignalStrength())))\r
-                .append(CMDSPLIT).append(runtime.getBattery())\r
-                .append(CMDSPLIT).append(runtime.getTotalStepCount())\r
-                .append(CMDSPLIT).append(runtime.getRolltimes())\r
-                .append(CMDSPLIT).append(runtime.getFZDDevStatus(runtime))\r
-                .append(CMDSPLIT).append(runtime.getFZDLBSMultiStationData())\r
-                .append(CMDSPLIT).append(runtime.getFZDWifiData())\r
-                .append(CMDSPLIT).append(runtime.bleInfo.is_in_area ? "1" : "0")\r
-                .append(CMDSPLIT).append(runtime.bleInfo.ble_area_id);\r
-        return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI());\r
-\r
-    }\r
-\r
-\r
-    public static StringMessage UPLOAD(Runtime runtime){\r
-\r
-\r
-        return  genMqttCMDMsg(cmdMap.get(CMD_TYPE.UPLOAD),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
-    }\r
-\r
-    public void handleUPLOAD(Connection connection,Runtime runtime,String cmd,String data){\r
-        /**\r
-         * 数据上传间隔设置(UPLOAD)\r
-         * 平台发布(终端订阅):\r
-         * 平台向“WBG100/v1/ID_手表IMEI/UPLOAD”的主题发布 [LEN, 时间间隔]\r
-         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为UPLOAD\r
-         *\r
-         * 终端发布(平台订阅):\r
-         * 终端收到数据,向“WBG100/v1/ID_手表IMEI/UPLOAD”的主题发布回应\r
-         * [LEN,区域id]\r
-         */\r
-            connection.send(UPLOAD(runtime));\r
-            String[] list=data.split(CMDSPLIT);\r
-            if (TextUtils.isDigitsOnly(list[1].trim())) {\r
-                try {\r
-                    int timesecond = Integer.parseInt(list[1].trim());\r
-                    int mod = runtime.getLocationInstance().getWorkingMod();\r
-                    log("LOCATION_MODE  " + LOCATION_MODE + " mod " + mod + " cycle " + timesecond);\r
-                    Config.setLocationMode(runtime.getContextProxy().context, mod);\r
-                    Config.setLocationCycle(runtime.getContextProxy().context, timesecond);\r
-                    runtime.getLocationInstance().setLocation_cycle(timesecond);\r
-                    runtime.getLocationInstance().setWorkingMod(mod);\r
-                    CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
-                }catch (Exception e){\r
-                    ICLogger.e(e.getMessage(),e);\r
-                }\r
-                //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。\r
-            }else{\r
-                ICLogger.i("UPLOAD format error!");\r
-            }\r
-    }\r
-\r
-    public static StringMessage heart(int hrt,Runtime runtime){\r
-        /***\r
-         * 终端心率上传(heart)\r
-         * 终端发布(平台订阅):\r
-         * 终端向“WBG100/v1/heart/ID_手表IMEI”的主题发布   [LEN,x,区域id]\r
-         * x 表示每分钟的心跳次数\r
-         *\r
-         * 平台不需要回复\r
-         * 说明:终端按照设定间隔上报,不需要平台回复.\r
-         */\r
-        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.heart),String.valueOf(hrt),runtime.IMEI());\r
-    }\r
-    public static StringMessage oxygen(int ox ,Runtime runtime){\r
-        /***\r
-         *\r
-         * 上传血氧数据(oxygen)\r
-         * 终端发布(平台订阅):\r
-         * 终端向“WBG100/v1/oxygen/ID_手表IMEI”的主题发布   [LEN,x,区域id]\r
-         * x 表示血氧饱和度\r
-         *\r
-         * 平台不需要回复\r
-         * 说明:终端按照设定间隔上报,不需要平台回复.\r
-         */\r
-        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.oxygen),String.valueOf(ox),runtime.IMEI());\r
-    }\r
-\r
-    public static StringMessage blood(int pbl,int pbh, Runtime runtime){\r
-        /***\r
-         *   上传血压数据(blood)\r
-         *     终端发布(平台订阅):\r
-         *     终端向“WBG100/v1/blood/ID_手表IMEI”的主题发布   [LEN,x,y,区域id]\r
-         *    x 是收缩压(高压)\r
-         *  y 是舒张压(低压)\r
-         *\r
-         *    平台不需要回复\r
-         *    说明:终端按照设定间隔上报,不需要平台回复.\r
-         *\r
-         */\r
-        String data=pbh+CMDSPLIT+pbl;\r
-        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.blood),data,runtime.IMEI());\r
-    }\r
-\r
-    public static StringMessage temp(double temp,Runtime runtime){\r
-        /***\r
-         * 上传体温数据(temp)\r
-         * 终端发布(平台订阅):\r
-         * 终端向“WBG100/v1/temp/ID_手表IMEI”的主题发布   [LEN,x.x,区域id]\r
-         * X.X: 当前测到温度值,若测到温度为36.2,则 x.x=36.2\r
-         *\r
-         * 平台不需要回复\r
-         * 说明:终端按照设定间隔上报,不需要平台回复.\r
-         */\r
-\r
-        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.temp),String.format("%.1f",temp ),runtime.IMEI());\r
-    }\r
-\r
-    public static StringMessage wdstart(Runtime runtime){\r
-        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.wdstart),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
-    }\r
-    public void handleWdstart(Connection connection,Runtime runtime ,String data) {\r
-\r
-/***\r
- * 设置体温上传频率(wdstart)\r
- * 平台向“WBG100/v1/ID_手表IMEI/wdstart”的主题发布 [LEN, x]\r
- * x 为上传间隔时间,单位秒,连续上传时最小时间不小于300 秒,最大不超过65535.\r
- * x 为1 则代表终端心率单次上传,上传完后自动关闭。\r
- * x 为0 则代表终端心率上传关闭。\r
- * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为wdstart\r
- *\r
- * 终端发布(平台订阅):\r
- * 终端收到数据,向“WBG100/v1/ID_手表IMEI/ wdstart”的主题发布回应\r
- * [LEN,区域id]\r
- */\r
-        connection.send(wdstart(runtime));\r
-        String[] list=data.split(CMDSPLIT);\r
-        if (list.length==2){\r
-            String cycle=list[1];\r
-            if (TextUtils.isDigitsOnly(cycle.trim())){\r
-                try {\r
-                    int cycle_int = Integer.parseInt(cycle.trim());\r
-                    ICLogger.i("收到服务器指令:设置体温上传频率 " + cycle + "秒");\r
-\r
-                    Config.setTemperatureTestCycle(runtime, cycle_int);\r
-                    CoreService.getInstance().setTempAlarm();\r
-                    if(runtime.check_stat_do_temp_test()) TemperatureUtil.doTempTestInThread();\r
-                }catch (Exception e){\r
-                    ICLogger.e(e.getMessage(),e);\r
-                }\r
-            }else\r
-            {\r
-                ICLogger.i("wdstart Format Error!");\r
-            }\r
-        }else\r
-        {\r
-            ICLogger.i("wdstart Format Error!");\r
-        }\r
-    }\r
-    public static StringMessage hrtstart(Runtime runtime){\r
-        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.hrtstart),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
-    }\r
-    public void handleHrtstart(Connection connection,Runtime runtime, String data) {\r
-        /***\r
-         * 设置心率、血氧、血压上传频率(hrtstart)\r
-         * 平台发布(终端订阅):\r
-         * 平台向“WBG100/v1/ID_手表IMEI/hrtstart”的主题发布 [LEN, x]\r
-         * x 为上传间隔时间,单位秒,连续上传时最小时间不小于300 秒,最大不超过65535.\r
-         * x 为1 则代表终端心率单次上传,上传完后自动关闭。\r
-         * x 为0 则代表终端心率上传关闭。\r
-         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为hrtstart\r
-         *\r
-         * 终端发布(平台订阅):\r
-         * 终端收到数据,向“WBG100/v1/ID_手表IMEI/ hrtstart”的主题发布回应\r
-         * [LEN,区域id]\r
-         */\r
-        connection.send(hrtstart(runtime));\r
-        String[] list=data.split(CMDSPLIT);\r
-        if (list.length==2){\r
-            String cycle=list[1];\r
-            if (TextUtils.isDigitsOnly(cycle.trim())){\r
-                try {\r
-                    int cycle_int = Integer.parseInt(cycle.trim());\r
-                    ICLogger.i("收到服务器指令:设置心率血压周期 " + cycle + "秒" + cycle_int / 60 + "分钟");\r
-\r
-                    //发送重置PPGCycle的广播,会在CoreServer里面执行\r
-                    Intent intent = new Intent();\r
-                    intent.putExtra("PPGTestCycle", cycle_int / 60);\r
-                    runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent);\r
-                }catch (Exception e){\r
-                    ICLogger.e(e.getMessage(),e);\r
-                }\r
-            }else\r
-            {\r
-                ICLogger.i("Hrtstart Format Error!");\r
-            }\r
-\r
-        }else{\r
-            ICLogger.i("Hrtstart Format Error!");\r
-        }\r
-\r
-    }\r
-\r
-    public static StringMessage SOS(Runtime runtime){\r
-        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.SOS),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
-    }\r
-\r
-\r
-    public void handleSOS(Connection connection,Runtime runtime,String cmd,String data) {\r
-/***\r
- * 设置SOS 号码(SOS)\r
- * 平台发布(终端订阅):\r
- * 平台向“WBG100/v1/ID_手表IMEI/SOS”的主题发布 [LEN,电话号码,电话号码]\r
- * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为SOS\r
- *\r
- * 终端发布(平台订阅):\r
- * 终端收到数据,向“WBG100/v1/ID_手表IMEI/SOS”的主题发布回应\r
- * [LEN,区域id]\r
- *\r
- * 说明:设置SOS 号码后,触发sos 警情时,终端向设置的几个号码拨打电话,一直没有接听,则循环拨打两轮,接听后则不再继续拨打电话,同时发送报警短信给2 个sos 号码.\r
- */\r
-        connection.send(SOS(runtime));\r
-        if (data!=null && data.length()>0) {\r
-            String list[] = data.split(CMDSPLIT);\r
-            if (list.length==2){\r
-                ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
-                if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1]))\r
-               {\r
-                   contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[1]));\r
-                   ICLogger.i("find SOS1 number "+list[1]);\r
-                   runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);\r
-               }\r
-            }else if (list.length==3){\r
-\r
-                ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
-                if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1]))\r
-                {\r
-                    contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[1]));\r
-                    ICLogger.i("find SOS1 number "+list[1]);\r
-                }\r
-                if (regexUtil.isMobileNumber( list[2]) || regexUtil.isPhoneNumber(list[2]))\r
-                {\r
-                    contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",list[2]));\r
-                    ICLogger.i("find SOS2 number "+list[2]);\r
-                }\r
-\r
-                runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);\r
-\r
-            }else{\r
-                ICLogger.i("SOS Format Error!");\r
-            }\r
-        }else\r
-            ICLogger.i("SOS Format Error!");\r
-\r
-\r
-    }\r
-\r
-    public static StringMessage FACTORY(Runtime runtime){\r
-        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.FACTORY),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
-    }\r
-\r
-\r
-    public void handleFactory(Connection connection,Runtime runtime,String cmd,String data) {\r
-/***\r
- * 恢复出厂设置(FACTORY)\r
- * 平台发布(终端订阅):\r
- * 平台向“WBG100/v1/ID_手表IMEI/FACTORY”的主题发布 [LEN,FACTORY]\r
- * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为FACTORY\r
- *\r
- * 终端发布(平台订阅):\r
- * 终端收到数据,向“WBG100/v1/ID_手表IMEI/FACTORY”的主题发布回应\r
- * [LEN,区域id]\r
- *\r
- * 说明:终端恢复出厂设置,里面设置的号码都将清空\r
- */\r
-        connection.send(FACTORY(runtime));\r
-    }\r
-\r
-\r
-    public static StringMessage MSGDOWN(Runtime runtime,String index){\r
-        String data=new StringBuffer(index).append(CMDSPLIT).append(runtime.bleInfo.ble_area_id).toString();\r
-        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.MSGDOWN),data,runtime.IMEI());\r
-    }\r
-\r
-\r
-    public void handleMSGDOWN(Connection connection,Runtime runtime,String cmd,String data) {\r
-\r
-/**\r
- * 消息下发到指定手表(MSGDOWN)\r
- * 平台发布(终端订阅):\r
- * 平台向“WBG100/v1/ID_手表IMEI/MSGDOWN”的主题发布 [LEN,包序号,具体消息]\r
- *\r
- * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为MSGDOWN\r
- *\r
- * 终端发布(平台订阅):\r
- * 终端收到数据,向“WBG100/v1/ID_手表IMEI/MSGDOWN”的主题发布回应\r
- * [LEN,包序号,区域id]\r
- *\r
- * 说明:\r
- * 终端回应的包序号与平台发送的包序号一致,每次发送平台包需要加1,确保每包消息的包序号唯一。\r
- * 具体消息为英文,ASCII格式,长度不超过512个字节\r
- */\r
-\r
-        String[] cmdlist=data.split(CMDSPLIT);\r
-        if (cmdlist.length == 3){\r
-            String cmdindex=cmdlist[1];\r
-            String txtmsg=cmdlist[2];\r
-            StringMessage msg=MSGDOWN(runtime,cmdindex);\r
-            connection.send(msg);\r
-            ICLogger.i("received Txt Msg "+txtmsg);\r
-            runtime.getContextProxy().sendMsgBroadcast(txtmsg,0);\r
-            runtime.getContextProxy().saveMstToSMSDB(txtmsg);\r
-        }else{\r
-            ICLogger.i("MSGDOWN format error!");\r
-        }\r
-    }\r
-    public static StringMessage REMOVE(Runtime runtime){\r
-        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.REMOVE),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
-    }\r
-\r
-\r
-    public void handleREMOVE(Connection connection,Runtime runtime,String cmd,String data) {\r
-\r
-        /**\r
-         * 取下手环报警开关(REMOVE)\r
-         * 平台发布(终端订阅):\r
-         * 平台向“WBG100/v1/ID_手表IMEI/REMOVE”的主题发布 [LEN,0 或者1]\r
-         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为REMOVE\r
-         *\r
-         * 终端发布(平台订阅):\r
-         * 终端收到数据,向“WBG100/v1/ID_手表IMEI/REMOVE”的主题发布回应\r
-         * [LEN,区域id]\r
-         *\r
-         * 说明:手表拆除报警的开关,1 打开,0 关闭.\r
-         */\r
-        connection.send(REMOVE(runtime));\r
-        String[] cmdlist=data.split(CMDSPLIT);\r
-        if (cmdlist.length == 2){\r
-            String cmdindex=cmdlist[1];\r
-            ICLogger.i("设置REMOVE "+cmdindex);\r
-        }else{\r
-            ICLogger.i("REMOVE format error!");\r
-        }\r
-    }\r
-\r
-    public static StringMessage PEDO(Runtime runtime){\r
-        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.PEDO),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
-    }\r
-\r
-\r
-    public void handlePEDO(Connection connection,Runtime runtime,String cmd,String data) {\r
-\r
-        /***\r
-         * 计步功能开关(PEDO)\r
-         * 平台发布(终端订阅):\r
-         * 平台向“WBG100/v1/ID_手表IMEI/PEDO”的主题发布 [LEN,0 或者1]\r
-         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为PEDO\r
-         *\r
-         * 终端发布(平台订阅):\r
-         * 终端收到数据,向“WBG100/v1/ID_手表IMEI/PEDO”的主题发布回应\r
-         * [LEN,区域id]\r
-         *\r
-         * 说明: 终端计步功能的开关.1 打开,0 关闭\r
-         */\r
-        connection.send(PEDO(runtime));\r
-        String[] cmdlist=data.split(CMDSPLIT);\r
-        if (cmdlist.length == 2){\r
-            String cmdindex=cmdlist[1];\r
-            ICLogger.i("设置PEDO "+cmdindex);\r
-        }else{\r
-            ICLogger.i("PEDO format error!");\r
-        }\r
-    }\r
-\r
-    public static StringMessage MONITOR(Runtime runtime){\r
-        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.MONITOR),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
-    }\r
-\r
-\r
-    public void handleMONITOR(Connection connection,Runtime runtime,String cmd,String data) {\r
-\r
-        /***\r
-         监听(MONITOR)\r
-         平台发布(终端订阅):\r
-         平台向“WBG100/v1/ID_手表IMEI/MONITOR”的主题发布 [LEN,电话号码]\r
-         终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为MONITOR\r
-\r
-         终端发布(平台订阅):\r
-         终端收到数据,向“WBG100/v1/ID_手表IMEI/ MONITOR”的主题发布回应\r
-         [LEN,区域id]\r
-\r
-         说明:终端收到该指令后会自动回拨给设置的电话号码,电话号码为CENTER时,回拨给中心号码.\r
-         */\r
-        connection.send(MONITOR(runtime));\r
-        String[] cmdlist=data.split(CMDSPLIT);\r
-        if (cmdlist.length == 2){\r
-            String cmdindex=cmdlist[1];\r
-            ICLogger.i("设置MONITOR 号码 "+cmdindex);\r
-        }else{\r
-            ICLogger.i("MONITOR format error!");\r
-        }\r
-    }\r
-\r
-\r
-    public static StringMessage CENTER(Runtime runtime){\r
-        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.CENTER),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
-    }\r
-\r
-\r
-    public void handleCENTER(Connection connection,Runtime runtime,String cmd,String data) {\r
-\r
-        /***\r
-         中心号码设置(CENTER)\r
-         平台发布(终端订阅):\r
-         平台向“WBG100/v1/ID_手表IMEI/CENTER”的主题发布 [LEN,电话号码]\r
-         终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为CENTER\r
-\r
-         终端发布(平台订阅):\r
-         终端收到数据,向“WBG100/v1/ID_手表IMEI/CENTER”的主题发布回应\r
-         [LEN,区域id]\r
-         说明:设置中心号码,通过该手机号码可发送短信指令。同时终端的各种报警短信会发送到该号码的手机上面\r
-         */\r
-        connection.send(CENTER(runtime));\r
-        String[] cmdlist=data.split(CMDSPLIT);\r
-        if (cmdlist.length == 2){\r
-            String cmdindex=cmdlist[1];\r
-            ICLogger.i("设置CENTER 号码 "+cmdindex);\r
-        }else{\r
-            ICLogger.i("CENTER format error!");\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
-    public boolean handleCmd(CMD_TYPE type, String cmd , String data) {\r
-\r
-        //普通非二进制命令用此函数处理\r
-        boolean ret=true;\r
-        ICLogger.i("mqtt handleCmd "+type.name() + " strLen="+data.length());\r
-\r
-        switch (type){\r
-\r
-            case KA:\r
-                ICLogger.i("服务器收到心跳包KA");\r
-                mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BREQ:\r
-                handleBREQ(mRuntime,data);\r
-                //ICLogger.i("服务器返回Ping绑定信息");\r
-                ICLogger.i("服务器收到登录包BREQ");\r
-                mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化\r
-                break;\r
-            case LGZONE:\r
-                handleLGZONE(mConnection,mRuntime,data);\r
-                break;\r
-\r
-            case UD:\r
-                mConnection.DeliverCMDMessageToSystem("UD",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case AL:\r
-                mConnection.DeliverCMDMessageToSystem("AL",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case PEDO:\r
-                handlePEDO(mConnection,mRuntime,cmd,data);\r
-                mConnection.DeliverCMDMessageToSystem("PEDO",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case REMOVE:\r
-                handleREMOVE(mConnection,mRuntime,cmd,data);\r
-                mConnection.DeliverCMDMessageToSystem("REMOVE",cmd);//通知下面线程状态变化\r
-                break;\r
-            case CENTER:\r
-                handleCENTER(mConnection,mRuntime,cmd,data);\r
-                mConnection.DeliverCMDMessageToSystem("CENTER",cmd);//通知下面线程状态变化\r
-\r
-                break;\r
-            case MONITOR:\r
-                handleMONITOR(mConnection,mRuntime,cmd,data);\r
-                mConnection.DeliverCMDMessageToSystem("MONITOR",cmd);//通知下面线程状态变化\r
-\r
-                break;\r
-//            case CR:\r
-//                //立即定位指令(长链接有效)\r
-//                handleCR(mConnection);\r
-//                mConnection.DeliverCMDMessageToSystem("StartLocate",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
-            case UPLOAD:\r
-                //设置工作模式\r
-                handleUPLOAD(mConnection,mRuntime,cmd,data);\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
-//\r
-////                            case BP05: //L02服务器不适用\r
-////                                //查询服务器语音 返回信息\r
-////                                API.handleBP05(cmd);\r
-////                                break;\r
-//\r
-            case SOS:\r
-                //收到设置SOS号码\r
-                handleSOS(mConnection,mRuntime,cmd,data);\r
-                ICLogger.i("收到服务器设置SOS号码命令BP12");\r
-                break;\r
-//            case PHL:\r
-//                //收到设置白名单号码\r
-//                ICLogger.i("收到服务器设置白名单号码命令BP14");\r
-//                handlePHL(mConnection,mRuntime,cmd,data);\r
-//                break;\r
-//            case BP15:\r
-//                handleBP15(cmd,mConnection,mRuntime);\r
-//                ICLogger.i("收到服务器设置定位命令BP15");\r
-//                break;\r
-            case FACTORY:\r
-                //收到恢复出厂设置\r
-                handleFactory(mConnection,mRuntime,cmd,data);\r
-                ICLogger.i("收到服务器恢复出厂设置命令");\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
-\r
-            case MSGDOWN:\r
-                //服务器推送文本\r
-                handleMSGDOWN(mConnection,mRuntime,cmd,data);\r
-                ICLogger.i("收到服务器推送文本消息");\r
-//                mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case hrtstart:\r
-                handleHrtstart(mConnection,mRuntime,data);\r
-                ICLogger.i("收到服务器心率检测命令");\r
-                if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();\r
-                break;\r
-\r
-            case wdstart:\r
-                handleWdstart(mConnection,mRuntime,data);\r
-                ICLogger.i("收到服务器体温测试及设置命令");\r
-                break;\r
-            case blood:\r
-                ICLogger.i("服务器收到上传的血压");\r
-                mConnection.DeliverCMDMessageToSystem("blood",cmd);//通知下面线程状态变化\r
-                break;\r
-            case oxygen:\r
-                ICLogger.i("服务器收到上传的血氧");\r
-                mConnection.DeliverCMDMessageToSystem("oxygen",cmd);//通知下面线程状态变化\r
-                break;\r
-            case temp:\r
-                ICLogger.i("服务器收到上传的体温");\r
-                mConnection.DeliverCMDMessageToSystem("temp",cmd);//通知下面线程状态变化\r
-                break;\r
-            case heart:\r
-                ICLogger.i("服务器收到上传的心率heart");\r
-                mConnection.DeliverCMDMessageToSystem("heart",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
-//\r
-\r
-\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("IWAPHP",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 BPDF:\r
-//                handleBPDF(mConnection,cmd,mRuntime);\r
-//                ICLogger.i(" 收到 体温阈值设置!");\r
-//                mConnection.DeliverCMDMessageToSystem("APDF",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
-\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 LK:\r
-//            //    handleBP28(mConnection,cmd, mRuntime,bytes);\r
-//                ICLogger.i("收到服务器语音BP28");\r
-//                mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化\r
-//                break;\r
-//        }\r
-        return ret;\r
-    }\r
-\r
-}\r
+package com.ic.protocols;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.text.TextUtils;
+
+import com.enqualcomm.support.Config;
+import com.enqualcomm.support.CoreService;
+import com.enqualcomm.support.adapter.BTHelper;
+import com.enqualcomm.support.bean.Contact;
+import com.enqualcomm.support.bean.Runtime;
+import com.enqualcomm.support.bean.StringMessage;
+import com.enqualcomm.support.service.HeartRateManager;
+import com.enqualcomm.support.utils.Connection;
+import com.enqualcomm.support.utils.ICLogger;
+import com.enqualcomm.support.utils.MD5;
+import com.enqualcomm.support.utils.TemperatureUtil;
+import com.enqualcomm.support.utils.TimeUtil;
+import com.enqualcomm.support.utils.Util;
+import com.enqualcomm.support.utils.regexUtil;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+
+import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;
+import static com.enqualcomm.support.LocationClient.LOCATION_MODE;
+import static java.lang.Math.abs;
+
+//import android.content.IClipboard;
+//import com.android.internal.telephony.uicc.RuimFileHandler;
+
+public class protocol_mqtt {
+    private static final String TAG = "ICSrv." + protocol_mqtt.class.getSimpleName();
+    private static final String CMDHEADER = "[";
+    private static final String CMDEND = "]";
+    private static final String CMDSPLIT = ",";
+
+    public static final String defaultTestServerIP = "47.106.237.76";
+    public static final String defaultServerIP = "mq0.waveon.cn";
+    public static final int defaultServerPort = 1883;
+
+    public static final String projName = "WBG100";
+    public static final String protocolVersion = "v1";
+    public static final String mqttKey = "QWER15WTF156OQRT1230";
+    public static final String username="yq_watch";
+    public static final String passwd="yq_watch@yg2020";
+    public static String MQTT_CLIENT_TOPIC_HEADER = "";
+
+    public enum CMD_TYPE {
+        //   cmd_type  含义
+        //          终端主动上传
+        BREQ,       // 手表请求绑定(新增)
+        KA,         // 心跳连接
+        LGZONE,     // 获取服务器端时间
+        UD,         // 位置数据上报
+        AL,         // 报警位置数据上报
+        ALARM,         //      报警数据上报
+        temp,       // 上传体温数据
+        heart,      // 终端心率上传
+        blood,      // 上传血压数据
+        oxygen,     // 上传血氧数据
+        // 平台主动下发
+        UPLOAD,     // 数据上传间隔设置
+        hrtstart,   // 设置心率、血氧、血压上传频率
+        wdstart,    // 设置体温上传频率
+        CENTER,     // 中心号码设置
+        MONITOR,    // 监听
+        SOS,        // 设置SOS 号码
+        FACTORY,    // 恢复出厂设置
+        REMOVE,     // 取下手环报警开关
+        PEDO,       // 计步功能开关
+        MSGDOWN,    // 消息下发到指定手表(新增)
+        UNKNOWN_CMD,
+    }
+
+    private static HashMap<CMD_TYPE, String> cmdMap = null;
+
+    static {
+        cmdMap = new HashMap<CMD_TYPE, String>();
+        cmdMap.put(CMD_TYPE.BREQ, "BREQ");
+        cmdMap.put(CMD_TYPE.KA, "KA");
+        cmdMap.put(CMD_TYPE.LGZONE, "LGZONE");
+        cmdMap.put(CMD_TYPE.UD, "UD");
+        cmdMap.put(CMD_TYPE.AL, "AL");
+        cmdMap.put(CMD_TYPE.ALARM, "ALARM");
+        cmdMap.put(CMD_TYPE.temp, "temp");
+        cmdMap.put(CMD_TYPE.heart, "heart");
+        cmdMap.put(CMD_TYPE.blood, "blood");
+        cmdMap.put(CMD_TYPE.oxygen, "oxygen");
+        //下发
+        cmdMap.put(CMD_TYPE.UPLOAD, "UPLOAD");
+        cmdMap.put(CMD_TYPE.hrtstart, "hrtstart");
+        cmdMap.put(CMD_TYPE.wdstart, "wdstart");
+        cmdMap.put(CMD_TYPE.CENTER, "CENTER");
+        cmdMap.put(CMD_TYPE.MONITOR, "MONITOR");
+        cmdMap.put(CMD_TYPE.SOS, "SOS");
+        cmdMap.put(CMD_TYPE.FACTORY, "FACTORY");
+        cmdMap.put(CMD_TYPE.REMOVE, "REMOVE");
+        cmdMap.put(CMD_TYPE.PEDO, "PEDO");
+        cmdMap.put(CMD_TYPE.MSGDOWN, "MSGDOWN");
+
+    }
+
+    private Connection mConnection = null;
+    private Runtime mRuntime = null;
+
+    public protocol_mqtt(Connection connect, Runtime runtime) {
+        mConnection = connect;
+        mRuntime = runtime;
+
+    }
+
+    private StringBuffer cmdbuf = new StringBuffer();
+
+
+    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;
+    }
+
+
+    public static String isCmdStr(StringMessage msg) {
+
+        String imei = "";
+        if (CoreService.getInstance() != null)
+            imei = CoreService.getInstance().getRuntime().IMEI();
+        String cmdtype = msg.cmd().replace(projName + "/" + protocolVersion + "/", "").replace("/" + imei, "");
+//        ICLogger.i("mqtt isCmdStr topic " + msg.cmd() + " ,cmd " + cmdtype);
+        for (CMD_TYPE key : cmdMap.keySet()) {
+//            ICLogger.i("mqtt isCmdStr cmd " + msg.cmd()+" " +cmdtype +" key " + cmdMap.get(key));
+            if (cmdMap.get(key).equals(cmdtype)) {
+//                ICLogger.i("Find cmd "+cmdtype);
+                return cmdtype;
+            }
+        }
+        return "";
+    }
+
+    /*
+    返回true 表示 cmd 全部解析成功
+    返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用
+    字符串通过#号进行识别。
+    每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃
+     */
+    public boolean parserCmd(String cmdtype, byte[] bytes) {
+        String cmd_msgbuf = new String(bytes);
+        log(cmdtype+" bytes.size " + bytes.length+" "+cmd_msgbuf);
+//        cmdbuf.append(cmd_msgbuf);
+//        log("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString());
+
+//        String[] cmdlist=cmdbuf.toString().split(CMDEND+CMDHEADER);
+
+//        for ( String cmditem : cmdlist ) {
+            cmd_msgbuf = cmd_msgbuf.replace(CMDHEADER, "").replace(CMDEND, "").replace("'","");
+            for (CMD_TYPE key : cmdMap.keySet()) {
+                if (cmdMap.get(key).toString().equals(cmdtype)) {
+                    handleCmd(key, cmdtype, cmd_msgbuf);
+                    return true;
+                }
+            }
+//        }
+
+        return false;
+    }
+
+    private static String getHexLen(int len) {
+        StringBuilder sb = new StringBuilder();
+        int v = len & 0xFFFF;
+        String hv = Integer.toHexString(v);
+        if (hv.length() == 1) {
+            sb.append(0).append(0).append(0);
+        } else if (hv.length() == 2) {
+            sb.append(0).append(0);
+        } else if (hv.length() == 3) {
+            sb.append(0);
+        }
+        sb.append(hv);
+        return sb.toString();
+    }
+
+    public static StringMessage genMqttCMDMsg(String cmdtype, String data, String imei) {
+        StringBuilder sb = new StringBuilder();
+        int len = data.length() + 1;//长度计算要包括逗号
+        sb.append(CMDHEADER).append(getHexLen(len)).append(CMDSPLIT).append(data).append(CMDEND);
+        StringBuilder sbtopic = new StringBuilder();
+        sbtopic.append(projName)
+                .append("/").append(protocolVersion)
+                .append("/").append(cmdtype)
+                .append("/").append(imei)
+                ;
+        return genStringMessage(sbtopic.toString(), sb.toString());
+    }
+
+
+    /**
+     * 终端发布(平台订阅):
+     * 终端向“WBG100/v1/BREQ/ID_手表IMEI”的主题发布   [LEN,MQTT注册时的账号及密码的密文]
+     * <p>
+     * 实例: 若手表IMEI号为334588000000156,
+     * MQTT注册时的账号及密码的密文为:QWER15WTF156OQRT1230
+     * 则向WBG100/v1/BREQ/ID_334588000000156的主题发布[0016,QWER15WTF156OQRT1230]
+     */
+    public static StringMessage BREQ(Runtime runtime) {
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.BREQ), mqttKey, runtime.IMEI());
+    }
+
+
+    public static void handleBREQ(Runtime runtime, String data) {
+/***
+ * 回应的消息为:[LEN,区域id,绑定的区域纬度,N/S,经度,E/W,beacon mac_1,beacon mac_2,beacon mac_3,…,beacon mac_n]
+ *
+ * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789,
+ * 经纬度为:22.570512,N,113.8623267,E,
+ * beacon  mac:0x5947ffff0001, 5947ffff0002
+ * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应
+ * 先判断子主题是否为:BREQ
+ * 是,则消息为:[003F,123456789,22.570512,N,113.8623267,E,5947ffff0001, 5947ffff0002]
+ */
+        String[] list = data.split(CMDSPLIT);
+        if (list.length >= 7) {
+            runtime.bleInfo.ble_area_id = list[1].trim();
+            runtime.bleInfo.gps_n = list[2].trim();
+            runtime.bleInfo.gps_e = list[4].trim();
+            runtime.bleInfo.btMacList.clear();
+            StringBuilder sb = new StringBuilder();
+            sb.append("登录绑定 区域码" + list[1] + " ,GPS " + list[2] + "N," + list[4] + "E, BtMacs ");
+            for (int i = 6; i < list.length; i++) {
+                runtime.bleInfo.btMacList.add(list[i].trim().toLowerCase());
+                sb.append(",").append(list[i]);
+            }
+            ICLogger.i(sb.toString());
+        }
+    }
+
+    public static StringMessage KA(Runtime runtime) {
+
+        /***
+         * 终端向“WBG100/v1/KA/ID_手表IMEI”的主题发布   [LEN, 日期,步数,翻滚次数,电量百分数,区域id]
+         *
+         * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789,
+         * 则向WBG100/v1/KA/ID_334588000000156的主题发布 [001B,120414,50,100,100, 123456789]
+         *
+         * 终端订阅(平台发布):
+         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应
+         * 平台发布的子主题为:KA
+         * 回应的消息为:[LEN,KA]
+         */
+        if(runtime.bleInfo.ble_area_id.isEmpty()){
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        String cmd = cmdMap.get(CMD_TYPE.KA);
+        sb.append(TimeUtil.getUTCSystemDateYYMMDD()).append(CMDSPLIT)
+                .append(runtime.getTotalStepCount()).append(CMDSPLIT)
+                .append(runtime.getRolltimes()).append(CMDSPLIT)
+                .append(runtime.getBattery()).append(CMDSPLIT)
+                .append(runtime.bleInfo.ble_area_id);
+        return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI());
+    }
+
+    /*LBS+GPS混合定位*/
+    public static StringMessage UD(Runtime runtime) {
+        /***
+         * [LEN,定位数据,区域id]
+         *
+         * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789,
+         * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布
+         * [00D7,180916,025723,A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6,100,
+         * 60,0,0,00000010,7,255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,21151,120,9529,63556,119,0,123456789]
+         * 说明:
+         * 数据内容:
+         * 180916,日期(年月日)(0 时区),表示0 时区的二零一八年九月十六号
+         * 025723,时间(时分秒)(0 时区),表示0 时区的两点五十七分二十三秒
+         * A,gps 定位有效
+         * 22.570733,纬度
+         * N,纬度表示
+         * 113.8626083,经度
+         * E,经度表示
+         * 0.00,速度
+         * 249.5,方向
+         * 0.0,海拔
+         * 6,卫星个数
+         * 100,gsm 信号强度
+         * 60,电量
+         * 0,计步数
+         * 0,翻转次数
+         * 00000010,终端状态,数据为16 进制,解析成二进制为0000 0000 0000 0000 0000 0000 0001 0000  前面4 个字节表示状态,后面4 个字节表示报警,数据中第4 位为1,对照文档最后的数据解析,表示手表静止状态。详细可参看文档最后部分。
+         * 7,基站个数
+         * 255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,21151,120,9529,63556,119,基站信息
+         * 0,WiFi 个数
+         * 123456789,为区域id
+         */
+
+        if(runtime.bleInfo.ble_area_id.isEmpty()){
+            ICLogger.i("not Bind, skip send Location!");
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        String cmd = cmdMap.get(CMD_TYPE.UD);
+        sb.append(TimeUtil.getUTCSystemDateYYMMDD()).append(CMDSPLIT)
+                .append(TimeUtil.getUTCSystemTimeHHmmss()).append(CMDSPLIT)
+                .append(runtime.getMqttGPSData()).append(CMDSPLIT)
+                .append(String.format("%03d", abs(runtime.getSignalStrength()))).append(CMDSPLIT)
+                .append(runtime.getBattery()).append(CMDSPLIT)
+                .append(runtime.getTotalStepCount()).append(CMDSPLIT)
+                .append(runtime.getRolltimes()).append(CMDSPLIT)
+                .append(runtime.getFZDDevStatus(runtime)).append(CMDSPLIT)
+                .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT)
+                .append(runtime.getFZDWifiData()).append(CMDSPLIT)
+                .append(runtime.bleInfo.is_in_area ? "1" : "0").append(CMDSPLIT)
+                .append(runtime.bleInfo.ble_area_id);
+        return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI());
+    }
+
+
+    //处理 定位 BP01
+    public void handleUD2(String cmd) {
+        log("BP02定位接收成功");
+    }
+
+    public static StringMessage LGZONE(Runtime runtime){
+        /***
+         * 获取服务器端时间(LGZONE)
+         * 终端发布(平台订阅):
+         * 终端向“WBG100/v1/LGZONE/ID_手表IMEI”的主题发布   [LEN,区域id]
+         *
+         * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789,
+         * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布 [0009,123456789]
+         *
+         * 终端订阅(平台发布):
+         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应
+         * 平台发布的子主题为:LGZONE
+         * 回应的消息为:[LEN, 时区,时间,日期]
+         *
+         * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789,
+         * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应
+         * 先判断子主题是否为:LGZONE
+         * 是,则消息为:[001D,+8,08:00:00,2016-01-12]
+         * 实例表示:东八区,上午8 点整
+
+         */
+        if(runtime.bleInfo.ble_area_id.isEmpty()){
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        String cmd = cmdMap.get(CMD_TYPE.LGZONE);
+        sb.append(runtime.bleInfo.ble_area_id);
+        return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI());
+
+    }
+    public void handleLGZONE(Connection connection,Runtime runtime, String data){
+
+    /***
+     * 获取服务器端时间(LGZONE)
+     * 终端发布(平台订阅):
+     * 终端向“WBG100/v1/LGZONE/ID_手表IMEI”的主题发布   [LEN,区域id]
+     *
+     * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789,
+     * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布 [0009,123456789]
+     *
+     * 终端订阅(平台发布):
+     * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应
+     * 平台发布的子主题为:LGZONE
+     * 回应的消息为:[LEN, 时区,时间,日期]
+     *
+     * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789,
+     * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应
+     * 先判断子主题是否为:LGZONE
+     * 是,则消息为:[001D,+8,08:00:00,2016-01-12]
+     * 实例表示:东八区,上午8 点整
+
+     */
+        String[] list=data.split(CMDSPLIT);
+        if (list.length==4){
+            String timeZone=list[1].trim();
+            String date=list[3].trim();
+            String time=list[2].trim();
+            Date datetime= TimeUtil.parseDatetiime(date,time);
+
+            int timezone;
+            try
+            {
+                timezone=Integer.parseInt(timeZone.replace("+","").trim());
+            }catch (Exception e){
+                ICLogger.e("timezone",e);
+                timezone=8;
+            }
+
+            if (datetime!=null){
+                ICLogger.i("==="+timezone+" "+TimeUtil.getDefaultTimeZone());
+                TimeUtil.setTimeZone(timezone);
+
+
+                ICLogger.i("==="+TimeUtil.getDefaultTimeZone());
+                TimeUtil.setSysDateTime(runtime.getContextProxy().context,datetime,timezone);
+                ICLogger.i("==="+TimeUtil.getDefaultTimeZone());
+
+            }
+//            Set Datetime 20200505112734
+//            Set TimeZone 8
+
+        }else{
+            ICLogger.i("LGZONE Format Error!");
+        }
+
+
+    }
+
+    public static StringMessage AL(Runtime runtime){
+/***
+ * 报警数据上报(AL)
+ * 终端发布(平台订阅):
+ * 终端向“WBG100/v1/AL/ID_手表IMEI”的主题发布   [LEN,位置数据(见附录一),区域id]
+ *
+ * 终端订阅(平台发布):
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应
+ * 平台发布的子主题为:AL
+ * 回应的消息为:[LEN, AL]
+ *
+ * 说明:终端产生警情后发送报警信息到平台,若终端没有收到回复,则定时上报直到收到报警确认为止.
+ */
+        if(runtime.bleInfo.ble_area_id.isEmpty()){
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        String cmd = cmdMap.get(CMD_TYPE.AL);
+        sb.append(TimeUtil.getUTCSystemDateYYMMDD())
+                .append(CMDSPLIT).append(TimeUtil.getUTCSystemTimeHHmmss())
+                .append(CMDSPLIT).append(runtime.getMqttGPSData())
+                .append(CMDSPLIT).append(String.format("%03d", abs(runtime.getSignalStrength())))
+                .append(CMDSPLIT).append(runtime.getBattery())
+                .append(CMDSPLIT).append(runtime.getTotalStepCount())
+                .append(CMDSPLIT).append(runtime.getRolltimes())
+                .append(CMDSPLIT).append(runtime.getFZDDevStatus(runtime))
+                .append(CMDSPLIT).append(runtime.getFZDLBSMultiStationData())
+                .append(CMDSPLIT).append(runtime.getFZDWifiData())
+                .append(CMDSPLIT).append(runtime.bleInfo.is_in_area ? "1" : "0")
+                .append(CMDSPLIT).append(runtime.bleInfo.ble_area_id);
+        return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI());
+
+    }
+
+
+    public static StringMessage UPLOAD(Runtime runtime){
+
+
+        return  genMqttCMDMsg(cmdMap.get(CMD_TYPE.UPLOAD),runtime.bleInfo.ble_area_id,runtime.IMEI());
+    }
+
+    public void handleUPLOAD(Connection connection,Runtime runtime,String cmd,String data){
+        /**
+         * 数据上传间隔设置(UPLOAD)
+         * 平台发布(终端订阅):
+         * 平台向“WBG100/v1/ID_手表IMEI/UPLOAD”的主题发布 [LEN, 时间间隔]
+         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为UPLOAD
+         *
+         * 终端发布(平台订阅):
+         * 终端收到数据,向“WBG100/v1/ID_手表IMEI/UPLOAD”的主题发布回应
+         * [LEN,区域id]
+         */
+            connection.send(UPLOAD(runtime));
+            String[] list=data.split(CMDSPLIT);
+            if (TextUtils.isDigitsOnly(list[1].trim())) {
+                try {
+                    int timesecond = Integer.parseInt(list[1].trim());
+                    int mod = runtime.getLocationInstance().getWorkingMod();
+                    log("LOCATION_MODE  " + LOCATION_MODE + " mod " + mod + " cycle " + timesecond);
+                    Config.setLocationMode(runtime.getContextProxy().context, mod);
+                    Config.setLocationCycle(runtime.getContextProxy().context, timesecond);
+                    runtime.getLocationInstance().setLocation_cycle(timesecond);
+                    runtime.getLocationInstance().setWorkingMod(mod);
+                    CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());
+                }catch (Exception e){
+                    ICLogger.e(e.getMessage(),e);
+                }
+                //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。
+            }else{
+                ICLogger.i("UPLOAD format error!");
+            }
+    }
+
+    public static StringMessage heart(int hrt,Runtime runtime){
+        /***
+         * 终端心率上传(heart)
+         * 终端发布(平台订阅):
+         * 终端向“WBG100/v1/heart/ID_手表IMEI”的主题发布   [LEN,x,区域id]
+         * x 表示每分钟的心跳次数
+         *
+         * 平台不需要回复
+         * 说明:终端按照设定间隔上报,不需要平台回复.
+         */
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.heart),String.valueOf(hrt),runtime.IMEI());
+    }
+    public static StringMessage oxygen(int ox ,Runtime runtime){
+        /***
+         *
+         * 上传血氧数据(oxygen)
+         * 终端发布(平台订阅):
+         * 终端向“WBG100/v1/oxygen/ID_手表IMEI”的主题发布   [LEN,x,区域id]
+         * x 表示血氧饱和度
+         *
+         * 平台不需要回复
+         * 说明:终端按照设定间隔上报,不需要平台回复.
+         */
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.oxygen),String.valueOf(ox),runtime.IMEI());
+    }
+
+    public static StringMessage blood(int pbl,int pbh, Runtime runtime){
+        /***
+         *   上传血压数据(blood)
+         *     终端发布(平台订阅):
+         *     终端向“WBG100/v1/blood/ID_手表IMEI”的主题发布   [LEN,x,y,区域id]
+         *    x 是收缩压(高压)
+         *  y 是舒张压(低压)
+         *
+         *    平台不需要回复
+         *    说明:终端按照设定间隔上报,不需要平台回复.
+         *
+         */
+        String data=pbh+CMDSPLIT+pbl;
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.blood),data,runtime.IMEI());
+    }
+
+    public static StringMessage temp(double temp,Runtime runtime){
+        /***
+         * 上传体温数据(temp)
+         * 终端发布(平台订阅):
+         * 终端向“WBG100/v1/temp/ID_手表IMEI”的主题发布   [LEN,x.x,区域id]
+         * X.X: 当前测到温度值,若测到温度为36.2,则 x.x=36.2
+         *
+         * 平台不需要回复
+         * 说明:终端按照设定间隔上报,不需要平台回复.
+         */
+
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.temp),String.format("%.1f",temp ),runtime.IMEI());
+    }
+
+    public static StringMessage wdstart(Runtime runtime){
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.wdstart),runtime.bleInfo.ble_area_id,runtime.IMEI());
+    }
+    public void handleWdstart(Connection connection,Runtime runtime ,String data) {
+
+/***
+ * 设置体温上传频率(wdstart)
+ * 平台向“WBG100/v1/ID_手表IMEI/wdstart”的主题发布 [LEN, x]
+ * x 为上传间隔时间,单位秒,连续上传时最小时间不小于300 秒,最大不超过65535.
+ * x 为1 则代表终端心率单次上传,上传完后自动关闭。
+ * x 为0 则代表终端心率上传关闭。
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为wdstart
+ *
+ * 终端发布(平台订阅):
+ * 终端收到数据,向“WBG100/v1/ID_手表IMEI/ wdstart”的主题发布回应
+ * [LEN,区域id]
+ */
+        connection.send(wdstart(runtime));
+        String[] list=data.split(CMDSPLIT);
+        if (list.length==2){
+            String cycle=list[1];
+            if (TextUtils.isDigitsOnly(cycle.trim())){
+                try {
+                    int cycle_int = Integer.parseInt(cycle.trim());
+                    ICLogger.i("收到服务器指令:设置体温上传频率 " + cycle + "秒");
+
+                    Config.setTemperatureTestCycle(runtime, cycle_int);
+                    CoreService.getInstance().setTempAlarm();
+                    if(runtime.check_stat_do_temp_test()) TemperatureUtil.doTempTestInThread();
+                }catch (Exception e){
+                    ICLogger.e(e.getMessage(),e);
+                }
+            }else
+            {
+                ICLogger.i("wdstart Format Error!");
+            }
+        }else
+        {
+            ICLogger.i("wdstart Format Error!");
+        }
+    }
+    public static StringMessage hrtstart(Runtime runtime){
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.hrtstart),runtime.bleInfo.ble_area_id,runtime.IMEI());
+    }
+    public void handleHrtstart(Connection connection,Runtime runtime, String data) {
+        /***
+         * 设置心率、血氧、血压上传频率(hrtstart)
+         * 平台发布(终端订阅):
+         * 平台向“WBG100/v1/ID_手表IMEI/hrtstart”的主题发布 [LEN, x]
+         * x 为上传间隔时间,单位秒,连续上传时最小时间不小于300 秒,最大不超过65535.
+         * x 为1 则代表终端心率单次上传,上传完后自动关闭。
+         * x 为0 则代表终端心率上传关闭。
+         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为hrtstart
+         *
+         * 终端发布(平台订阅):
+         * 终端收到数据,向“WBG100/v1/ID_手表IMEI/ hrtstart”的主题发布回应
+         * [LEN,区域id]
+         */
+        connection.send(hrtstart(runtime));
+        String[] list=data.split(CMDSPLIT);
+        if (list.length==2){
+            String cycle=list[1];
+            if (TextUtils.isDigitsOnly(cycle.trim())){
+                try {
+                    int cycle_int = Integer.parseInt(cycle.trim());
+                    ICLogger.i("收到服务器指令:设置心率血压周期 " + cycle + "秒" + cycle_int / 60 + "分钟");
+
+                    //发送重置PPGCycle的广播,会在CoreServer里面执行
+                    Intent intent = new Intent();
+                    intent.putExtra("PPGTestCycle", cycle_int / 60);
+                    runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent);
+                }catch (Exception e){
+                    ICLogger.e(e.getMessage(),e);
+                }
+            }else
+            {
+                ICLogger.i("Hrtstart Format Error!");
+            }
+
+        }else{
+            ICLogger.i("Hrtstart Format Error!");
+        }
+
+    }
+
+    public static StringMessage SOS(Runtime runtime){
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.SOS),runtime.bleInfo.ble_area_id,runtime.IMEI());
+    }
+
+
+    public void handleSOS(Connection connection,Runtime runtime,String cmd,String data) {
+/***
+ * 设置SOS 号码(SOS)
+ * 平台发布(终端订阅):
+ * 平台向“WBG100/v1/ID_手表IMEI/SOS”的主题发布 [LEN,电话号码,电话号码]
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为SOS
+ *
+ * 终端发布(平台订阅):
+ * 终端收到数据,向“WBG100/v1/ID_手表IMEI/SOS”的主题发布回应
+ * [LEN,区域id]
+ *
+ * 说明:设置SOS 号码后,触发sos 警情时,终端向设置的几个号码拨打电话,一直没有接听,则循环拨打两轮,接听后则不再继续拨打电话,同时发送报警短信给2 个sos 号码.
+ */
+        connection.send(SOS(runtime));
+        if (data!=null && data.length()>0) {
+            String list[] = data.split(CMDSPLIT);
+            if (list.length==2){
+                ArrayList<Contact> contactArray=new ArrayList<Contact>();
+                if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1]))
+               {
+                   contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[1]));
+                   ICLogger.i("find SOS1 number "+list[1]);
+                   runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);
+               }
+            }else if (list.length==3){
+
+                ArrayList<Contact> contactArray=new ArrayList<Contact>();
+                if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1]))
+                {
+                    contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[1]));
+                    ICLogger.i("find SOS1 number "+list[1]);
+                }
+                if (regexUtil.isMobileNumber( list[2]) || regexUtil.isPhoneNumber(list[2]))
+                {
+                    contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",list[2]));
+                    ICLogger.i("find SOS2 number "+list[2]);
+                }
+
+                runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);
+
+            }else{
+                ICLogger.i("SOS Format Error!");
+            }
+        }else
+            ICLogger.i("SOS Format Error!");
+
+
+    }
+
+    public static StringMessage FACTORY(Runtime runtime){
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.FACTORY),runtime.bleInfo.ble_area_id,runtime.IMEI());
+    }
+
+
+    public void handleFactory(Connection connection,Runtime runtime,String cmd,String data) {
+/***
+ * 恢复出厂设置(FACTORY)
+ * 平台发布(终端订阅):
+ * 平台向“WBG100/v1/ID_手表IMEI/FACTORY”的主题发布 [LEN,FACTORY]
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为FACTORY
+ *
+ * 终端发布(平台订阅):
+ * 终端收到数据,向“WBG100/v1/ID_手表IMEI/FACTORY”的主题发布回应
+ * [LEN,区域id]
+ *
+ * 说明:终端恢复出厂设置,里面设置的号码都将清空
+ */
+        connection.send(FACTORY(runtime));
+    }
+
+
+    public static StringMessage MSGDOWN(Runtime runtime,String index){
+        String data=new StringBuffer(index).append(CMDSPLIT).append(runtime.bleInfo.ble_area_id).toString();
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.MSGDOWN),data,runtime.IMEI());
+    }
+
+
+    public void handleMSGDOWN(Connection connection,Runtime runtime,String cmd,String data) {
+
+/**
+ * 消息下发到指定手表(MSGDOWN)
+ * 平台发布(终端订阅):
+ * 平台向“WBG100/v1/ID_手表IMEI/MSGDOWN”的主题发布 [LEN,包序号,具体消息]
+ *
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为MSGDOWN
+ *
+ * 终端发布(平台订阅):
+ * 终端收到数据,向“WBG100/v1/ID_手表IMEI/MSGDOWN”的主题发布回应
+ * [LEN,包序号,区域id]
+ *
+ * 说明:
+ * 终端回应的包序号与平台发送的包序号一致,每次发送平台包需要加1,确保每包消息的包序号唯一。
+ * 具体消息为英文,ASCII格式,长度不超过512个字节
+ */
+
+        String[] cmdlist=data.split(CMDSPLIT);
+        if (cmdlist.length == 3){
+            String cmdindex=cmdlist[1];
+            String txtmsg=cmdlist[2];
+            StringMessage msg=MSGDOWN(runtime,cmdindex);
+            connection.send(msg);
+            ICLogger.i("received Txt Msg "+txtmsg);
+            runtime.getContextProxy().sendMsgBroadcast(txtmsg,0);
+            runtime.getContextProxy().saveMstToSMSDB(txtmsg);
+        }else{
+            ICLogger.i("MSGDOWN format error!");
+        }
+    }
+    public static StringMessage REMOVE(Runtime runtime){
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.REMOVE),runtime.bleInfo.ble_area_id,runtime.IMEI());
+    }
+
+
+    public void handleREMOVE(Connection connection,Runtime runtime,String cmd,String data) {
+
+        /**
+         * 取下手环报警开关(REMOVE)
+         * 平台发布(终端订阅):
+         * 平台向“WBG100/v1/ID_手表IMEI/REMOVE”的主题发布 [LEN,0 或者1]
+         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为REMOVE
+         *
+         * 终端发布(平台订阅):
+         * 终端收到数据,向“WBG100/v1/ID_手表IMEI/REMOVE”的主题发布回应
+         * [LEN,区域id]
+         *
+         * 说明:手表拆除报警的开关,1 打开,0 关闭.
+         */
+        connection.send(REMOVE(runtime));
+        String[] cmdlist=data.split(CMDSPLIT);
+        if (cmdlist.length == 2){
+            String cmdindex=cmdlist[1];
+            ICLogger.i("设置REMOVE "+cmdindex);
+        }else{
+            ICLogger.i("REMOVE format error!");
+        }
+    }
+
+    public static StringMessage PEDO(Runtime runtime){
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.PEDO),runtime.bleInfo.ble_area_id,runtime.IMEI());
+    }
+
+
+    public void handlePEDO(Connection connection,Runtime runtime,String cmd,String data) {
+
+        /***
+         * 计步功能开关(PEDO)
+         * 平台发布(终端订阅):
+         * 平台向“WBG100/v1/ID_手表IMEI/PEDO”的主题发布 [LEN,0 或者1]
+         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为PEDO
+         *
+         * 终端发布(平台订阅):
+         * 终端收到数据,向“WBG100/v1/ID_手表IMEI/PEDO”的主题发布回应
+         * [LEN,区域id]
+         *
+         * 说明: 终端计步功能的开关.1 打开,0 关闭
+         */
+        connection.send(PEDO(runtime));
+        String[] cmdlist=data.split(CMDSPLIT);
+        if (cmdlist.length == 2){
+            String cmdindex=cmdlist[1];
+            ICLogger.i("设置PEDO "+cmdindex);
+        }else{
+            ICLogger.i("PEDO format error!");
+        }
+    }
+
+    public static StringMessage MONITOR(Runtime runtime){
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.MONITOR),runtime.bleInfo.ble_area_id,runtime.IMEI());
+    }
+
+
+    public void handleMONITOR(Connection connection,Runtime runtime,String cmd,String data) {
+
+        /***
+         监听(MONITOR)
+         平台发布(终端订阅):
+         平台向“WBG100/v1/ID_手表IMEI/MONITOR”的主题发布 [LEN,电话号码]
+         终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为MONITOR
+
+         终端发布(平台订阅):
+         终端收到数据,向“WBG100/v1/ID_手表IMEI/ MONITOR”的主题发布回应
+         [LEN,区域id]
+
+         说明:终端收到该指令后会自动回拨给设置的电话号码,电话号码为CENTER时,回拨给中心号码.
+         */
+        connection.send(MONITOR(runtime));
+        String[] cmdlist=data.split(CMDSPLIT);
+        if (cmdlist.length == 2){
+            String cmdindex=cmdlist[1];
+            ICLogger.i("设置MONITOR 号码 "+cmdindex);
+        }else{
+            ICLogger.i("MONITOR format error!");
+        }
+    }
+
+
+    public static StringMessage CENTER(Runtime runtime){
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.CENTER),runtime.bleInfo.ble_area_id,runtime.IMEI());
+    }
+
+
+    public void handleCENTER(Connection connection,Runtime runtime,String cmd,String data) {
+
+        /***
+         中心号码设置(CENTER)
+         平台发布(终端订阅):
+         平台向“WBG100/v1/ID_手表IMEI/CENTER”的主题发布 [LEN,电话号码]
+         终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为CENTER
+
+         终端发布(平台订阅):
+         终端收到数据,向“WBG100/v1/ID_手表IMEI/CENTER”的主题发布回应
+         [LEN,区域id]
+         说明:设置中心号码,通过该手机号码可发送短信指令。同时终端的各种报警短信会发送到该号码的手机上面
+         */
+        connection.send(CENTER(runtime));
+        String[] cmdlist=data.split(CMDSPLIT);
+        if (cmdlist.length == 2){
+            String cmdindex=cmdlist[1];
+            ICLogger.i("设置CENTER 号码 "+cmdindex);
+        }else{
+            ICLogger.i("CENTER format error!");
+        }
+    }
+    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);
+    }
+
+    public boolean handleCmd(CMD_TYPE type, String cmd , String data) {
+
+        //普通非二进制命令用此函数处理
+        boolean ret=true;
+        ICLogger.i("mqtt handleCmd "+type.name() + " strLen="+data.length());
+
+        switch (type){
+
+            case KA:
+                ICLogger.i("服务器收到心跳包KA");
+                mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化
+                break;
+
+            case BREQ:
+                handleBREQ(mRuntime,data);
+                //ICLogger.i("服务器返回Ping绑定信息");
+                ICLogger.i("服务器收到登录包BREQ");
+                mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化
+                break;
+            case LGZONE:
+                handleLGZONE(mConnection,mRuntime,data);
+                break;
+
+            case UD:
+                mConnection.DeliverCMDMessageToSystem("UD",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                break;
+
+            case AL:
+                mConnection.DeliverCMDMessageToSystem("AL",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                break;
+
+            case PEDO:
+                handlePEDO(mConnection,mRuntime,cmd,data);
+                mConnection.DeliverCMDMessageToSystem("PEDO",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                break;
+
+            case REMOVE:
+                handleREMOVE(mConnection,mRuntime,cmd,data);
+                mConnection.DeliverCMDMessageToSystem("REMOVE",cmd);//通知下面线程状态变化
+                break;
+            case CENTER:
+                handleCENTER(mConnection,mRuntime,cmd,data);
+                mConnection.DeliverCMDMessageToSystem("CENTER",cmd);//通知下面线程状态变化
+
+                break;
+            case MONITOR:
+                handleMONITOR(mConnection,mRuntime,cmd,data);
+                mConnection.DeliverCMDMessageToSystem("MONITOR",cmd);//通知下面线程状态变化
+
+                break;
+//            case CR:
+//                //立即定位指令(长链接有效)
+//                handleCR(mConnection);
+//                mConnection.DeliverCMDMessageToSystem("StartLocate",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 UPLOAD:
+                //设置工作模式
+                handleUPLOAD(mConnection,mRuntime,cmd,data);
+                mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化
+
+                break;
+//            case BP34:
+//                //设置工作模式
+//                handleBP34(mConnection,mRuntime,cmd);
+//                mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化
+//                break;
+//
+////                            case BP05: //L02服务器不适用
+////                                //查询服务器语音 返回信息
+////                                API.handleBP05(cmd);
+////                                break;
+//
+            case SOS:
+                //收到设置SOS号码
+                handleSOS(mConnection,mRuntime,cmd,data);
+                ICLogger.i("收到服务器设置SOS号码命令BP12");
+                break;
+//            case PHL:
+//                //收到设置白名单号码
+//                ICLogger.i("收到服务器设置白名单号码命令BP14");
+//                handlePHL(mConnection,mRuntime,cmd,data);
+//                break;
+//            case BP15:
+//                handleBP15(cmd,mConnection,mRuntime);
+//                ICLogger.i("收到服务器设置定位命令BP15");
+//                break;
+            case FACTORY:
+                //收到恢复出厂设置
+                handleFactory(mConnection,mRuntime,cmd,data);
+                ICLogger.i("收到服务器恢复出厂设置命令");
+                mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化
+                break;
+//
+//            case BP18:
+//                //收到重启
+//                handleBP18(mConnection,cmd);
+//                ICLogger.i("收到服务器重启命令BP18");
+//                mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化
+//                break;
+//
+
+            case MSGDOWN:
+                //服务器推送文本
+                handleMSGDOWN(mConnection,mRuntime,cmd,data);
+                ICLogger.i("收到服务器推送文本消息");
+//                mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化
+                break;
+
+            case hrtstart:
+                handleHrtstart(mConnection,mRuntime,data);
+                ICLogger.i("收到服务器心率检测命令");
+                if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();
+                break;
+
+            case wdstart:
+                handleWdstart(mConnection,mRuntime,data);
+                ICLogger.i("收到服务器体温测试及设置命令");
+                break;
+            case blood:
+                ICLogger.i("服务器收到上传的血压");
+                mConnection.DeliverCMDMessageToSystem("blood",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                break;
+            case oxygen:
+                ICLogger.i("服务器收到上传的血氧");
+                mConnection.DeliverCMDMessageToSystem("oxygen",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                break;
+            case temp:
+                ICLogger.i("服务器收到上传的体温");
+                mConnection.DeliverCMDMessageToSystem("temp",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                break;
+            case heart:
+                ICLogger.i("服务器收到上传的心率heart");
+                mConnection.DeliverCMDMessageToSystem("heart",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                break;
+//            case BP84:
+//                handleBP84(cmd,mConnection);
+//                ICLogger.i("收到服务器白名单命令");
+//                break;
+//
+//            case BP86:
+//                //绑定解绑消息
+//                handleBP86(cmd,mConnection,mRuntime);
+//                mConnection.DeliverCMDMessageToSystem("AP86",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("IWAPHP",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 BPDF:
+//                handleBPDF(mConnection,cmd,mRuntime);
+//                ICLogger.i(" 收到 体温阈值设置!");
+//                mConnection.DeliverCMDMessageToSystem("APDF",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 LK:
+//            //    handleBP28(mConnection,cmd, mRuntime,bytes);
+//                ICLogger.i("收到服务器语音BP28");
+//                mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化
+//                break;
+//        }
+        return ret;
+    }
+
+}
index da93444..3c5cd34 100644 (file)
@@ -1,2 +1,2 @@
-#Tue Dec 01 19:24:13 CST 2020
-VERSION_CODE=720
+#Thu Dec 03 09:50:50 CST 2020
+VERSION_CODE=722