471 lines
21 KiB
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;
|
|
}
|
|
}
|