#include "includes.h" POC_DEF sutPocStatus; void pocDataInit(void){ memset((unsigned char *)&sutPocStatus, 0, sizeof(POC_DEF)); } /*控制查询POC设置状? dly:接口被调用的频率,单位ms*/ void pocProCtl(int dly) { static unsigned short cnt=0; static unsigned char excnt=4; //static unsigned char change=0; if(sutApp.gtMode!=0) return;//GT模式后不再查? if(++cnt<(5*1000/dly)) return; cnt=0; if(getAppObjStatus(ASLEEP_LCD)==0) return; msgToModem("AT+COPS?\r\n"); msgToModem("AT+CTEC?\r\n");//查询当前网络制式 msgToModem("AT+CSQ\r\n");//查询信号强度 msgAtSend("AT+POC=280000\r\n"); // #ifdef USE_GWSD_POC // if(sutApp.pocParaDone==0) msgAtSend("AT+POC=020000\r\n"); // //if(++excnt>6) // #endif } static void pocStartMsg(void); static void pro80Msg(char *msg); static void pro81Msg(char *msg); static void pro82Msg(char *msg); static void pro83Msg(char *msg); static void pro84Msg(char *msg); static void pro86Msg(char *msg); static void pro3dMsg(char *msg); static void pro3eMsg(char *msg); static void pro0eMsg(char *msg); static void pro1eMsg(char *msg); static void pro1dMsg(char *msg); static void pocGetVer(char *msg); static void pocGetPpp(char *msg); static void proGauthMsg(char *msg); static void proNoteMsg(char *msg); static void proNetMode(char *msg); static void proSimMode(char *msg); static void proPwrMode(char *msg); static void proFotaMsg(char *msg); static void proGmrMsg(char *msg); static void proSmsMsg(char *msg); static void proAlarmMsg(void); static void proPendMsg(void); static void proToneMsg(char *msg); static void proGPIPMsg(char *msg); static void proGGIPMsg(char *msg); static void proCsqMsg(char *msg); static void proMicSpk(int mic, int spk); static void proCopsMsg(char *msg); static void proHeadSet(char *msg); static void ProGetMicLV(char *msg); static void pro0dMsg(char *msg); static void proMic(int mic); static void proSpk(int spk); static void pro28Msg(char *msg); static void ProFEMsg(char *msg); void cmdsProcess(char *msg, int len){//已去掉回车换? int i,j; char buf[10]; //if(sutApp.pocInitStatus==0) sutApp.pocInitStatus=1; if(sutApp.gtMode==0){ appSleepCtl(ASLEEP_POC, 1); tryWakeupApp(); MSG_INFO(1,"POC:%s",msg); if(msgCmp(msg, "PocSleep")){//POC休眠? appSleepCtl(ASLEEP_POC, 0); }else if(msgCmp(msg, "+POC:WAKEUP")){//POC唤醒? }else if(msgCmp(msg, "+POC:8B")){ buf[0]=msg[9];buf[1]=msg[10];buf[2]=0; proSpk(atoi(buf)); }else if(msgCmp(msg, "+POC:0B")){//+POC:0B000000 buf[0]=msg[7];buf[1]=msg[8];buf[2]=0; proMic(atoi(buf)); }else if(msgCmp(msg, "+POC:0C00")){ proMic(3);//¼ }else if(msgCmp(msg, "+LSHTTS: END")){ sutPocStatus.TTS=0; }else if(msgCmp(msg, "+HTTS: START")){ paControl(true); sutPocStatus.TTS=1; } else if(msgCmp(msg, "PTT_") || msgCmp(msg, "GW_")) pocGetVer(msg); else if(msgCmp(msg, "+POC:02000000")){ setPocPara(msg+13,len-13); sutApp.startPoc=1; }else if(msgCmp(msg, "+POC:81")) pro81Msg(msg+7); else if(msgCmp(msg, "+POC:82")) pro82Msg(msg+7); else if(msgCmp(msg, "+POC:3D")) pro3dMsg(msg+7); else if(msgCmp(msg, "+POC:3E")) pro3eMsg(msg+7); else if(msgCmp(msg, "+POC:80")) pro80Msg(msg+7); else if(msgCmp(msg, "+POC:1E")) pro1eMsg(msg+7); else if(msgCmp(msg, "+POC:86")) pro86Msg(msg+7); else if(msgCmp(msg, "+POC:83")) pro83Msg(msg+7); else if(msgCmp(msg, "+POC:84")) pro84Msg(msg+7); else if(msgCmp(msg, "+POC:0E")) pro0eMsg(msg+7); else if(msgCmp(msg, "+POC:1D")) pro1dMsg(msg+7); else if(msgCmp(msg, "+POC:0D")) pro0dMsg(msg+7); else if(msgCmp(msg, "+POC:28")) pro28Msg(msg); else if(msgCmp(msg, "+POC:7F000000")) proVoiceMode(msg+13); else if(msgCmp(msg, "+CCID: ")) proCCIDMsg(msg+7); else if(msgCmp(msg, "$GNRMC"))process_gps_data(msg+7,len-7); else if(msgCmp(msg, "+CTEC:")) proNetMode(msg+7); else if(msgCmp(msg, "+CSQ: ")) proCsqMsg(msg+6); else if(msgCmp(msg, "+COPS:")) proCopsMsg(msg); else if(msgCmp(msg, "+CPIN: READY")) sutApp.cardStatus=1; else if(msgCmp(msg, "+SIMCROSS"))proSimMode(msg+10); else if(msgCmp(msg, "SV")) strcpy(sutApp.modemVer, msg); else if(msgCmp(msg,"+CACCP:"))ProGetMicLV(msg); else if(msgCmp(msg,"AT+POC=FE"))ProFEMsg(msg); else MSG_INFO(1, "skip:%d,%s", len,msg); } } //+POC:28000000 07e2061511391904 //ʾ 2018 ꣨07E2 6 £06 21 գ15 17 㣨11 57 ֣39 25 루19ģ04 static void pro28Msg(char *msg){ msg[27]=0; poc_clock.sec=htoi(msg+25); msg[25]=0; poc_clock.min=htoi(msg+23); msg[23]=0; poc_clock.hour=htoi(msg+21); msg[21]=0; poc_clock.day=htoi(msg+19); msg[19]=0; poc_clock.month=htoi(msg+17); msg[17]=0; poc_clock.year=htoi(msg+13); MSG_INFO(1,"%d:%d:%d",poc_clock.year,poc_clock.month,poc_clock.day); } static void proSpk( int spk){ if(spk==0){//Ž keyToneStart(1); sutPocStatus.spk=0; }else if(spk==1){//ſʼ paControl(true); keyToneStart(2); sutPocStatus.spk=1; //sutPocStatus.preSpk=1; } } static void proMic(int mic){ if(mic==3){ keyToneStart(1); sutPocStatus.mic=0; }else if(mic==1 || mic==2){//¼,2ǽֹ LSAPI_OSI_ThreadSleep(100); sutPocStatus.PttFail=1; keyToneStart(1); sutPocStatus.mic=0; }else if(mic==0){//¼ʼ //keyToneStart(); sutPocStatus.mic=1; } } /* +CCID: 898604851920C0133569 msg=898604851920C0133569 */ void proCCIDMsg(char *msg){ sutApp.cardStatus=1; msg[6]=0; sutApp.copstype=atoi(msg+4); } void FindIndexBysrt(char *src,char *substr,char*dest){ char i=0,j=0; while(*src){ if(*src==*substr){ if(memcmp(src,substr,strlen(substr))==0){ i=i+strlen(substr); while(src[i]!=';'){ dest[j]=src[i]; i++; j++; } dest[j]=0; return; } } i++; src++; } return ; } const char *poc_Usr="usr="; const char *poc_pwd="pwd="; const char *poc_oapwd="oapwd="; //75->0x75 /* key = (account[0] | 0x80); for(int i = 0; i < strlen(pwd); i++) { dec_pwd[i] = pwd[i]^key; } */ void ProFEMsg(char *msg){ char temp[100]={0}; char data[40]={0}; char key=0,i=0; StrAsciiToHex(msg+14,temp); FindIndexBysrt(temp,poc_Usr,data); strncpy(sutApp.UserInfo.OtherId,data,strlen(data)); FindIndexBysrt(temp,poc_pwd,data); memset(temp,0,sizeof(temp)); key=(sutApp.UserInfo.OtherId[0]|0x80);\ for(i=0;i=sizeof(tmp)) k=0; tmp[k++]=msg[j]; if(ch=='\r' && msg[j]=='\n'){ if(k!=2){ //处理 k -=2;tmp[k]=0;//去掉回车换行 MakeStringToUpperCap(tmp, k); cmdsProcess(tmp,k); } k=0; } ch=msg[j]; } } static void proMicSpk(int mic, int spk){ if(mic==0 && spk==0){//0000 if(newPara.KeySound!=0) pttBeepStart(false); sutPocStatus.spk=0; sutPocStatus.mic=0; sutPocStatus.TONE=0; }else if(mic==1 && spk==0){//0100 if(newPara.KeySound!=0) pttBeepStart(false); sutPocStatus.mic=1; }else if(mic==0 && spk==1){//0001 if(newPara.KeySound!=0) paControl(true);//pttBeepStart(false); else paControl(true);//关闭提示音时,也要打开喇叭 sutPocStatus.spk=1; sutPocStatus.mic=0; }else if(mic==0 && spk==13){//0013 if(newPara.KeySound!=0) beepStart(TONE_SPECIAL); }else if(mic==0 && spk==2){ paControl(true); sutPocStatus.TONE=1; } } static void micPro(int mic){ switch(mic){ case 0://关闭mic sutPocStatus.mic=0; break; case 1://打开mic if(newPara.KeySound!=0) beepStart(TONE_NORMAL); sutPocStatus.mic=1; //sutPocStatus.spk=0; break; } } static void spkPro(int spk){ switch(spk){ case 0://tone音后关闭spk if(newPara.KeySound!=0) beepStart(TONE_NORMAL); sutPocStatus.spk=0; break; case 1://tone音后保持spk打开 if(newPara.KeySound!=0) beepStart(TONE_NORMAL); paControl(true); sutPocStatus.spk=1; sutPocStatus.mic=0; break; case 2://播放TTS paControl(true); sutPocStatus.TTS=1; break; case 13://抢麦失败,可以tone特殊? if(newPara.KeySound!=0) beepStart(TONE_SPECIAL); break; } } /*POC已启动成?*/ static void pocStartMsg(void){ sutApp.pocInitStatus=1; } /*当前账号所属群组列表信?一次性获取所? 不同应用采用不同需求指? 从不在线到登录会主动上报一次列? 发AT+POC=0D0000也会上报一次列? msg:000000,iiii(组列表索?,dddddddd(组ID),nnnn(组成员数),mmmmmm(组名?*/ static void pro80Msg(char *msg){ int index,len,i; char buf[5],*pName; //Ȼȡ memcpy(buf, msg+6, 4); buf[4]=0;index=strtol(buf, &pName,16); if(index<1 || index>POC_ALL_GROUPS_NUM) return;//1ʼ index -= 1; //ȡ len=strlen(msg+22); LwEndingToBiEndingStr(msg+22,len); unicodeToGbk(msg+22, sutPocStatus.AllGroups[index].name, &len); sutPocStatus.AllGroups[index].name[len]=0; //ȡԱ msg[22]=0; sutPocStatus.AllGroups[index].usernum=strtol(&msg[18], &pName,16); //ȡID msg[18]=0; sutPocStatus.AllGroups[index].ID=strtol(&msg[10], &pName, 16); } /*所在组成员信息列表 发AT+POC=0E0000xxxxxxxx查询 msg:010000,iiii(成员列表索引),dddddddd(成员ID),mmmmmmmm(成员名称)*/ static void pro81Msg(char *msg){ int index,len,status; char buf[5],*pName; //ȡԱ״̬ buf[0]=msg[0];buf[1]=msg[1];buf[2]=0; status=atoi(buf); if(status<=1 || status >4) return; //ȻȡԱֵ memcpy(buf, msg+6, 4);buf[4]=0; index=strtol(buf, &pName, 16); if(index<=0 || index>POC_ALL_USERS_NUM) return; index --; sutPocStatus.AllUsers[index].status=status; //ȡԱ len=strlen(msg+18); LwEndingToBiEndingStr(msg+18,len); unicodeToGbk(msg+18, sutPocStatus.AllUsers[index].name, &len); sutPocStatus.AllUsers[index].name[len]=0; //ȡԱID msg[18]=0; sutPocStatus.AllUsers[index].ID=strtol(msg+10, &pName, 16); } /*登录状态信? msg:ss(00未登?02已登?,dddddddd(成员id),mmmmmmmm(状态信息内? 00 CEDECDF8C2E7C1ACBDD3 表示不在线,输出信息?无网络连?拨号?成功) 00 CEDEB7A8C1ACBDD3 表示不在线,输出信息?无法连接(IP 不对或定 向卡) 00 C3BBD3D0B7FECEF1 表示不在线,输出信息?没有服务(没注? 00 B5C7C2BDCAA7B0DC 表示不在线,输出信息?登陆失败(账号错误) 00 0D5CBBAC5D0C5CFA2B4EDCEF3 账号信息错误 02 0001A750 B2E2CAD431BAC5(测试 1 ?,*/ static void pro82Msg(char *msg){ char buf[3],*pName; int type,len; char Username[POC_GROUP_USER_NAME_LEN*2]; buf[0]=msg[0];buf[1]=msg[1];buf[2]=0; type=atoi(buf); switch(type){ case 0: sutPocStatus.logined=0; if(0==memcmp(msg+10, "CEDECDF8C2E7C1ACBDD3",20)) sutPocStatus.PocLineOffReason=1; else if(0==memcmp(msg+10, "CEDEB7A8C1ACBDD3",16)) sutPocStatus.PocLineOffReason=2; else if(0==memcmp(msg+10, "C3BBD3D0B7FECEF1",16)) sutPocStatus.PocLineOffReason=3; else if(0==memcmp(msg+10, "B5C7C2BDCAA7B0DC",16)) sutPocStatus.PocLineOffReason=4; break; case 2: sutPocStatus.TTS=1; paControl(true); sutPocStatus.PocLineOffReason=0; len=strlen(msg+10); if(len>POC_GROUP_USER_NAME_LEN) len=POC_GROUP_USER_NAME_LEN; memcpy(Username, msg+10,len); Username[len]=0; LwEndingToBiEndingStr(Username,len); unicodeToGbk(Username, sutPocStatus.LocalUser.name, &len); sutPocStatus.LocalUser.name[len]=0; msg[10]=0; sutPocStatus.LocalUser.ID=strtol(&msg[2], &pName, 16); MSG_INFO(1, "Login ok"); sutPocStatus.loginResult=3; break; case 8: //Զ̷ź msgAtSend("AT+POC=FE00000001\r\n"); break; } } /*有人说话 msg:00,dddddddd(成员id),nnnnnnnn(成员名称)*/ static void pro83Msg(char *msg){ int len; char callerName[POC_GROUP_USER_NAME_LEN*2]; backLightReset();//收到有人说话 // if(msg[0]=='0'&&msg[1]=='0'){ // if(newPara.KeySound!=0) keyToneStart(); // } len=strlen(msg+10); if(len>POC_GROUP_USER_NAME_LEN) len=POC_GROUP_USER_NAME_LEN; memcpy(callerName, msg+10,len); callerName[len]=0; if(0!=memcmp(callerName, sutPocStatus.CallName,len)){ LwEndingToBiEndingStr(callerName,len); unicodeToGbk(callerName, sutPocStatus.CallName, &len); sutPocStatus.CallName[len]=0; } } /*单呼响应信息 msg:00,mmmmmmmmmm(单呼结果信息) BAF4BDD0B3C9B9A6 表示 呼叫成功 BAF4BDD0CAA7B0DC 表示 呼叫失败 CDCBB3F6C1D9CAB1BAF4BDD0 表示 退出临时呼? C1D9CAB1BAF4BDD031BAC5BBFA 表示 临时呼叫 1 号机*/ static void pro84Msg(char *msg){ char ttsinfo[40]; char tempbuf[80]; char len; len=strlen(msg+2); memcpy(tempbuf, msg+2,len); if(0==memcmp(msg+2, "7C54EB5310629F52", 16)) sutPocStatus.danHuStatus=1; //ɹ else if(0==memcmp(msg+2, "344EF6657C54EB53", 16)) sutPocStatus.danHuStatus=1; //ɹ else if(0==memcmp(msg+2, "0090FA51", 8)) sutPocStatus.danHuStatus=0;//˳ʱ LwEndingToBiEndingStr(tempbuf,len); unicodeToGbk(tempbuf,ttsinfo, &len); ttsPlay(ENCODE_USER_ASCII, ttsinfo); } /*切换群组完成指令(表示已登? msg:00,dddddddd(组id),nnnnnnnn(组名?*/ static void pro86Msg(char *msg){ char buf[POC_GROUP_USER_NAME_LEN*4+40],*pName; int len,i; char GroupName[POC_GROUP_USER_NAME_LEN*2]; char tmp[POC_GROUP_USER_NAME_LEN*2+20]; char needTTs=0; // sutPocStatus.TTS=1; // paControl(true); sutPocStatus.logined=1; len=strlen(msg+10); if(len>POC_GROUP_USER_NAME_LEN*2) len=POC_GROUP_USER_NAME_LEN*2; memcpy(GroupName, msg+10,len); GroupName[len]=0; LwEndingToBiEndingStr(GroupName,len); unicodeToGbk(GroupName, sutPocStatus.LocalGroup.name, &len); sutPocStatus.LocalGroup.name[len]=0; msg[10]=0; sutPocStatus.LocalGroup.ID=strtol(msg+2, &pName,16); if(sutPocStatus.firstLogin==0){ snprintf(tmp, sizeof(tmp), "%s,ѵ½,%s", sutPocStatus.LocalUser.name,sutPocStatus.LocalGroup.name); backLightReset();//һε¼ʱ needTTs=1; }else{ snprintf(tmp, sizeof(tmp), ",%s",sutPocStatus.LocalGroup.name); if(sutApp.groupTTSEnable!=0){ needTTs=1; sutApp.groupTTSEnable=0; } } if(needTTs!=0){ memset(buf, 0, sizeof(buf)); for(i=0;i= POC_GROUP_USER_NAME_LEN*2) len = POC_GROUP_USER_NAME_LEN*2; memcpy(name, &msg[18], len); name[len]=0; msg[18]=0; id=strtol(&msg[10],&pTemp,16); sutPocStatus.AllUsers[sutPocStatus.ListFillIndex].ID=id; if(name[0]==0){ sutPocStatus.AllUsers[sutPocStatus.ListFillIndex].name[0]=' '; sutPocStatus.AllUsers[sutPocStatus.ListFillIndex].name[1]=0; }else{ LwEndingToBiEndingStr(name,len); unicodeToGbk(name, sutPocStatus.AllUsers[sutPocStatus.ListFillIndex].name, &len); sutPocStatus.AllUsers[sutPocStatus.ListFillIndex].name[len]=0; } sutPocStatus.ListFillIndex++; if(sutPocStatus.ListFillIndex==sutPocStatus.ExceptionReadNum){ sutPocStatus.ListGetOneFlag=1; sutPocStatus.ListDetailValid=1; } } /*定时查询所属组信息 发AT+POC=1D0000xxxxx获得 msg:000000,iiii(组列表索?,dddddddd(组ID),nnnn(成员个数),mmmmmmmmm(名称)*/ static void pro1dMsg(char *msg){ unsigned short num; char name[POC_GROUP_USER_NAME_LEN*2+1]; unsigned long id; unsigned short index; char *pTemp; int len; if(!uiAssist.status)return ; len = strlen(&msg[22]);//ȥس if(len >= POC_GROUP_USER_NAME_LEN*2) len = POC_GROUP_USER_NAME_LEN*2; memcpy(name, &msg[22], len); name[len]=0; msg[22]=0; num=strtol(&msg[18],&pTemp,16); msg[18]=0; id=strtol(&msg[10],&pTemp,16); sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].ID=id; sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].usernum=num; if(name[0]==0){ sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].name[0]=' '; sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].name[1]=0; }else LwEndingToBiEndingStr(name,len); unicodeToGbk(name, sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].name, &len); sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].name[len]=0; sutPocStatus.ListFillIndex++; if(sutPocStatus.ListFillIndex==sutPocStatus.ExceptionReadNum){ sutPocStatus.ListGetOneFlag=1; sutPocStatus.ListDetailValid=1; } } static void pro0dMsg(char *msg){ char *pName; //ȡȺ sutPocStatus.ListCurOnlineNum=strtol(msg+6, &pName, 16); MSG_INFO(1, "total group num:%d", sutPocStatus.ListCurOnlineNum); sutPocStatus.ListDetailValid=1; } /* +POC_VER:01027 msg=01027 */ static void pocGetVer(char *msg){ int i; sutApp.pocInitStatus=1; for(i=0;i'9') return; netModeValue=atoi(msg); ctecCurrentSet=netModeValue; if(ctecCurrentSet != newPara.netMode){ snprintf(cmd, sizeof(cmd),"AT+CTEC=%d,%d\r\n", ctecCurrentSet, newPara.netMode); msgAtSend(cmd); } } /* +COPS: 0,2,"46000",7 msg=+COPS: 0,2,"46000",7 */ static void proCopsMsg(char *msg){ int i,j=0,codeType; char w=0; unsigned char netModeValue; MSG_INFO(1,"enter PORCOPS"); for(i=0;i0 && codeType != sutApp.copstype) sutApp.copstype=codeType; } } } } /* +SIMCROSS:0 msg=0/1 */ static void proSimMode(char *msg){ unsigned char tmpSim; tmpSim=msg[0]-0x30; if(tmpSim!=0 && tmpSim!=1) return; if(tmpSim==1)sutApp.simSel=0; else if(tmpSim==0)sutApp.simSel=1; } /* +UDP:0,5,30 msg=0,5,30 */ static void proPwrMode(char *msg){ int seg1,seg2; short i; char buf[15]; for(i=2;i= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z') || (s[i] >='A' && s[i] <= 'Z');++i){ if (tolower(s[i]) > '9') n = 16 * n + (10 + tolower(s[i]) - 'a'); else n = 16 * n + (tolower(s[i]) - '0'); } return n; } void voiceModeSet(unsigned char voiceSel){ if(voiceSel==0) msgAtSend("AT+POC=7E000000\r\n"); else if(voiceSel==1) msgAtSend("AT+POC=7E000001\r\n"); } void voiceModeQuery(void){ msgAtSend("AT+POC=7F0000\r\n"); } /* +POC:7f00000001 msg=01 */ void proVoiceMode(char *msg){ char buf[3]; buf[0]=msg[0];buf[1]=msg[1];buf[2]=0; int mode=atol(buf); if((mode==0 || mode==1)&&mode != newPara.voiceSel){ newPara.voiceSel=mode; sysIniSave(); } }