Modem.c 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147
  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. //MODEM_TYPE MODEM_TYPE;
  26. /************************************************************************************
  27. *
  28. *************************************************************************************/
  29. void ModemSendAT(char *p)
  30. {
  31. unsigned short len;
  32. len=strlen(p);
  33. RunMake(THIS_FILE_ID);
  34. #if UART2_TX_USE_DMA==0
  35. Uart2Send(p,len);
  36. #else
  37. USART2_Send(p,len);
  38. #endif
  39. }
  40. /************************************************************************************
  41. *
  42. *************************************************************************************/
  43. void ModemSendData(unsigned char *pData,unsigned short datalen)
  44. {
  45. #if UART2_TX_USE_DMA==0
  46. Uart2Send(pData,datalen);
  47. #else
  48. USART2_Send((char *)pData,datalen);
  49. #endif
  50. }
  51. /**********************************************************************************
  52. 等待模块启动完成
  53. 0:成功 -1:超时
  54. ***********************************************************************************/
  55. int WaitModemIsOpened(void)
  56. {
  57. int i;
  58. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  59. RunMake(THIS_FILE_ID);
  60. for(i=0;i<100;i++){
  61. SlwTrace(INF,"AT",1);
  62. ModemSendAT("AT\r\n");
  63. //if(OS_R_TMO!=os_mbx_wait(AtMsgBox,(void **)&pMsg,50)){
  64. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))){
  65. if('O'==pMsg->MsgData[0] && 'K'==pMsg->MsgData[1]){
  66. return 0;
  67. }
  68. //free(pMsg);
  69. }else os_dly_wait(1);
  70. }
  71. return -1;
  72. }
  73. void ModemCtrlInit(void)
  74. {
  75. GPIO_InitTypeDef GPIO_InitStructure;
  76. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  77. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  78. MODEM_DTR_HIGH;
  79. MODEM_RING_HIGH;
  80. MODEM_DSR_HIGH;
  81. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  82. GPIO_InitStructure.GPIO_Pin = MODEM_DTR_PIN;
  83. GPIO_Init(MODEM_DTR_PORT, &GPIO_InitStructure);
  84. MODEM_DTR_HIGH;
  85. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  86. GPIO_InitStructure.GPIO_Pin = MODEM_RING_PIN;
  87. GPIO_Init(MODEM_RING_PORT, &GPIO_InitStructure);
  88. MODEM_RING_HIGH;
  89. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  90. GPIO_InitStructure.GPIO_Pin = MODEM_DSR_PIN;
  91. GPIO_Init(MODEM_DSR_PORT, &GPIO_InitStructure);
  92. MODEM_DSR_HIGH;
  93. MODEM_DCD_HIGH;
  94. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  95. GPIO_InitStructure.GPIO_Pin = MODEM_DCD_PIN;
  96. GPIO_Init(MODEM_DCD_PORT, &GPIO_InitStructure);
  97. }
  98. /*************************************************************************
  99. *ModemWaitAtReady
  100. **************************************************************************/
  101. int ModemWaitAtReady(void)
  102. {
  103. int i;
  104. SUT_MODEM_AT_MSG *pMsg;
  105. for(i=0;i<20;i++){
  106. if(ModemSendAT2WaitAckMsg("AT\r\n","OK",&pMsg,100)){
  107. //_free_box(AtMpool,pMsg);
  108. return 1;
  109. }
  110. }
  111. return 0;
  112. }
  113. /*************************************************************************
  114. ModemWaitOpen
  115. 等待模块开机
  116. 通过检查模块主动上报:
  117. **************************************************************************/
  118. int ModemWaitOpen(int timeout)
  119. {
  120. //char *pAck;
  121. //SUT_MODEM_AT_MSG **pMsg;
  122. SUT_MODEM_AT_MSG *Msg;
  123. SlwTrace(DEBUG,"ModemWaitOpen",1);
  124. while(timeout--){
  125. //if(OS_R_TMO!=os_mbx_wait(AtMsgBox,(void **)&Msg,1)){
  126. if((Msg->MsgLen = MsgQueueAccept(Msg->MsgData,sizeof(Msg->MsgData)))){
  127. SlwTrace(DEBUG,(char *)Msg->MsgData,0);
  128. // if(0==ModemStrCmp((char *)Msg->MsgData,pAck)){
  129. // *pMsg=Msg;
  130. // return 1;
  131. // }else{
  132. // _free_box(AtMpool,Msg);
  133. //}
  134. }else os_dly_wait(1);
  135. }
  136. return 1;
  137. }
  138. //模块的电源以及复位引脚的配置
  139. //这段配置要放要最开始
  140. //目的是一开机时确保模块是没有电源的
  141. //解决原来问题:当开机到模块播报“欢迎.....”时马上关机,看到屏幕灭后马上又开机,此次开机会失败
  142. void ModemPinConfig(void)
  143. {
  144. GPIO_InitTypeDef GPIO_InitStructure;
  145. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  146. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  147. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  148. GPIO_InitStructure.GPIO_Pin = MODEM_RESET_PIN;
  149. GPIO_Init(MODEM_RESET_PORT, &GPIO_InitStructure);
  150. GPIO_InitStructure.GPIO_Pin = MODEM_PWRKEY_PIN;
  151. GPIO_Init(MODEM_PWRKEY_PORT, &GPIO_InitStructure);
  152. MODEM_RESET_HIGH;
  153. MODEM_PWRKEY_LOW;
  154. }
  155. /**********************************************************************************
  156. ModemInit
  157. 返回:1 初始化成功 0-失败
  158. ***********************************************************************************/
  159. int ModemInit(void)
  160. {
  161. RunMake(THIS_FILE_ID);
  162. MsgQueueSet();//初始化队列
  163. g_ucModemSentTcpCt=0;
  164. RunMake(THIS_FILE_ID);
  165. MODEM_RESET_HIGH;
  166. os_dly_wait(100);
  167. MODEM_RESET_LOW;
  168. MODEM_PWRKEY_HIGH;
  169. os_dly_wait(100);
  170. MODEM_PWRKEY_LOW;
  171. //return 0;
  172. //等待模块开机并能接受AT命令
  173. if(WaitModemStart())return 0;
  174. return 1;
  175. //ModemGetIMEI();
  176. }
  177. /**********************************************************************************
  178. CSQ2Num
  179. ***********************************************************************************/
  180. int CSQ2Num(char *str)
  181. {
  182. int csq;
  183. csq=atoi(str);
  184. if(csq<0 || csq>99)return 99;
  185. else return csq;
  186. }
  187. /**********************************************************************************
  188. ModemStrCmp
  189. ***********************************************************************************/
  190. int ModemStrCmp(char *msg,char *str)
  191. {
  192. char *p1=str;
  193. char *p2=msg;
  194. while(*p1!=0){
  195. if(*p1!=*p2)return 1;
  196. p1++;
  197. p2++;
  198. }
  199. return 0;
  200. }
  201. /**********************************************************************************
  202. ModemWaitAckMsg
  203. Input:
  204. pATCmd--AT Command string
  205. pAck --期待回的ACK,头相同即可
  206. pMsg --实际消息内容,可能比pAck长
  207. timeout --超时,10ms为单位
  208. Output:
  209. if timeout return 0
  210. else return 1 注意,处理完消息要调用_free_box释放消息
  211. ***********************************************************************************/
  212. int ModemSendAT2WaitAckMsg(char *pATCmd,char *pAck,SUT_MODEM_AT_MSG **pMsg,int timeout)
  213. {
  214. SUT_MODEM_AT_MSG *Msg=&sutAtmPro;
  215. ModemSendAT(pATCmd);
  216. while(timeout){
  217. //if(OS_R_TMO!=os_mbx_wait(AtMsgBox,(void **)&Msg,1)){
  218. if((Msg->MsgLen = MsgQueueAccept(Msg->MsgData,sizeof(Msg->MsgData)))){
  219. //SlwTrace(DEBUG,(char *)Msg->MsgData);
  220. if(0==ModemStrCmp((char *)Msg->MsgData,pAck)){
  221. *pMsg=Msg;
  222. return 1;
  223. }else{
  224. //_free_box(AtMpool,Msg);
  225. }
  226. }else {
  227. timeout--;
  228. os_dly_wait(1);
  229. }
  230. }
  231. return 0;
  232. }
  233. /********************************************
  234. *0x12 --> "12" --> 0x31 0x32
  235. **********************************************/
  236. void HexToAsc(unsigned char Hex,char *pAsc)
  237. {
  238. unsigned char h,l;
  239. l=Hex & 0x0f;
  240. h=Hex >> 4;
  241. if((l>=0)&&(l<=9))l += 0x30;
  242. else if((l>=10)&&(l<=15))l += ('A'-10);
  243. if((h>=0)&&(h<=9))h += 0x30;
  244. else if((h>=10)&&(h<=15))h += ('A'-10);
  245. pAsc[0]=h;
  246. pAsc[1]=l;
  247. }
  248. void HexToStr(unsigned char *HexStr,char *AscStr,unsigned short len)
  249. {
  250. int i,j=0;
  251. for(i=0;i<len;i++)
  252. {
  253. HexToAsc(HexStr[i],&AscStr[j]);
  254. j+=2;
  255. }
  256. }
  257. /***********************************************************************************
  258. *ModemSendUdpData WCDMA没有UDP指令
  259. ************************************************************************************/
  260. int ModemSendUdpData(unsigned char socket,unsigned char *pData,unsigned short len)
  261. {
  262. int i;
  263. char buf[142];
  264. char tmp[5];
  265. unsigned char temp=0;
  266. snprintf(buf, sizeof(buf),"AT+ZIPSENDU=%d,%d\r",socket,len);
  267. ModemSendAT(buf);
  268. ModemSendData(pData,len);
  269. snprintf(buf, sizeof(buf),"UdpSend[%d]",len);
  270. SlwTrace(INF,buf,1);
  271. #ifdef SLW_DEBUG
  272. if(len>45)len=45;
  273. buf[0]='>';buf[1]='>';buf[2]=0;
  274. for(i=0;i<len;i++){
  275. snprintf(tmp, sizeof(tmp),"%02x,",pData[i]);
  276. strcat(buf,tmp);
  277. }
  278. SlwTrace(DEBUG,buf,1);
  279. #endif
  280. return 0;
  281. }
  282. /***********************************************************************************
  283. *StrToNum
  284. ************************************************************************************/
  285. unsigned short StrToNum(char *str)
  286. {
  287. unsigned short num;
  288. if(str[0]>0x2f && str[0]<0x3a){
  289. if(str[1]>0x2f && str[1]<0x3a){
  290. if(str[2]>0x2f && str[2]<0x3a){
  291. if(str[3]>0x2f && str[3]<0x3a){
  292. num=1000*(str[0]-0x30);
  293. num+=100*(str[1]-0x30);
  294. num+=10*(str[2]-0x30);
  295. num+=(str[3]-0x30);
  296. }else{
  297. num=100*(str[0]-0x30);
  298. num+=10*(str[1]-0x30);
  299. num+=(str[2]-0x30);
  300. }
  301. }else{
  302. num=10*(str[0]-0x30);
  303. num+=(str[1]-0x30);
  304. }
  305. }else{
  306. num= str[0]-0x30;
  307. }
  308. }else{
  309. num=0;
  310. }
  311. return num;
  312. }
  313. /***********************************************************************************
  314. *ModemPoweroff
  315. ************************************************************************************/
  316. void ModemPoweroff(void)
  317. {
  318. ModemSendAT("AT+ZPWROFF\r\n");
  319. os_dly_wait(50);
  320. ModemSendAT("AT+ZPWROFF\r\n");
  321. IWDG_ReloadCounter();//喂狗
  322. os_dly_wait(100);
  323. IWDG_ReloadCounter();//喂狗
  324. os_dly_wait(100);
  325. IWDG_ReloadCounter();//喂狗
  326. os_dly_wait(50);
  327. IWDG_ReloadCounter();//喂狗
  328. MODEM_PWRKEY_LOW;
  329. MODEM_RESET_HIGH;
  330. os_dly_wait(10);
  331. MODEM_RESET_LOW;
  332. }
  333. /**********************************************************************************
  334. *ModemSetDTRLow
  335. ***********************************************************************************/
  336. void ModemSetDtrLow(void)
  337. {
  338. GPIO_InitTypeDef GPIO_InitStructure;
  339. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  340. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  341. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  342. GPIO_InitStructure.GPIO_Pin = MODEM_DTR_PIN;
  343. GPIO_Init(MODEM_DTR_PORT, &GPIO_InitStructure);
  344. MODEM_DTR_LOW;
  345. }
  346. /**********************************************************************************
  347. *ModemSetRINGLow
  348. ***********************************************************************************/
  349. void ModemSetRingLow(void)
  350. {
  351. GPIO_InitTypeDef GPIO_InitStructure;
  352. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  353. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  354. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  355. GPIO_InitStructure.GPIO_Pin = MODEM_RING_PIN;
  356. GPIO_Init(MODEM_RING_PORT, &GPIO_InitStructure);
  357. MODEM_RING_LOW;
  358. }
  359. /*******************************************************************
  360. *ModemCheckPocParam
  361. return:
  362. 1--not same, Reset
  363. 0--same,no reset
  364. ********************************************************************/
  365. int ModemCheckPocParam(void)
  366. {
  367. int t,j;
  368. int i,len;
  369. char buf[80];//60
  370. char buf1[130];
  371. char buf2[40];
  372. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  373. RunMake(THIS_FILE_ID);
  374. for(i=0;i<5;i++)
  375. {
  376. ModemSendAT("AT+POC=020000\r\n");
  377. //+POC:0200000069643D3135393930303130313B69703D3235352E3235352E3235352E3235353B7077643D4131303030303542313134313432 len <= 13 + 100
  378. //id=159900101;ip=255.255.255.255;pwd=A100005B114142
  379. t=50;
  380. while(t--)
  381. {
  382. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  383. {
  384. if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:02"))
  385. {
  386. snprintf(buf, sizeof(buf), "id=%lu;",sutProductPara.PSN);
  387. snprintf(buf2, sizeof(buf2), "ip=%s;",sutProductPara.PIP);
  388. strcat(buf, buf2);
  389. snprintf(buf2, sizeof(buf2), "pwd=%s;",sutProductPara.HARDID);
  390. strcat(buf, buf2);
  391. // snprintf(buf2,sizeof(buf2),"domain=%s;",sutProductPara.domain);
  392. // strcat(buf,buf2);
  393. SlwTrace(INF,buf,1);
  394. AscStrToHexStr(buf,buf1);
  395. for(j=0;j<strlen(pMsg->MsgData);j++) if(pMsg->MsgData[j]== '\r') pMsg->MsgData[j] = 0;
  396. if(0!=strcasecmp((char *)&pMsg->MsgData[13],buf1))
  397. {
  398. ModemSendAT("AT+POC=010000");
  399. ModemSendAT(buf1);
  400. ModemSendAT("\r\n");
  401. return 1;
  402. }else return 0;
  403. }
  404. }else os_dly_wait(1);
  405. }
  406. }
  407. return 0;
  408. }
  409. char WaitModemStart(void)
  410. {
  411. int t,i;
  412. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  413. SlwTrace(INF, "WaitModemRun:",0);
  414. for(i=0;i<100;i++)
  415. {
  416. t=50;
  417. ModemSendAT("ATE0\r\n");
  418. while(t--)
  419. {
  420. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  421. {
  422. if(0==ModemStrCmp((char *)pMsg->MsgData,"OK") ||
  423. 0==ModemStrCmp((char *)pMsg->MsgData,"+POC:START"))
  424. {
  425. SlwTrace(INF, "Runing",1);
  426. return 0;
  427. }
  428. }else
  429. os_dly_wait(1);
  430. }
  431. }
  432. SlwTrace(INF, "TimeOut",1);
  433. return 1;
  434. }
  435. void ModemInfo(void)
  436. {
  437. int t;
  438. int i,len,ver,j;
  439. char bufTemp[30],version[10],type,countFlag;
  440. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  441. RunMake(THIS_FILE_ID);
  442. ver=0;
  443. SlwTrace(INF, "[03]ModemInfo:",1);
  444. type=0;
  445. for(i=0;i<10;i++)
  446. {
  447. if(type==0) ModemSendAT("ATI\r\n");//模块型号
  448. else ModemSendAT("AT+LCTSW\r\n");//版本信息
  449. t=50;
  450. while(t--)
  451. {
  452. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  453. {
  454. if(type==0)
  455. {//Manufacturer: LONGSUNG
  456. //Model: U9507C 全网通模块版本
  457. //Model: U9507C_SXNT 单电信模块版本
  458. //Model: U9507C_SXNM 移动联通模块版本
  459. if(0==ModemStrCmp((char *)pMsg->MsgData,"Manufacturer:")) SlwTrace(INF, pMsg->MsgData, 0);
  460. else if(0==ModemStrCmp((char *)pMsg->MsgData,"Model:"))
  461. {
  462. if(0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C_SXNT")|| 0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C SXNT")){
  463. //单电信
  464. support_type=ONLY_Telecom;
  465. }else if(0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C_SXNM")|| 0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C SXNM")){
  466. //移动联通版
  467. support_type=Mobile_unicom;
  468. }else if(0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C")){
  469. support_type=All_Netcom;
  470. //全网通
  471. }else {
  472. //未知
  473. support_type=Un_Known;
  474. }
  475. SlwTrace(INF, pMsg->MsgData, 0);
  476. type ++;
  477. break;
  478. }
  479. }else{
  480. //SoftwareVersion: LLA0029.1.2_M005
  481. //InnerVersion: LLA0029_0016_1.0.57_L0901_EFS2.6
  482. //AP: LLA0029_0016_0.0.57_L0901_M005
  483. if(0==ModemStrCmp((char *)pMsg->MsgData,"SoftwareVersion:")) SlwTrace(INF, pMsg->MsgData, 0);
  484. else if(0==ModemStrCmp((char *)pMsg->MsgData,"AP:"))
  485. {
  486. SlwTrace(INF, pMsg->MsgData, 0);
  487. return;
  488. }
  489. else if(0==ModemStrCmp((char *)pMsg->MsgData,"InnerVersion:"))
  490. {
  491. SlwTrace(INF, pMsg->MsgData, 0);
  492. countFlag=0;
  493. for(j=0;j<strlen(pMsg->MsgData);j++)
  494. {
  495. if(pMsg->MsgData[j] == '_')
  496. {
  497. countFlag++;
  498. if(countFlag == 1)
  499. {
  500. version[0] = pMsg->MsgData[j+3];
  501. version[1] = pMsg->MsgData[j+4];
  502. }else if(countFlag == 3)
  503. {
  504. version[2] = pMsg->MsgData[j+2];
  505. version[3] = pMsg->MsgData[j+3];
  506. version[4] = pMsg->MsgData[j+4];
  507. version[5] = pMsg->MsgData[j+5];
  508. version[6] = 0;
  509. snprintf(bufTemp, sizeof(bufTemp), "[03]ModemVer:%s",version);
  510. SlwTrace(INF, bufTemp, 1);
  511. g_iModemVer=atoi(version);
  512. }
  513. }
  514. }
  515. }
  516. }
  517. }else os_dly_wait(1);
  518. }
  519. }
  520. }
  521. int ModemGetIMEI(void)
  522. {
  523. int t,j;
  524. int i,len;
  525. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  526. for(i=0;i<50;i++){
  527. ModemSendAT("AT+GSN\r\n");//0x80DA219D
  528. //862015030301209 两种情况都会返回
  529. t=50;
  530. while(t--)
  531. {
  532. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  533. {
  534. len=strlen((char *)&(pMsg->MsgData));
  535. if(0==ModemStrCmp((char *)pMsg->MsgData,"0x"))
  536. {
  537. len -=4;
  538. memcpy(sutProductPara.HARDID, &pMsg->MsgData[2], len);
  539. if(len < sizeof(sutProductPara.HARDID))
  540. sutProductPara.HARDID[len]=0;
  541. return 1;
  542. }else if(len == 17)
  543. {
  544. len -= 2;
  545. memcpy(sutProductPara.HARDID, pMsg->MsgData, len);
  546. if(len < sizeof(sutProductPara.HARDID))
  547. sutProductPara.HARDID[len]=0;
  548. return 2;
  549. }
  550. }else
  551. os_dly_wait(1);
  552. }
  553. }
  554. return 0;
  555. }
  556. void ModemPocVersionCheck(void)
  557. {
  558. char bufTemp[40];
  559. short t,i,len,ver,j;
  560. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  561. for(i=0;i<5;i++)
  562. {
  563. t=50;
  564. ModemSendAT("AT+POC_VER?\r\n");
  565. while(t--)
  566. {
  567. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  568. {
  569. if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC_VER:"))
  570. {
  571. len = strlen(pMsg->MsgData);
  572. j=0;
  573. for(i=0;i<len;i++)
  574. {
  575. if(pMsg->MsgData[i] == '\r')
  576. {
  577. bufTemp[j]=0;
  578. ver=atoi(bufTemp);
  579. snprintf(bufTemp, sizeof(bufTemp),"[04]POCver:%d<->%s", ver,pMsg->MsgData);
  580. SlwTrace(INF, bufTemp,0);
  581. g_iPocVer=ver;
  582. return;
  583. }else if(pMsg->MsgData[i] >= '0' && pMsg->MsgData[i] <= '9') bufTemp[j++]=pMsg->MsgData[i];
  584. }
  585. }
  586. }else
  587. os_dly_wait(1);
  588. }
  589. }
  590. snprintf(bufTemp, sizeof(bufTemp),"[04]PocVer=%d", ver);
  591. SlwTrace(INF, bufTemp, 1);
  592. }
  593. void ModemApnConfig(void)
  594. {
  595. char buf[100],index;
  596. char buf2[80];
  597. char i,t;
  598. char ApnSetFlag=0;
  599. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  600. snprintf(buf, sizeof(buf), "[11]Accessp:");
  601. if(sutProductPara.APNApn[0]==0)
  602. {//接入点为空时不配置,因为模块不支持
  603. strcat(buf, "unsupport-Empty");
  604. }else
  605. {
  606. snprintf(buf2, sizeof(buf2), "AT+MIPPROFILE=1,\"%s\"\r\n",sutProductPara.APNApn);
  607. ModemSendAT(buf2);
  608. snprintf(buf2, sizeof(buf2), "%s",sutProductPara.APNApn);
  609. strcat(buf,buf2);
  610. }
  611. SlwTrace(INF,buf,1);
  612. snprintf(buf, sizeof(buf), ",Name-Pass:");
  613. if(sutProductPara.APNName[0] ==0 ||
  614. sutProductPara.APNPass[0] ==0)
  615. {//名称或密码为空不配置,因为模块不支持
  616. strcat(buf, "unsupport-Empty");
  617. }else
  618. {
  619. snprintf(buf2, sizeof(buf2),"AT^PPPCFG=\"%s\",\"%s\"\r\n",sutProductPara.APNName,sutProductPara.APNPass);
  620. ModemSendAT(buf2);
  621. SlwTrace(INF,buf2,0);
  622. snprintf(buf, sizeof(buf), "^PPPCFG:\"%s\",\"%s\"",sutProductPara.APNName,sutProductPara.APNPass);
  623. for(i=0;i<5;i++)
  624. {
  625. t=50;
  626. ModemSendAT("at^pppcfg\r\n");
  627. while(t--)
  628. {
  629. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  630. {
  631. if(0==ModemStrCmp((char *)pMsg->MsgData,buf))
  632. {
  633. ApnSetFlag=1;
  634. break;
  635. }else{
  636. if(t==0)ModemSendAT(buf2);
  637. }
  638. }else
  639. os_dly_wait(1);
  640. }
  641. }
  642. if(ApnSetFlag==1){
  643. SlwTrace(INF,"PPPCFG is OK",1);
  644. }else
  645. SlwTrace(INF,"PPPCFG is failed",1);
  646. ApnSetFlag=0;
  647. memset(buf,0,sizeof(buf));
  648. memset(buf2,0,sizeof(buf2));
  649. if(sutProductPara.ApnAuthType!=0){
  650. snprintf(buf2, sizeof(buf2),"AT$QCPDPP=1,%d,%s,%s\r\n",sutProductPara.ApnAuthType,sutProductPara.APNPass,sutProductPara.APNName);
  651. ModemSendAT(buf2);
  652. SlwTrace(INF,buf2,0);
  653. snprintf(buf, sizeof(buf), "$QCPDPP: 1,%d,\"%s\"",sutProductPara.ApnAuthType,sutProductPara.APNName);
  654. for(i=0;i<5;i++)
  655. {
  656. t=50;
  657. ModemSendAT("AT$QCPDPP?\r\n");
  658. while(t--)
  659. {
  660. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  661. {
  662. if(0==ModemStrCmp((char *)pMsg->MsgData,buf))
  663. {
  664. ApnSetFlag=1;
  665. break;
  666. }else
  667. {
  668. if(t==0)ModemSendAT(buf2);
  669. // break;
  670. }
  671. }else
  672. os_dly_wait(1);
  673. }
  674. }
  675. if(ApnSetFlag==1){
  676. SlwTrace(INF,"QCPDPP is OK",1);
  677. }else
  678. SlwTrace(INF,"QCPDPP is failed",1);
  679. }else
  680. {
  681. for(i=0;i<3;i++){
  682. snprintf(buf2, sizeof(buf2),"AT$QCPDPP=1,%d\r\n",sutProductPara.ApnAuthType);
  683. ModemSendAT(buf2);
  684. os_dly_wait(30);
  685. }
  686. }
  687. }
  688. }
  689. void M9507CSendTcpData(unsigned char socket, unsigned char *pData, unsigned short len)
  690. {
  691. char buf[20];
  692. snprintf(buf, sizeof(buf), "AT+TCPSEND=%d,%d,",socket, len);
  693. ModemSendAT(buf);
  694. ModemSendData(pData, len);
  695. ModemSendAT("\r\n");
  696. }
  697. void ModemSetSpeed(void)
  698. {
  699. char i,t;
  700. int Volume;
  701. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  702. for(i=0;i<5;i++)
  703. {
  704. t=50;
  705. REGO:
  706. ModemSendAT("AT+LSHTTSSPEED?\r\n");
  707. while(t--)
  708. {
  709. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  710. {
  711. if(0==ModemStrCmp((char *)pMsg->MsgData,"+LSHTTSSPEED:"))
  712. {
  713. Volume=atoi(&pMsg->MsgData[13]);
  714. if(7000 != Volume)
  715. {
  716. ModemSendAT("AT+LSHTTSSPEED=-1,7000\r\n");
  717. os_dly_wait(1);
  718. goto REGO;
  719. }
  720. else
  721. {
  722. SlwTrace(INF, "[06]SetTTS Speed Ok",1);
  723. return;
  724. }
  725. }
  726. }else
  727. os_dly_wait(1);
  728. }
  729. }
  730. SlwTrace(INF, "[06]SetTTS Speed Failed",1);
  731. }
  732. void VolumeSet(void)
  733. {
  734. char i,t;
  735. int Volume;
  736. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  737. if(sutProductPara.SoundMode==0)
  738. {
  739. //先配置一次,再查,因为默认就查有可能是没有返回的
  740. ModemSendAT("at+syscmd=start_pcm volume 7 5\r\n");//TTS 音量/ MIC 输入音量
  741. for(i=0;i<10;i++)
  742. {
  743. t=100;
  744. REGO:
  745. ModemSendAT("at+syscmd=start_pcm volume\r\n");
  746. while(t--)
  747. {
  748. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  749. {
  750. if(0==ModemStrCmp((char *)pMsg->MsgData,"7 5"))
  751. {
  752. SlwTrace(INF, "[07]Set Volume ok",1);
  753. return;
  754. }else{
  755. if(t==0) ModemSendAT("at+syscmd=start_pcm volume 7 5\r\n");
  756. }
  757. }else
  758. os_dly_wait(1);
  759. }
  760. }
  761. }else{
  762. //先配置一次,再查,因为默认就查有可能是没有返回的
  763. ModemSendAT("at+syscmd=start_pcm volume 7 7\r\n");//TTS 音量/ MIC 输入音量
  764. for(i=0;i<10;i++)
  765. {
  766. t=100;
  767. ModemSendAT("at+syscmd=start_pcm volume\r\n");
  768. while(t--)
  769. {
  770. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  771. {
  772. if(0==ModemStrCmp((char *)pMsg->MsgData,"7 7"))
  773. {
  774. SlwTrace(INF, "[07]Set Volume ok",1);
  775. return;
  776. }else{
  777. if(t==0) ModemSendAT("at+syscmd=start_pcm volume 7 7\r\n");
  778. }
  779. }else
  780. os_dly_wait(1);
  781. }
  782. }
  783. }
  784. SlwTrace(INF, "[07]Set Volume failed",1);
  785. }
  786. void SpeakTTSVoice(void)
  787. {
  788. int len,timeout;
  789. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  790. if(sysStartTTS[0]==0) return;
  791. len=strlen(sysStartTTS);
  792. len = len+(8-len%8);//8倍数
  793. timeout=len/8;//两个中文需要播报1秒算
  794. timeout *= 100;
  795. MeSpeak(ENCODE_UNICODE, sysStartTTS,0);
  796. while(timeout--)
  797. {
  798. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  799. {
  800. if(0==ModemStrCmp((char *)pMsg->MsgData,"+LSHTTS: END"))
  801. {
  802. SpeakerCtrl(0);
  803. return;
  804. }
  805. }else os_dly_wait(1);
  806. }
  807. SpeakerCtrl(0);
  808. }
  809. void ServerTimeGet(void)
  810. {
  811. static unsigned short timeCnt=12000;
  812. if(++timeCnt < 12000) return;
  813. timeCnt=0;
  814. ModemSendAT("AT+CCLK?\r\n");
  815. }
  816. //total 成员总数
  817. //一次获取个数最多5个,取决于显示条目个数
  818. //前提是要使用简短模式
  819. void SimpleUserInfoScan(uint8_t firstIn,uint8_t direction)
  820. {
  821. uint16_t i;
  822. uint16_t timeout;
  823. char buf[30];
  824. uint16_t thisStartIndex;
  825. uint8_t readNum;
  826. if(firstIn) sutPocStatus.handleIndex=0;
  827. ShowMessageBox("请稍候...");
  828. os_dly_wait(1);
  829. snprintf(buf, sizeof(buf),"AT+POC=0E0000%08x\r\n",sutPocStatus.LocalGroup.ID);//先更新总数
  830. ModemSendAT(buf);
  831. SlwTrace(INF,buf,0);
  832. timeout=1000;
  833. sutPocStatus.UserNum_Update=0;
  834. sutPocStatus.UserOnLineNum=0;
  835. while(timeout)
  836. {
  837. timeout--;
  838. OsDelayTime(1);
  839. if(sutPocStatus.UserNum_Update) break;
  840. if(timeout % 200 == 0)
  841. ModemSendAT(buf);
  842. }
  843. if(sutPocStatus.UserOnLineNum<=0) {
  844. sutPocStatus.FillUserIndex=0;
  845. goto QUIT_FUNCTION;
  846. }
  847. if(sutPocStatus.handleIndex >= sutPocStatus.UserOnLineNum)
  848. {
  849. snprintf(buf, sizeof(buf), "over:%d",sutPocStatus.handleIndex);
  850. SlwTrace(INF, buf, 1);
  851. sutPocStatus.handleIndex=sutPocStatus.UserOnLineNum-1;
  852. }
  853. //然后根据最新总数来获取每个成员信息
  854. if(direction==1)//递增索引
  855. {
  856. thisStartIndex=sutPocStatus.handleIndex;
  857. if(sutPocStatus.UserOnLineNum-thisStartIndex>=5) readNum=5;
  858. else readNum=sutPocStatus.UserOnLineNum-thisStartIndex;
  859. }else{//递减索引
  860. if(sutPocStatus.handleIndex <5)
  861. {
  862. thisStartIndex=0;
  863. readNum=sutPocStatus.UserOnLineNum;
  864. }
  865. else
  866. {
  867. thisStartIndex=sutPocStatus.handleIndex-5;
  868. readNum=5;
  869. }
  870. }
  871. if(readNum >= 5) readNum=5;
  872. sutPocStatus.FillUserIndex=0;
  873. for(i=thisStartIndex;i<(thisStartIndex+readNum);i++)
  874. {
  875. sutPocStatus.GetOneUserFlag=0;
  876. snprintf(buf, sizeof(buf), "AT+POC=10000021%04x\r\n",i);
  877. ModemSendAT(buf);
  878. SlwTrace(INF, buf,0);
  879. timeout=200;
  880. while(1)
  881. {
  882. OsDelayTime(1);
  883. if(sutPocStatus.GetOneUserFlag)
  884. {
  885. sutPocStatus.FillUserIndex++;
  886. break;
  887. }
  888. if(--timeout==0) break;
  889. }
  890. }
  891. if(direction==1) sutPocStatus.handleIndex += readNum;
  892. else sutPocStatus.handleIndex -= readNum;
  893. //最终成功读了多少个回来,存在sutPocStatus.FillUserIndex中
  894. QUIT_FUNCTION:
  895. GuiClearRect(0, 40, LCD_WIDTH-1, LCD_HEIGHT-32);
  896. }
  897. void SetModemPocSimpleMode(void)
  898. {//设置使用简短模式获取成员信息
  899. short t,i;
  900. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  901. for(i=0;i<5;i++)
  902. {
  903. t=50;
  904. ModemSendAT("AT+POC=10000020\r\n");
  905. while(t--)
  906. {
  907. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  908. {
  909. if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:10000000"))
  910. {
  911. SlwTrace(INF, "[14]SimpleMode_Ok",1);
  912. return;
  913. }
  914. }else
  915. os_dly_wait(1);
  916. }
  917. }
  918. SlwTrace(INF, "[14]SimpleMode_Tout",1);
  919. }
  920. char GetUniStringByID(char *HardIDString)
  921. {//输出15个字节的字符串
  922. unsigned char id[12];
  923. unsigned char string[16];
  924. long long temp;
  925. short i;
  926. unsigned char seed;
  927. if(HardIDString == '\0') return 0;
  928. GetSTM32ID(id);
  929. printf("STM32 ID==");
  930. for(i=0;i<12;i++)printf("%02x",id[i]);
  931. printf("\r\n");
  932. for(i=5;i>=0;i--){
  933. temp <<=8;
  934. temp |= id[i];
  935. }
  936. temp &= 0xffffffffffff;
  937. printf("temp=%015llu\r\n",temp);
  938. snprintf(string,sizeof(string),"%015llu",temp);
  939. for(i=0;i<15;i++) HardIDString[i]=string[i];
  940. HardIDString[15]='\0';
  941. //snprintf(HardIDString,16,"%015llu",temp);
  942. return 1;
  943. }
  944. //检查并设置POC域名
  945. int ModemCheckFotaDomain(void)
  946. {
  947. int t,j;
  948. int i,len;
  949. char buf1[130];
  950. char buf2[40];
  951. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  952. RunMake(THIS_FILE_ID);
  953. for(i=0;i<5;i++)
  954. {
  955. ModemSendAT("AT+POC=21000000\r\n");
  956. t=50;
  957. while(t--)
  958. {
  959. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  960. {
  961. if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:21000000"))
  962. {
  963. snprintf(buf2,sizeof(buf2),"%s",sutProductPara.fota_pocdomain);
  964. //strcat(buf,buf2);
  965. for(j=0;j<strlen(pMsg->MsgData);j++) if(pMsg->MsgData[j]== '\r') pMsg->MsgData[j] = 0;
  966. if(0!=strcasecmp((char *)&pMsg->MsgData[13],buf2))
  967. {
  968. snprintf(buf1,sizeof(buf1),"AT+POC=21000001%s",buf1);
  969. return 1;
  970. }else return 0;
  971. }
  972. }else os_dly_wait(1);
  973. }
  974. }
  975. return 0;
  976. }
  977. int htoi(char s[])
  978. {
  979. int i = 0;
  980. int n = 0;
  981. if (s[0] == '0' && (s[1]=='x' || s[1]=='X'))
  982. {
  983. i = 2;
  984. }
  985. else
  986. {
  987. i = 0;
  988. }
  989. for (; (s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z') || (s[i] >='A' && s[i] <= 'Z');++i)
  990. {
  991. if (tolower(s[i]) > '9')
  992. {
  993. n = 16 * n + (10 + tolower(s[i]) - 'a');
  994. }
  995. else
  996. {
  997. n = 16 * n + (tolower(s[i]) - '0');
  998. }
  999. }
  1000. return n;
  1001. }
  1002. int ModemSetCodec(unsigned char addr,unsigned short value)
  1003. {
  1004. int t,j;
  1005. int i,len;
  1006. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  1007. char buf[50];
  1008. sprintf(buf,"AT+CODEC=3,%2x,%4x\r\n",addr,value);
  1009. // SlwTrace(INF,buf,1);
  1010. ModemSendAT(buf);
  1011. for(i=0;i<10;i++){
  1012. t=20;
  1013. sprintf(buf,"AT+CODEC=3,%2x\r\n",addr);
  1014. // SlwTrace(INF,buf,1);
  1015. ModemSendAT(buf);
  1016. while(t--)
  1017. {
  1018. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  1019. {
  1020. len=strlen((char *)&(pMsg->MsgData));
  1021. if(0==ModemStrCmp((char *)pMsg->MsgData,"+CODEC:"))
  1022. {
  1023. //SlwTrace(INF,(char *)pMsg->MsgData,1);
  1024. if(value == htoi(&pMsg->MsgData[7]))return 0;
  1025. }else{
  1026. if(t==0) {
  1027. sprintf(buf,"AT+CODEC=3,%2x,%4x\r\n",addr,value);
  1028. // SlwTrace(INF,buf,1);
  1029. ModemSendAT(buf);
  1030. }
  1031. }
  1032. }else os_dly_wait(1);
  1033. }
  1034. }
  1035. return addr;
  1036. }
  1037. /***********************************************************************************/