From f28ad375b388957f6ca3103f5b65e127b2a9e8ab Mon Sep 17 00:00:00 2001 From: snickersun Date: Wed, 29 Jul 2020 16:15:59 +0800 Subject: [PATCH] =?utf8?q?1=E3=80=81=E4=BF=AE=E6=94=B9protocol=5Fic=20?= =?utf8?q?=E4=B8=AD=E7=9A=84=20APTU=20=E6=A0=BC=E5=BC=8F=E3=80=82=202?= =?utf8?q?=E3=80=81=E6=B7=BB=E5=8A=A0protocol=5Ffzd=EF=BC=8C=20=E4=BD=BFpr?= =?utf8?q?otocolAPIHelper=20=E5=90=8C=E6=97=B6=E5=85=BC=E5=AE=B9=20jiai,be?= =?utf8?q?ehome,ic,fzd=20=E5=9B=9B=E7=A7=8D=E5=8D=8F=E8=AE=AE=E3=80=82=20?= =?utf8?q?=E5=BD=93=E5=89=8D=E5=AE=9E=E7=8E=B0=E4=BA=86fzd=20=E6=95=B4?= =?utf8?q?=E4=B8=AA=E5=8D=8F=E8=AE=AE=E6=A0=BC=E5=BC=8F=E8=A7=A3=E6=9E=90?= =?utf8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BB=A5=E5=8F=8ALK,KA=20=E4=B8=A4?= =?utf8?q?=E4=B8=AA=E6=8C=87=E4=BB=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../com/enqualcomm/support/MainActivity.java | 1 + .../com/enqualcomm/support/bean/Runtime.java | 2 +- .../enqualcomm/support/service/Deliver.java | 32 +- .../support/service/Initialize.java | 2 +- .../enqualcomm/support/service/KeepAlive.java | 15 +- .../com/enqualcomm/support/utils/MD5.java | 87 + .../enqualcomm/support/utils/TimeUtil.java | 4 +- .../com/enqualcomm/support/utils/Util.java | 33 +- .../enqualcomm/support/utils/regexUtil.java | 161 ++ .../com/ic/protocols/protocolAPIHelper.java | 29 +- .../com/ic/protocols/protocol_beehome.java | 42 +- .../java/com/ic/protocols/protocol_fzd.java | 1814 ++++------------- .../java/com/ic/protocols/protocol_ic.java | 75 +- .../java/com/ic/protocols/protocol_jiai.java | 37 +- 14 files changed, 855 insertions(+), 1479 deletions(-) create mode 100644 app/src/main/java/com/enqualcomm/support/utils/MD5.java create mode 100644 app/src/main/java/com/enqualcomm/support/utils/regexUtil.java diff --git a/app/src/main/java/com/enqualcomm/support/MainActivity.java b/app/src/main/java/com/enqualcomm/support/MainActivity.java index 55976586..829e971c 100644 --- a/app/src/main/java/com/enqualcomm/support/MainActivity.java +++ b/app/src/main/java/com/enqualcomm/support/MainActivity.java @@ -16,6 +16,7 @@ import com.enqualcomm.support.utils.Util; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import chestnut.utils.RegexUtils; import rx.Observable; import rx.functions.Action1; diff --git a/app/src/main/java/com/enqualcomm/support/bean/Runtime.java b/app/src/main/java/com/enqualcomm/support/bean/Runtime.java index 24f392d5..e46d1cb8 100644 --- a/app/src/main/java/com/enqualcomm/support/bean/Runtime.java +++ b/app/src/main/java/com/enqualcomm/support/bean/Runtime.java @@ -24,7 +24,7 @@ public class Runtime { public int SignalStrength; - + public boolean BindingStatus=false; private String battery="000"; private int batteryVoltage=0; diff --git a/app/src/main/java/com/enqualcomm/support/service/Deliver.java b/app/src/main/java/com/enqualcomm/support/service/Deliver.java index 6232f95a..2a58bb11 100644 --- a/app/src/main/java/com/enqualcomm/support/service/Deliver.java +++ b/app/src/main/java/com/enqualcomm/support/service/Deliver.java @@ -144,12 +144,20 @@ public class Deliver extends AbstractConnectionService { delaySendMSG.run(); // mSendMSGHandler.sendEmptyMessage(1); } - private static boolean NeedCheckServerResponse=true; private static boolean ServerResponsed=false; private static String needCheckResponseCMD=null; private static int CheckCount=0; + private static void checkNeedServerResponse(String cmd){ + if (cmd!=null && Config.protocol_no==Config.PROTOCOL_FZD && + (protocolAPIHelper.isCmdStr(cmd).equals("UD") || protocolAPIHelper.isCmdStr(cmd).equals("UD2"))){ + NeedCheckServerResponse=false; + }else{ + NeedCheckServerResponse=true; + } + } + public static boolean getAndSendMsgFromQueue(){ boolean ret=false; if (mRuntime.getUseQueue()) { @@ -162,7 +170,13 @@ public class Deliver extends AbstractConnectionService { //如果没有数据从缓存中尝试读取 // if (queue.isEmpty()) // loadMessage2Queue(); + + //检查刚刚发送出去的包是否需要检查server response + checkNeedServerResponse(needCheckResponseCMD); + + //如果需要,且没有服务器反馈 if (NeedCheckServerResponse==true && ServerResponsed==false){ + //刚刚发送的包不为空,且检测次数小于3,则保留数据,进行下一次重试。 if (needCheckResponseCMD!=null && CheckCount < 3) { //如果cmd有效,且尝试次数小于3, 没有收到反馈的情况下,可以重新插入queue进行下一次尝试! ICLogger.i("checkSrvResponse "+CheckCount+" times for "+needCheckResponseCMD); @@ -175,7 +189,7 @@ public class Deliver extends AbstractConnectionService { ICLogger.logToFile("APILog", "response failed retry ! " +CheckCount+" " + needCheckResponseCMD); } CheckCount++; - }else{ + }else{ //否则 可能是还没有发送过数据,或者超过重试次数,继续提取queue中数据进行发送 ICLogger.i("checkSrvResponse CheckCount="+CheckCount+" Timeout or cmd is null, skip "); if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", "response timeout skip! " + needCheckResponseCMD); @@ -194,11 +208,10 @@ public class Deliver extends AbstractConnectionService { if (checkNetwork()) { connection.sendMsg(cmd); // stringMessage = queue.poll(); - + needCheckResponseCMD=cmd; //如果需要Check if (NeedCheckServerResponse==true){ ICLogger.i("checkSrvResponse "+cmd); - needCheckResponseCMD=cmd; ServerResponsed=false; } ret=true; @@ -314,21 +327,18 @@ public static void sendLocationMSG( String Msg){ if (NeedCheckServerResponse==true){ if(needCheckResponseCMD!=null) { - if( cmd.equals(needCheckResponseCMD.substring(0,6))){ - - ICLogger.i("checkSrvResponse "+cmd+" "+needCheckResponseCMD.substring(0,6)+" is responsed!"); + if( cmd.equals(protocolAPIHelper.isCmdStr (needCheckResponseCMD))){ + ICLogger.i("checkSrvResponse "+cmd+" "+protocolAPIHelper.isCmdStr (needCheckResponseCMD)+" is responsed!"); ServerResponsed=true; CheckCount=0; } } } ICLogger.i("Deliver receive cmd " + paramStringMessage.cmd()); - if (cmd.equals("BP07") || cmd.equals("SentVoicePacket")) { + if (cmd.equals("SentVoicePacket") ) { //收到BP07 表示服务器收到一个voicePacket 分包成功,开始检查下一个包是否存在需要发送。 //收到SentVoicePacket 表示 有一个VoiceMessage要发送,需要从第0个包开始发送语音分包。 - voicePacket voicepacket = voicePacket.getInstanceSent(); - if (voicepacket.getCurrentIndexToSent() < voicepacket.getPacketCount()) { ICLogger.i("voicepacket " + voicepacket.getName() + " " + voicepacket.getPacketTime() + " send " + (voicepacket.getCurrentIndexToSent() + 1) + "/" + voicepacket.getPacketCount()); ((NettyConnection) mConnection).sendMsg( @@ -401,7 +411,7 @@ public static void sendLocationMSG( String Msg){ } }); return true; - } else if ("BP03".equals(paramStringMessage.cmd())) { + } else if ("heartbeat".equals(paramStringMessage.cmd())) { //每次心跳,查询一下 是否有语音消息需要接收。 // paramConnection.send(protocolAPIHelper.genStringMessage("AP05",protocolAPIHelper.AP05(true))); } else if ("NewVoice".equals(paramStringMessage.cmd())) diff --git a/app/src/main/java/com/enqualcomm/support/service/Initialize.java b/app/src/main/java/com/enqualcomm/support/service/Initialize.java index 8bf4f4d0..9a6884c4 100644 --- a/app/src/main/java/com/enqualcomm/support/service/Initialize.java +++ b/app/src/main/java/com/enqualcomm/support/service/Initialize.java @@ -90,7 +90,7 @@ public class Initialize extends AbstractConnectionService { public boolean onReceive(StringMessage paramStringMessage, Connection paramConnection, Runtime paramRuntime) { if (this.initOK) return false; - if (paramStringMessage.cmd().equals("BP00")) { + if (paramStringMessage.cmd().equals("login")) { this.initOK = true; // try { // paramRuntime.setKey(((JSONObject)(new JSONTokener(paramStringMessage.all()[1])).nextValue()).getString("KEY")); diff --git a/app/src/main/java/com/enqualcomm/support/service/KeepAlive.java b/app/src/main/java/com/enqualcomm/support/service/KeepAlive.java index 8ba5fc0a..d16deb79 100644 --- a/app/src/main/java/com/enqualcomm/support/service/KeepAlive.java +++ b/app/src/main/java/com/enqualcomm/support/service/KeepAlive.java @@ -111,9 +111,9 @@ public class KeepAlive extends AbstractConnectionService { boolean ret=DeviceInfoUtil.updateImei(mRuntime); ICLogger.i("Update IMEI "+ret); if (is_login_send_success) - connection.send(protocolAPIHelper.genStringMessage("heart", protocolAPIHelper.getHeartbeatMSG(mRuntime))); + connection.send(protocolAPIHelper.genStringMessage("heartbeat", protocolAPIHelper.getHeartbeatMSG(mRuntime))); else - connection.send(protocolAPIHelper.genStringMessage("heart", protocolAPIHelper.getLoginMSG(mRuntime))); + connection.send(protocolAPIHelper.genStringMessage("heartbeat", protocolAPIHelper.getLoginMSG(mRuntime))); } } @@ -286,7 +286,7 @@ public class KeepAlive extends AbstractConnectionService { //这个是正常心跳包,暂时不能认为服务器连接时失败的,所以正常发送检测。 //发送心跳包 - connection.send(protocolAPIHelper.genStringMessage("heart",protocolAPIHelper.getHeartbeatMSG(paramRuntime))); + connection.send(protocolAPIHelper.genStringMessage("heartbeat",protocolAPIHelper.getHeartbeatMSG(paramRuntime))); //发送完心跳后,开始检查服务器响应 startResponseCheckTimer(); @@ -295,10 +295,9 @@ public class KeepAlive extends AbstractConnectionService { public boolean onReceive(StringMessage paramStringMessage, Connection paramConnection, Runtime paramRuntime) { // this.idleTimeMillis = SystemClock.elapsedRealtime(); - if ("heart".equals(paramStringMessage.cmd())) { + if ("heartbeat".equals(paramStringMessage.cmd())) { AlarmWakeUp.isNeedWakeUpAlarm(paramRuntime); - return true; - }else if ("BP03".equals(paramStringMessage.cmd())){ + // 收到心跳才认为是已经连接了服务器 paramRuntime.setServerProtocolConnected(true); // isConnected = true; @@ -313,7 +312,7 @@ public class KeepAlive extends AbstractConnectionService { LocationClient.setForceLocation(1); CoreService.getInstance().setLocationAlarm(paramRuntime.getLocationInstance().getWorkingMod()); } - }else if (paramStringMessage.cmd().equals("BP00")) { + }else if (paramStringMessage.cmd().equals("login")) { //广播服务器连接成功的消息 // paramRuntime.getContextProxy().sendBroadcastServerConnectionChanged(true); //登录包收到就停止重链接服务器 @@ -328,7 +327,7 @@ public class KeepAlive extends AbstractConnectionService { public void call(Long param1Long) { //这时重新连接服务器才进行的连接,理论上close已经设置false,此次可以认为协议定然断开,所以设置为false作为双重保险。 mRuntime.setServerProtocolConnected(false); - connection.send(protocolAPIHelper.genStringMessage("heart",protocolAPIHelper.getHeartbeatMSG(paramRuntime))); + connection.send(protocolAPIHelper.genStringMessage("heartbeat",protocolAPIHelper.getHeartbeatMSG(paramRuntime))); //发送完心跳后,开始检查服务器响应 startResponseCheckTimer(); } diff --git a/app/src/main/java/com/enqualcomm/support/utils/MD5.java b/app/src/main/java/com/enqualcomm/support/utils/MD5.java new file mode 100644 index 00000000..6de99210 --- /dev/null +++ b/app/src/main/java/com/enqualcomm/support/utils/MD5.java @@ -0,0 +1,87 @@ +package com.enqualcomm.support.utils; + +import android.util.Log; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class MD5 { + static String TAG = "MD5"; + + public static String getCMDStringMD5(String src){ + + if (src.isEmpty()) { + return ""; + } + MessageDigest md5 = null; + try { + md5 = MessageDigest.getInstance("MD5"); + byte[] bytes = md5.digest(src.getBytes()); + String result = ""; + for (byte b : bytes) { + String temp = Integer.toHexString(b & 0xff); + if (temp.length() == 1) { + temp = "0" + temp; + } + result += temp; + } + return result; + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return ""; + } + public static String createMd5(String str) { + MessageDigest mMDigest; + FileInputStream Input; + File file = new File(str); + byte buffer[] = new byte[1024]; + int len; + if (!file.exists()) + return null; + try { + mMDigest = MessageDigest.getInstance("MD5"); + Input = new FileInputStream(file); + while ((len = Input.read(buffer, 0, 1024)) != -1) { + mMDigest.update(buffer, 0, len); + } + Input.close(); + } catch (NoSuchAlgorithmException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } + BigInteger mBInteger = new BigInteger(1, mMDigest.digest()); + Log.v(TAG, "create_MD5=" + mBInteger.toString(16)); + return mBInteger.toString(16); + + } + + public static boolean checkMd5(String Md5, String file) { + + if (Md5!=null) { + String str = createMd5(file); + Log.d(TAG, "md5sum = " + str); + if (Md5.compareTo(str) == 0) + return true; + else + return false; + }else + { + return true; + } + } +} diff --git a/app/src/main/java/com/enqualcomm/support/utils/TimeUtil.java b/app/src/main/java/com/enqualcomm/support/utils/TimeUtil.java index 4e2f0d1a..7dd0cf28 100644 --- a/app/src/main/java/com/enqualcomm/support/utils/TimeUtil.java +++ b/app/src/main/java/com/enqualcomm/support/utils/TimeUtil.java @@ -38,7 +38,9 @@ public class TimeUtil { public static String getSystemTime4(long paramLong) { return (new SimpleDateFormat("yyyyMMdd")).format(new Date(paramLong)); } - + public static String getSystemDateYYMMDD(){ + return (new SimpleDateFormat("yyMMdd")).format(new Date(System.currentTimeMillis())); + } public static Date parseDatetiime(String datetimeStr){ diff --git a/app/src/main/java/com/enqualcomm/support/utils/Util.java b/app/src/main/java/com/enqualcomm/support/utils/Util.java index b6d02a07..e655c517 100644 --- a/app/src/main/java/com/enqualcomm/support/utils/Util.java +++ b/app/src/main/java/com/enqualcomm/support/utils/Util.java @@ -935,6 +935,37 @@ public class Util { return ret; } - + public static String bytesToHexString(byte[] src) { + StringBuilder stringBuilder = new StringBuilder(""); + if (src == null || src.length <= 0) { + return null; + } + for (int i = 0; i < src.length; i++) { + int v = src[i] & 0xFF; + String hv = Integer.toHexString(v); + if (hv.length() < 2) { + stringBuilder.append(0); + } + stringBuilder.append(hv); + } + return stringBuilder.toString(); + } + public static byte[] hexStringToBytes(String hexString) { + if (hexString == null || hexString.equals("")) { + return null; + } + hexString = hexString.toUpperCase(); + int length = hexString.length() / 2; + char[] hexChars = hexString.toCharArray(); + byte[] d = new byte[length]; + for (int i = 0; i < length; i++) { + int pos = i * 2; + d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); + } + return d; + } + private static byte charToByte(char c) { + return (byte) "0123456789ABCDEF".indexOf(c); + } } diff --git a/app/src/main/java/com/enqualcomm/support/utils/regexUtil.java b/app/src/main/java/com/enqualcomm/support/utils/regexUtil.java new file mode 100644 index 00000000..d9e7fd7a --- /dev/null +++ b/app/src/main/java/com/enqualcomm/support/utils/regexUtil.java @@ -0,0 +1,161 @@ +package com.enqualcomm.support.utils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/*********************************************** + * 正则表达式工具 + * + * @author chen.lin + * @version 1.0 + ************************************************/ + +public class regexUtil { + + public static final Pattern PATTERN_FZD_CMD_HEADER= Pattern + .compile("\\[IC\\*\\d{15}\\*\\d*\\*[a-zA-Z0-9]+$"); + /** + * 车牌号码Pattern + */ + public static final Pattern PLATE_NUMBER_PATTERN = Pattern + .compile("^[\u0391-\uFFE5]{1}[a-zA-Z0-9]{6}$"); + + /** + * 证件号码Pattern + */ + public static final Pattern ID_CODE_PATTERN = Pattern + .compile("^[a-zA-Z0-9]+$"); + + /** + * 编码Pattern + */ + public static final Pattern CODE_PATTERN = Pattern + .compile("^[a-zA-Z0-9]+$"); + + /** + * 固定电话编码Pattern + */ + public static final Pattern PHONE_NUMBER_PATTERN = Pattern + .compile("0\\d{2,3}-[0-9]+"); + + /** + * 邮政编码Pattern + */ + public static final Pattern POST_CODE_PATTERN = Pattern.compile("\\d{6}"); + + /** + * 面积Pattern + */ + public static final Pattern AREA_PATTERN = Pattern.compile("\\d*.?\\d*"); + + /** + * 手机号码Pattern + */ + public static final Pattern MOBILE_NUMBER_PATTERN = Pattern + .compile("\\d{11}"); + + /** + * 银行帐号Pattern + */ + public static final Pattern ACCOUNT_NUMBER_PATTERN = Pattern + .compile("\\d{16,21}"); + + /** + * 车牌号码是否正确 + * + * @param s + * @return + */ + public static boolean isPlateNumber(String s) { + Matcher m = PLATE_NUMBER_PATTERN.matcher(s); + return m.matches(); + } + + /** + * 证件号码是否正确 + * + * @param s + * @return + */ + public static boolean isIDCode(String s) { + Matcher m = ID_CODE_PATTERN.matcher(s); + return m.matches(); + } + + /** + * 编码是否正确 + * + * @param s + * @return + */ + public static boolean isCode(String s) { + Matcher m = CODE_PATTERN.matcher(s); + return m.matches(); + } + + /** + * 固话编码是否正确 + * + * @param s + * @return + */ + public static boolean isPhoneNumber(String s) { + Matcher m = PHONE_NUMBER_PATTERN.matcher(s); + return m.matches(); + } + + /** + * 邮政编码是否正确 + * + * @param s + * @return + */ + public static boolean isPostCode(String s) { + Matcher m = POST_CODE_PATTERN.matcher(s); + return m.matches(); + } + + /** + * 面积是否正确 + * + * @param s + * @return + */ + public static boolean isArea(String s) { + Matcher m = AREA_PATTERN.matcher(s); + return m.matches(); + } + + /** + * 手机号码否正确 + * + * @param s + * @return + */ + public static boolean isMobileNumber(String s) { + Matcher m = MOBILE_NUMBER_PATTERN.matcher(s); + return m.matches(); + } + + /** + * 银行账号否正确 + * + * @param s + * @return + */ + public static boolean isAccountNumber(String s) { + Matcher m = ACCOUNT_NUMBER_PATTERN.matcher(s); + return m.matches(); + } + + + public static boolean isFZDCMD(String s){ + Matcher m = PLATE_NUMBER_PATTERN.matcher(s); + return m.matches(); + } + + public static boolean isFZDCMD(String cmd, String s){ + return Pattern.compile("\\[IC\\*\\d{15}\\*\\d*\\*"+cmd).matcher(s).matches(); + } + +} diff --git a/app/src/main/java/com/ic/protocols/protocolAPIHelper.java b/app/src/main/java/com/ic/protocols/protocolAPIHelper.java index ee0a6ed4..62e9f1d5 100644 --- a/app/src/main/java/com/ic/protocols/protocolAPIHelper.java +++ b/app/src/main/java/com/ic/protocols/protocolAPIHelper.java @@ -55,6 +55,27 @@ public class protocolAPIHelper { return sm; } + + public static String isCmdStr(String msg){ + + String ret=""; + switch(Config.protocol_no) + { + case Config.PROTOCOL_JIAI: + ret=protocol_jiai.isCmdStr(msg); + break; + case Config.PROTOCOL_BEEHOME: + ret=protocol_beehome.isCmdStr(msg); + break; + case Config.PROTOCOL_IC: + ret=protocol_ic.isCmdStr(msg); + break; + case Config.PROTOCOL_FZD: + ret=protocol_fzd.isCmdStr(msg); + break; + } + return ret; + } public static String getTemperatureMSG(double temp_adusted,double body_temp){ String ret=""; switch(Config.protocol_no) @@ -108,7 +129,7 @@ public class protocolAPIHelper { ret=protocol_ic.AP00(runtime); break; case Config.PROTOCOL_FZD: - ret=""; + ret=protocol_fzd.LK(); break; } return ret; @@ -128,7 +149,7 @@ public class protocolAPIHelper { ret=protocol_ic.AP03(runtime); break; case Config.PROTOCOL_FZD: - ret=""; + ret=protocol_fzd.KA(runtime); break; } return ret; @@ -184,10 +205,10 @@ public class protocolAPIHelper { ret=protocol_beehome.AP07(packetTime,count,index,datalen,amrdata); break; case Config.PROTOCOL_IC: - ret=protocol_ic.AP07(packetTime,count,index,datalen,amrdata); + ret=protocol_ic.APTU(packetTime,1,1,count,index,datalen,amrdata); break; case Config.PROTOCOL_FZD: - ret=protocol_fzd.AP07(packetTime,count,index,datalen,amrdata); + ret=null;//protocol_fzd.AP07(packetTime,count,index,datalen,amrdata); break; } return ret; diff --git a/app/src/main/java/com/ic/protocols/protocol_beehome.java b/app/src/main/java/com/ic/protocols/protocol_beehome.java index 4bb945fa..1a49f29b 100644 --- a/app/src/main/java/com/ic/protocols/protocol_beehome.java +++ b/app/src/main/java/com/ic/protocols/protocol_beehome.java @@ -215,18 +215,30 @@ public class protocol_beehome { private StringBuffer cmdbuf = new StringBuffer(); /* - 输入的字符串,如果有完整命令,返回 true - 否则返回 false + 输入的字符串,如果有完整命令,返回 命令名 + 否则返回 空字符串 */ - public boolean isCmdStr(String msg) { + public static String isCmdStr(String msg) { + int head_index = msg.indexOf(CMDHEADER); if (head_index >= 0) { int end_index = msg.indexOf("#", head_index); - if (end_index >= 0) { - return true; + if (end_index < 0) { + + return ""; } + }else{ + return ""; } - return false; + + for (CMD_TYPE key : cmdMap.keySet()) { + if (msg.startsWith(CMDHEADER + cmdMap.get(key))) { + ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key)); + return cmdMap.get(key); + } + } + + return ""; } private void log(String msg) { @@ -976,7 +988,7 @@ public class protocol_beehome { voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex); } //发送消息,再次检查要发送的语音包,确认其发送完毕 - connection.DeliverCMDMessageToSystem("BP07","SentVoicePacket"); + connection.DeliverCMDMessageToSystem("SentVoicePacket","SentVoicePacket"); }else{ ICLogger.i(" BP07 Format error!"); @@ -1831,22 +1843,22 @@ public class protocol_beehome { case BP00: //登录包 handleBP00(mRuntime,cmd); ICLogger.i("服务器收到登录包AP00"); - mConnection.DeliverCMDMessageToSystem("BP00",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化 break; case BP01: //gps定位包 handleBP01(cmd); ICLogger.i("服务器收到定位AP01"); - mConnection.DeliverCMDMessageToSystem("IWAP01",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("AP01",cmd);//通知下面线程状态变化 break; case BP02:// wifi定位包 handleBP02(cmd); ICLogger.i("服务器收到定位AP02"); - mConnection.DeliverCMDMessageToSystem("IWAP02",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("AP02",cmd);//通知下面线程状态变化 break; case BP03: //心跳包 handleBP03(cmd); ICLogger.i("服务器收到心跳包AP03"); - mConnection.DeliverCMDMessageToSystem("BP03",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化 break; case BP07: @@ -1855,7 +1867,7 @@ public class protocol_beehome { break; case BP10: //报警包 - mConnection.DeliverCMDMessageToSystem("IWAP10",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化 break; case BPTM: @@ -1948,7 +1960,7 @@ public class protocol_beehome { break; case BPHT: ICLogger.i("服务器收到上传的心率血压"); - mConnection.DeliverCMDMessageToSystem("IWAPHT",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("APHT",cmd);//通知下面线程状态变化 break; case BP84: handleBP84(cmd,mConnection); @@ -1980,11 +1992,11 @@ public class protocol_beehome { case BPTP: handleBPTP(); - mConnection.DeliverCMDMessageToSystem("IWAPTP",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化 break; case BPHP: handleBPHP(); - mConnection.DeliverCMDMessageToSystem("IWAPHP",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("APHP",cmd);//通知下面线程状态变化 break; case BPX1://设置 心率血压血氧修正值 handleBPX1(cmd,mConnection,mRuntime); diff --git a/app/src/main/java/com/ic/protocols/protocol_fzd.java b/app/src/main/java/com/ic/protocols/protocol_fzd.java index da7d5d3c..0d95a139 100644 --- a/app/src/main/java/com/ic/protocols/protocol_fzd.java +++ b/app/src/main/java/com/ic/protocols/protocol_fzd.java @@ -1,10 +1,12 @@ 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; @@ -18,14 +20,18 @@ 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.NettyConnection; 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.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; @@ -34,74 +40,52 @@ 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 = "IC"; - private static final String CMDEND = "#"; + 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="zd.xcloudtech.com"; + public static final String defaultServerIP="fzd.xcloudtech.com"; public static final int defaultServerPort=9000; public enum CMD_TYPE { /*终端发起*/ - AP00,//登录包 - BP00, - AP01,//混合定位 - BP01, - AP02,//多基站定位 - BP02, - AP92,//CDMA 混合定位 - BP92, - AP03,//心跳包 - BP03, - AP05,//语音查询接收 - BP05, - AP07,//语音上行 - BP07, - AP10,//报警与地址回复 - BP10, - AP49,//心率上传 - BP49, - APHT,//心率血压上传 - BPHT, - APTM,//基站校时及获取定位 - BPTM, + //链路保持数据 + LK,//登录 + PING,//绑定查询 + KA,//心跳包 + UD,//位置上传 + UD2,//盲点位置上传 + AL,//报警数据上传 + Time,//获取服务器时间 + WT,//获取天气 + img,//上传图片 + VOICE,//上传语音 + WG,//请求位置信息 + DLT,//解绑 + temp,//temp /* 服务器发起*/ - AP12, - BP12,//SOS 号码设置 - AP14, - BP14,//设置联系人白名单 - AP15, - BP15,//设置定位周期 - AP16, - BP16,//立即定位 - AP17, - BP17,//恢复出厂设置 - AP18, - BP18,//重启设备 - AP21, - BP21,//设置计步开关 - AP28, - BP28, //语音下行 - AP31, - BP31,//关机 - AP33, - BP33,//工作模式 - AP34, - BP34,//自定义工作模式 - APXL, - BPXL,//测量心率 - APXY, - BPXY,//测量血压 - APJZ, - BPJZ,//血压校准 - AP84, - BP84,//白名单开关 - AP85, - BP85,//设置闹钟 - AP86, - BP86,//心率血压测试周期 - AP89, - BP89,//心率血压阀值设置 + UPLOAD,//数据上传间隔设置 + CENTER,//中心号码设置 + CALL, //拨打电话 + MONITOR,//监听 + SOS,//SOS 号码设置 + FACTORY,//恢复出厂设置 + SOSSMS,//SOS 短信报警开关 + LOWBAT,//低电短信报警开关 + VERNO,//版本查询 + CR,//定位指令 + POWEROFF,//关机指令 + REMOVE,//取下手环报警开关 + REMOVESMS,//取下手表短信报警开关 + PEDO,//计步功能开关 + SILENCETIME,//免打扰时间段设置 + SILENCETIME2, //免打扰时间段设置 + SLEEPTIME,//翻转检测时间段设置 + FIND,//找手表指令 + REMIND,//闹钟设置指令 + TK,//对讲功能(微聊发送语音) UNKNOWN_CMD, } @@ -109,64 +93,39 @@ public class protocol_fzd { static { cmdMap = new HashMap(); - cmdMap.put(CMD_TYPE.AP00, "AP00"); - cmdMap.put(CMD_TYPE.BP00, "BP00"); - cmdMap.put(CMD_TYPE.AP01, "AP01"); - cmdMap.put(CMD_TYPE.BP01, "BP01"); - cmdMap.put(CMD_TYPE.AP02, "AP02"); - cmdMap.put(CMD_TYPE.BP02, "BP02"); - cmdMap.put(CMD_TYPE.AP92, "AP92"); - cmdMap.put(CMD_TYPE.BP92, "BP92"); - cmdMap.put(CMD_TYPE.AP03, "AP03"); - cmdMap.put(CMD_TYPE.BP03, "BP03"); - cmdMap.put(CMD_TYPE.AP05, "AP05"); - cmdMap.put(CMD_TYPE.BP05, "BP05"); - cmdMap.put(CMD_TYPE.AP07, "AP07"); - cmdMap.put(CMD_TYPE.BP07, "BP07"); - cmdMap.put(CMD_TYPE.AP10, "AP10"); - cmdMap.put(CMD_TYPE.BP10, "BP10"); - cmdMap.put(CMD_TYPE.AP49, "AP49"); - cmdMap.put(CMD_TYPE.BP49, "BP49"); - cmdMap.put(CMD_TYPE.APHT, "APHT"); - cmdMap.put(CMD_TYPE.BPHT, "BPHT"); - cmdMap.put(CMD_TYPE.APTM, "APTM"); - cmdMap.put(CMD_TYPE.BPTM, "BPTM"); - cmdMap.put(CMD_TYPE.AP12, "AP12"); - cmdMap.put(CMD_TYPE.BP12, "BP12"); - cmdMap.put(CMD_TYPE.AP14, "AP14"); - cmdMap.put(CMD_TYPE.BP14, "BP14"); - cmdMap.put(CMD_TYPE.AP15, "AP15"); - cmdMap.put(CMD_TYPE.BP15, "BP15"); - cmdMap.put(CMD_TYPE.AP16, "AP16"); - cmdMap.put(CMD_TYPE.BP16, "BP16"); - cmdMap.put(CMD_TYPE.AP17, "AP17"); - cmdMap.put(CMD_TYPE.BP17, "BP17"); - cmdMap.put(CMD_TYPE.AP18, "AP18"); - cmdMap.put(CMD_TYPE.BP18, "BP18"); - cmdMap.put(CMD_TYPE.AP21, "AP21"); - cmdMap.put(CMD_TYPE.BP21, "BP21"); - cmdMap.put(CMD_TYPE.AP28, "AP28"); - cmdMap.put(CMD_TYPE.BP28, "BP28"); - cmdMap.put(CMD_TYPE.AP31, "AP31"); - cmdMap.put(CMD_TYPE.BP31, "BP31"); - cmdMap.put(CMD_TYPE.AP33, "AP33"); - cmdMap.put(CMD_TYPE.BP33, "BP33"); - cmdMap.put(CMD_TYPE.AP34, "AP34"); - cmdMap.put(CMD_TYPE.BP34, "BP34"); - cmdMap.put(CMD_TYPE.APXL, "APXL"); - cmdMap.put(CMD_TYPE.BPXL, "BPXL"); - cmdMap.put(CMD_TYPE.APXY, "APXY"); - cmdMap.put(CMD_TYPE.BPXY, "BPXY"); - cmdMap.put(CMD_TYPE.APJZ, "APJZ"); - cmdMap.put(CMD_TYPE.BPJZ, "BPJZ"); - cmdMap.put(CMD_TYPE.AP84, "AP84"); - cmdMap.put(CMD_TYPE.BP84, "BP84"); - cmdMap.put(CMD_TYPE.AP85, "AP85"); - cmdMap.put(CMD_TYPE.BP85, "BP85"); - cmdMap.put(CMD_TYPE.AP86, "AP86"); - cmdMap.put(CMD_TYPE.BP86, "BP86"); - cmdMap.put(CMD_TYPE.AP89, "AP89"); - cmdMap.put(CMD_TYPE.BP89, "BP89"); + 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.Time, "Time"); + 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"); } private NettyConnection mConnection=null; @@ -180,24 +139,26 @@ public class protocol_fzd { private StringBuffer cmdbuf = new StringBuffer(); - /* - 输入的字符串,如果有完整命令,返回 true - 否则返回 false - */ - public boolean isCmdStr(String msg) { - /*** - * IC* - */ - - int head_index = msg.indexOf(CMDHEADER); - if (head_index >= 0) { - int end_index = msg.indexOf("#", head_index); - if (end_index >= 0) { - return true; - } - } - return false; - } +// /* +// 输入的字符串,如果有完整命令,返回 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); @@ -215,6 +176,22 @@ public class protocol_fzd { return sm; } + /* + 输入的字符串,如果有完整命令,返回 命令名 + 否则返回 空字符串 + */ + public static String isCmdStr(String msg) { + if (regexUtil.isFZDCMD(msg)) { + for (CMD_TYPE key : cmdMap.keySet()) { + if (regexUtil.isFZDCMD(cmdMap.get(key), msg)) { //如果是FZD命令,则进行处理,否则保留数据动 + ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key)); + return cmdMap.get(key); + } + } + return ""; + }else + return ""; + } /* 返回true 表示 cmd 全部解析成功 返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用 @@ -222,171 +199,144 @@ public class protocol_fzd { 每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃 */ public boolean parserCmd(byte[] bytes) { - boolean iscmdComplete = false; - boolean ret = true; - String last_inCompletecmd = ""; String cmd_msgbuf=new String(bytes); log("bytes.size "+bytes.length); -// cmdbuf.append(cmd_msgbuf); cmdbuf.append(cmd_msgbuf); log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString()); - /* - 如果不是 #结尾,就认为 接收数据不全,置位。 - */ - if (cmdbuf.toString().endsWith(CMDEND)) { - iscmdComplete = true; + int cmdindex =cmd_msgbuf.indexOf(CMDHEADER+CMDCOMPANY+CMDHEADERSPLIT); + if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据 + String cmd=cmd_msgbuf.substring(cmdindex); + cmd_msgbuf=cmd; } - String[] cmdlist = cmd_msgbuf.split(CMDEND); - int listlen = cmdlist.length; - log("listlen "+listlen); - /* - 如果解析出来的cmdlist不是空,且数据不是完整cmd则保留 最后一条数据到last_inCompletecmd - */ - if (cmdlist.length > 0 && iscmdComplete == false) { - listlen -= 1; - last_inCompletecmd = cmdlist[listlen]; - log("cmd not complete , " + last_inCompletecmd); + 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 (int i = 0; i < listlen; i++) { for (CMD_TYPE key : cmdMap.keySet()) { - if (cmdlist[i].startsWith(CMDHEADER + cmdMap.get(key))) { - log("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdlist[i]); - if (key == CMD_TYPE.BP28) { - //如果是BP28则 后面的数据是音频,需要保留 - byte[] amrBuf; - int amrLen = getBP28Amrlen(cmdlist[i] ); - if (bytes.length > amrLen) { - handleCmd(key, cmdlist[i], bytes); - } - } else { - handleCmd(key, cmdlist[i]); - } + // ICLogger.i("key "+cmdMap.get(key)+" cmdbuf "+cmd_msgbuf); + if (regexUtil.isFZDCMD(cmdMap.get(key),cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动 + String data=cmdbuf.toString().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 { + + + handleCmd(key, 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); } - - cmdbuf = new StringBuffer().append(last_inCompletecmd); - return ret; + sb.append(hv); + return sb.toString(); } - public int getBP28Amrlen(String cmd) { - - String Name; - String appendIndex; - int packetCount; - int currentId; - int packetLen; + private static String genHeader(int len,String cmd){ + if (CoreService.getInstance()==null) + return ""; - String[] msg=cmd.split(CMDSPLIT); - if (msg.length>=6){ - - Name=msg[1]; - appendIndex=msg[2]; - packetCount= Integer.parseInt(msg[3]); - currentId= Integer.parseInt(msg[4]); - packetLen= Integer.parseInt(msg[5]); - - StringBuffer stringBuffer=new StringBuffer(); - stringBuffer.append("getBP28AmrLen name = ").append(Name) - .append(",appendIndex = ").append(appendIndex) - .append(",packetCount = ").append(packetCount) - .append(",currentId = ").append(currentId) - .append(",packetLen = ").append(packetLen); - + 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(); + } - log( stringBuffer.toString()); - return packetLen; - }else{ - log("getBP28AmrLen","format Error"); + private static String keyheader(String cmd,int len){ + String header=genHeader(len,cmd); + String key= MD5.getCMDStringMD5(header+PrivKEY); + return key; + } - } - return -1; + public static String 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 sb.toString(); + } + public static String 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 sb.toString(); } /*登录*/ - public static String AP00(Runtime ds) { - //示例数据:IWAP00867155030001063# - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP00)).append(ds.IMEI()).append(CMDEND).toString(); + public static String LK() { + /*IC*YYYYYYYYYYYYYYY*LEN*LK*/ + return genFZDCMD(cmdMap.get(CMD_TYPE.LK)); } - //处理 登录 BP00 - public void handleBP00(Runtime runtime,String cmd){ - String[] msg=cmd.split(CMDSPLIT); -// get Msg :IWBP00,20191229171933,8# (size)24 -// 12-30 01:19:33.861 6492-6492/com.enqualcomm.support I/ICSrv.protocolAPIHelper: found cmd keyid=BP00 ,keyname=BP00 , IWBP00,20191229171933,8 - - if (msg.length>=3) { - log("handleBP00", "Set Datetime " + msg[1]); - log("handleBP00", "Set TimeZone " + msg[2]); - -// Date datetime= TimeUtil.parseDatetiime(msg[1]); -// int timezone=Integer.parseInt(msg[2]); -// if (datetime!=null){ -// ICLogger.i("==="+TimeUtil.getDefaultTimeZone()); -// TimeUtil.setTimeZone(timezone); -// -// -// ICLogger.i("==="+TimeUtil.getDefaultTimeZone()); -// TimeUtil.setSysDateTime(runtime.getContextProxy().context,datetime,timezone); -// ICLogger.i("==="+TimeUtil.getDefaultTimeZone()); -// -// } -// Set Datetime 20200505112734 -// Set TimeZone 8 - - }else{ - log("handleBP00","format Error"); - } + /** + * 绑定 + * */ + public static String PING(){ +// IC*YYYYYYYYYYYYYYY*LEN*PING + return genFZDCMD(cmdMap.get(CMD_TYPE.PING)); } - public static String AP03(Runtime ds) { - //示例数据:IWAP03,06000908000102,5555,30# IWAP03,000000null00000,0,0# - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP03)).append(CMDSPLIT).append(String.format("%03d",abs(ds.getSignalStrength()))) - .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0") - .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT) - .append(ds.getTotalStepCount()).append(CMDSPLIT).append(ds.getRolltimes()).append(CMDEND).toString(); + public static void handlePing(Runtime runtime,String cmd){ +// [IC*YYYYYYYYYYYYYYY*LEN*PING,是否绑定(0 表示未绑定,1 表示绑定)] +// 实例:[IC*334588000000156*0006*PING,0]或[IC*334588000000156*0006*PING,1] + String[] cmdlist=cmd.split(CMDSPLIT); + if (cmdlist.length==2){ + int bind=Integer.parseInt(cmdlist[1]); + if (bind==0){ + ICLogger.i("设备未绑定!"); + runtime.BindingStatus=false; + }else{ + ICLogger.i("设备已绑定!"); + runtime.BindingStatus=true; + } + } } - //处理 心跳 BP03 - public void handleBP03(String cmd){ - log("BP03心跳接收成功"); + public static String 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 static String AP10(Runtime ds){ - /** - * IWAP10080524A2232.9806N11404.9355E000.1 061830 323.87 060 009 080 0 05 02, - * 460,0,9520,3671, - * 00,zh-cn,00, - * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05/06:跌倒报警)) - * zh-cn:设备语言 - * 00:第一个0:是否需要回复地址信息,0:不回复,1回复. - * HOME|74-DE-2B-44-88-8C|97&HOME1|74-DE-2B-44-88-8C|97&HOME2|74-DE-2B-44-88-8C|97&HOME3|74-DE-2B-44-88-8C|97# - * IW标识符 - * AP10:命令字 - * 080524: 2008 年05 月24 - * A:“A”表示数据有效,”V”无效,如为V则取LBS数据 - * 2232.9806N11404.9355E000.1: 北纬22度32.9806分,东经114度04.9355分,速度为000.1 km/h,如经纬度无效,可默认全为0,如0000.0000N00000.0000E - * 061830: 格林尼治时间06 点18 分30 秒 - * 323.87:方向角323.87° - * 06000908000102:060为GSM信号,009为参与定位的卫星数,080为电池电量,0,保留位,01为设防状态,02为工作模式 ,(设防,工作模式如果为00,则代表无或未设置) - * 460,0,9520,3671 : LBS基站数据,MCC国家码,460为中国,0:MNC,0为移动,9520:LAC,十进制,3671,CID,十进制 - * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05:剪断报警,06:跌倒报警,07:心率异常, 08:心率过高, 09:心率过低,10:收缩压过高,11:收缩压过低,12:舒张压过高,13:舒张压过低,14:久坐提醒,15:非法解锁(剪断报警),16:锁定提醒(佩戴提醒),17:体温过高,18体温过低) - * zh-cn:设备语言 - * 00:第一个0:是否需要回复地址信息,0:不回复,1回复. - */ - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP10)).append(TimeUtil.getShortDate()) - .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength()))) - .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0") - .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT) - .append(ds.getLBSData()).append(CMDSPLIT) - .append(ds.getAlarmType()).append(CMDSPLIT) - .append(ds.getLanguage()).append(CMDSPLIT) - .append("00").append(CMDSPLIT) //不回复地址 - .append(ds.getWifiInfo()).append(CMDEND).toString(); - - } /*LBS+GPS混合定位*/ public static String AP01(Runtime ds) { @@ -394,7 +344,7 @@ public class protocol_fzd { // 460,0,9520,3671, // Home|74-DE-2B-44-88-8C|97& Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97& Home3|74-DE-2B-44-88-8C|97# // IWAP01191230A2232.9807N11404.9355E000.1161320000.0006000910000000,460,00,9520,3671,# - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP01)).append(TimeUtil.getShortDate()) + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.LK)).append(TimeUtil.getShortDate()) .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength()))) .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0") .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT) @@ -437,7 +387,7 @@ public class protocol_fzd { } ICLogger.i("Wifi ap sum "+apsum); - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP02)).append(CMDSPLIT) + 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) //基站信息数据 @@ -451,871 +401,6 @@ public class protocol_fzd { - public static String APXL(String id){ -//设备响应: IWAPXL,080835# - //080835:指令流水号 - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXL)) - .append(CMDSPLIT).append(id) - .append(CMDEND).toString(); - } - - /** - * 测量心率 - * @param cmd - * @param connection - */ - public void handleBPXL(String cmd, Connection connection){ - //IWBPXL,353456789012345,080835# - //说明: - //IW:标识符 - //BPXL : 命令字符 - //353456789012345:IMEI号,设备唯一ID - //080835 :指令流水号 - //设备响应: IWAPXL,080835# - //080835:指令流水号 - String[] list=cmd.split(CMDSPLIT); - if (list.length==3){ - String index=list[2]; - String imei=list[1]; - ICLogger.i("Handle BPXL IMEI "+imei+",index "+index); - connection.send(genStringMessage("APXL",APXL(index))); - }else{ - ICLogger.i("BPXL format error!"); - } - - } - - public static String APXY(String id){ -//设备响应: IWAPXY,080835# - //080835:指令流水号 - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXY)) - .append(CMDSPLIT).append(id) - .append(CMDEND).toString(); - } - - /** - * 测量血压 - * @param cmd - * @param connection - */ - public void handleBPXY(String cmd,Connection connection){ - //IWBPXY,353456789012345,080835# - //说明: - //IW:标识符 - //BPXL : 命令字符 - //353456789012345:IMEI号,设备唯一ID - //080835 :指令流水号 - //设备响应: IWAPXY,080835# - //080835:指令流水号 - String[] list=cmd.split(CMDSPLIT); - if (list.length==3){ - String index=list[2]; - String imei=list[1]; - ICLogger.i("Handle BPXY IMEI "+imei+",index "+index); - connection.send(genStringMessage("APXY",APXY(index))); - }else{ - ICLogger.i("BPXY format error!"); - } - - } - - - - public static String APJZ(String id,String BPH,String BPL,String Age,String Sex){ - //设备响应: IWAPJZ,792997,120,85,42,1# - //792997:指令流水号 - // 高压120,低压85,年龄42,1 男性 - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APJZ)) - .append(CMDSPLIT).append(id) - .append(CMDSPLIT).append(BPH) - .append(CMDSPLIT).append(BPL) - .append(CMDSPLIT).append(Age) - .append(CMDSPLIT).append(Sex) - .append(CMDEND).toString(); - } - - /** - * - * @param cmd - * @param connection - * @param runtime - */ - public void handleBPJZ(String cmd,Connection connection,Runtime runtime){ - //cmdbuf.size 42 IWBPJZ,867155030001063,199600,120,85,45,1# 高压120,低压85,年龄45,男性 -// cmdbuf.size 42 IWBPJZ,867155030001063,909957,120,85,42,0# 高压120,低压85,年龄42,女性 - //IWBPJZ,353456789012345,080835,110,75# - //说明: - //IW:标识符 - //BPJZ : 命令字符 - //353456789012345:IMEI号,设备唯一ID - //110:高压值 - //75:低压值 - //080835 :指令流水号 - //设备响应: IWAPJZ,792997,120,85,42,1# - //792997:指令流水号 - String[] list=cmd.split(CMDSPLIT); - if (list.length==7){ - String index=list[2]; - String imei=list[1]; - String strBPH=list[3]; - String strBPL=list[4]; - String strAge=list[5]; - String strSex=list[6]; - - connection.send(genStringMessage("APJZ",APJZ(index,strBPH,strBPL,strAge,strSex))); - runtime.getHRS().setXY_Ref(Integer.parseInt(strBPH),Integer.parseInt(strBPL),Integer.parseInt(strAge),Integer.parseInt(strSex)); - ICLogger.i("Handle BPJZ IMEI "+imei+",index "+index+", BPH "+strBPH+", BPL "+strBPL+", Age "+ strAge +", Sex "+ (strSex.equals("1")?"男":"女")); - }else{ - ICLogger.i("BPXY format error!"); - } - } - - - - //重启 - - - public static String AP18(String index){ - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP18)) - .append(CMDSPLIT).append(index) - .append(CMDEND).toString(); - } - - public void handleBP18(Connection connection,String cmd) { - - // IWBP18,867155030001063,161723 - String[] cmdlist=cmd.split(CMDSPLIT); - if (cmdlist.length==3) { - - connection.send(genStringMessage("AP18",AP18(cmdlist[2]))); - - } - } - //恢复出厂设置 - - public static String AP17(String index){ - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP17)) - .append(CMDSPLIT).append(index) - .append(CMDEND).toString(); - } - public void handleBP17(Connection connection,String cmd) { - - // IWBP17,867155030001063,161723 - String[] cmdlist=cmd.split(CMDSPLIT); - if (cmdlist.length==3) { - - connection.send(genStringMessage("AP17",AP17(cmdlist[2]))); - - } - } - - //关机 - - - public static String AP31(String index){ - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP31)) - .append(CMDSPLIT).append(index) - .append(CMDEND).toString(); - } - public void handleBP31(Connection connection,String cmd) { - - // IWBP31,867155030001063,161723 - String[] cmdlist=cmd.split(CMDSPLIT); - if (cmdlist.length==3) { - - connection.send(genStringMessage("AP31",AP31(cmdlist[2]))); - - } - } - - //设置SOS号码 - public static String AP12(String index,String phNum1,String phNum2,String phNum3){ - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP12)) - .append(CMDSPLIT).append(index) - .append(CMDSPLIT).append(phNum1) - .append(CMDSPLIT).append(phNum2) - .append(CMDSPLIT).append(phNum3) - .append(CMDEND).toString(); - } - - //设置SOS号码 - public void handleBP12(Connection connection,String cmd,Runtime runtime){ - // IWBP12,353456789012345,080835,135XXXXXXXX,135XXXXXXXX,135XXXXXXXX# - String[] cmdlist=cmd.split(CMDSPLIT); - if (cmdlist.length>=3){ - String index=cmdlist[2]; - String phNum1=cmdlist.length==3?"":cmdlist[3]; - String phNum2=cmdlist.length>3?(cmdlist.length==4?"":cmdlist[4]):""; - String phNum3=(cmdlist.length>4)?(cmdlist.length==5? "":cmdlist[5]):""; - ICLogger.i(new StringBuffer().append("get Emegency Numbs "+phNum1+","+phNum2+","+phNum3).toString()); - connection.send(genStringMessage("AP12",AP12(index,phNum1,phNum2,phNum3))); - - ArrayList contactArray=new ArrayList(); - if (!phNum1.isEmpty()) contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",phNum1)); - if (!phNum2.isEmpty()) contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",phNum2)); - if (!phNum3.isEmpty()) contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos3",phNum3)); - - runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true); - - }else{ - ICLogger.i(" BP12 format error!"); - } - } - - - public static String AP14(String index,String[] phnumbs){ - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .append(CMDSPLIT).append(index) - .append(CMDSPLIT).append(phnumbs[0]) - .append(CMDSPLIT).append(phnumbs[1]) - .append(CMDSPLIT).append(phnumbs[2]) - .append(CMDSPLIT).append(phnumbs[3]) - .append(CMDSPLIT).append(phnumbs[4]) - .append(CMDSPLIT).append(phnumbs[5]) - .append(CMDSPLIT).append(phnumbs[6]) - .append(CMDSPLIT).append(phnumbs[7]) - .append(CMDSPLIT).append(phnumbs[8]) - .append(CMDSPLIT).append(phnumbs[9]) - .append(CMDEND).toString(); - } - //设置通讯录,白名单(10个) - public void handleBP14(Connection connection,String cmd , Runtime runtime){ -// IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,, -/** - * IWBP14,353456789012345,080835, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx# - */ - String[] cmdlist=cmd.split(CMDSPLIT); - String[] phnums=new String[]{"","","","","","","","","",""}; - StringBuffer sb=new StringBuffer().append("recv phone Numbs "); - if (cmdlist.length>=3){ - switch (cmdlist.length){ - case 13: - phnums[9]=cmdlist[12]; - sb.append(phnums[9]).append(","); - case 12: - phnums[8]=cmdlist[11]; - sb.append(phnums[8]).append(","); - case 11: - phnums[7]=cmdlist[10]; - sb.append(phnums[7]).append(","); - case 10: - phnums[6]=cmdlist[9]; - sb.append(phnums[6]).append(","); - case 9: - phnums[5]=cmdlist[8]; - sb.append(phnums[5]).append(","); - case 8: - phnums[4]=cmdlist[7]; - sb.append(phnums[4]).append(","); - case 7: - phnums[3]=cmdlist[6]; - sb.append(phnums[3]).append(","); - case 6: - phnums[2]=cmdlist[5]; - sb.append(phnums[2]).append(","); - case 5: - phnums[1]=cmdlist[4]; - sb.append(phnums[1]).append(","); - case 4: - phnums[0]=cmdlist[3]; - sb.append(phnums[0]).append(","); - - } - - String index=cmdlist[2]; - ICLogger.i(sb.toString()); - connection.send(genStringMessage("AP14",AP14(index,phnums))); - ArrayList contactArray=new ArrayList(); - for (int i=0; i< phnums.length;i++){ - String[] tmp= phnums[i].split("\\|"); - if (tmp.length==2){ - String name= Util.decodeUnicode2Utf8(tmp[0]); - String phonem=tmp[1]; - ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem); - contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem)); - }else{ - ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length); - - } - } -// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666")); -// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666")); -// contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666")); -// contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666")); - - runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false); - - }else{ - ICLogger.i(" BP14 format error!"); - } - - } - - - - public static String AP85(Runtime ds,String cmddata){ -//示例数据:IWAP49,68## - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP85)) - .append(CMDSPLIT).append(cmddata) - .append(CMDEND).toString(); - - } - //设置闹钟 - public void handleBP85(String cmd , Connection connection,Runtime runtime){ -// IWBP85,867155030001063,155312,1,1,0235,12,1,1 -// IWBP85,867155030002145,945166,1,0, -// IWBP85,867155030001064,265960,1,1,1130,,1,1 -// IWBP85,353456789012345,080835,1,3, 0900,135,1,1@0900 ,135,1,2@0900 ,135,1,3# -//353456789012345:IMEI号,设备唯一ID -//080835 :指令流水号 -//1: 表示闹钟总开关,1为开,0 为关 -//3: 表示闹钟个数 -//0900 ,135,1,1,表示一组闹钟,0900表示早上09:00, 135表示周一周三周五,使用24小时制 -//1表示该组闹钟开启或关闭状态 1表示开启 0表示关闭 -//1表示吃药提醒 -//2 表示喝水提醒 -//3 表示久坐提醒 -//多组闹钟之间用”@”符号分隔 - - String imei="",cmdindex="0"/*指令流水号*/; - int all_alarmswitch=0 /*总开关 1为开,0 为关*/, - alarmswitch=0 /*1为开,0 为关*/, - alarmcount=0 /*表示闹钟个数*/; - String alarmtime="";//0900表示早上09:00 - int alarmtype=1; //1表示吃药提醒 , 2 表示喝水提醒 ,3 表示久坐提醒 - String repeat="";// 135表示周一周三周五,使用24小时制 - String[] datalist= cmd.split("@"); - ArrayList alarmlist=new ArrayList<>(); - if (datalist.length >0){ - for (int i =0 ; i< datalist.length;i++){ - String [] cmdarglist=datalist[i].split(","); - - if (i == 0){ - if (cmdarglist.length == 9){ - imei=cmdarglist[1]; - cmdindex=cmdarglist[2]; - all_alarmswitch=Integer.parseInt(cmdarglist[3]); - alarmcount=Integer.parseInt(cmdarglist[4]); - alarmtime=cmdarglist[5]; - repeat=cmdarglist[6]; - alarmswitch=Integer.parseInt(cmdarglist[7]); - alarmtype = Integer.parseInt(cmdarglist[8]); - log(new StringBuilder("imei ").append(imei) - .append(", cmdindex ").append(cmdindex) - .append(", allswitch=").append(all_alarmswitch) - .append(", all alarm count=").append(alarmcount) - .toString() - ); - - log(new StringBuilder("alarmtime ").append(alarmtime) - .append(", relpeat ").append(repeat) - .append(", switch=").append(alarmswitch) - .append(", alarmtype=").append(alarmtype) - .toString() - ); - alarmlist.add(new Alarm("ST"+alarmtime.substring(0,2)+"."+alarmtime.substring(2),"W"+repeat,"CON",alarmswitch==1?"ON":"OFF","闹铃")); - - }else if (cmdarglist.length == 5) { - imei=cmdarglist[1]; - cmdindex=cmdarglist[2]; - all_alarmswitch=Integer.parseInt(cmdarglist[3]); - alarmcount=Integer.parseInt(cmdarglist[4]); - }else{ - log("data len is too small!"); - } - }else{ - if (cmdarglist.length == 4){ - alarmtime=cmdarglist[0]; - repeat=cmdarglist[1]; - alarmswitch=Integer.parseInt(cmdarglist[2]); - alarmtype = Integer.parseInt(cmdarglist[3]); - - log(new StringBuilder("set alarmtime ").append(alarmtime) - .append(", relpeat ").append(repeat) - .append(", switch=").append(alarmswitch) - .append(", alarmtype=").append(alarmtype) - .toString() - ); - - alarmlist.add(new Alarm("ST"+alarmtime.substring(0,2)+"."+alarmtime.substring(2),"W"+repeat,"CON",alarmswitch==1?"ON":"OFF","闹铃")); - - }else{ - log("data len is too small!"); - } - - } - }//循环获取alarm数据结束 - runtime.getDbHelper().saveAlarm(alarmlist); - - //do clean and set alarm things - - } -//IWBP85,867155030002145,410385,1,0,# - - String replacement=new StringBuilder("IWBP85,").append(imei).append(",").toString(); - String replycmd = cmd.replace(replacement,""); - ICLogger.i("gen reply "+replacement+" "+replycmd); - connection.send(genStringMessage("AP85",AP85(runtime,replycmd))); - } - - -// AP05命令L02服务器不适用 -// public static String AP05(boolean recvFlag){ -// -//// IWAP05,1# -// return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP05)) -// .append(CMDSPLIT).append(recvFlag?1:0) -// .append(CMDEND).toString(); -// -// } -// -// -// public void handleBP05(String cmd){ -//// IWBP05,6# -// String[] cmdlist=cmd.split(CMDSPLIT); -// if (cmdlist.length>1){ -// ICLogger.i(" 服务器有 " +cmdlist[1]+" 条语音未接收!"); -// } -// } - - - - - public static byte[] AP07(String packetTime,int count,int index,int datalen,byte[] amrdata){ -//IWAP07,20140818064408,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX# -//说明: -//IW:标识符 -//AP07 : 命令字符 -//20140818064408 :yyyyMMddHHmmss 格式的年月日时分秒,设备录音时间 -//6:语音包分包总数 -//1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同 -//1024 :语音包长度 -//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数 -//语音包上传规则: -//按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。 -//收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。 -//如果设备回复确认数据包接收失败状态,则重复发送上一个数据包 - - - String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP07)) - .append(CMDSPLIT).append(packetTime) - .append(CMDSPLIT).append(count) - .append(CMDSPLIT).append(index) - .append(CMDSPLIT).append(datalen) - .append(CMDSPLIT).toString(); - - byte[] sentbuf=new byte[sb.length()+datalen+1]; - System.arraycopy(sb.getBytes(),0,sentbuf,0,sb.length()); - System.arraycopy(amrdata,0,sentbuf,sb.length(),datalen); - sentbuf[sb.length()+datalen]='#'; - - return sentbuf; - - } - - - public void handleBP07(String cmd , NettyConnection connection ){ -//平台响应: IWBP07,20140818064408,6,1,1# -//20140818064408:设备语音时间,yyyyMMddHHmmss 格式的年月日时分秒 -//6:语音包分包总数 -//1:当前设备收到的是第几个包 -//1:表示服务器接受数据成功,0表示服务器接受数据失败 - String[] cmdlist=cmd.split(CMDSPLIT); - if (cmdlist.length==5){ - String time=cmdlist[1]; - int packetCount=Integer.parseInt(cmdlist[2]); - int packetIndex=Integer.parseInt(cmdlist[3]); - int receiveSuccess=Integer.parseInt(cmdlist[4]); - ICLogger.i("服务器在"+time+" 收到语音 "+packetIndex+"/"+packetCount+" "+ (receiveSuccess==1?"成功":"失敗")); - if (receiveSuccess == 1){ - //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送 - voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex); - } - //发送消息,再次检查要发送的语音包,确认其发送完毕 - connection.DeliverCMDMessageToSystem("BP07","SentVoicePacket"); - - }else{ - ICLogger.i(" BP07 Format error!"); - } - } - - - - public static String AP33(String cmdindex,int workMode){ -//IWAP33,080835,1# -//080835:指令流水号 -//1:设置信息,供服务器同步 - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP33)) - .append(CMDSPLIT).append(cmdindex) - .append(CMDSPLIT).append(workMode) - .append(CMDEND).toString(); - } - - //设置工作模式 - public void handleBP33(Connection connection,Runtime runtime,String cmd){ - -// IWBP33,867155030001063,560555,1 -// IW:标识符 -// BP33 : 命令字符 -// 353456789012345:IMEI号,设备唯一ID -// 080835:指令流水号 -// 1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式 - - String[] cmdlist=cmd.split(","); - if (cmdlist.length == 4){ - - - log("work mode "+cmdlist[3]); - int mod=Integer.parseInt(cmdlist[3]); - int Cycle=900; - switch(mod){ - case ICLocation.NORMAL_MOD: - Cycle=900; - break; - case ICLocation.LOWPOWER_MOD: - Cycle=3600; - break; - case ICLocation.EMERGNECY_MOD: - case ICLocation.REALTIME_MOD: - Cycle=60; - break; - - } - - String msg=AP33(cmdlist[2],mod); - //设定当前工作模式及循环频率 - connection.send(genStringMessage("AP33",msg)); - log("reply msg "+msg); - log("LOCATION_MODE "+LOCATION_MODE+" mod "+ mod); - Config.setLocationMode(runtime.getContextProxy().context,mod); - Config.setLocationCycle(runtime.getContextProxy().context,Cycle); - runtime.getLocationInstance().setLocation_cycle(Cycle); - runtime.getLocationInstance().setWorkingMod(mod); -// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); - //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。 - } - - } - - - public static String AP34(String cmdindex,int workMode){ -//IWAP34,588854,1# -//080835:指令流水号 -//8:模式 - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP34)) - .append(CMDSPLIT).append(cmdindex) - .append(CMDSPLIT).append(workMode) - .append(CMDEND).toString(); - } - - //设置自定义工作模式 - public void handleBP34(Connection connection,Runtime runtime,String cmd){ - -// IWBP34,867155030001063,588854,8,900,1# -// IW:标识符 -// BP33 : 命令字符 -// 353456789012345:IMEI号,设备唯一ID -// 080835:指令流水号 -// 1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式 - - String[] cmdlist=cmd.split(","); - if (cmdlist.length == 6){ - - - log("work mode "+cmdlist[3]); - int mod=Integer.parseInt(cmdlist[3]); - int Cycle=Integer.parseInt(cmdlist[4]); - int gpson=Integer.parseInt(cmdlist[5]); - - String msg=AP34(cmdlist[2],mod); - //设定当前工作模式及循环频率 - connection.send(genStringMessage("AP34",msg)); - - if(gpson==1){ - mod=ICLocation.CUSTOM_MOD8_GPS; - }else{ - mod=ICLocation.CUSTOM_MOD8_WIFI; - } - log("reply msg "+msg); - log("LOCATION_MODE "+LOCATION_MODE+" mod "+ mod + ", cycle = "+Cycle+", GPS On= "+gpson); - Config.setLocationMode(runtime.getContextProxy().context,mod); - Config.setLocationCycle(runtime.getContextProxy().context,Cycle); - runtime.getLocationInstance().setLocation_cycle(Cycle); - runtime.getLocationInstance().setWorkingMod(mod); -// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); - //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。 - } - - } - - /** - * 心率上传,返回协议字串 - * @param ds - * @return - */ - public static String AP49(Runtime ds){ - //示例数据:IWAP49,68## - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP49)) - .append(CMDSPLIT).append(ds.getHRS().getPPG()) - .append(CMDEND).toString(); - - } - - - - - /** - * 返回上传心率血压的协议字串 - * @param ds - * @return - */ - public static String APHT(Runtime ds){ - //IWAPHT,60,130,85# - //说明: - //IW:标识符 - //APHT : 命令字符 - //60 : 表示心率 - //130: 血压高压 [收缩压] - //85 : 血压低压 [舒张压] - //平台响应: IWBPHT# - //表示平台已接收,可不作响应 - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT)) - .append(CMDSPLIT).append(ds.getHRS().getPPG()) - .append(CMDSPLIT).append(ds.getHRS().getBPH()) - .append(CMDSPLIT).append(ds.getHRS().getBPL()) - .append(CMDEND).toString(); - } - public static String APHT(int ppg,int bph,int bpl){ - //IWAPHT,60,130,85# - //说明: - //IW:标识符 - //APHT : 命令字符 - //60 : 表示心率 - //130: 血压高压 [收缩压] - //85 : 血压低压 [舒张压] - //平台响应: IWBPHT# - //表示平台已接收,可不作响应 - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT)) - .append(CMDSPLIT).append(ppg) - .append(CMDSPLIT).append(bph) - .append(CMDSPLIT).append(bpl) - .append(CMDEND).toString(); - } - - - //立即定位反馈 - public static String AP16(String cmdindex){ -//IWAP16,080835# -//080835:指令流水号 - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP16)) - .append(CMDSPLIT).append(cmdindex) - .append(CMDEND).toString(); - } - // 立即定位指令(长链接有效) - public void handleBP16(Connection connection,Runtime runtime,String cmd){ - //示例数据:IWBP16,867155030001063,335386 -// IWBP16,353456789012345,080835# -// 说明: -// IW:标识符 -// BP16 : 命令字符 -// 353456789012345:IMEI号,设备唯一ID -// 080835 :指令流水号 - String[] cmdlist = cmd.split(","); - if(cmdlist.length==3){ - log("imei "+cmdlist[1]+", cmdindex "+cmdlist[2]); - - connection.send(genStringMessage("AP16",AP16(cmdlist[2]))); - }else{ - log("error BP16 format"); - } - } - - - /*通过基站获取时间和坐标*/ - public static String APTM(Runtime ds){ - //示例数据:IWAPTM,460,0,9750,3613# - //说明: - //IW:标识符 - //APTM : 命令字符 - //460:MCC - //0: MNC - //9750: LAC - //3613: CID - - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTM)) - .append(CMDSPLIT).append(ds.getLocationInstance().getMCC()) - .append(CMDSPLIT).append(ds.getLocationInstance().getMNC()) - .append(CMDSPLIT).append(ds.getLocationInstance().getLAC()) - .append(CMDSPLIT).append(ds.getLocationInstance().getGSMStationCID()) - .append(CMDEND).toString(); - - } - - public void handleBPTM(String cmd){ - //平台响应: IWBPTM,20160225090909,22.123456,113.654321# - //返回时间,格式为:yyyyMMddHHmmss ,为UTC0 时间 - //经纬度保留六位小数,若没取到则返回 0 - String[] list=cmd.split(CMDSPLIT); - - if(list.length==4){ - - String time=list[1]; - String lat=list[2]; - String lon=list[3]; - ICLogger.i("BPTM , time="+time+", lat="+lat+", lon="+lon); - }else{ - ICLogger.i("BPTM format error"); - } - - - } - - public static String AP15(String index){ -//IWAP15, 080835# -//080835:指令流水号 - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP15)) - .append(CMDSPLIT).append(index) - .append(CMDEND).toString(); - } - - //设置定位周期 - public void handleBP15(String cmd ,Connection connection,Runtime runtime){ -// IWBP15, 353456789012345, 080835, 30# -// 353456789012345:IMEI号,设备唯一ID -// 080835 :指令流水号 -// 30: 表示频率为30分钟 - - String[] list=cmd.split(CMDSPLIT); - - if(list.length==4){ - String index=list[2]; - String time=list[3]; - connection.send(genStringMessage("AP15",AP15(index))); - ICLogger.i("BP15 , 定位周期="+time+"秒"); - - Config.setLocationMode(runtime.getContextProxy().context, ICLocation.CUSTOM_MOD8_GPS); - Config.setLocationCycle(runtime.getContextProxy().context,Integer.parseInt(time)); - runtime.getLocationInstance().setWorkingMod(Config.getLocationMode(runtime.getContextProxy().context)); - runtime.getLocationInstance().setLocation_cycle(Config.getLocationCycle(runtime.getContextProxy().context)); - //set AlarmCycle and trigger Location - CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); - }else{ - ICLogger.i("BP15 format error"); - } - - } - - - - - - - /*语音下行反馈*/ - public static String AP28(String name, String msg, int packagecount, int currentpackageindex, int received_success) { - //示例数据:IWAP28,D3590D54,xxxx,6,1,1# - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP28)) - .append(CMDSPLIT).append(name) - .append(CMDSPLIT).append(msg) - .append(CMDSPLIT).append(packagecount) - .append(CMDSPLIT).append(currentpackageindex) - .append(CMDSPLIT).append(received_success) - .append(CMDEND).toString(); - } - - //处理 BP28 语音消息 - public void handleBP28(NettyConnection connection,String cmd,Runtime runtime,byte[] bytes) { - //log("handleBP28 msg"+cmd); -/** - * IWBP28, D3590D54,XXXX,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX# - * 说明: - * IW:标识符 - * BP28 : 命令字符 - * D3590D54:UNICODE编码,发送者名称 - * XXXX: 附加信息,在响应数据包时,将附加信息原样响应,类似流水号 - * 6:语音包分包总数 - * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同 - * 1024 :语音包长度 - * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数 - * 语音包上传规则: - * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。 - * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。 - * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包 - * 设备响应: IWAP28,D3590D54,XXXX,6,1,1# - * D3590D54:UNICODE编码,发送者名称 - * XXXX: 附加信息,原样返回 - * 6:语音包分包总数 - * 1:当前设备收到的是第几个包 - * 1:表示设备接受数据成功,0表示设备接受数据失败 - */ - String Name; - String appendIndex; - int packetCount; - int currentId; - int packetLen; - byte[] packetData; - - String[] msg= cmd.split(CMDSPLIT); - if (msg.length>=6){ - - Name=msg[1]; - appendIndex=msg[2]; - packetCount= Integer.parseInt(msg[3]); - currentId= Integer.parseInt(msg[4]); - packetLen= Integer.parseInt(msg[5]); - packetData= Util.subArray(bytes,msg[0].length()+msg[1].length()+msg[2].length()+msg[3].length()+msg[4].length()+msg[5].length()+6,bytes.length-1); - - StringBuffer stringBuffer=new StringBuffer(); - stringBuffer.append("recv BP28 name = ").append(Name) - .append(",appendIndex = ").append(appendIndex) - .append(",packetCount = ").append(packetCount) - .append(",currentId = ").append(currentId) - .append(",packetLen = ").append(packetLen) - .append(",packetDatalen = ").append(packetData.length); - - log( stringBuffer.toString()); - connection.send(genStringMessage("AP28",AP28(Name,appendIndex,packetCount,currentId,1))); - voicePacket.getInstance().appendVoice(Name,appendIndex,packetCount,currentId,packetLen,packetData); - log("================"+voicePacket.getInstance().toString()); - if (voicePacket.getInstance().isFinished()) - { - - String dir = Environment.getExternalStorageDirectory()+ "/Android/VoiceCache"; - String amrFilepath=Util.saveFile(voicePacket.getInstance().getVoicePacketBytes(),0,voicePacket.getInstance().getVoicePacketLen(),new File(dir),"receive_"+voicePacket.getInstance().getPacketTime()+".amr"); - ICLogger.i("save Amr file to "+amrFilepath); - voicePacket.getInstance().clearPacket(); - VoiceContent voiceContent=VoiceContent.placeHolderIn(Content.CONTACT_CATEGORY_GROUP,GROUP_ALL,amrFilepath); - - - final Uri uri2 = runtime.getDbHelper().insertMessage( voiceContent); - - //回复UI消息,表示已经接收到 - voiceContent.status = 3; - voiceContent.serverTime = TimeUtil.getSystemTime3(); - voiceContent.preview = String.valueOf(Util.getDuration(voiceContent.content)); - runtime.getDbHelper().updateMessage(voiceContent, uri2); - -// runtime.getContextProxy().sendBroadcast(ACTION_IMESSAGE, runtime); - - connection.DeliverCMDMessageToSystem("NewVoice", amrFilepath);//通知下面线程状态变化 - } - - }else{ - log("handleBP28","format Error"); -// connection.send(genStringMessage("AP28",AP28(Name,appendIndex,packetCount,currentId,0))); - - } - - } public void sendBroadcast(String cmd, Runtime dev) { @@ -1328,130 +413,6 @@ public class protocol_fzd { dev.getContextProxy().context.startActivity(intent); } - //白名单开关(下行协议号:BP84,响应:AP84) - public static String AP84(String index,int success){ - - //设备响应: IWAP80,080835,1# - //080835:指令流水号 - //1:表示设备执行成功,0 表示设备执行失败 - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP84)) - .append(CMDSPLIT).append(index) - .append(CMDSPLIT).append(success) - .append(CMDEND).toString(); - } - - public void handleBP84(String cmd,Connection connection){ -//示例: - //IWBP84,353456789012345,080835,1# - //说明: - //IW:标识符 - //BP84 : 命令字符 - //353456789012345:IMEI号,设备唯一ID - //080835 :指令流水号 - //1: 表示白名单开,0 表示白名单关 - String[] list=cmd.split(CMDSPLIT); - - if (list.length==4){ - String index=list[2]; - String whitelist_switch=list[3]; - connection.send(genStringMessage("AP84",AP84(index,1))); - - if (whitelist_switch.equals("1")){ - Util.setSystemProperties("persist.sys.whitelist.enable","true"); - }else{ - Util.setSystemProperties("persist.sys.whitelist.enable","false"); - } - ICLogger.i("收到服务器指令:白名单"+(whitelist_switch.equals("1")?"开":"关")); - - }else{ - - ICLogger.i("BP84 format error!"); - } - - } - - //17.设置心率/血压测量周期(下行协议号:BP86,响应:AP86) - public static String AP86(String index){ - - //设备响应: IWAP86, 080835# - //080835:指令流水号 - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP86)) - .append(CMDSPLIT).append(index) - .append(CMDEND).toString(); - } - - public void handleBP86(String cmd,Connection connection,Runtime runtime){ - - //示例: - //IWBP86, 353456789012345, 080835,1,720# - //说明: - //IW:标识符 - //BP86 : 命令字符 - //353456789012345:IMEI号,设备唯一ID - //080835 :指令流水号 - //1: 表示心率周期;2 :表示血压周期 - //720: 表示720分钟 - - String[] list=cmd.split(CMDSPLIT); - - if (list.length==5){ - String index=list[2]; - String type=list[3]; - String cycle=list[4]; - connection.send(genStringMessage("AP86",AP86(index))); - ICLogger.i("收到服务器指令:设置"+(type.equals("1")?"心率周期 ":"血压周期 ")+cycle+"分钟"); - - //发送重置PPGCycle的广播,会在CoreServer里面执行 - Intent intent = new Intent(); - intent.putExtra("PPGTestCycle",Integer.parseInt(cycle)); - runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START,intent); - }else{ - ICLogger.i("BP86 format error!"); - } - - } - - //18.18.设置心率/血压阀值(下行协议号:BP89,响应:AP89) - public static String AP89(String index){ - - //设备响应: IWAP89, 080835# - //080835:指令流水号 - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP89)) - .append(CMDSPLIT).append(index) - .append(CMDEND).toString(); - } - - public void handleBP89(String cmd,Connection connection){ - - //示例: - //IWBP89, 353456789012345, 080835,50,90,80,90,110,140# - //说明: - //IW:标识符 - //BP89 : 命令字符 - //353456789012345:IMEI号,设备唯一ID - //080835 :指令流水号 - //50: 心率低阀值,低于该阀值上传心率,如果未设置,则留空 - //90: 心率高阀值,高于该阀值上传心率,如果未设置,则留空 - //80: 低压阀值,低压低于该阀值上传血压,如果未设置,则留空 - //90: 低压阀值,低压高于该阀值上传血压,如果未设置,则留空 - //110: 高压阀值,高压低于该阀值上传血压,如果未设置,则留空 - //140: 高压阀值,高压高于该阀值上传血压,如果未设置,则留空 - String[] list=cmd.split(CMDSPLIT); - if (list.length==9){ - String index=list[2]; - String PPGH=list[3]; - String PPGL=list[4]; - String BPH_H=list[5]; - String BPH_L=list[6]; - String BPL_H=list[7]; - String BPL_L=list[8]; - connection.send(genStringMessage("AP89",AP89(index))); - ICLogger.i("收到服务器指令:心率/血压阀值 "+PPGH+","+PPGL+","+BPH_H+","+BPH_L+","+BPL_H+","+BPL_L); - }else{ - ICLogger.i("BP89 format error!"); - } - - } public boolean handleCmd(CMD_TYPE type, String cmd) { //普通非二进制命令用此函数处理 @@ -1459,135 +420,206 @@ public class protocol_fzd { ICLogger.i("handleCmd "+type.name() + " strLen="+cmd.length()); if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd); switch (type){ - case BP00: //登录包 - handleBP00(mRuntime,cmd); - ICLogger.i("服务器收到登录包AP00"); - mConnection.DeliverCMDMessageToSystem("BP00",cmd);//通知下面线程状态变化 - break; - case BP01: //gps定位包 - handleBP01(cmd); - ICLogger.i("服务器收到定位AP01"); - mConnection.DeliverCMDMessageToSystem("IWAP01",cmd);//通知下面线程状态变化 + case LK: //登录包 + ICLogger.i("服务器收到登录包LK"); + mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化 break; - case BP02:// wifi定位包 - handleBP02(cmd); - ICLogger.i("服务器收到定位AP02"); - mConnection.DeliverCMDMessageToSystem("IWAP02",cmd);//通知下面线程状态变化 - break; - case BP03: //心跳包 - handleBP03(cmd); - ICLogger.i("服务器收到心跳包AP03"); - mConnection.DeliverCMDMessageToSystem("BP03",cmd);//通知下面线程状态变化 - break; - - case BP07: - //收到发送的语音包 - handleBP07(cmd,mConnection); - break; - case BP10: - //报警包 - mConnection.DeliverCMDMessageToSystem("IWAP10",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 BP33: - //设置工作模式 - handleBP33(mConnection,mRuntime,cmd); - mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 - - break; - case BP34: - //设置工作模式 - handleBP34(mConnection,mRuntime,cmd); - mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 - break; - case BP16: - //立即定位指令(长链接有效) - handleBP16(mConnection,mRuntime,cmd); - mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化 - break; - -// case BP05: //L02服务器不适用 -// //查询服务器语音 返回信息 -// API.handleBP05(cmd); -// break; - - case BP12: - //收到设置SOS号码 - handleBP12(mConnection,cmd,mRuntime); - ICLogger.i("收到服务器设置SOS号码命令BP12"); - break; - case BP14: - //收到设置白名单号码 - handleBP14(mConnection,cmd,mRuntime); - ICLogger.i("收到服务器设置白名单号码命令BP14"); - break; - case BP15: - handleBP15(cmd,mConnection,mRuntime); - ICLogger.i("收到服务器设置定位命令BP15"); - break; - case BP17: - //收到恢复出厂设置 - handleBP17(mConnection,cmd); - ICLogger.i("收到服务器恢复出厂设置命令BP17"); - mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化 - break; - - case BP18: - //收到重启 - handleBP18(mConnection,cmd); - ICLogger.i("收到服务器重启命令BP18"); - mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化 - break; - - case BP31: - //收到关机 - handleBP31(mConnection,cmd); - ICLogger.i("收到服务器关机命令BP31"); - mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化 + case KA: +// handleBP03(cmd); + ICLogger.i("服务器收到心跳包KA"); + mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化 break; - case BPXL: - handleBPXL(cmd,mConnection); - ICLogger.i("收到服务器心率检测命令"); - HeartRateManager.triggerPPGtest(); - break; - case BPXY: - handleBPXY(cmd,mConnection); - ICLogger.i("收到服务器血压检测命令"); - HeartRateManager.triggerPPGtest(); - break; - case BPJZ: - handleBPJZ(cmd,mConnection,mRuntime); - ICLogger.i("收到服务器血压校准命令"); - break; - case BPHT: - ICLogger.i("服务器收到上传的心率血压"); - break; - case BP84: - handleBP84(cmd,mConnection); - ICLogger.i("收到服务器白名单命令"); + case PING: + handlePing(mRuntime,cmd); + ICLogger.i("服务器返回Ping绑定信息"); break; +// case BP00: //登录包 +// handleBP00(mRuntime,cmd); +// ICLogger.i("服务器收到登录包AP00"); +// mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化 +// break; +// case BP01: //gps定位包 +// handleBP01(cmd); +// ICLogger.i("服务器收到定位AP01"); +// mConnection.DeliverCMDMessageToSystem("AP01",cmd);//通知下面线程状态变化 +// break; +// case BP02:// wifi定位包 +// handleBP02(cmd); +// ICLogger.i("服务器收到定位AP02"); +// mConnection.DeliverCMDMessageToSystem("AP02",cmd);//通知下面线程状态变化 +// break; +// case BP03: //心跳包 +// handleBP03(cmd); +// ICLogger.i("服务器收到心跳包AP03"); +// mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化 +// break; +// +// case BP07: +// //收到发送的语音包 +// handleBP07(cmd,mConnection); +// break; +// case BP10: +// //报警包 +// mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化 +// break; +// +// case BPTM: +// //校时命令 +// handleBPTM(cmd); +// ICLogger.i("服务器收到校时命令APTM"); +// mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程状态变化 +// break; +// case BP85://设置闹钟 +// handleBP85(cmd,mConnection,mRuntime); +// ICLogger.i("收到服务器设置闹钟命令BP85"); +// mConnection.DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程状态变化 +// break; +// case BP33: +// //设置工作模式 +// handleBP33(mConnection,mRuntime,cmd); +// mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 +// +// break; +// case BP34: +// //设置工作模式 +// handleBP34(mConnection,mRuntime,cmd); +// mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 +// break; +// case BP16: +// //立即定位指令(长链接有效) +// handleBP16(mConnection,mRuntime,cmd); +// mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化 +// break; +// +//// case BP05: //L02服务器不适用 +//// //查询服务器语音 返回信息 +//// API.handleBP05(cmd); +//// break; +// +// case BP12: +// //收到设置SOS号码 +// handleBP12(mConnection,cmd,mRuntime); +// ICLogger.i("收到服务器设置SOS号码命令BP12"); +// break; +// case BP14: +// //收到设置白名单号码 +// handleBP14(mConnection,cmd,mRuntime); +// ICLogger.i("收到服务器设置白名单号码命令BP14"); +// break; +// case BP15: +// handleBP15(cmd,mConnection,mRuntime); +// ICLogger.i("收到服务器设置定位命令BP15"); +// break; +// case BP17: +// //收到恢复出厂设置 +// handleBP17(mConnection,cmd); +// ICLogger.i("收到服务器恢复出厂设置命令BP17"); +// mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化 +// break; +// +// case BP18: +// //收到重启 +// handleBP18(mConnection,cmd); +// ICLogger.i("收到服务器重启命令BP18"); +// mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化 +// break; +// +// case BP31: +// //收到关机 +// handleBP31(mConnection,cmd); +// ICLogger.i("收到服务器关机命令BP31"); +// mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化 +// break; +// case BP40: +// //服务器推送文本 +// handleBP40(mConnection,mRuntime,cmd); +// ICLogger.i("收到服务器推送文本消息"); +// mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化 +// break; +// +// case BPXL: +// handleBPXL(cmd,mConnection); +// ICLogger.i("收到服务器心率检测命令"); +// HeartRateManager.triggerPPGtest(); +// break; +// case BPXY: +// handleBPXY(cmd,mConnection); +// ICLogger.i("收到服务器血压检测命令"); +// HeartRateManager.triggerPPGtest(); +// break; +// case BPJZ: +// handleBPJZ(cmd,mConnection,mRuntime); +// ICLogger.i("收到服务器血压校准命令"); +// break; +// case BPHT: +// ICLogger.i("服务器收到上传的心率血压"); +// mConnection.DeliverCMDMessageToSystem("APHT",cmd);//通知下面线程状态变化 +// break; +// case BP84: +// handleBP84(cmd,mConnection); +// ICLogger.i("收到服务器白名单命令"); +// break; +// +// case BP86: +// //绑定解绑消息 +// handleBP86(cmd,mConnection,mRuntime); +// mConnection.DeliverCMDMessageToSystem("AP86",cmd);//通知下面线程状态变化 +// +// break; +// +// case BP88: +// //收到查找设备消息 +// handleBP88(cmd,mConnection); +// mConnection.DeliverCMDMessageToSystem("findDev",cmd);//通知下面线程状态变化 +// break; +// case BP89: +// //心率/血压阀值 +// handleBP89(cmd,mConnection); +// mConnection.DeliverCMDMessageToSystem("AP89",cmd);//通知下面线程状态变化 +// break; +// +// case BPTE: //设置测试体温 +// handleBPTE(cmd,mConnection,mRuntime); +// mConnection.DeliverCMDMessageToSystem("APTE",cmd);//通知下面线程状态变化 +// break; +// +// case BPTP: +// handleBPTP(); +// mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化 +// break; +// case BPHP: +// handleBPHP(); +// mConnection.DeliverCMDMessageToSystem("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; - case BP86: - //心率血压周期设置 - handleBP86(cmd,mConnection,mRuntime); -// ICLogger.i(""); - break; - case BP89: - //心率/血压阀值 - handleBP89(cmd,mConnection); - break; } return ret; @@ -1603,8 +635,8 @@ public class protocol_fzd { ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length ); if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes)); switch (type) { - case BP28: - handleBP28(mConnection,cmd, mRuntime,bytes); + case LK: + // handleBP28(mConnection,cmd, mRuntime,bytes); ICLogger.i("收到服务器语音BP28"); mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化 break; diff --git a/app/src/main/java/com/ic/protocols/protocol_ic.java b/app/src/main/java/com/ic/protocols/protocol_ic.java index 041ca162..f7cd176e 100644 --- a/app/src/main/java/com/ic/protocols/protocol_ic.java +++ b/app/src/main/java/com/ic/protocols/protocol_ic.java @@ -226,18 +226,30 @@ public class protocol_ic { private StringBuffer cmdbuf = new StringBuffer(); /* - 输入的字符串,如果有完整命令,返回 true - 否则返回 false + 输入的字符串,如果有完整命令,返回 命令名 + 否则返回 空字符串 */ - public boolean isCmdStr(String msg) { + public static String isCmdStr(String msg) { + int head_index = msg.indexOf(CMDHEADER); if (head_index >= 0) { int end_index = msg.indexOf("#", head_index); - if (end_index >= 0) { - return true; + if (end_index < 0) { + + return ""; } + }else{ + return ""; } - return false; + + for (CMD_TYPE key : cmdMap.keySet()) { + if (msg.startsWith(CMDHEADER + cmdMap.get(key))) { + ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key)); + return cmdMap.get(key); + } + } + + return ""; } private void log(String msg) { @@ -986,7 +998,7 @@ public class protocol_ic { voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex); } //发送消息,再次检查要发送的语音包,确认其发送完毕 - connection.DeliverCMDMessageToSystem("BP07","SentVoicePacket"); + connection.DeliverCMDMessageToSystem("SentVoicePacket","SentVoicePacket"); }else{ ICLogger.i(" BP07 Format error!"); @@ -1950,25 +1962,22 @@ public class protocol_ic { * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。 * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包 */ - - - String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP07)) - .append(CMDSPLIT).append(6654111) + String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTU)) + .append(CMDSPLIT) .append(CMDSPLIT).append(packetTime) .append(CMDSPLIT).append(filetype) .append(CMDSPLIT).append(datatype) .append(CMDSPLIT).append(count) .append(CMDSPLIT).append(index) - .append(CMDSPLIT).append(datalen) + .append(CMDSPLIT).append(datalen*2) .append(CMDSPLIT).toString(); - byte[] sentbuf=new byte[sb.length()+datalen+1]; + byte[] sentbuf=new byte[sb.length()+datalen*2+1]; + byte[] amrdata2=Util.bytesToHexString(amrdata).getBytes(); System.arraycopy(sb.getBytes(),0,sentbuf,0,sb.length()); - System.arraycopy(amrdata,0,sentbuf,sb.length(),datalen); - sentbuf[sb.length()+datalen]='#'; - + System.arraycopy(amrdata2,0,sentbuf,sb.length(),datalen*2); + sentbuf[sb.length()+datalen*2]='#'; return sentbuf; - } @@ -2005,7 +2014,7 @@ public class protocol_ic { voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex); } //发送消息,再次检查要发送的语音包,确认其发送完毕 - connection.DeliverCMDMessageToSystem("BPTU","SentBPFilePacket"); + connection.DeliverCMDMessageToSystem("SentVoicePacket","SentBPFilePacket"); }else{ ICLogger.i(" BPTU Format error!"); @@ -2025,22 +2034,22 @@ public class protocol_ic { case BP00: //登录包 handleBP00(mRuntime,cmd); ICLogger.i("服务器收到登录包AP00"); - mConnection.DeliverCMDMessageToSystem("BP00",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化 break; case BP01: //gps定位包 handleBP01(cmd); ICLogger.i("服务器收到定位AP01"); - mConnection.DeliverCMDMessageToSystem("IWAP01",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("AP01",cmd);//通知下面线程状态变化 break; case BP02:// wifi定位包 handleBP02(cmd); ICLogger.i("服务器收到定位AP02"); - mConnection.DeliverCMDMessageToSystem("IWAP02",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("AP02",cmd);//通知下面线程状态变化 break; case BP03: //心跳包 handleBP03(cmd); ICLogger.i("服务器收到心跳包AP03"); - mConnection.DeliverCMDMessageToSystem("BP03",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化 break; case BP07: @@ -2049,7 +2058,7 @@ public class protocol_ic { break; case BP10: //报警包 - mConnection.DeliverCMDMessageToSystem("IWAP10",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化 break; case BPTM: @@ -2142,7 +2151,7 @@ public class protocol_ic { break; case BPHT: ICLogger.i("服务器收到上传的心率血压"); - mConnection.DeliverCMDMessageToSystem("IWAPHT",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("APHT",cmd);//通知下面线程状态变化 break; case BP84: handleBP84(cmd,mConnection); @@ -2164,17 +2173,17 @@ public class protocol_ic { case BP89: //心率/血压阀值 handleBP89(cmd,mConnection); - mConnection.DeliverCMDMessageToSystem("IWAP89",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("AP89",cmd);//通知下面线程状态变化 break; case BPTE: //设置测试体温 handleBPTE(cmd,mConnection,mRuntime); - mConnection.DeliverCMDMessageToSystem("IWAPTE",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("APTE",cmd);//通知下面线程状态变化 break; case BPTP: handleBPTP(); - mConnection.DeliverCMDMessageToSystem("IWAPTP",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化 break; case BPHP: handleBPHP(); @@ -2183,29 +2192,29 @@ public class protocol_ic { case BPX1://设置 心率血压血氧修正值 handleBPX1(cmd,mConnection,mRuntime); ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1"); - mConnection.DeliverCMDMessageToSystem("IWAPX1",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("APX1",cmd);//通知下面线程状态变化 break; case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。 handleBPS4(cmd,mConnection,mRuntime); ICLogger.i("收到 提醒设置(时间段)"); - mConnection.DeliverCMDMessageToSystem("IWAPS4",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("APS4",cmd);//通知下面线程状态变化 break; case BPDE: handleBPDE(mConnection,cmd,mRuntime); ICLogger.i(" 收到 进出围栏通知!"); - mConnection.DeliverCMDMessageToSystem("IWAPDE",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("APDE",cmd);//通知下面线程状态变化 break; case BPTU: handleBPTU(cmd, mConnection); ICLogger.i("收到服务器 图片语音 消息 BPTU"); - mConnection.DeliverCMDMessageToSystem("BPTU", "");//通知下面线程状态变化 + // mConnection.DeliverCMDMessageToSystem("APTU", "");//通知下面线程状态变化 break; case BPDF: handleBPDF(mConnection,cmd,mRuntime); ICLogger.i(" 收到 体温阈值设置!"); - mConnection.DeliverCMDMessageToSystem("IWAPDF",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("APDF",cmd);//通知下面线程状态变化 break; } @@ -2224,7 +2233,7 @@ public class protocol_ic { case BP28: handleBP28(mConnection,cmd, mRuntime,bytes); ICLogger.i("收到服务器语音BP28"); - mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化 +// mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化 break; } return ret; diff --git a/app/src/main/java/com/ic/protocols/protocol_jiai.java b/app/src/main/java/com/ic/protocols/protocol_jiai.java index bd72d1f1..77a92fe0 100644 --- a/app/src/main/java/com/ic/protocols/protocol_jiai.java +++ b/app/src/main/java/com/ic/protocols/protocol_jiai.java @@ -181,20 +181,31 @@ public class protocol_jiai { private StringBuffer cmdbuf = new StringBuffer(); /* - 输入的字符串,如果有完整命令,返回 true - 否则返回 false + 输入的字符串,如果有完整命令,返回 命令名 + 否则返回 空字符串 */ - public boolean isCmdStr(String msg) { + public static String isCmdStr(String msg) { + int head_index = msg.indexOf(CMDHEADER); if (head_index >= 0) { int end_index = msg.indexOf("#", head_index); - if (end_index >= 0) { - return true; + if (end_index < 0) { + + return ""; } + }else{ + return ""; } - return false; - } + for (CMD_TYPE key : cmdMap.keySet()) { + if (msg.startsWith(CMDHEADER + cmdMap.get(key))) { + ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key)); + return cmdMap.get(key); + } + } + + return ""; + } private void log(String msg) { ICLogger.log(TAG, msg); } @@ -938,7 +949,7 @@ public class protocol_jiai { voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex); } //发送消息,再次检查要发送的语音包,确认其发送完毕 - connection.DeliverCMDMessageToSystem("BP07","SentVoicePacket"); + connection.DeliverCMDMessageToSystem("SentVoicePacket","SentVoicePacket"); }else{ ICLogger.i(" BP07 Format error!"); @@ -1458,22 +1469,22 @@ public class protocol_jiai { case BP00: //登录包 handleBP00(mRuntime,cmd); ICLogger.i("服务器收到登录包AP00"); - mConnection.DeliverCMDMessageToSystem("BP00",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化 break; case BP01: //gps定位包 handleBP01(cmd); ICLogger.i("服务器收到定位AP01"); - mConnection.DeliverCMDMessageToSystem("IWAP01",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("AP01",cmd);//通知下面线程状态变化 break; case BP02:// wifi定位包 handleBP02(cmd); ICLogger.i("服务器收到定位AP02"); - mConnection.DeliverCMDMessageToSystem("IWAP02",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("AP02",cmd);//通知下面线程状态变化 break; case BP03: //心跳包 handleBP03(cmd); ICLogger.i("服务器收到心跳包AP03"); - mConnection.DeliverCMDMessageToSystem("BP03",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化 break; case BP07: @@ -1482,7 +1493,7 @@ public class protocol_jiai { break; case BP10: //报警包 - mConnection.DeliverCMDMessageToSystem("IWAP10",cmd);//通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化 break; case BPTM: -- 2.17.1