StandAPP/app/src/main/java/com/example/kingway/ptt/CallBackResolution.java

471 lines
21 KiB
Java

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<GroupMemberInfoDto> memberInfoDtos = new ArrayList<>();
private static int speckType = 1;
private static String talkId = "";
private static String talkName = "";
private static ArrayList<GroupInfoDto> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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;
}
}