PocTask.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545
  1. /**********************************************************************************
  2. * File Name: Poc.c
  3. * Function Describe:device for Poc
  4. * Relate Module:
  5. * Explain: the modem must be using ZTE MC8332
  6. * Writer: ShiLiangWen
  7. * Date: 2015.7.10
  8. ***********************************************************************************/
  9. #define THIS_FILE_ID 15
  10. /***********************************************************************************/
  11. #include "includes.h"
  12. SUT_POC_STATUS sutPocStatus;
  13. OS_TID idPocTask=0;
  14. //U64 stkPocTask[POC_TASK_STK_SIZE];
  15. char g_cGroupName[POC_GROUP_NAME_LEN];
  16. unsigned long g_ulGroupID;
  17. unsigned char g_ucSelect=0;
  18. int g_iModemVer=0;
  19. int g_iPocVer=0;
  20. /*********************************************************************
  21. *添加组内成员状态列表
  22. Data[]="0x0x0x..."
  23. x='1'
  24. **********************************************************************/
  25. void PocAddUserStatusToList(char *Data)
  26. {
  27. // char buf[50];//50
  28. // int i=0;
  29. // int j=0;
  30. // char s;
  31. // unsigned short index=0;
  32. // for(i=0;i<POC_USER_ONLINE_LIST_LEN;i++){
  33. // s=Data[j];
  34. // if(s<'0' || s>'3')break;
  35. // j++;
  36. // s=Data[j];
  37. // if(s<'0' || s>'3')break;
  38. // if(s=='3'){
  39. // //sutPocStatus.UserOnLineList[index++]=j/2;
  40. // index++;
  41. // }
  42. // j++;
  43. // }
  44. // sutPocStatus.UserOnLineNum=index;
  45. // sprintf(buf,"[OnLineUserNum=%d]",index);
  46. // SlwTrace(DEBUG,buf,1);
  47. }
  48. /*******************************************************************
  49. *在str里找到/r或/n 并将其修改为/0
  50. 比如: "1234/r" -> "1234"
  51. 比如: "1234/n" -> "1234"
  52. 比如: "1234/r/n" -> "1234"
  53. msgbuf[130];
  54. msgbuf[129]=0;
  55. ********************************************************************/
  56. void ReplaceStrWithN(char *str)
  57. {
  58. char d;
  59. char *p=str;
  60. while(0!=(d=*p)){
  61. if(d=='\r' || d=='\n'){
  62. *p='\0';
  63. break;
  64. }
  65. p++;
  66. }
  67. }
  68. int GetAllUsers(char *msg)
  69. {
  70. unsigned short num;
  71. char name[POC_USER_NAME_LEN*2+1];
  72. unsigned long id;
  73. unsigned short index;
  74. char *pTemp;
  75. char status;//状态
  76. unsigned char len;
  77. //+POC:8101000000000000A5F647726F757031
  78. //+POC:0e 00 0000 0004
  79. if(msg[5]=='8' && msg[6]=='1'){
  80. //+POC:81 01 0000 0000 0000A5F6 47726F757031
  81. // 81 状态 操作ID 成员索引 成员ID 成员名字
  82. //用户名GB2312
  83. len = strlen(&msg[25])-2;
  84. if(len >= POC_USER_NAME_LEN*2) len = POC_USER_NAME_LEN*2;
  85. memcpy(name, &msg[25], len);
  86. name[len]=0;
  87. //成员ID
  88. msg[25]=0;
  89. id=strtol(&msg[17],&pTemp,16);
  90. //组索引
  91. msg[17]=0;
  92. index=strtol(&msg[13],&pTemp,16);
  93. //索引必须非0 且不能超出所能接收的限制,否则不处理
  94. //if(index==0 || index>=POC_ALL_USERS_NUM) return 1;
  95. if(index>=(POC_ALL_USERS_NUM-1)) return 1;
  96. sutPocStatus.AllUsers[index].ID=id;
  97. sutPocStatus.AllUsers[index].status=2;
  98. StrAsciiToHex(name, sutPocStatus.AllUsers[index].name);
  99. return 1;
  100. }
  101. //+POC:0E00 0000 0002
  102. if(msg[5]=='0'&& msg[6]=='E' && msg[7]=='0' && msg[8]=='0'){
  103. msg[17]=0;
  104. sutPocStatus.UserOnLineNum=strtol(&msg[13],&pTemp,16);
  105. if(sutPocStatus.UserOnLineNum>POC_ALL_USERS_NUM)sutPocStatus.UserOnLineNum=POC_ALL_USERS_NUM;
  106. sutPocStatus.UserNum_Update=1;
  107. }
  108. return 0;
  109. }
  110. int GetAllGroups(char *msg)
  111. {
  112. unsigned short num;
  113. char name[POC_GROUP_NAME_LEN*2+1];
  114. unsigned long id;
  115. unsigned short index;
  116. char *pTemp;
  117. unsigned char len;
  118. //+POC:8000000000010000009a0059d89ea48ba47fc47e0000 第1个群组名为默认群组
  119. //+POC:800000000002000001040024f16d33579e528b4e04590000 第2个群组名为深圳办事处
  120. if(msg[5]=='8' && msg[6]=='0'){
  121. //+POC:80 00 AE4A 0001 00000BF9 0009 D1D0B7A2B2E2CAD4D7E93030
  122. //+POC:80 00 0000 0001 0000009a 0059 d89ea48ba47fc47e 0000
  123. // 80 组标示 操作ID 组索引 组ID 组内成员个数 组名 结束符
  124. //群组名unicode
  125. len = strlen(&msg[29])-2;
  126. if(len >= POC_GROUP_NAME_LEN*2) len = POC_GROUP_NAME_LEN*2;
  127. memcpy(name, &msg[29], len);
  128. name[len]=0;
  129. //组内成员个数
  130. msg[29]=0;
  131. num=strtol(&msg[25],&pTemp,16);
  132. //组ID
  133. msg[25]=0;
  134. id=strtol(&msg[17],&pTemp,16);
  135. //组索引
  136. msg[17]=0;
  137. index=strtol(&msg[13],&pTemp,16);
  138. //索引必须非0 且不能超出所能接收的限制,否则不处理
  139. //4G模块POC组索引是从0000开始的
  140. if(index>POC_ALL_GROUPS_NUM)return 1;
  141. //组个数统计
  142. if(index==0){
  143. sutPocStatus.GroupsNum=1;
  144. }else{
  145. sutPocStatus.GroupsNum++;
  146. }
  147. //index-=1;
  148. //添加
  149. sutPocStatus.AllGroups[index].ID=id;
  150. sutPocStatus.AllGroups[index].usernum=num;
  151. if(name[0]==0)
  152. {//当模块吐出来的名字为空时,自动添加为空格,防止显示时会死掉
  153. sutPocStatus.AllGroups[index].name[0]=' ';
  154. sutPocStatus.AllGroups[index].name[1]=0;
  155. }else
  156. StrAsciiToHex(name, sutPocStatus.AllGroups[index].name);
  157. sutPocStatus.GroupNum_Update = 1;
  158. return 1;
  159. }
  160. return 0;
  161. }
  162. int GBKTostr(char *src,char *dec,short maxlen)
  163. {
  164. char Temp[3];
  165. char *p=src;
  166. char *q=dec;
  167. int j=0;
  168. long data;
  169. Temp[2]=0;
  170. while(*p && j<(maxlen-1)){
  171. Temp[0]=*p++;
  172. Temp[1]=*p++;
  173. data=strtol(Temp,NULL,16);
  174. q[j++]=data;
  175. }
  176. return j;
  177. }
  178. /********************************************************************
  179. PocHandle
  180. 处理"+POC消息
  181. *********************************************************************/
  182. char PocHandle(char *msg)
  183. {
  184. uint8_t temp[4];
  185. SUTDS ds;
  186. SUTDL dl;
  187. char buf[102];//100
  188. char *pName;
  189. unsigned char len,type;
  190. char pGroup[POC_GROUP_NAME_LEN*2]={0};
  191. static int Table[POC_GROUP_NAME_LEN*2]={0};
  192. long l;
  193. int i;
  194. static unsigned char getNameFlag=0;
  195. static char Username[POC_USER_NAME_LEN+1];//因为播报时是先存了用户名,后面才存群组名,然后一起播报,故此值要是静态的,否则有时用户名会播报不出来
  196. char Groupname[POC_GROUP_NAME_LEN+1];
  197. #if(SPECALL_CTR==1)
  198. static char noSpeakFlag=0;
  199. #endif
  200. //=============+LSHTTS: END
  201. if(msg[1]=='L' && msg[2]=='S' && msg[3]=='H' && msg[4]=='T' && msg[9]=='E'){
  202. sutPocStatus.TTS=0;
  203. if(sutPocStatus.Speaker==0)SpeakerDisable();
  204. return 1;
  205. }
  206. //+POC:0BXXYYYY
  207. //请求PTT返回
  208. //XX:00请求成功,可以不处理,因为同时有8Bxxyy回来处理打开喇叭
  209. //XX:FF请求失败,播报特tone音,与抢麦失败一样
  210. //YYYY:操作ID,不处理
  211. if(msg[5] == '0' && msg[6] == 'B')
  212. {
  213. if(msg[7] == 'F' && msg[8] == 'F')
  214. {
  215. #if(SPECALL_CTR==1)
  216. noSpeakFlag=0;
  217. #endif
  218. SpeakerEnable();
  219. SetBeep(1176,12);
  220. }
  221. #if(SPECALL_CTR==1)
  222. else if(msg[7] == '0' && msg[8] == '0')
  223. {
  224. sutPocStatus.Mic=1;
  225. noSpeakFlag=1;
  226. SpeakerEnable();
  227. SetBeep(878,12);
  228. //SlwTrace(INF, "Speak",1);
  229. }
  230. #endif
  231. return 1;
  232. }
  233. //+POC:8bxxyy
  234. //xx--mic控制 01--打开MIC
  235. // 00--关闭MIC
  236. //yy--speaker控制
  237. // 00--关闭speaker并要产生成功的滴音
  238. // 01--对方说话,打开speaker,并产生成功的滴音
  239. // 13--抢麦失败,打开speaker,并产生失败的滴音
  240. if(msg[5]=='8' && msg[6]=='B' && msg[7]=='0')
  241. {
  242. if(msg[8]=='1')//xx == 01
  243. {
  244. sutPocStatus.Mic=1;
  245. MicEnable();
  246. sutPocStatus.Speaker=0;
  247. SpeakerDisable();
  248. sutPocStatus.Logined=1;
  249. }else if(msg[8]=='0')//xx == 00
  250. {
  251. sutPocStatus.Mic=0;
  252. MicDisable();
  253. }
  254. if(msg[9]=='0' && msg[10] == '0')
  255. {//yy == 00 对方说话结束或本地讲话开始,滴音
  256. #if(SPECALL_CTR==1)
  257. if(noSpeakFlag == 1)
  258. {
  259. noSpeakFlag=0;
  260. if(sutPocStatus.Speaker) sutPocStatus.Speaker=0;
  261. return 1;
  262. }
  263. #endif
  264. sutPocStatus.Speaker=0;
  265. SpeakerEnable();
  266. SetBeep(878,12);
  267. }else if(msg[9]=='0' && msg[10] == '1')
  268. {//yy == 00 对方说话开始
  269. LCDTimeOut(0); //此时如果睡眠 觉醒吧
  270. sutLcdParam.OnTimeCt=0;
  271. ///////////////////
  272. sutPocStatus.Logined=1;
  273. sutPocStatus.Speaker=1;
  274. SpeakerEnable();
  275. SetBeep(878,12);
  276. }else if(msg[9]=='1' && msg[10]=='3')
  277. {//yy == 13 抢麦不成功滴音
  278. #if(SPECALL_CTR==1)
  279. //防止A讲话,B按了一下PTT,后A结果,B灯还是绿的
  280. if(noSpeakFlag == 1) noSpeakFlag=0;
  281. #endif
  282. sutPocStatus.statusChaned=1;
  283. //sutPocStatus.Speaker=1;//3;//屏蔽掉后:能达到修改记录中的第6点
  284. SpeakerEnable();
  285. SetBeep(1176,12);
  286. }
  287. return 1;
  288. }
  289. //==============+POC:xxxx=============
  290. //+POC:820100000000 +POC:8201ffffffff
  291. //+POC:82 02 00002c8d 4b6dd58b3100300032000000 登陆成功,提示“测试102”
  292. //+POC:82 02 0000D590 B5E7C1BFB2E2CAD432 登陆成功 提示"电量测试2"
  293. if(msg[5]=='8' && msg[6]=='2')
  294. {
  295. buf[0] = msg[7];
  296. buf[1] = msg[8];
  297. buf[2] = 0;
  298. type = atoi(buf);
  299. switch(type)
  300. {
  301. case 0://离线 ID无效
  302. if(sutPocStatus.Logined) HigosStartCnt(1);
  303. sutPocStatus.danHunStatus=0;//掉线,清单呼显示状态为非单呼状态
  304. sutPocStatus.Logined=0;
  305. sutGpsInfo.isGpsAuthOk=0;
  306. snprintf(buf, sizeof(buf),"[msg]");
  307. if(msg[17] == 'B' && msg[18]== '5' && msg[25] == 'C' && msg[26] == 'A')
  308. {//帐号信息错误
  309. pocTimeOutTime=5;
  310. #if 0
  311. if(sutPocStatus.FirstLogined==0)
  312. {//从来没登陆过,来一次播报一次
  313. MeSpeak(ENCODE_GBK, "D5CABAC5D0C5CFA2B4EDCEF3", 0);
  314. sutPocStatus.report1Lock=1;
  315. }else
  316. {
  317. if(sutPocStatus.reportTimeCnt1 >= 60)
  318. {
  319. sutPocStatus.reportTimeCnt1=0;
  320. MeSpeak(ENCODE_GBK, "D5CABAC5D0C5CFA2B4EDCEF3", 0);
  321. sutPocStatus.report1Lock=1;
  322. }
  323. }
  324. #else
  325. sutPocStatus.loginResult=1;
  326. #endif
  327. strcat(buf, "账号信息错误");
  328. }
  329. else
  330. if(msg[17] == 'C' && msg[18]== 'E' && msg[25] == 'C' && msg[26] == '2')
  331. {//无网络连接
  332. #if 0
  333. if(sutPocStatus.FirstLogined==0)
  334. {//从来没登陆过,来一次播报一次
  335. if(sutPocStatus.report1Lock==0)
  336. MeSpeak(ENCODE_GBK, "CEDECDF8C2E7C1ACBDD3", 0);
  337. }else
  338. {
  339. if(sutPocStatus.reportTimeCnt2 >= 60 && sutPocStatus.report1Lock==0)
  340. {
  341. sutPocStatus.reportTimeCnt2=0;
  342. MeSpeak(ENCODE_GBK, "CEDECDF8C2E7C1ACBDD3", 0);
  343. }
  344. }
  345. #else
  346. if(sutPocStatus.loginResult != 1)
  347. sutPocStatus.loginResult=2;
  348. #endif
  349. strcat(buf, "无网络连接");
  350. }
  351. else strcat(buf, "No login");
  352. SlwTrace(INF, buf, 1);
  353. break;
  354. case 1://登陆中 ID无效
  355. SlwTrace(INF, "login ing",1);
  356. break;
  357. case 2://登陆成功 ID为用户ID
  358. len = strlen(&msg[17])-2;
  359. if(len >= POC_USER_NAME_LEN) len = POC_USER_NAME_LEN;
  360. memcpy(Username,&msg[17],len);
  361. Username[len]=0;
  362. StrAsciiToHex(Username,sutPocStatus.LocalUser.name);
  363. msg[17]=0;
  364. sutPocStatus.LocalUser.ID=strtol(&msg[9],&pName,16);
  365. SlwTrace(INF, "login ok",1);
  366. getNameFlag=1;//登陆成功时,获取过了用户名字,后面可以播报了
  367. sutPocStatus.loginResult=3;
  368. break;
  369. case 3://注销中 ID无效
  370. SlwTrace(INF, "logout ing",1);
  371. break;
  372. }
  373. return 1;
  374. }
  375. //获取所有组列表,也就是处理+POC:80xxx
  376. if(GetAllGroups(msg))return 1;
  377. //获取所有成员列表,也就是处理+POC:81XXX
  378. //if(GetAllUsers(msg))return 1;
  379. //+POC:86 00 000000dc a47fc47e3300 0000 进入群组,提示“群组3”(群组ID为000000dc,群组名为“群组3”即a47fc47e3300)
  380. // 86 00 0000009a d89ea48ba47fc47e0000 默认群组
  381. //+POC:86 00 00000366 0000
  382. if(msg[5]=='8' && msg[6]=='6')
  383. {//----获取本机当前群组名及群组ID
  384. HigosStopCnt();//正常登陆了,停止计数
  385. sutPocStatus.Logined=1;
  386. pocTimeOutTime=30;
  387. if(msg[8] == '0')
  388. {//GB2312
  389. len = strlen(&msg[17])-2;
  390. if(len >= POC_GROUP_NAME_LEN) len = POC_GROUP_NAME_LEN;
  391. memcpy(Groupname,&msg[17],len);
  392. Groupname[len]=0;
  393. msg[17]=0;
  394. sutPocStatus.LocalGroup.ID=strtol(&msg[9],&pName,16);
  395. StrAsciiToHex(Groupname,sutPocStatus.LocalGroup.name);
  396. if(sutPocStatus.FirstLogined==0)
  397. {//登陆成功用户名群组名只播报一次
  398. if(getNameFlag == 0)
  399. snprintf(buf, sizeof(buf), "%s",Groupname);
  400. else
  401. {
  402. getNameFlag=0;
  403. snprintf(buf, sizeof(buf), "%s2CD2D1B5C7C2BD2C%s",Username,Groupname);
  404. }
  405. MeSpeak(ENCODE_GBK, buf,0);
  406. }else
  407. {//其它形式进入
  408. if(g_ucEnterGroupFlag==1)
  409. {
  410. g_ucEnterGroupFlag=0;
  411. snprintf(buf, sizeof(buf), "BDF8C8EB2C%s",sutPocStatus.LocalGroup.name);
  412. MeSpeak(ENCODE_GBK, buf,0);
  413. }
  414. }
  415. }
  416. sutPocStatus.danHunStatus=0;//收到这个直接设置为非单呼模式,否在会在单呼模式下如果被创建了临时群组,之后会一直显示单呼模式
  417. //if(sutPocStatus.FirstLogined==0) ModemSendAT("AT+CCLK?\r\n");
  418. sutPocStatus.FirstLogined=1;
  419. if(sutProductPara.takeNoteFlag != 1)
  420. {//认为登陆过来就开始记录,刷机后不再记录
  421. sutProductPara.takeNoteFlag = 1;
  422. SaveProductParaToFlash("START_NOTE");
  423. }
  424. return 1;
  425. }
  426. //+POC:830000002e650000 对方话语权
  427. //+POC:83000000420c330067004b6dd58b3200f7530000
  428. //+POC:8300000045544800530031003500310057004b6dd58b300033000000
  429. //+POC:83000000D592 303738
  430. if(msg[5]=='8' && msg[6]=='3' && msg[7]=='0' && msg[8]=='0')
  431. {
  432. //最新POC版本快速短按PTT放开会只发这条过来,实际是没有请麦来的
  433. //因此不做灯与喇叭,LCD背光等控制
  434. ReplaceStrWithN(&msg[17]);
  435. //如果他只发ID不发对方名,要记得修改防护
  436. i=strlen(&msg[17]);
  437. if(i>=POC_USER_NAME_LEN) i=POC_USER_NAME_LEN;
  438. else i++;//把0结束也拷过去
  439. StrAsciiToHex(&msg[17], sutPocStatus.Callname);
  440. *(msg+17) = 0;
  441. sutPocStatus.CallID = strtol(&msg[9],&pName,16);
  442. msg[17]=0;
  443. return 1;
  444. }
  445. //+POC:8301ffffffff0000 对方释放话语权
  446. if(msg[5]=='8' && msg[6]=='3' && msg[7]=='0' && msg[8]=='1'){
  447. //最新POC版本目前没有这条指令,也忽视吧
  448. // sutPocStatus.Speaker=0;
  449. // SpeakerDisable();
  450. return 1;
  451. }
  452. //+POC:91010103
  453. if(msg[5]=='9' && msg[6]=='1'){
  454. PocAddUserStatusToList(&msg[7]);
  455. return 1;
  456. }
  457. //+POC:0E00 0000 0002
  458. if(msg[5]=='0'&& msg[6]=='E'){
  459. msg[17]=0;
  460. StrAsciiToHex(&msg[13], temp);
  461. ds.Data.ucData.b1=temp[1];
  462. ds.Data.ucData.b2=temp[2];
  463. sutPocStatus.UserOnLineNum=ds.Data.usData;
  464. sutPocStatus.UserNum_Update=1;
  465. snprintf(buf, sizeof(buf), "oneLine:%d",sutPocStatus.UserOnLineNum);
  466. SlwTrace(INF, buf, 1);
  467. }
  468. //+POC:84 00 xxx //单呼提示
  469. if(msg[5]=='8' && msg[6]=='4')
  470. {
  471. MakeStrEndByNewLine(msg);
  472. MeSpeak(ENCODE_GBK , &msg[9],0);
  473. //检测是哪种单呼
  474. if(memcmp(&msg[9], "C1D9CAB1", 8)==0)
  475. {//临时呼叫xxxx 被呼成功
  476. sutPocStatus.danHunStatus=1;//进入单显示
  477. }else if(memcmp(&msg[9], "CDCBB3F6", 8)==0)
  478. {//退出临时呼叫 退出单呼状态
  479. sutPocStatus.danHunStatus=0;
  480. }else if(memcmp(&msg[9], "BAF4BDD0B3C9B9A6", 16)==0)
  481. {//呼叫成功 主单呼
  482. sutPocStatus.danHunStatus=1;
  483. }
  484. return 1;
  485. }
  486. //+POC:21 000000 0000A5AB B8D6CCFACFC0
  487. // 关键字 保留 UID 名称
  488. if(msg[5]=='2' && msg[6]=='1'){
  489. MakeStrEndByNewLine(msg);
  490. memset(sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].name,0,POC_ALL_USERS_NUM);
  491. if(msg[21]==0) sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].name[0]=' ';
  492. else StrAsciiToHex(&msg[21], sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].name);
  493. msg[21]=0;
  494. StrAsciiToHex(&msg[13], temp);
  495. dl.Data.ucData.b4=temp[0];
  496. dl.Data.ucData.b3=temp[1];
  497. dl.Data.ucData.b2=temp[2];
  498. dl.Data.ucData.b1=temp[3];
  499. sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].ID=dl.Data.ulData;
  500. sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].status=3;
  501. sutPocStatus.GetOneUserFlag=1;
  502. return 1;
  503. }
  504. //+POC:1000000007 0004 00000BF9 0003 D1D0B7A2B2E2CAD4D7E93030
  505. //+POC:1000000008 0004 00000BF9 0003 D1D0B7A2B2E2CAD4D7E93030
  506. // 组索引 组ID 成员数 组名字
  507. //xxxxxxxx 4字节ID
  508. //nnnnnnnn 名称
  509. if(msg[5] == '1' &&
  510. msg[7] == '0' &&
  511. (msg[14] == '7' || msg[14] == '8'))
  512. {
  513. memcpy(sutPocStatus.switchGroupID,&msg[19], 8);
  514. MakeStrEndByNewLine(&msg[31]);
  515. MeSpeak(ENCODE_GBK, &msg[31],0);
  516. return 1;
  517. }
  518. }