Modem.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874
  1. /**********************************************************************************
  2. * File Name: Modem.c
  3. * Function Describe:device for modem
  4. * Relate Module:
  5. * Explain: the modem must be using ZTE MC8332
  6. * Writer: ShiLiangWen
  7. * Date: 2015.1.20
  8. ***********************************************************************************/
  9. #define THIS_FILE_ID 2
  10. /* Includes ------------------------------------------------------------------*/
  11. #include "includes.h"
  12. //os_mbx_declare (PocMsgBox, 5); /* Declare an RTX mailbox */
  13. //_declare_box(PocMpool,sizeof(SUT_MODEM_POC_MSG),5);
  14. //SUT_SMS_PARA sutSMSpara;
  15. //os_mbx_declare (AtMsgBox, 7); /* Declare an RTX mailbox */
  16. //_declare_box(AtMpool,sizeof(SUT_MODEM_AT_MSG),7);
  17. SUT_MODEM_AT_MSG sutAtm,sutAtmPro;
  18. unsigned char g_ucModemSentTcpCt;//TCP 发送计数器
  19. unsigned char g_usModeMTime=0x00;
  20. unsigned char g_usModeSTime=0x00;
  21. unsigned char g_usModeHTime=0x00;
  22. unsigned char g_usModeYTime=0x00;//年
  23. unsigned char g_usModemTime=0x00;//月
  24. unsigned char g_usModeDTime=0x00;//日
  25. /************************************************************************************
  26. *
  27. *************************************************************************************/
  28. void ModemSendAT(char *p)
  29. {
  30. unsigned short len;
  31. len=strlen(p);
  32. RunMake(THIS_FILE_ID);
  33. #if UART2_TX_USE_DMA==0
  34. Uart2Send(p,len);
  35. #else
  36. USART2_Send(p,len);
  37. #endif
  38. }
  39. /************************************************************************************
  40. *
  41. *************************************************************************************/
  42. void ModemSendData(unsigned char *pData,unsigned short datalen)
  43. {
  44. #if UART2_TX_USE_DMA==0
  45. Uart2Send(pData,datalen);
  46. #else
  47. USART2_Send((char *)pData,datalen);
  48. #endif
  49. }
  50. /**********************************************************************************
  51. 等待模块启动完成
  52. 0:成功 -1:超时
  53. ***********************************************************************************/
  54. int WaitModemIsOpened(void)
  55. {
  56. int i;
  57. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  58. RunMake(THIS_FILE_ID);
  59. for(i=0;i<100;i++){
  60. SlwTrace(INF,"AT",1);
  61. ModemSendAT("AT\r\n");
  62. //if(OS_R_TMO!=os_mbx_wait(AtMsgBox,(void **)&pMsg,50)){
  63. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))){
  64. if('O'==pMsg->MsgData[0] && 'K'==pMsg->MsgData[1]){
  65. return 0;
  66. }
  67. //free(pMsg);
  68. }else os_dly_wait(1);
  69. }
  70. return -1;
  71. }
  72. void ModemCtrlInit(void)
  73. {
  74. GPIO_InitTypeDef GPIO_InitStructure;
  75. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  76. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  77. MODEM_DTR_HIGH;
  78. MODEM_RING_HIGH;
  79. MODEM_DSR_HIGH;
  80. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  81. GPIO_InitStructure.GPIO_Pin = MODEM_DTR_PIN;
  82. GPIO_Init(MODEM_DTR_PORT, &GPIO_InitStructure);
  83. MODEM_DTR_HIGH;
  84. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  85. GPIO_InitStructure.GPIO_Pin = MODEM_RING_PIN;
  86. GPIO_Init(MODEM_RING_PORT, &GPIO_InitStructure);
  87. MODEM_RING_HIGH;
  88. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  89. GPIO_InitStructure.GPIO_Pin = MODEM_DSR_PIN;
  90. GPIO_Init(MODEM_DSR_PORT, &GPIO_InitStructure);
  91. MODEM_DSR_HIGH;
  92. MODEM_DCD_HIGH;
  93. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  94. GPIO_InitStructure.GPIO_Pin = MODEM_DCD_PIN;
  95. GPIO_Init(MODEM_DCD_PORT, &GPIO_InitStructure);
  96. }
  97. /*************************************************************************
  98. *ModemWaitAtReady
  99. **************************************************************************/
  100. int ModemWaitAtReady(void)
  101. {
  102. int i;
  103. SUT_MODEM_AT_MSG *pMsg;
  104. for(i=0;i<20;i++){
  105. if(ModemSendAT2WaitAckMsg("AT\r\n","OK",&pMsg,100)){
  106. //_free_box(AtMpool,pMsg);
  107. return 1;
  108. }
  109. }
  110. return 0;
  111. }
  112. /*************************************************************************
  113. ModemWaitOpen
  114. 等待模块开机
  115. 通过检查模块主动上报:
  116. **************************************************************************/
  117. int ModemWaitOpen(int timeout)
  118. {
  119. //char *pAck;
  120. //SUT_MODEM_AT_MSG **pMsg;
  121. SUT_MODEM_AT_MSG *Msg;
  122. SlwTrace(DEBUG,"ModemWaitOpen",1);
  123. while(timeout--){
  124. //if(OS_R_TMO!=os_mbx_wait(AtMsgBox,(void **)&Msg,1)){
  125. if((Msg->MsgLen = MsgQueueAccept(Msg->MsgData,sizeof(Msg->MsgData)))){
  126. SlwTrace(DEBUG,(char *)Msg->MsgData,0);
  127. // if(0==ModemStrCmp((char *)Msg->MsgData,pAck)){
  128. // *pMsg=Msg;
  129. // return 1;
  130. // }else{
  131. // _free_box(AtMpool,Msg);
  132. //}
  133. }else os_dly_wait(1);
  134. }
  135. return 1;
  136. }
  137. //模块的电源以及复位引脚的配置
  138. //这段配置要放要最开始
  139. //目的是一开机时确保模块是没有电源的
  140. //解决原来问题:当开机到模块播报“欢迎.....”时马上关机,看到屏幕灭后马上又开机,此次开机会失败
  141. void ModemPinConfig(void)
  142. {
  143. GPIO_InitTypeDef GPIO_InitStructure;
  144. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  145. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  146. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  147. GPIO_InitStructure.GPIO_Pin = MODEM_RESET_PIN;
  148. GPIO_Init(MODEM_RESET_PORT, &GPIO_InitStructure);
  149. GPIO_InitStructure.GPIO_Pin = MODEM_PWRKEY_PIN;
  150. GPIO_Init(MODEM_PWRKEY_PORT, &GPIO_InitStructure);
  151. MODEM_RESET_HIGH;
  152. MODEM_PWRKEY_LOW;
  153. }
  154. /**********************************************************************************
  155. ModemInit
  156. 返回:1 初始化成功 0-失败
  157. ***********************************************************************************/
  158. int ModemInit(void)
  159. {
  160. RunMake(THIS_FILE_ID);
  161. MsgQueueSet();//初始化队列
  162. g_ucModemSentTcpCt=0;
  163. RunMake(THIS_FILE_ID);
  164. MODEM_RESET_HIGH;
  165. os_dly_wait(100);
  166. MODEM_RESET_LOW;
  167. MODEM_PWRKEY_HIGH;
  168. os_dly_wait(100);
  169. MODEM_PWRKEY_LOW;
  170. //等待模块开机并能接受AT命令
  171. if(WaitModemStart())return 0;
  172. return ModemGetIMEI();
  173. }
  174. /**********************************************************************************
  175. CSQ2Num
  176. ***********************************************************************************/
  177. int CSQ2Num(char *str)
  178. {
  179. int csq;
  180. csq=atoi(str);
  181. if(csq<0 || csq>99)return 99;
  182. else return csq;
  183. }
  184. /**********************************************************************************
  185. ModemStrCmp
  186. ***********************************************************************************/
  187. int ModemStrCmp(char *msg,char *str)
  188. {
  189. char *p1=str;
  190. char *p2=msg;
  191. while(*p1!=0){
  192. if(*p1!=*p2)return 1;
  193. p1++;
  194. p2++;
  195. }
  196. return 0;
  197. }
  198. /**********************************************************************************
  199. ModemWaitAckMsg
  200. Input:
  201. pATCmd--AT Command string
  202. pAck --期待回的ACK,头相同即可
  203. pMsg --实际消息内容,可能比pAck长
  204. timeout --超时,10ms为单位
  205. Output:
  206. if timeout return 0
  207. else return 1 注意,处理完消息要调用_free_box释放消息
  208. ***********************************************************************************/
  209. int ModemSendAT2WaitAckMsg(char *pATCmd,char *pAck,SUT_MODEM_AT_MSG **pMsg,int timeout)
  210. {
  211. SUT_MODEM_AT_MSG *Msg=&sutAtmPro;
  212. ModemSendAT(pATCmd);
  213. while(timeout){
  214. //if(OS_R_TMO!=os_mbx_wait(AtMsgBox,(void **)&Msg,1)){
  215. if((Msg->MsgLen = MsgQueueAccept(Msg->MsgData,sizeof(Msg->MsgData)))){
  216. //SlwTrace(DEBUG,(char *)Msg->MsgData);
  217. if(0==ModemStrCmp((char *)Msg->MsgData,pAck)){
  218. *pMsg=Msg;
  219. return 1;
  220. }else{
  221. //_free_box(AtMpool,Msg);
  222. }
  223. }else {
  224. timeout--;
  225. os_dly_wait(1);
  226. }
  227. }
  228. return 0;
  229. }
  230. /********************************************
  231. *0x12 --> "12" --> 0x31 0x32
  232. **********************************************/
  233. void HexToAsc(unsigned char Hex,char *pAsc)
  234. {
  235. unsigned char h,l;
  236. l=Hex & 0x0f;
  237. h=Hex >> 4;
  238. if((l>=0)&&(l<=9))l += 0x30;
  239. else if((l>=10)&&(l<=15))l += ('A'-10);
  240. if((h>=0)&&(h<=9))h += 0x30;
  241. else if((h>=10)&&(h<=15))h += ('A'-10);
  242. pAsc[0]=h;
  243. pAsc[1]=l;
  244. }
  245. void HexToStr(unsigned char *HexStr,char *AscStr,unsigned short len)
  246. {
  247. int i,j=0;
  248. for(i=0;i<len;i++)
  249. {
  250. HexToAsc(HexStr[i],&AscStr[j]);
  251. j+=2;
  252. }
  253. }
  254. /***********************************************************************************
  255. *ModemSendUdpData WCDMA没有UDP指令
  256. ************************************************************************************/
  257. int ModemSendUdpData(unsigned char socket,unsigned char *pData,unsigned short len)
  258. {
  259. int i;
  260. char buf[142];
  261. char tmp[5];
  262. unsigned char temp=0;
  263. snprintf(buf, sizeof(buf),"AT+ZIPSENDU=%d,%d\r",socket,len);
  264. ModemSendAT(buf);
  265. ModemSendData(pData,len);
  266. snprintf(buf, sizeof(buf),"UdpSend[%d]",len);
  267. SlwTrace(INF,buf,1);
  268. #ifdef SLW_DEBUG
  269. if(len>45)len=45;
  270. buf[0]='>';buf[1]='>';buf[2]=0;
  271. for(i=0;i<len;i++){
  272. snprintf(tmp, sizeof(tmp),"%02x,",pData[i]);
  273. strcat(buf,tmp);
  274. }
  275. SlwTrace(DEBUG,buf,1);
  276. #endif
  277. return 0;
  278. }
  279. /***********************************************************************************
  280. *StrToNum
  281. ************************************************************************************/
  282. unsigned short StrToNum(char *str)
  283. {
  284. unsigned short num;
  285. if(str[0]>0x2f && str[0]<0x3a){
  286. if(str[1]>0x2f && str[1]<0x3a){
  287. if(str[2]>0x2f && str[2]<0x3a){
  288. if(str[3]>0x2f && str[3]<0x3a){
  289. num=1000*(str[0]-0x30);
  290. num+=100*(str[1]-0x30);
  291. num+=10*(str[2]-0x30);
  292. num+=(str[3]-0x30);
  293. }else{
  294. num=100*(str[0]-0x30);
  295. num+=10*(str[1]-0x30);
  296. num+=(str[2]-0x30);
  297. }
  298. }else{
  299. num=10*(str[0]-0x30);
  300. num+=(str[1]-0x30);
  301. }
  302. }else{
  303. num= str[0]-0x30;
  304. }
  305. }else{
  306. num=0;
  307. }
  308. return num;
  309. }
  310. /***********************************************************************************
  311. *ModemPoweroff
  312. ************************************************************************************/
  313. void ModemPoweroff(void)
  314. {
  315. ModemSendAT("AT+ZPWROFF\r\n");
  316. os_dly_wait(50);
  317. ModemSendAT("AT+ZPWROFF\r\n");
  318. IWDG_ReloadCounter();//喂狗
  319. os_dly_wait(100);
  320. IWDG_ReloadCounter();//喂狗
  321. os_dly_wait(100);
  322. IWDG_ReloadCounter();//喂狗
  323. os_dly_wait(50);
  324. IWDG_ReloadCounter();//喂狗
  325. MODEM_PWRKEY_LOW;
  326. MODEM_RESET_HIGH;
  327. os_dly_wait(10);
  328. MODEM_RESET_LOW;
  329. }
  330. /**********************************************************************************
  331. *ModemSetDTRLow
  332. ***********************************************************************************/
  333. void ModemSetDtrLow(void)
  334. {
  335. GPIO_InitTypeDef GPIO_InitStructure;
  336. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  337. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  338. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  339. GPIO_InitStructure.GPIO_Pin = MODEM_DTR_PIN;
  340. GPIO_Init(MODEM_DTR_PORT, &GPIO_InitStructure);
  341. MODEM_DTR_LOW;
  342. }
  343. /**********************************************************************************
  344. *ModemSetRINGLow
  345. ***********************************************************************************/
  346. void ModemSetRingLow(void)
  347. {
  348. GPIO_InitTypeDef GPIO_InitStructure;
  349. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  350. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  351. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  352. GPIO_InitStructure.GPIO_Pin = MODEM_RING_PIN;
  353. GPIO_Init(MODEM_RING_PORT, &GPIO_InitStructure);
  354. MODEM_RING_LOW;
  355. }
  356. /*******************************************************************
  357. *ModemCheckPocParam
  358. return:
  359. 1--not same, Reset
  360. 0--same,no reset
  361. ********************************************************************/
  362. int ModemCheckPocParam(void)
  363. {
  364. int t,j;
  365. int i,len;
  366. char buf[60];
  367. char buf1[130];
  368. char buf2[40];
  369. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  370. RunMake(THIS_FILE_ID);
  371. for(i=0;i<5;i++)
  372. {
  373. ModemSendAT("AT+POC=020000\r\n");
  374. //+POC:0200000069643D3135393930303130313B69703D3235352E3235352E3235352E3235353B7077643D4131303030303542313134313432 len <= 13 + 100
  375. //id=159900101;ip=255.255.255.255;pwd=A100005B114142
  376. t=50;
  377. while(t--)
  378. {
  379. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  380. {
  381. if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:02"))
  382. {
  383. snprintf(buf, sizeof(buf), "id=%lu;",sutProductPara.PSN);
  384. snprintf(buf2, sizeof(buf2), "ip=%s;",sutProductPara.PIP);
  385. strcat(buf, buf2);
  386. snprintf(buf2, sizeof(buf2), "pwd=%s;",sutProductPara.IMEI);
  387. strcat(buf, buf2);
  388. AscStrToHexStr(buf,buf1);
  389. for(j=0;j<strlen(pMsg->MsgData);j++) if(pMsg->MsgData[j]== '\r') pMsg->MsgData[j] = 0;
  390. if(0!=strcasecmp((char *)&pMsg->MsgData[13],buf1))
  391. {
  392. ModemSendAT("AT+POC=010000");
  393. ModemSendAT(buf1);
  394. ModemSendAT("\r\n");
  395. return 1;
  396. }else return 0;
  397. }
  398. }else os_dly_wait(1);
  399. }
  400. }
  401. return 0;
  402. }
  403. char WaitModemStart(void)
  404. {
  405. int t,i;
  406. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  407. SlwTrace(INF, "WaitModemRun:",0);
  408. for(i=0;i<100;i++)
  409. {
  410. t=50;
  411. ModemSendAT("ATE0\r\n");
  412. while(t--)
  413. {
  414. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  415. {
  416. if(0==ModemStrCmp((char *)pMsg->MsgData,"OK") ||
  417. 0==ModemStrCmp((char *)pMsg->MsgData,"+POC:START"))
  418. {
  419. SlwTrace(INF, "Runing",1);
  420. return 0;
  421. }
  422. }else
  423. os_dly_wait(1);
  424. }
  425. }
  426. SlwTrace(INF, "TimeOut",1);
  427. return 1;
  428. }
  429. void ModemInfo(void)
  430. {
  431. int t;
  432. int i,len,ver,j;
  433. char bufTemp[30],version[10],type,countFlag;
  434. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  435. RunMake(THIS_FILE_ID);
  436. ver=0;
  437. SlwTrace(INF, "[03]ModemInfo:",1);
  438. type=0;
  439. for(i=0;i<10;i++)
  440. {
  441. if(type==0) ModemSendAT("ATI\r\n");//模块型号
  442. else ModemSendAT("AT+LCTSW\r\n");//版本信息
  443. t=50;
  444. while(t--)
  445. {
  446. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  447. {
  448. if(type==0)
  449. {//Manufacturer: LONGSUNG
  450. //Model: U9507C
  451. if(0==ModemStrCmp((char *)pMsg->MsgData,"Manufacturer:")) SlwTrace(INF, pMsg->MsgData, 0);
  452. else if(0==ModemStrCmp((char *)pMsg->MsgData,"Model:"))
  453. {
  454. SlwTrace(INF, pMsg->MsgData, 0);
  455. type ++;
  456. break;
  457. }
  458. }else{
  459. //SoftwareVersion: LLA0029.1.2_M005
  460. //InnerVersion: LLA0029_0016_1.0.57_L0901_EFS2.6
  461. //AP: LLA0029_0016_0.0.57_L0901_M005
  462. if(0==ModemStrCmp((char *)pMsg->MsgData,"SoftwareVersion:")) SlwTrace(INF, pMsg->MsgData, 0);
  463. else if(0==ModemStrCmp((char *)pMsg->MsgData,"AP:"))
  464. {
  465. SlwTrace(INF, pMsg->MsgData, 0);
  466. return;
  467. }
  468. else if(0==ModemStrCmp((char *)pMsg->MsgData,"InnerVersion:"))
  469. {
  470. SlwTrace(INF, pMsg->MsgData, 0);
  471. countFlag=0;
  472. for(j=0;j<strlen(pMsg->MsgData);j++)
  473. {
  474. if(pMsg->MsgData[j] == '_')
  475. {
  476. countFlag++;
  477. if(countFlag == 1)
  478. {
  479. version[0] = pMsg->MsgData[j+3];
  480. version[1] = pMsg->MsgData[j+4];
  481. }else if(countFlag == 3)
  482. {
  483. version[2] = pMsg->MsgData[j+2];
  484. version[3] = pMsg->MsgData[j+3];
  485. version[4] = pMsg->MsgData[j+4];
  486. version[5] = pMsg->MsgData[j+5];
  487. version[6] = 0;
  488. snprintf(bufTemp, sizeof(bufTemp), "[03]ModemVer:%s",version);
  489. SlwTrace(INF, bufTemp, 1);
  490. g_iModemVer=atoi(version);
  491. }
  492. }
  493. }
  494. }
  495. }
  496. }else os_dly_wait(1);
  497. }
  498. }
  499. }
  500. int ModemGetIMEI(void)
  501. {
  502. int t,j;
  503. int i,len;
  504. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  505. for(i=0;i<50;i++){
  506. ModemSendAT("AT+GSN\r\n");//0x80DA219D
  507. //862015030301209 两种情况都会返回
  508. t=50;
  509. while(t--)
  510. {
  511. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  512. {
  513. len=strlen((char *)&(pMsg->MsgData));
  514. if(0==ModemStrCmp((char *)pMsg->MsgData,"0x"))
  515. {
  516. len -=4;
  517. memcpy(sutProductPara.IMEI, &pMsg->MsgData[2], len);
  518. if(len < sizeof(sutProductPara.IMEI))
  519. sutProductPara.IMEI[len]=0;
  520. return 1;
  521. }else if(len == 17)
  522. {
  523. len -= 2;
  524. memcpy(sutProductPara.IMEI, pMsg->MsgData, len);
  525. if(len < sizeof(sutProductPara.IMEI))
  526. sutProductPara.IMEI[len]=0;
  527. return 2;
  528. }
  529. }else
  530. os_dly_wait(1);
  531. }
  532. }
  533. return 0;
  534. }
  535. void ModemPocVersionCheck(void)
  536. {
  537. char bufTemp[40];
  538. short t,i,len,ver,j;
  539. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  540. for(i=0;i<5;i++)
  541. {
  542. t=50;
  543. ModemSendAT("AT+POC_VER?\r\n");
  544. while(t--)
  545. {
  546. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  547. {
  548. if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC_VER:"))
  549. {
  550. len = strlen(pMsg->MsgData);
  551. j=0;
  552. for(i=0;i<len;i++)
  553. {
  554. if(pMsg->MsgData[i] == '\r')
  555. {
  556. bufTemp[j]=0;
  557. ver=atoi(bufTemp);
  558. snprintf(bufTemp, sizeof(bufTemp),"[04]POCver:%d<->%s", ver,pMsg->MsgData);
  559. SlwTrace(INF, bufTemp,0);
  560. g_iPocVer=ver;
  561. return;
  562. }else if(pMsg->MsgData[i] >= '0' && pMsg->MsgData[i] <= '9') bufTemp[j++]=pMsg->MsgData[i];
  563. }
  564. }
  565. }else
  566. os_dly_wait(1);
  567. }
  568. }
  569. snprintf(bufTemp, sizeof(bufTemp),"[04]PocVer=%d", ver);
  570. SlwTrace(INF, bufTemp, 1);
  571. }
  572. void ModemApnConfig(void)
  573. {
  574. char buf[100],index;
  575. char buf2[80];
  576. char i;
  577. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  578. snprintf(buf, sizeof(buf), "[11]Accessp:");
  579. if(sutProductPara.APNApn[0]==0)
  580. {//接入点为空时不配置,因为模块不支持
  581. strcat(buf, "unsupport-Empty");
  582. }else
  583. {
  584. snprintf(buf2, sizeof(buf2), "AT+MIPPROFILE=1,\"%s\"\r\n",sutProductPara.APNApn);
  585. ModemSendAT(buf2);
  586. snprintf(buf2, sizeof(buf2), "%s",sutProductPara.APNApn);
  587. strcat(buf,buf2);
  588. }
  589. SlwTrace(INF,buf,0);
  590. snprintf(buf, sizeof(buf), ",Name-Pass:");
  591. if(sutProductPara.APNName[0] ==0 ||
  592. sutProductPara.APNPass[0] ==0)
  593. {//名称或密码为空不配置,因为模块不支持
  594. strcat(buf, "unsupport-Empty");
  595. }else
  596. {
  597. snprintf(buf2, sizeof(buf2),"AT^PPPCFG=\"%s\",\"%s\"\r\n",sutProductPara.APNName,sutProductPara.APNPass);
  598. ModemSendAT(buf2);
  599. snprintf(buf2, sizeof(buf2), "%s,%s",sutProductPara.APNName,sutProductPara.APNPass);
  600. strcat(buf,buf2);
  601. }
  602. SlwTrace(INF,buf,1);
  603. }
  604. void M9507CSendTcpData(unsigned char socket, unsigned char *pData, unsigned short len)
  605. {
  606. char buf[20];
  607. snprintf(buf, sizeof(buf), "AT+TCPSEND=%d,%d,",socket, len);
  608. ModemSendAT(buf);
  609. ModemSendData(pData, len);
  610. ModemSendAT("\r\n");
  611. }
  612. void ModemSetSpeed(void)
  613. {
  614. char i,t;
  615. int Volume;
  616. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  617. for(i=0;i<5;i++)
  618. {
  619. t=50;
  620. REGO:
  621. ModemSendAT("AT+LSHTTSSPEED?\r\n");
  622. while(t--)
  623. {
  624. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  625. {
  626. if(0==ModemStrCmp((char *)pMsg->MsgData,"+LSHTTSSPEED:"))
  627. {
  628. Volume=atoi(&pMsg->MsgData[13]);
  629. if(7000 != Volume)
  630. {
  631. ModemSendAT("AT+LSHTTSSPEED=-1,7000\r\n");
  632. os_dly_wait(1);
  633. goto REGO;
  634. }
  635. else
  636. {
  637. SlwTrace(INF, "[06]SetTTS Speed Ok",1);
  638. return;
  639. }
  640. }
  641. }else
  642. os_dly_wait(1);
  643. }
  644. }
  645. SlwTrace(INF, "[06]SetTTS Speed Failed",1);
  646. }
  647. void VolumeSet(void)
  648. {
  649. char i,t;
  650. int Volume;
  651. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  652. //先配置一次,再查,因为默认就查有可能是没有返回的
  653. ModemSendAT("at+syscmd=start_pcm volume 7 5\r\n");//TTS 音量/ MIC 输入音量
  654. for(i=0;i<10;i++)
  655. {
  656. t=100;
  657. REGO:
  658. ModemSendAT("at+syscmd=start_pcm volume\r\n");
  659. while(t--)
  660. {
  661. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  662. {
  663. if(0==ModemStrCmp((char *)pMsg->MsgData,"7 5"))
  664. {
  665. SlwTrace(INF, "[07]Set Volume ok",1);
  666. return;
  667. }else{
  668. if(t==0) ModemSendAT("at+syscmd=start_pcm volume 7 5\r\n");
  669. }
  670. }else
  671. os_dly_wait(1);
  672. }
  673. }
  674. SlwTrace(INF, "[07]Set Volume failed",1);
  675. }
  676. void SpeakTTSVoice(void)
  677. {
  678. int len,timeout;
  679. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  680. if(sysStartTTS[0]==0) return;
  681. len=strlen(sysStartTTS);
  682. len = len+(8-len%8);//8倍数
  683. timeout=len/8;//两个中文需要播报1秒算
  684. timeout *= 100;
  685. MeSpeak(ENCODE_UNICODE, sysStartTTS,0);
  686. while(timeout--)
  687. {
  688. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  689. {
  690. if(0==ModemStrCmp((char *)pMsg->MsgData,"+LSHTTS: END"))
  691. {
  692. SpeakerCtrl(0);
  693. return;
  694. }
  695. }else os_dly_wait(1);
  696. }
  697. SpeakerCtrl(0);
  698. }
  699. void ServerTimeGet(void)
  700. {
  701. static unsigned short timeCnt=12000;
  702. if(++timeCnt < 12000) return;
  703. timeCnt=0;
  704. ModemSendAT("AT+CCLK?\r\n");
  705. }
  706. //total 成员总数
  707. //一次获取个数最多5个,取决于显示条目个数
  708. //前提是要使用简短模式
  709. void SimpleUserInfoScan(uint8_t firstIn,uint8_t direction)
  710. {
  711. uint16_t i;
  712. uint16_t timeout;
  713. char buf[30];
  714. uint16_t thisStartIndex;
  715. uint8_t readNum;
  716. if(firstIn) sutPocStatus.handleIndex=0;
  717. ShowMessageBox("请稍候...");
  718. os_dly_wait(1);
  719. snprintf(buf, sizeof(buf),"AT+POC=0E0000%08x\r\n",sutPocStatus.LocalGroup.ID);//先更新总数
  720. ModemSendAT(buf);
  721. SlwTrace(INF,buf,0);
  722. timeout=1000;
  723. sutPocStatus.UserNum_Update=0;
  724. sutPocStatus.UserOnLineNum=0;
  725. while(timeout)
  726. {
  727. timeout--;
  728. OsDelayTime(1);
  729. if(sutPocStatus.UserNum_Update) break;
  730. if(timeout % 200 == 0)
  731. ModemSendAT(buf);
  732. }
  733. if(sutPocStatus.UserOnLineNum<=0) goto QUIT_FUNCTION;
  734. if(sutPocStatus.handleIndex >= sutPocStatus.UserOnLineNum)
  735. {
  736. snprintf(buf, sizeof(buf), "over:%d",sutPocStatus.handleIndex);
  737. SlwTrace(INF, buf, 1);
  738. sutPocStatus.handleIndex=sutPocStatus.UserOnLineNum-1;
  739. }
  740. //然后根据最新总数来获取每个成员信息
  741. if(direction==1)//递增索引
  742. {
  743. thisStartIndex=sutPocStatus.handleIndex;
  744. if(sutPocStatus.UserOnLineNum-thisStartIndex>=5) readNum=5;
  745. else readNum=sutPocStatus.UserOnLineNum-thisStartIndex;
  746. }else{//递减索引
  747. if(sutPocStatus.handleIndex <5)
  748. {
  749. thisStartIndex=0;
  750. readNum=sutPocStatus.UserOnLineNum;
  751. }
  752. else
  753. {
  754. thisStartIndex=sutPocStatus.handleIndex-5;
  755. readNum=5;
  756. }
  757. }
  758. if(readNum >= 5) readNum=5;
  759. sutPocStatus.FillUserIndex=0;
  760. for(i=thisStartIndex;i<(thisStartIndex+readNum);i++)
  761. {
  762. sutPocStatus.GetOneUserFlag=0;
  763. snprintf(buf, sizeof(buf), "AT+POC=10000021%04x\r\n",i);
  764. ModemSendAT(buf);
  765. SlwTrace(INF, buf,0);
  766. timeout=200;
  767. while(1)
  768. {
  769. OsDelayTime(1);
  770. if(sutPocStatus.GetOneUserFlag)
  771. {
  772. sutPocStatus.FillUserIndex++;
  773. break;
  774. }
  775. if(--timeout==0) break;
  776. }
  777. }
  778. if(direction==1) sutPocStatus.handleIndex += readNum;
  779. else sutPocStatus.handleIndex -= readNum;
  780. //最终成功读了多少个回来,存在sutPocStatus.FillUserIndex中
  781. QUIT_FUNCTION:
  782. GuiClearRect(0, 40, LCD_WIDTH-1, LCD_HEIGHT-32);
  783. }
  784. void SetModemPocSimpleMode(void)
  785. {//设置使用简短模式获取成员信息
  786. short t,i;
  787. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  788. for(i=0;i<5;i++)
  789. {
  790. t=50;
  791. ModemSendAT("AT+POC=10000020\r\n");
  792. while(t--)
  793. {
  794. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  795. {
  796. if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:10000000"))
  797. {
  798. SlwTrace(INF, "[14]SimpleMode_Ok",1);
  799. return;
  800. }
  801. }else
  802. os_dly_wait(1);
  803. }
  804. }
  805. SlwTrace(INF, "[14]SimpleMode_Tout",1);
  806. }
  807. /***********************************************************************************/