poc.c 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006
  1. #include "includes.h"
  2. POC_DEF sutPocStatus;
  3. void pocDataInit(void){
  4. memset((unsigned char *)&sutPocStatus, 0, sizeof(POC_DEF));
  5. }
  6. /*鎺у埗鏌ヨ�POC璁剧疆鐘舵€?
  7. dly:鎺ュ彛琚�皟鐢ㄧ殑棰戠巼锛屽崟浣峬s*/
  8. void pocProCtl(int dly)
  9. {
  10. static unsigned short cnt=0;
  11. static unsigned char excnt=4;
  12. //static unsigned char change=0;
  13. if(sutApp.gtMode!=0) return;//GT妯″紡鍚庝笉鍐嶆煡璇?
  14. if(++cnt<(5*1000/dly)) return;
  15. cnt=0;
  16. if(getAppObjStatus(ASLEEP_LCD)==0) return;
  17. msgToModem("AT+COPS?\r\n");
  18. msgToModem("AT+CTEC?\r\n");//鏌ヨ�褰撳墠缃戠粶鍒跺紡
  19. msgToModem("AT+CSQ\r\n");//鏌ヨ�淇″彿寮哄害
  20. msgAtSend("AT+POC=280000\r\n");
  21. // #ifdef USE_GWSD_POC
  22. // if(sutApp.pocParaDone==0) msgAtSend("AT+POC=020000\r\n");
  23. // //if(++excnt>6)
  24. // #endif
  25. }
  26. static void pocStartMsg(void);
  27. static void pro80Msg(char *msg);
  28. static void pro81Msg(char *msg);
  29. static void pro82Msg(char *msg);
  30. static void pro83Msg(char *msg);
  31. static void pro84Msg(char *msg);
  32. static void pro86Msg(char *msg);
  33. static void pro3dMsg(char *msg);
  34. static void pro3eMsg(char *msg);
  35. static void pro0eMsg(char *msg);
  36. static void pro1eMsg(char *msg);
  37. static void pro1dMsg(char *msg);
  38. static void pocGetVer(char *msg);
  39. static void pocGetPpp(char *msg);
  40. static void proGauthMsg(char *msg);
  41. static void proNoteMsg(char *msg);
  42. static void proNetMode(char *msg);
  43. static void proSimMode(char *msg);
  44. static void proPwrMode(char *msg);
  45. static void proFotaMsg(char *msg);
  46. static void proGmrMsg(char *msg);
  47. static void proSmsMsg(char *msg);
  48. static void proAlarmMsg(void);
  49. static void proPendMsg(void);
  50. static void proToneMsg(char *msg);
  51. static void proGPIPMsg(char *msg);
  52. static void proGGIPMsg(char *msg);
  53. static void proCsqMsg(char *msg);
  54. static void proMicSpk(int mic, int spk);
  55. static void proCopsMsg(char *msg);
  56. static void proHeadSet(char *msg);
  57. static void ProGetMicLV(char *msg);
  58. static void pro0dMsg(char *msg);
  59. static void proMic(int mic);
  60. static void proSpk(int spk);
  61. static void pro28Msg(char *msg);
  62. static void ProFEMsg(char *msg);
  63. void cmdsProcess(char *msg, int len){//宸插幓鎺夊洖杞︽崲琛?
  64. int i,j;
  65. char buf[10];
  66. //if(sutApp.pocInitStatus==0) sutApp.pocInitStatus=1;
  67. if(sutApp.gtMode==0){
  68. appSleepCtl(ASLEEP_POC, 1);
  69. tryWakeupApp();
  70. MSG_INFO(1,"POC:%s",msg);
  71. if(msgCmp(msg, "PocSleep")){//POC浼戠湢浜?
  72. appSleepCtl(ASLEEP_POC, 0);
  73. }else if(msgCmp(msg, "+POC:WAKEUP")){//POC鍞ら啋浜?
  74. }else if(msgCmp(msg, "+POC:8B")){
  75. buf[0]=msg[9];buf[1]=msg[10];buf[2]=0;
  76. proSpk(atoi(buf));
  77. }else if(msgCmp(msg, "+POC:0B")){//+POC:0B000000
  78. buf[0]=msg[7];buf[1]=msg[8];buf[2]=0;
  79. proMic(atoi(buf));
  80. }else if(msgCmp(msg, "+POC:0C00")){
  81. proMic(3);//录音结束
  82. }else if(msgCmp(msg, "+LSHTTS: END")){
  83. sutPocStatus.TTS=0;
  84. }else if(msgCmp(msg, "+HTTS: START")){
  85. paControl(true);
  86. sutPocStatus.TTS=1;
  87. }
  88. else if(msgCmp(msg, "PTT_") || msgCmp(msg, "GW_")) pocGetVer(msg);
  89. else if(msgCmp(msg, "+POC:02000000")){
  90. setPocPara(msg+13,len-13);
  91. sutApp.startPoc=1;
  92. }else if(msgCmp(msg, "+POC:81")) pro81Msg(msg+7);
  93. else if(msgCmp(msg, "+POC:82")) pro82Msg(msg+7);
  94. else if(msgCmp(msg, "+POC:3D")) pro3dMsg(msg+7);
  95. else if(msgCmp(msg, "+POC:3E")) pro3eMsg(msg+7);
  96. else if(msgCmp(msg, "+POC:80")) pro80Msg(msg+7);
  97. else if(msgCmp(msg, "+POC:1E")) pro1eMsg(msg+7);
  98. else if(msgCmp(msg, "+POC:86")) pro86Msg(msg+7);
  99. else if(msgCmp(msg, "+POC:83")) pro83Msg(msg+7);
  100. else if(msgCmp(msg, "+POC:84")) pro84Msg(msg+7);
  101. else if(msgCmp(msg, "+POC:0E")) pro0eMsg(msg+7);
  102. else if(msgCmp(msg, "+POC:1D")) pro1dMsg(msg+7);
  103. else if(msgCmp(msg, "+POC:0D")) pro0dMsg(msg+7);
  104. else if(msgCmp(msg, "+POC:28")) pro28Msg(msg);
  105. else if(msgCmp(msg, "+POC:7F000000")) proVoiceMode(msg+13);
  106. else if(msgCmp(msg, "+CCID: ")) proCCIDMsg(msg+7);
  107. else if(msgCmp(msg, "$GNRMC"))process_gps_data(msg+7,len-7);
  108. else if(msgCmp(msg, "+CTEC:")) proNetMode(msg+7);
  109. else if(msgCmp(msg, "+CSQ: ")) proCsqMsg(msg+6);
  110. else if(msgCmp(msg, "+COPS:")) proCopsMsg(msg);
  111. else if(msgCmp(msg, "+CPIN: READY")) sutApp.cardStatus=1;
  112. else if(msgCmp(msg, "+SIMCROSS"))proSimMode(msg+10);
  113. else if(msgCmp(msg, "SV")) strcpy(sutApp.modemVer, msg);
  114. else if(msgCmp(msg,"+CACCP:"))ProGetMicLV(msg);
  115. else if(msgCmp(msg,"AT+POC=FE"))ProFEMsg(msg);
  116. else MSG_INFO(1, "skip:%d,%s", len,msg);
  117. }
  118. }
  119. //+POC:28000000 07e2061511391904
  120. //表示 2018 年(07E2) 6 月(06) 21 日(15) 17 点(11) 57 分(39) 25 秒(19)星期四(04)
  121. static void pro28Msg(char *msg){
  122. msg[27]=0;
  123. poc_clock.sec=htoi(msg+25);
  124. msg[25]=0;
  125. poc_clock.min=htoi(msg+23);
  126. msg[23]=0;
  127. poc_clock.hour=htoi(msg+21);
  128. msg[21]=0;
  129. poc_clock.day=htoi(msg+19);
  130. msg[19]=0;
  131. poc_clock.month=htoi(msg+17);
  132. msg[17]=0;
  133. poc_clock.year=htoi(msg+13);
  134. MSG_INFO(1,"%d:%d:%d",poc_clock.year,poc_clock.month,poc_clock.day);
  135. }
  136. static void proSpk( int spk){
  137. if(spk==0){//播放结束
  138. keyToneStart(1);
  139. sutPocStatus.spk=0;
  140. }else if(spk==1){//播放开始
  141. paControl(true);
  142. keyToneStart(2);
  143. sutPocStatus.spk=1;
  144. //sutPocStatus.preSpk=1;
  145. }
  146. }
  147. static void proMic(int mic){
  148. if(mic==3){
  149. keyToneStart(1);
  150. sutPocStatus.mic=0;
  151. }else if(mic==1 || mic==2){//录音结束,2是禁止
  152. LSAPI_OSI_ThreadSleep(100);
  153. sutPocStatus.PttFail=1;
  154. keyToneStart(1);
  155. sutPocStatus.mic=0;
  156. }else if(mic==0){//录音开始
  157. //keyToneStart();
  158. sutPocStatus.mic=1;
  159. }
  160. }
  161. /*
  162. +CCID: 898604851920C0133569
  163. msg=898604851920C0133569
  164. */
  165. void proCCIDMsg(char *msg){
  166. sutApp.cardStatus=1;
  167. msg[6]=0;
  168. sutApp.copstype=atoi(msg+4);
  169. }
  170. void FindIndexBysrt(char *src,char *substr,char*dest){
  171. char i=0,j=0;
  172. while(*src){
  173. if(*src==*substr){
  174. if(memcmp(src,substr,strlen(substr))==0){
  175. i=i+strlen(substr);
  176. while(src[i]!=';'){
  177. dest[j]=src[i];
  178. i++;
  179. j++;
  180. }
  181. dest[j]=0;
  182. return;
  183. }
  184. }
  185. i++;
  186. src++;
  187. }
  188. return ;
  189. }
  190. const char *poc_Usr="usr=";
  191. const char *poc_pwd="pwd=";
  192. const char *poc_oapwd="oapwd=";
  193. //75->0x75
  194. /*
  195. key = (account[0] | 0x80);
  196. for(int i = 0; i < strlen(pwd); i++)
  197. {
  198. dec_pwd[i] = pwd[i]^key;
  199. }
  200. */
  201. void ProFEMsg(char *msg){
  202. char temp[100]={0};
  203. char data[40]={0};
  204. char key=0,i=0;
  205. StrAsciiToHex(msg+14,temp);
  206. FindIndexBysrt(temp,poc_Usr,data);
  207. strncpy(sutApp.UserInfo.OtherId,data,strlen(data));
  208. FindIndexBysrt(temp,poc_pwd,data);
  209. memset(temp,0,sizeof(temp));
  210. key=(sutApp.UserInfo.OtherId[0]|0x80);\
  211. for(i=0;i<strlen(data);i++){
  212. temp[i]=data[i]^key;
  213. }
  214. strncpy(sutApp.UserInfo.OtherId,temp,strlen(temp));
  215. saveInfoNow(&sutApp.UserInfo);
  216. memset(temp,0,sizeof(temp));
  217. memset(data,0,sizeof(data));
  218. snprintf(temp, sizeof(temp), "AT+POC=010000");
  219. snprintf(data, sizeof(data), "id=%s;pwd=%s",sutApp.UserInfo.OtherId,sutApp.UserInfo.OtherPassWord);
  220. AscStrTurnHexStr(data, temp+strlen(temp));
  221. strcat(temp, "00\r\n");
  222. msgAtSend(temp);
  223. MSG_INFO(1, "POC reset");
  224. }
  225. //澶勭悊POC妯″潡淇℃伅
  226. void pocCmdHandler(unsigned char *msg, int len){
  227. //鏈夋秷鎭�繘鏉ワ紝濡傛灉涓嶆槸+POC:SLEEP锛孭OC閮藉敜閱掍簡
  228. static char tmp[1024],ch;//300
  229. static int k=0;
  230. unsigned int j;
  231. if(sutApp.authReady==0) return;
  232. if(sutApp.gtMode !=0 && sutApp.gtTMode != 0){
  233. //MSG_INFO(1,"stop USBsend");
  234. usbOutPut(msg, len);//TM TRACE
  235. return;
  236. }
  237. for(j=0;j<len;j++){//杩囨护
  238. if(k>=sizeof(tmp)) k=0;
  239. tmp[k++]=msg[j];
  240. if(ch=='\r' && msg[j]=='\n'){
  241. if(k!=2){
  242. //澶勭悊
  243. k -=2;tmp[k]=0;//鍘绘帀鍥炶溅鎹㈣�
  244. MakeStringToUpperCap(tmp, k);
  245. cmdsProcess(tmp,k);
  246. }
  247. k=0;
  248. }
  249. ch=msg[j];
  250. }
  251. }
  252. static void proMicSpk(int mic, int spk){
  253. if(mic==0 && spk==0){//0000
  254. if(newPara.KeySound!=0) pttBeepStart(false);
  255. sutPocStatus.spk=0;
  256. sutPocStatus.mic=0;
  257. sutPocStatus.TONE=0;
  258. }else if(mic==1 && spk==0){//0100
  259. if(newPara.KeySound!=0) pttBeepStart(false);
  260. sutPocStatus.mic=1;
  261. }else if(mic==0 && spk==1){//0001
  262. if(newPara.KeySound!=0) paControl(true);//pttBeepStart(false);
  263. else paControl(true);//鍏抽棴鎻愮ず闊虫椂锛屼篃瑕佹墦寮€鍠囧彮
  264. sutPocStatus.spk=1;
  265. sutPocStatus.mic=0;
  266. }else if(mic==0 && spk==13){//0013
  267. if(newPara.KeySound!=0) beepStart(TONE_SPECIAL);
  268. }else if(mic==0 && spk==2){
  269. paControl(true);
  270. sutPocStatus.TONE=1;
  271. }
  272. }
  273. static void micPro(int mic){
  274. switch(mic){
  275. case 0://鍏抽棴mic
  276. sutPocStatus.mic=0;
  277. break;
  278. case 1://鎵撳紑mic
  279. if(newPara.KeySound!=0) beepStart(TONE_NORMAL);
  280. sutPocStatus.mic=1;
  281. //sutPocStatus.spk=0;
  282. break;
  283. }
  284. }
  285. static void spkPro(int spk){
  286. switch(spk){
  287. case 0://tone闊冲悗鍏抽棴spk
  288. if(newPara.KeySound!=0) beepStart(TONE_NORMAL);
  289. sutPocStatus.spk=0;
  290. break;
  291. case 1://tone闊冲悗淇濇寔spk鎵撳紑
  292. if(newPara.KeySound!=0) beepStart(TONE_NORMAL);
  293. paControl(true);
  294. sutPocStatus.spk=1;
  295. sutPocStatus.mic=0;
  296. break;
  297. case 2://鎾�斁TTS
  298. paControl(true);
  299. sutPocStatus.TTS=1;
  300. break;
  301. case 13://鎶㈤害澶辫触锛屽彲浠�one鐗规畩闊?
  302. if(newPara.KeySound!=0) beepStart(TONE_SPECIAL);
  303. break;
  304. }
  305. }
  306. /*POC宸插惎鍔ㄦ垚鍔?*/
  307. static void pocStartMsg(void){
  308. sutApp.pocInitStatus=1;
  309. }
  310. /*褰撳墠璐﹀彿鎵€灞炵兢缁勫垪琛ㄤ俊鎭?涓€娆℃€ц幏鍙栨墍鏈?
  311. 涓嶅悓搴旂敤閲囩敤涓嶅悓闇€姹傛寚浠?
  312. 浠庝笉鍦ㄧ嚎鍒扮櫥褰曚細涓诲姩涓婃姤涓€娆″垪琛?
  313. 鍙慉T+POC=0D0000涔熶細涓婃姤涓€娆″垪琛?
  314. msg:000000,iiii(缁勫垪琛ㄧ储寮?,dddddddd(缁処D),nnnn(缁勬垚鍛樻暟),mmmmmm(缁勫悕绉?*/
  315. static void pro80Msg(char *msg){
  316. int index,len,i;
  317. char buf[5],*pName;
  318. //先获取组索引
  319. memcpy(buf, msg+6, 4);
  320. buf[4]=0;index=strtol(buf, &pName,16);
  321. if(index<1 || index>POC_ALL_GROUPS_NUM) return;//索引从1开始
  322. index -= 1;
  323. //获取组名称
  324. len=strlen(msg+22);
  325. LwEndingToBiEndingStr(msg+22,len);
  326. unicodeToGbk(msg+22, sutPocStatus.AllGroups[index].name, &len);
  327. sutPocStatus.AllGroups[index].name[len]=0;
  328. //获取成员数
  329. msg[22]=0;
  330. sutPocStatus.AllGroups[index].usernum=strtol(&msg[18], &pName,16);
  331. //获取组ID
  332. msg[18]=0;
  333. sutPocStatus.AllGroups[index].ID=strtol(&msg[10], &pName, 16);
  334. }
  335. /*鎵€鍦ㄧ粍鎴愬憳淇℃伅鍒楄〃
  336. 鍙慉T+POC=0E0000xxxxxxxx鏌ヨ�
  337. msg:010000,iiii(鎴愬憳鍒楄〃绱㈠紩),dddddddd(鎴愬憳ID),mmmmmmmm(鎴愬憳鍚嶇О)*/
  338. static void pro81Msg(char *msg){
  339. int index,len,status;
  340. char buf[5],*pName;
  341. //获取成员状态
  342. buf[0]=msg[0];buf[1]=msg[1];buf[2]=0;
  343. status=atoi(buf);
  344. if(status<=1 || status >4) return;
  345. //先获取成员索引值
  346. memcpy(buf, msg+6, 4);buf[4]=0;
  347. index=strtol(buf, &pName, 16);
  348. if(index<=0 || index>POC_ALL_USERS_NUM) return;
  349. index --;
  350. sutPocStatus.AllUsers[index].status=status;
  351. //获取成员名字
  352. len=strlen(msg+18);
  353. LwEndingToBiEndingStr(msg+18,len);
  354. unicodeToGbk(msg+18, sutPocStatus.AllUsers[index].name, &len);
  355. sutPocStatus.AllUsers[index].name[len]=0;
  356. //获取成员ID
  357. msg[18]=0;
  358. sutPocStatus.AllUsers[index].ID=strtol(msg+10, &pName, 16);
  359. }
  360. /*鐧诲綍鐘舵€佷俊鎭?
  361. msg:ss(00鏈�櫥褰?02宸茬櫥褰?,dddddddd(鎴愬憳id),mmmmmmmm(鐘舵€佷俊鎭�唴瀹?
  362. 00 CEDECDF8C2E7C1ACBDD3 琛ㄧず涓嶅湪绾匡紝杈撳嚭淇℃伅涓?鏃犵綉缁滆繛鎺?鎷ㄥ彿娌?鎴愬姛)
  363. 00 CEDEB7A8C1ACBDD3 琛ㄧず涓嶅湪绾匡紝杈撳嚭淇℃伅涓?鏃犳硶杩炴帴(IP 涓嶅�鎴栧畾 鍚戝崱)
  364. 00 C3BBD3D0B7FECEF1 琛ㄧず涓嶅湪绾匡紝杈撳嚭淇℃伅涓?娌℃湁鏈嶅姟(娌℃敞鍐?
  365. 00 B5C7C2BDCAA7B0DC 琛ㄧず涓嶅湪绾匡紝杈撳嚭淇℃伅涓?鐧婚檰澶辫触(璐﹀彿閿欒�)
  366. 00 0D5CBBAC5D0C5CFA2B4EDCEF3 璐﹀彿淇℃伅閿欒�
  367. 02 0001A750 B2E2CAD431BAC5(娴嬭瘯 1 鍙?,*/
  368. static void pro82Msg(char *msg){
  369. char buf[3],*pName;
  370. int type,len;
  371. char Username[POC_GROUP_USER_NAME_LEN*2];
  372. buf[0]=msg[0];buf[1]=msg[1];buf[2]=0;
  373. type=atoi(buf);
  374. switch(type){
  375. case 0:
  376. sutPocStatus.logined=0;
  377. if(0==memcmp(msg+10, "CEDECDF8C2E7C1ACBDD3",20)) sutPocStatus.PocLineOffReason=1;
  378. else if(0==memcmp(msg+10, "CEDEB7A8C1ACBDD3",16)) sutPocStatus.PocLineOffReason=2;
  379. else if(0==memcmp(msg+10, "C3BBD3D0B7FECEF1",16)) sutPocStatus.PocLineOffReason=3;
  380. else if(0==memcmp(msg+10, "B5C7C2BDCAA7B0DC",16)) sutPocStatus.PocLineOffReason=4;
  381. break;
  382. case 2:
  383. sutPocStatus.TTS=1;
  384. paControl(true);
  385. sutPocStatus.PocLineOffReason=0;
  386. len=strlen(msg+10);
  387. if(len>POC_GROUP_USER_NAME_LEN) len=POC_GROUP_USER_NAME_LEN;
  388. memcpy(Username, msg+10,len);
  389. Username[len]=0;
  390. LwEndingToBiEndingStr(Username,len);
  391. unicodeToGbk(Username, sutPocStatus.LocalUser.name, &len);
  392. sutPocStatus.LocalUser.name[len]=0;
  393. msg[10]=0;
  394. sutPocStatus.LocalUser.ID=strtol(&msg[2], &pName, 16);
  395. MSG_INFO(1, "Login ok");
  396. sutPocStatus.loginResult=3;
  397. break;
  398. case 8: //远程放号
  399. msgAtSend("AT+POC=FE00000001\r\n");
  400. break;
  401. }
  402. }
  403. /*鏈変汉璇磋瘽
  404. msg:00,dddddddd(鎴愬憳id),nnnnnnnn(鎴愬憳鍚嶇О)*/
  405. static void pro83Msg(char *msg){
  406. int len;
  407. char callerName[POC_GROUP_USER_NAME_LEN*2];
  408. backLightReset();//鏀跺埌鏈変汉璇磋瘽
  409. // if(msg[0]=='0'&&msg[1]=='0'){
  410. // if(newPara.KeySound!=0) keyToneStart();
  411. // }
  412. len=strlen(msg+10);
  413. if(len>POC_GROUP_USER_NAME_LEN) len=POC_GROUP_USER_NAME_LEN;
  414. memcpy(callerName, msg+10,len);
  415. callerName[len]=0;
  416. if(0!=memcmp(callerName, sutPocStatus.CallName,len)){
  417. LwEndingToBiEndingStr(callerName,len);
  418. unicodeToGbk(callerName, sutPocStatus.CallName, &len);
  419. sutPocStatus.CallName[len]=0;
  420. }
  421. }
  422. /*鍗曞懠鍝嶅簲淇℃伅
  423. msg:00,mmmmmmmmmm(鍗曞懠缁撴灉淇℃伅)
  424. BAF4BDD0B3C9B9A6 琛ㄧず 鍛煎彨鎴愬姛
  425. BAF4BDD0CAA7B0DC 琛ㄧず 鍛煎彨澶辫触
  426. CDCBB3F6C1D9CAB1BAF4BDD0 琛ㄧず 閫€鍑轰复鏃跺懠鍙?
  427. C1D9CAB1BAF4BDD031BAC5BBFA 琛ㄧず 涓存椂鍛煎彨 1 鍙锋満*/
  428. static void pro84Msg(char *msg){
  429. char ttsinfo[40];
  430. char tempbuf[80];
  431. char len;
  432. len=strlen(msg+2);
  433. memcpy(tempbuf, msg+2,len);
  434. if(0==memcmp(msg+2, "7C54EB5310629F52", 16)) sutPocStatus.danHuStatus=1; //主呼成功
  435. else if(0==memcmp(msg+2, "344EF6657C54EB53", 16)) sutPocStatus.danHuStatus=1; //被呼成功
  436. else if(0==memcmp(msg+2, "0090FA51", 8)) sutPocStatus.danHuStatus=0;//退出临时呼叫
  437. LwEndingToBiEndingStr(tempbuf,len);
  438. unicodeToGbk(tempbuf,ttsinfo, &len);
  439. ttsPlay(ENCODE_USER_ASCII, ttsinfo);
  440. }
  441. /*鍒囨崲缇ょ粍瀹屾垚鎸囦护(琛ㄧず宸茬櫥褰?
  442. msg:00,dddddddd(缁刬d),nnnnnnnn(缁勫悕绉?*/
  443. static void pro86Msg(char *msg){
  444. char buf[POC_GROUP_USER_NAME_LEN*4+40],*pName;
  445. int len,i;
  446. char GroupName[POC_GROUP_USER_NAME_LEN*2];
  447. char tmp[POC_GROUP_USER_NAME_LEN*2+20];
  448. char needTTs=0;
  449. // sutPocStatus.TTS=1;
  450. // paControl(true);
  451. sutPocStatus.logined=1;
  452. len=strlen(msg+10);
  453. if(len>POC_GROUP_USER_NAME_LEN*2) len=POC_GROUP_USER_NAME_LEN*2;
  454. memcpy(GroupName, msg+10,len);
  455. GroupName[len]=0;
  456. LwEndingToBiEndingStr(GroupName,len);
  457. unicodeToGbk(GroupName, sutPocStatus.LocalGroup.name, &len);
  458. sutPocStatus.LocalGroup.name[len]=0;
  459. msg[10]=0;
  460. sutPocStatus.LocalGroup.ID=strtol(msg+2, &pName,16);
  461. if(sutPocStatus.firstLogin==0){
  462. snprintf(tmp, sizeof(tmp), "%s,已登陆,%s", sutPocStatus.LocalUser.name,sutPocStatus.LocalGroup.name);
  463. backLightReset();//第一次登录时,保持屏亮起来
  464. needTTs=1;
  465. }else{
  466. snprintf(tmp, sizeof(tmp), "进入,%s",sutPocStatus.LocalGroup.name);
  467. if(sutApp.groupTTSEnable!=0){
  468. needTTs=1;
  469. sutApp.groupTTSEnable=0;
  470. }
  471. }
  472. if(needTTs!=0){
  473. memset(buf, 0, sizeof(buf));
  474. for(i=0;i<strlen(tmp);i++){
  475. snprintf(GroupName, sizeof(GroupName), "%02x", tmp[i]);
  476. strcat(buf, GroupName);
  477. }
  478. ttsPlay(ENCODE_USER_GBK, buf);
  479. }
  480. sutPocStatus.danHuStatus=0;
  481. sutPocStatus.firstLogin=1;
  482. }
  483. /*鏌ヨ�鎵€灞炵兢缁勬€绘暟鐨勫搷搴?
  484. 鍙慉T+POC=3D0000鑾峰緱
  485. msg:000000,nnnn(鎵€灞炲�灏戜釜缇ょ粍)*/
  486. static void pro3dMsg(char *msg){
  487. char *pName;
  488. sutPocStatus.ListCurOnlineNum=strtol(&msg[6],&pName,16);
  489. sutPocStatus.ListUpdate=1;
  490. MSG_INFO(1, "groupNum:%d", sutPocStatus.ListCurOnlineNum);
  491. }
  492. /*鏌ヨ�鎵€灞炲湪绾挎垚鍛樻€绘暟鐨勫搷搴?
  493. 鍙慉T+POC=3E0000鑾峰緱
  494. msg:000000,nnnn(鎵€灞炲�灏戜釜鍦ㄧ嚎鎴愬憳)*/
  495. static void pro3eMsg(char *msg){
  496. char *pName;
  497. sutPocStatus.ListCurOnlineNum=strtol(&msg[6],&pName,16);
  498. sutPocStatus.ListUpdate=1;
  499. MSG_INFO(1, "userNum:%d", sutPocStatus.ListCurOnlineNum);
  500. }
  501. /*鏌ヨ�鎵€鍦ㄧ粍鎴愬憳淇℃伅鏃惰繑鍥烇紝寰楀埌鍦ㄧ嚎鎴愬憳鎬绘暟
  502. msg:000000,nnnn(鍦ㄧ嚎鎴愬憳鎬绘暟)*/
  503. static void pro0eMsg(char *msg){
  504. char *pName;
  505. //获取在线成员总数
  506. sutPocStatus.ListCurOnlineNum=strtol(msg+6, &pName, 16);
  507. MSG_INFO(1, "total user num:%d", sutPocStatus.ListCurOnlineNum);
  508. sutPocStatus.ListDetailValid=1;
  509. }
  510. /*瀹氶噺鏌ヨ�鎵€鍦ㄧ兢缁勪腑鐨勫湪绾挎垚鍛樹俊鎭�搷搴?
  511. 鍙慉T+POC=1E0000xxxxx鑾峰緱
  512. msg:010000,iiii(鎴愬憳鍒楄〃绱㈠紩),dddddddd(鎴愬憳ID),mmmmmmmm(鎴愬憳鍚嶇О)*/
  513. static void pro1eMsg(char *msg){
  514. char name[POC_GROUP_USER_NAME_LEN*2+1];
  515. int len;
  516. unsigned long id;
  517. char *pTemp;
  518. if(!uiAssist.status)return 1;
  519. len = strlen(&msg[18]);
  520. if(len >= POC_GROUP_USER_NAME_LEN*2) len = POC_GROUP_USER_NAME_LEN*2;
  521. memcpy(name, &msg[18], len);
  522. name[len]=0;
  523. msg[18]=0;
  524. id=strtol(&msg[10],&pTemp,16);
  525. sutPocStatus.AllUsers[sutPocStatus.ListFillIndex].ID=id;
  526. if(name[0]==0){
  527. sutPocStatus.AllUsers[sutPocStatus.ListFillIndex].name[0]=' ';
  528. sutPocStatus.AllUsers[sutPocStatus.ListFillIndex].name[1]=0;
  529. }else{
  530. LwEndingToBiEndingStr(name,len);
  531. unicodeToGbk(name, sutPocStatus.AllUsers[sutPocStatus.ListFillIndex].name, &len);
  532. sutPocStatus.AllUsers[sutPocStatus.ListFillIndex].name[len]=0;
  533. }
  534. sutPocStatus.ListFillIndex++;
  535. if(sutPocStatus.ListFillIndex==sutPocStatus.ExceptionReadNum){
  536. sutPocStatus.ListGetOneFlag=1;
  537. sutPocStatus.ListDetailValid=1;
  538. }
  539. }
  540. /*瀹氭椂鏌ヨ�鎵€灞炵粍淇℃伅
  541. 鍙慉T+POC=1D0000xxxxx鑾峰緱
  542. msg:000000,iiii(缁勫垪琛ㄧ储寮?,dddddddd(缁処D),nnnn(鎴愬憳涓�暟),mmmmmmmmm(鍚嶇О)*/
  543. static void pro1dMsg(char *msg){
  544. unsigned short num;
  545. char name[POC_GROUP_USER_NAME_LEN*2+1];
  546. unsigned long id;
  547. unsigned short index;
  548. char *pTemp;
  549. int len;
  550. if(!uiAssist.status)return ;
  551. len = strlen(&msg[22]);//已去掉回车换行
  552. if(len >= POC_GROUP_USER_NAME_LEN*2) len = POC_GROUP_USER_NAME_LEN*2;
  553. memcpy(name, &msg[22], len);
  554. name[len]=0;
  555. msg[22]=0;
  556. num=strtol(&msg[18],&pTemp,16);
  557. msg[18]=0;
  558. id=strtol(&msg[10],&pTemp,16);
  559. sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].ID=id;
  560. sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].usernum=num;
  561. if(name[0]==0){
  562. sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].name[0]=' ';
  563. sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].name[1]=0;
  564. }else
  565. LwEndingToBiEndingStr(name,len);
  566. unicodeToGbk(name, sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].name, &len);
  567. sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].name[len]=0;
  568. sutPocStatus.ListFillIndex++;
  569. if(sutPocStatus.ListFillIndex==sutPocStatus.ExceptionReadNum){
  570. sutPocStatus.ListGetOneFlag=1;
  571. sutPocStatus.ListDetailValid=1;
  572. }
  573. }
  574. static void pro0dMsg(char *msg){
  575. char *pName;
  576. //获取群组总数
  577. sutPocStatus.ListCurOnlineNum=strtol(msg+6, &pName, 16);
  578. MSG_INFO(1, "total group num:%d", sutPocStatus.ListCurOnlineNum);
  579. sutPocStatus.ListDetailValid=1;
  580. }
  581. /*
  582. +POC_VER:01027
  583. msg=01027
  584. */
  585. static void pocGetVer(char *msg){
  586. int i;
  587. sutApp.pocInitStatus=1;
  588. for(i=0;i<strlen(msg);i++){
  589. if(msg[i]==' '){
  590. msg[i]=0;
  591. snprintf(sutApp.pocVersion, sizeof(sutApp.pocVersion), "%s",msg);
  592. return;
  593. }
  594. }
  595. }
  596. static void pocGetPpp(char *msg){
  597. if(msg[0]=='1') sutApp.pocPpp=1;
  598. else sutApp.pocPpp=0;
  599. }
  600. /*
  601. +GAUTH:AD86EBCCECC4
  602. msg=AD86EBCCECC4+鍥炶溅
  603. */
  604. static void proGauthMsg(char *msg){
  605. unsigned char newAuthTable[10]={0x50,0x28,0xaf,0x6d,0x08,0x9c,0x1b,0xe4,0x23,0x77};
  606. unsigned char randBuf[100];
  607. char buf[3];
  608. int len,i,j;
  609. len=0;
  610. for(i=0;i<strlen(msg);i++){
  611. if(msg[i]=='\r' || msg[i]=='\n' || msg[i]=='\0') goto MSG_DONE;
  612. randBuf[len++]=msg[i];
  613. }
  614. MSG_DONE:
  615. //鑾峰彇涓插苟杞�崲鎴?6杩涘埗鍔犲瘑涓?
  616. if(len%2 || 0!=restoreDataFormatByHex(randBuf,len)){
  617. MSG_WARN(1, "auth get error");
  618. return;
  619. }
  620. len /= 2;//寰楀埌鍔犲瘑淇℃伅:闀垮害涓簂en鐨剅andBuf
  621. extCodeBuffer(randBuf, len,newAuthTable, sizeof(newAuthTable));
  622. snprintf(randBuf, sizeof(randBuf), "AT+SAUTH=");
  623. //灏嗛暱搴︿负i鐨則mp鍐呭瓨浠ュ崄鍏�繘鍒朵覆鎵撳寘鍙戦€?
  624. for(j=0;j<sizeof(newAuthTable);j++){
  625. snprintf(buf, sizeof(buf),"%02x",newAuthTable[j]);
  626. strcat(randBuf, buf);
  627. }
  628. strcat(randBuf, "\r\n");
  629. msgAtSend(randBuf);
  630. MSG_INFO(0, randBuf);
  631. }
  632. /*
  633. +NOTE:0,1
  634. msg=0,1+鍥炶溅
  635. */
  636. static void proNoteMsg(char *msg){
  637. MSG_INFO(1,"authAck:%s",msg);
  638. }
  639. /*
  640. +CTEC: 0,0
  641. msg=0,0
  642. */
  643. static void proNetMode(char *msg){
  644. unsigned char netModeValue;
  645. char cmd[30];
  646. if(msg[0]<'0' || msg[0]>'9') return;
  647. netModeValue=atoi(msg);
  648. ctecCurrentSet=netModeValue;
  649. if(ctecCurrentSet != newPara.netMode){
  650. snprintf(cmd, sizeof(cmd),"AT+CTEC=%d,%d\r\n", ctecCurrentSet, newPara.netMode);
  651. msgAtSend(cmd);
  652. }
  653. }
  654. /*
  655. +COPS: 0,2,"46000",7
  656. msg=+COPS: 0,2,"46000",7
  657. */
  658. static void proCopsMsg(char *msg){
  659. int i,j=0,codeType;
  660. char w=0;
  661. unsigned char netModeValue;
  662. MSG_INFO(1,"enter PORCOPS");
  663. for(i=0;i<strlen(msg);i++){
  664. if(msg[i]==','){
  665. if(++j==3){
  666. codeType=msg[i+1]-0x30;
  667. if(codeType==7) codeType=4;
  668. if(netshowvalue!=codeType) netshowvalue=codeType;
  669. return;
  670. }
  671. }else if(msg[i]=='"'){
  672. if(++w==1){
  673. codeType=atoi(msg+i+1);
  674. if(codeType>0 && codeType != sutApp.copstype) sutApp.copstype=codeType;
  675. }
  676. }
  677. }
  678. }
  679. /*
  680. +SIMCROSS:0
  681. msg=0/1
  682. */
  683. static void proSimMode(char *msg){
  684. unsigned char tmpSim;
  685. tmpSim=msg[0]-0x30;
  686. if(tmpSim!=0 && tmpSim!=1) return;
  687. if(tmpSim==1)sutApp.simSel=0;
  688. else if(tmpSim==0)sutApp.simSel=1;
  689. }
  690. /*
  691. +UDP:0,5,30
  692. msg=0,5,30
  693. */
  694. static void proPwrMode(char *msg){
  695. int seg1,seg2;
  696. short i;
  697. char buf[15];
  698. for(i=2;i<strlen(msg);i++){
  699. if(msg[i]==','){
  700. seg1=atoi(msg+2);
  701. seg2=atoi(msg+i+1);
  702. pwrModeAckHandler(seg1,seg2);
  703. }
  704. }
  705. }
  706. /*
  707. +FOTA:1,0
  708. +FOTA:1,XXX
  709. +FOTA:0
  710. +FOTA:1
  711. +FOTA:2
  712. msg=1,xxxx
  713. */
  714. static void proFotaMsg(char *msg){
  715. if(msg[1]==','){
  716. if(msg[2]=='0' && msg[3]==0){
  717. fotaStepSet(6);
  718. }else{
  719. strcpy(sutApp.fotaVersion, msg+2);
  720. fotaStepSet(9);
  721. }
  722. }else if(msg[1]==0){
  723. if(msg[0]=='0'){
  724. fotaStepSet(7);
  725. }else if(msg[0]=='1') showLoading();
  726. else if(msg[0]=='2'){
  727. fotaStepSet(8);
  728. }
  729. }
  730. }
  731. /*
  732. SV63302_T02
  733. msg=SV63302_T02
  734. */
  735. static void proGmrMsg(char *msg){
  736. snprintf(sutApp.modemVer, sizeof(sutApp.modemVer), "%s", msg);
  737. }
  738. /*
  739. +SMS:1,B2E2CAD4313233
  740. msg=1,B2E2CAD4313233
  741. */
  742. static void proSmsMsg(char *msg){
  743. unsigned char smsType=msg[0]-0x30;
  744. unsigned len=strlen(msg+2);
  745. if(len%2 || 0!=restoreDataFormatByHex(msg+2,len)){
  746. MSG_WARN(1, "sms data error");
  747. return;
  748. }
  749. len /= 2;
  750. sutMess.codeType=smsType;
  751. sutSms.smsUpdate=1;
  752. memcpy(sutMess.GBKMess1+4, msg+2, len);
  753. }
  754. /*鏈嶅姟鍣ㄦ姤涓嬪彂鎶ヨ�TTS锛孭OC宸叉挱鎶ワ紝鏈�俊鎭�彧鎻愮ず*/
  755. static void proAlarmMsg(void){
  756. }
  757. static void proPendMsg(void){
  758. MSG_INFO(1, "active auth now");
  759. msgAtSend("AT+GAUTH\r\n");//鐢ㄤ簬鎺堟潈妫€娴?
  760. }
  761. static void proToneMsg(char *msg){
  762. #ifndef ENABLE_PWM_BEEP
  763. if(msg[0]=='1'){
  764. sutPocStatus.TONE=1;
  765. paControl(true);
  766. }else if(msg[0]=='0'){
  767. sutPocStatus.TONE=0;
  768. }
  769. #endif
  770. }
  771. /*
  772. +GPIP:183.131.13.10
  773. msg=183.131.13.10
  774. */
  775. static void proGPIPMsg(char *msg){
  776. if(strlen(msg)<7) return;
  777. if(strcmp(showPIP, msg)==0) return;
  778. snprintf(showPIP, sizeof(showPIP), "%s",msg);
  779. MSG_INFO(1, "updatePIP:%s", showPIP);
  780. }
  781. /*
  782. +GGIP:183.131.13.6
  783. msg=183.131.13.6
  784. */
  785. static void proGGIPMsg(char *msg){
  786. if(strlen(msg)<7) return;
  787. if(strcmp(showGIP, msg)==0) return;
  788. snprintf(showGIP, sizeof(showGIP), "%s",msg);
  789. MSG_INFO(1, "updateGIP:%s", showGIP);
  790. }
  791. /*
  792. +CSQ: 14,99
  793. msg=14,99
  794. */
  795. static void proCsqMsg(char *msg){
  796. int csq=atoi(msg);
  797. if(csq != sutApp.g_iCSQ) sutApp.g_iCSQ=csq;
  798. }
  799. /*
  800. +HEADSET:1
  801. msg=1
  802. */
  803. static void proHeadSet(char *msg){
  804. switch(msg[0]){
  805. case '0'://HEADSET CONNECT
  806. sutApp.earLev=1;
  807. msgAtSend("AT+AUDCH=1,3\r\n");
  808. sutApp.pcant=2;
  809. break;//HEADSET DISCONNECTED
  810. case '1':
  811. sutApp.earLev=0;
  812. msgAtSend("AT+AUDCH=0,0\r\n");
  813. sutApp.pcant=4;
  814. break;//HEADSET BTN PRESS
  815. case '2':
  816. micPttHandler(1);
  817. break;//HEADSET BTN RELEASED
  818. case '3':
  819. micPttHandler(0);
  820. break;
  821. }
  822. }
  823. static void ProGetATIMsg(char *msg){strcpy(sutApp.modemVer, msg);}
  824. static void ProGetMicLV(char *msg){
  825. char buf[30];
  826. char NeedSet=0;
  827. msg[11]=0;
  828. msg[15]=0;
  829. if(newPara.VolMicLvCu!=htoi(&msg[9]))NeedSet=1;
  830. if(newPara.VolMicLvXi!=htoi(&msg[13]))NeedSet=1;
  831. if(NeedSet==0){
  832. sutApp.Get_MicLv=1;
  833. return;
  834. }
  835. snprintf(buf, sizeof(buf),"AT+CACCP=0,0,0,\"%02x00%02x00\"\r\n",newPara.VolMicLvCu,newPara.VolMicLvXi);
  836. msgAtSend(buf);
  837. MSG_INFO(0,buf);
  838. }
  839. #ifdef USE_GWSD_POC
  840. char *ohpocGetICCID(void){
  841. return NULL;
  842. }
  843. char *ohpocGetIMEI(void){
  844. static char imei[16]={0};
  845. if(imei[0]==0){
  846. if(LSAPI_SIM_GetIMEI(imei)==0){
  847. return imei;
  848. }
  849. }
  850. return NULL;
  851. }
  852. //void ohpocGetClock(MY_CLOCK *myclock){
  853. //
  854. // //current_zone_time(myclock);
  855. //
  856. //}
  857. #endif
  858. unsigned long htoi(char s[])
  859. {
  860. int i = 0;
  861. unsigned long long n = 0;
  862. if (s[0] == '0' && (s[1]=='x' || s[1]=='X')) i = 2;
  863. else i = 0;
  864. for (; (s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z') || (s[i] >='A' && s[i] <= 'Z');++i){
  865. if (tolower(s[i]) > '9') n = 16 * n + (10 + tolower(s[i]) - 'a');
  866. else n = 16 * n + (tolower(s[i]) - '0');
  867. }
  868. return n;
  869. }
  870. void voiceModeSet(unsigned char voiceSel){
  871. if(voiceSel==0) msgAtSend("AT+POC=7E000000\r\n");
  872. else if(voiceSel==1) msgAtSend("AT+POC=7E000001\r\n");
  873. }
  874. void voiceModeQuery(void){
  875. msgAtSend("AT+POC=7F0000\r\n");
  876. }
  877. /*
  878. +POC:7f00000001
  879. msg=01
  880. */
  881. void proVoiceMode(char *msg){
  882. char buf[3];
  883. buf[0]=msg[0];buf[1]=msg[1];buf[2]=0;
  884. int mode=atol(buf);
  885. if((mode==0 || mode==1)&&mode != newPara.voiceSel){
  886. newPara.voiceSel=mode;
  887. sysIniSave();
  888. }
  889. }