package com.example.kingway.ptt; import timber.log.Timber; import java.util.ArrayList; import java.util.List; /**解析接收到的AT指令*/ public class CallBackResolution { private static String TAG = "PTT_RX"; private static String indexGroupId = "";//用户所在群组Id private static String indexGroupName = "";//用户所在群组名称 private static List memberInfoDtos = new ArrayList<>(); private static int speckType = 1; private static String talkId = ""; private static String talkName = ""; private static ArrayList groupInfos = new ArrayList<>(); private static String oldLoginSate = "00"; private static int logNum = 0; private static long offlineTime = 0; private static boolean loginState = false; public static void at_OEM_AT_cb(List lisHex){ if (lisHex.size() == 0) { return; } String ngx = "\\u"; try { Timber.tag(TAG).i("lisHex-->" + lisHex.toString()); String firstHex = lisHex.get(0); String errorNum = lisHex.get(1); Timber.tag(TAG).d("at_OEM_AT_cb firstHex: " + firstHex + ", errorNum: " + errorNum); switch (firstHex){ case "82"://登录状态通知指令 String loginId = lisHex.get(2) + "" + lisHex.get(3) + "" + lisHex.get(4) + "" + lisHex.get(5); CallBackUtil.callBackLoinState(errorNum, loginId); loginState = isLoginConflict(errorNum); CallBackUtil.callBackLoginConflict(loginState); break; case "a2"://账号有视频功能 CallBackUtil.callBackHaveVideo(); break; case "0d"://查询群组返回状态 if (errorNum.equals("00")){ CallBackUtil.callBackGroupInfo(groupInfos); } //CallBackUtil.callBackOnGroupSuccess(errorNum.equals("01")? false : true); break; case "0e"://查询群组成员返回状态 CallBackUtil.callBackOnMemberSuccess(errorNum.equals("01")? false : true, memberInfoDtos); break; case "0b"://发起讲话返回状态 Timber.tag(TAG).d("at_OEM_AT_cb ptt speak..."); CallBackUtil.callBackSpeakPlaySuccess(errorNum.equals("00")? true : false); break; case "0c"://结束讲话返回状态 Timber.tag(TAG).d("at_OEM_AT_cb speak end..."); CallBackUtil.callBackSpeakReleaseSuccess(errorNum.equals("00")? true : false); break; case "80"://返回群组信息 Timber.tag(TAG).d("at_OEM_AT_cb get group info: " + lisHex); String strGroup = ""; String groupId = lisHex.get(6) + "" + lisHex.get(7) + "" + lisHex.get(8) + "" + lisHex.get(9); int groupNo = Integer.valueOf((lisHex.get(4) + "" + lisHex.get(5)), 16); int groupCount = Integer.valueOf((lisHex.get(10) + "" + lisHex.get(11)), 16); try { int numB = 13; int size = lisHex.size() - 12; size = (size / 2) - 1; for (int i = 0; i < size; i++) { if (i == 0) { strGroup += ngx + lisHex.get(i + numB) + "" + lisHex.get(i + numB - 1); } else { strGroup += ngx + lisHex.get(i + numB + 1) + "" + lisHex.get(i + numB); numB = numB + 1; } } } catch (Exception e) { e.printStackTrace(); } finally { String tempTxt = ""; tempTxt = unicodeToString(strGroup); Timber.tag(TAG).i(" 组名称 " + tempTxt); CallBackUtil.callBackGroupInfo(groupId, tempTxt, groupNo, groupCount); Timber.tag(TAG).d("at_OEM_AT_cb group info groupId: " + groupId + ", groupNo: " + groupNo+", groupCount: " +groupCount); if (1 == groupNo) groupInfos.clear(); GroupInfoDto groupInfo = new GroupInfoDto(groupId, tempTxt, groupNo, groupCount); groupInfos.add(groupInfo); } break; case "81"://返回群成员信息 String groupMemberName = ""; String status = lisHex.get(1); boolean haveVideo = lisHex.get(10).equals("01") ? true : false; String memberId = lisHex.get(6) + "" + lisHex.get(7) + "" + lisHex.get(8) + "" + lisHex.get(9); int memberNo = Integer.valueOf((lisHex.get(4) + "" + lisHex.get(5)), 16); try { int numB = 12; int size = lisHex.size() - 11; size = (size / 2) - 1; for (int i = 0; i < size; i++) { if (i == 0) { groupMemberName += ngx + lisHex.get(i + numB) + "" + lisHex.get(i + numB - 1); } else { groupMemberName += ngx + lisHex.get(i + numB + 1) + "" + lisHex.get(i + numB); numB = numB + 1; } } } catch (Exception e) { e.printStackTrace(); } finally { String tempTxt = unicodeToString(groupMemberName); GroupMemberInfoDto infoDto = new GroupMemberInfoDto(memberId, tempTxt, status, memberNo, haveVideo); if (memberNo == 1) memberInfoDtos.clear(); memberInfoDtos.add(infoDto); } break; case "83"://讲话用户信息通知 if (lisHex.get(1).equals("00")) { speckType = 0; } else { speckType = 1; } talkId = lisHex.get(2) + "" + lisHex.get(3) + "" + lisHex.get(4) + "" + lisHex.get(5); List stringsSpker = new ArrayList<>(); try { int numA = 6; int numB = 7; int size = lisHex.size() - 6; size = (size / 2) - 1; for (int i = 0; i < size; i++) { if (i == 0) { stringsSpker.add(ngx + lisHex.get(i + numB) + "" + lisHex.get(i + numA)); } else { int start = i + numB; int end = i + numB + 1; stringsSpker.add(ngx + lisHex.get(end) + "" + lisHex.get(start)); numB = numB + 1; } } } catch (Exception e) { e.printStackTrace(); } finally { String tempTxt = ""; for (int i = 0; i < stringsSpker.size(); i++) { tempTxt += unicode(stringsSpker.get(i)); } talkName = tempTxt; } break; case "8b"://通知音频播放的状态 int notifyPlayStatus = Integer.parseInt(lisHex.get(2)); if (notifyPlayStatus == 0){ talkId = ""; talkName = ""; } CallBackUtil.callBackNotifyPlayStatus(notifyPlayStatus, speckType, indexGroupId, indexGroupName, talkId, talkName); break; case "84"://提示信息通知 List stringsTalk = new ArrayList<>(); try { int numA = 2; int numB = 3; int size = lisHex.size() - 2; size = (size / 2) - 1; for (int i = 0; i < size; i++) { if (i == 0) { stringsTalk.add(ngx + lisHex.get(i + numB) + "" + lisHex.get(i + numA)); } else { int start = i + numB; int end = i + numB + 1; stringsTalk.add(ngx + lisHex.get(end) + "" + lisHex.get(start)); numB = numB + 1; } } } catch (Exception e) { e.printStackTrace(); } finally { String tempTxt = ""; for (int i = 0; i < stringsTalk.size(); i++) { tempTxt += unicode(stringsTalk.get(i)); } Timber.tag(TAG).i(" 临时讲话 信息通知的指令 " + tempTxt); CallBackUtil.callBackTempCallNotify(tempTxt); } break; case "86"://用户进入群组信息通知 String userGroupId = lisHex.get(2) + "" + lisHex.get(3) + "" + lisHex.get(4) + "" + lisHex.get(5); List stringsJumpGroup = new ArrayList<>(); try { int numA = 6; int numB = 7; int size = lisHex.size() - 6; size = (size / 2) - 1; for (int i = 0; i < size; i++) { if (i == 0) { stringsJumpGroup.add(ngx + lisHex.get(i + numB) + "" + lisHex.get(i + numA)); } else { int start = i + numB; int end = i + numB + 1; stringsJumpGroup.add(ngx + lisHex.get(end) + "" + lisHex.get(start)); numB = numB + 1; } } } catch (Exception e) { e.printStackTrace(); } finally { String userGroupName = ""; for (int i = 0; i < stringsJumpGroup.size(); i++) { userGroupName += unicode(stringsJumpGroup.get(i)); } Timber.tag(TAG).i("进入群组 " + userGroupName); indexGroupId = userGroupId; indexGroupName = userGroupName; CallBackUtil.callBackNotifyUpdateGroup(userGroupId, userGroupName); } break; case "8d"://用户定位信息通知 if (lisHex.get(1).equals("00")) { String str = ""; String locationMemberId = lisHex.get(2) + "" + lisHex.get(3) + "" + lisHex.get(4) + "" + lisHex.get(5); for (int i = 0; i < lisHex.size() - 1; i++) { if (i > 5) { str = str + "" + lisHex.get(i).toString(); } } String address = hexString2String(str); address = address.substring(0,address.lastIndexOf(":")); try { String[] strLis = address.split(","); double latitude = Double.parseDouble(strLis[1]); double longitude = Double.parseDouble(strLis[0]); String time = strLis[2]; CallBackUtil.callBackNotifyLocationStatus(0, locationMemberId, latitude, longitude, time); } catch (Exception e) { Timber.tag(TAG).e(e, "获取定位Exception"); } } else { CallBackUtil.callBackNotifyLocationStatus(1, "", 0.0, 0.0, ""); } break; case "11"://上报位置信息 CallBackUtil.callBackNotifyUploadLocation(errorNum.equals("00")? true : false); break; case "02"://获取写码账号信息 String str = ""; for (int i = 4; i < lisHex.size() - 2; i++) { str = str + "" + lisHex.get(i); } String cmdTxt = hexString2String(str); CallBackUtil.callBackNotifyCodeInfo(cmdTxt); break; case "48"://获取写码密码信息 String strPwd = ""; for (int i = 4; i < lisHex.size() - 2; i++) { strPwd = strPwd + "" + lisHex.get(i); } String cmdPwdTxt = hexString2String(strPwd); CallBackUtil.callBackNotifyPwdInfo(cmdPwdTxt); break; case "45"://进入写码模式通知 CallBackUtil.callBackNotifyCodeOpenStatus(errorNum.equals("00")? true : false); break; case "52"://退出写码模式操作 CallBackUtil.callBackNotifyCodeExiteStatus(errorNum.equals("00")? true : false); break; case "47"://上传经销商密码 CallBackUtil.callBackNotifyUploadAgentPwd(errorNum.equals("00")? true : false); break; case "53"://上报本机告警信号 CallBackUtil.callBackRequestReportAlarm(errorNum.equals("00")? true : false); break; case "54"://停止本机告警信号 CallBackUtil.callBackRequestStopAlarm(errorNum.equals("00")? true : false); break; case "8e"://收到群成员告警信号 if (lisHex.get(1).equals("00")) { List strName = new ArrayList<>(); double latitude = 0.0, longitude = 0.0; try { String string = ""; for (int i = 4; i < lisHex.size(); i++) { string += lisHex.get(i).toString(); } String address = hexString2String(string); Timber.tag(TAG).i("address-->" + address); String[] strLis = address.split(","); latitude = Double.parseDouble(strLis[0]); longitude = Double.parseDouble(strLis[1]); int size = lisHex.size() - (8 + strLis[0].length() + strLis[1].length()); size = size / 2; int numA = 4 + strLis[0].length() + strLis[1].length() + 3; int numB = 4 + strLis[0].length() + strLis[1].length() + 4; for (int i = 0; i < size; i++) { if (i == 0) { strName.add(ngx + lisHex.get(i + numB) + "" + lisHex.get(i + numA)); } else { int start = i + numB; int end = i + numB + 1; strName.add(ngx + lisHex.get(end) + "" + lisHex.get(start)); numB = numB + 1; } } } catch (Exception e) { } finally { String tempTxt = ""; for (int i = 0; i < strName.size(); i++) { if (strName.get(i).equals("\\u0000")) break; tempTxt += unicode(strName.get(i)); } CallBackUtil.callBackEnotifyAlarm(tempTxt, latitude, longitude); } } break; case "8f"://收到群成员停止警告信息 CallBackUtil.callBackEnotifyStopAlarm(); break; case "78"://上传NFC信息 CallBackUtil.callBackRequestNfc(errorNum.equals("00")? true : false); break; } }catch (Exception e){ Timber.tag(TAG).e(e, "at_OEM_AT_cb Exception"); } } public static boolean isLoginConflict(String state) { if (oldLoginSate.equals("00") && state.equals("01")) { logNum++; oldLoginSate = state; } else if (oldLoginSate.equals("01") && state.equals("00")) { logNum++; oldLoginSate = state; } if (1 == logNum) { offlineTime = System.currentTimeMillis(); } if (logNum > 4) { if (System.currentTimeMillis() - offlineTime >= 60 * 1000) { return true; } } return false; } public static void at_Play_TTS_cb(String sData){ try { String[] txt = sData.split("\""); String data = txt[1]; String ngx = "\\u"; List strings = new ArrayList<>(); try { String str = ""; for (int i = 0; i < data.length(); i++) { if (i == 0) { str = ngx + data.charAt(i); } else if (i % 4 == 0) { strings.add(str); str = ngx + data.charAt(i); } else if (i == data.length() - 1) { str = str + data.charAt(i); strings.add(str); } else { str = str + data.charAt(i); } } } catch (Exception e) { e.printStackTrace(); } finally { String tempTxt = ""; for (int k = 0; k < strings.size(); k++) { tempTxt += unicode(strings.get(k)); } if (tempTxt.contains("已登录")) { String showName = tempTxt.substring(3, tempTxt.length()); CallBackUtil.callBackLogin(true, showName); java.util.concurrent.ScheduledExecutorService executor = java.util.concurrent.Executors.newScheduledThreadPool(1); Runnable task = () -> { SendAtUtil.sendUDP(); SendAtUtil.sendTCP(); }; executor.scheduleAtFixedRate(task, 0, 40, java.util.concurrent.TimeUnit.SECONDS); } else if (tempTxt.contains("账号或密码错误")) { CallBackUtil.callBackLogin(false, ""); } } } catch (Exception e) { e.printStackTrace(); } } public static String unicode(String str) { java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("(\\\\u(\\p{XDigit}{4}))"); java.util.regex.Matcher matcher = pattern.matcher(str); char ch; while (matcher.find()) { String group = matcher.group(2); ch = (char) Integer.parseInt(group, 16); String group1 = matcher.group(1); str = str.replace(group1, ch + ""); } return str; } public static String unicodeToString(String hex) { int t = hex.length() / 6; StringBuilder str = new StringBuilder(); for (int i = 0; i < t; i++) { String s = hex.substring(i * 6, (i + 1) * 6); String s1 = s.substring(2, 4) + "00"; String s2 = s.substring(4); int n = Integer.valueOf(s1, 16) + Integer.valueOf(s2, 16); char[] chars = Character.toChars(n); str.append(new String(chars)); } return str.toString(); } public static String hexString2String(String src) { String temp = ""; for (int i = 0; i < src.length() / 2; i++) { temp = temp + (char) Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue(); } return temp; } }