Modem.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032
  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. //等待模块开机并能接受AT命令
  172. if(WaitModemStart())return 0;
  173. return 1;
  174. //ModemGetIMEI();
  175. }
  176. /**********************************************************************************
  177. CSQ2Num
  178. ***********************************************************************************/
  179. int CSQ2Num(char *str)
  180. {
  181. int csq;
  182. csq=atoi(str);
  183. if(csq<0 || csq>99)return 99;
  184. else return csq;
  185. }
  186. /**********************************************************************************
  187. ModemStrCmp
  188. ***********************************************************************************/
  189. int ModemStrCmp(char *msg,char *str)
  190. {
  191. char *p1=str;
  192. char *p2=msg;
  193. while(*p1!=0){
  194. if(*p1!=*p2)return 1;
  195. p1++;
  196. p2++;
  197. }
  198. return 0;
  199. }
  200. /**********************************************************************************
  201. ModemWaitAckMsg
  202. Input:
  203. pATCmd--AT Command string
  204. pAck --期待回的ACK,头相同即可
  205. pMsg --实际消息内容,可能比pAck长
  206. timeout --超时,10ms为单位
  207. Output:
  208. if timeout return 0
  209. else return 1 注意,处理完消息要调用_free_box释放消息
  210. ***********************************************************************************/
  211. int ModemSendAT2WaitAckMsg(char *pATCmd,char *pAck,SUT_MODEM_AT_MSG **pMsg,int timeout)
  212. {
  213. SUT_MODEM_AT_MSG *Msg=&sutAtmPro;
  214. ModemSendAT(pATCmd);
  215. while(timeout){
  216. //if(OS_R_TMO!=os_mbx_wait(AtMsgBox,(void **)&Msg,1)){
  217. if((Msg->MsgLen = MsgQueueAccept(Msg->MsgData,sizeof(Msg->MsgData)))){
  218. //SlwTrace(DEBUG,(char *)Msg->MsgData);
  219. if(0==ModemStrCmp((char *)Msg->MsgData,pAck)){
  220. *pMsg=Msg;
  221. return 1;
  222. }else{
  223. //_free_box(AtMpool,Msg);
  224. }
  225. }else {
  226. timeout--;
  227. os_dly_wait(1);
  228. }
  229. }
  230. return 0;
  231. }
  232. /********************************************
  233. *0x12 --> "12" --> 0x31 0x32
  234. **********************************************/
  235. void HexToAsc(unsigned char Hex,char *pAsc)
  236. {
  237. unsigned char h,l;
  238. l=Hex & 0x0f;
  239. h=Hex >> 4;
  240. if((l>=0)&&(l<=9))l += 0x30;
  241. else if((l>=10)&&(l<=15))l += ('A'-10);
  242. if((h>=0)&&(h<=9))h += 0x30;
  243. else if((h>=10)&&(h<=15))h += ('A'-10);
  244. pAsc[0]=h;
  245. pAsc[1]=l;
  246. }
  247. void HexToStr(unsigned char *HexStr,char *AscStr,unsigned short len)
  248. {
  249. int i,j=0;
  250. for(i=0;i<len;i++)
  251. {
  252. HexToAsc(HexStr[i],&AscStr[j]);
  253. j+=2;
  254. }
  255. }
  256. /***********************************************************************************
  257. *ModemSendUdpData WCDMA没有UDP指令
  258. ************************************************************************************/
  259. int ModemSendUdpData(unsigned char socket,unsigned char *pData,unsigned short len)
  260. {
  261. int i;
  262. char buf[142];
  263. char tmp[5];
  264. unsigned char temp=0;
  265. snprintf(buf, sizeof(buf),"AT+ZIPSENDU=%d,%d\r",socket,len);
  266. ModemSendAT(buf);
  267. ModemSendData(pData,len);
  268. snprintf(buf, sizeof(buf),"UdpSend[%d]",len);
  269. SlwTrace(INF,buf,1);
  270. #ifdef SLW_DEBUG
  271. if(len>45)len=45;
  272. buf[0]='>';buf[1]='>';buf[2]=0;
  273. for(i=0;i<len;i++){
  274. snprintf(tmp, sizeof(tmp),"%02x,",pData[i]);
  275. strcat(buf,tmp);
  276. }
  277. SlwTrace(DEBUG,buf,1);
  278. #endif
  279. return 0;
  280. }
  281. /***********************************************************************************
  282. *StrToNum
  283. ************************************************************************************/
  284. unsigned short StrToNum(char *str)
  285. {
  286. unsigned short num;
  287. if(str[0]>0x2f && str[0]<0x3a){
  288. if(str[1]>0x2f && str[1]<0x3a){
  289. if(str[2]>0x2f && str[2]<0x3a){
  290. if(str[3]>0x2f && str[3]<0x3a){
  291. num=1000*(str[0]-0x30);
  292. num+=100*(str[1]-0x30);
  293. num+=10*(str[2]-0x30);
  294. num+=(str[3]-0x30);
  295. }else{
  296. num=100*(str[0]-0x30);
  297. num+=10*(str[1]-0x30);
  298. num+=(str[2]-0x30);
  299. }
  300. }else{
  301. num=10*(str[0]-0x30);
  302. num+=(str[1]-0x30);
  303. }
  304. }else{
  305. num= str[0]-0x30;
  306. }
  307. }else{
  308. num=0;
  309. }
  310. return num;
  311. }
  312. /***********************************************************************************
  313. *ModemPoweroff
  314. ************************************************************************************/
  315. void ModemPoweroff(void)
  316. {
  317. ModemSendAT("AT+ZPWROFF\r\n");
  318. os_dly_wait(50);
  319. ModemSendAT("AT+ZPWROFF\r\n");
  320. IWDG_ReloadCounter();//喂狗
  321. os_dly_wait(100);
  322. IWDG_ReloadCounter();//喂狗
  323. os_dly_wait(100);
  324. IWDG_ReloadCounter();//喂狗
  325. os_dly_wait(50);
  326. IWDG_ReloadCounter();//喂狗
  327. MODEM_PWRKEY_LOW;
  328. MODEM_RESET_HIGH;
  329. os_dly_wait(10);
  330. MODEM_RESET_LOW;
  331. }
  332. /**********************************************************************************
  333. *ModemSetDTRLow
  334. ***********************************************************************************/
  335. void ModemSetDtrLow(void)
  336. {
  337. GPIO_InitTypeDef GPIO_InitStructure;
  338. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  339. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  340. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  341. GPIO_InitStructure.GPIO_Pin = MODEM_DTR_PIN;
  342. GPIO_Init(MODEM_DTR_PORT, &GPIO_InitStructure);
  343. MODEM_DTR_LOW;
  344. }
  345. /**********************************************************************************
  346. *ModemSetRINGLow
  347. ***********************************************************************************/
  348. void ModemSetRingLow(void)
  349. {
  350. GPIO_InitTypeDef GPIO_InitStructure;
  351. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  352. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  353. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  354. GPIO_InitStructure.GPIO_Pin = MODEM_RING_PIN;
  355. GPIO_Init(MODEM_RING_PORT, &GPIO_InitStructure);
  356. MODEM_RING_LOW;
  357. }
  358. /*******************************************************************
  359. *ModemCheckPocParam
  360. return:
  361. 1--not same, Reset
  362. 0--same,no reset
  363. ********************************************************************/
  364. int ModemCheckPocParam(void)
  365. {
  366. int t,j;
  367. int i,len;
  368. char buf[60];
  369. char buf1[130];
  370. char buf2[40];
  371. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  372. RunMake(THIS_FILE_ID);
  373. for(i=0;i<5;i++)
  374. {
  375. ModemSendAT("AT+POC=020000\r\n");
  376. //+POC:0200000069643D3135393930303130313B69703D3235352E3235352E3235352E3235353B7077643D4131303030303542313134313432 len <= 13 + 100
  377. //id=159900101;ip=255.255.255.255;pwd=A100005B114142
  378. t=50;
  379. while(t--)
  380. {
  381. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  382. {
  383. if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:02"))
  384. {
  385. snprintf(buf, sizeof(buf), "id=%lu;",sutProductPara.PSN);
  386. if(sutProductPara.Ipselect==0){ snprintf(buf2, sizeof(buf2), "ip=%s;",sutProductPara.PIP);}
  387. else snprintf(buf2, sizeof(buf2), "ip=%s;",sutProductPara.PIP2);
  388. strcat(buf, buf2);
  389. snprintf(buf2, sizeof(buf2), "pwd=%s;",sutProductPara.HARDID);
  390. strcat(buf, buf2);
  391. AscStrToHexStr(buf,buf1);
  392. for(j=0;j<strlen(pMsg->MsgData);j++) if(pMsg->MsgData[j]== '\r') pMsg->MsgData[j] = 0;
  393. if(0!=strcasecmp((char *)&pMsg->MsgData[13],buf1))
  394. {
  395. ModemSendAT("AT+POC=010000");
  396. ModemSendAT(buf1);
  397. ModemSendAT("\r\n");
  398. return 1;
  399. }else return 0;
  400. }
  401. }else os_dly_wait(1);
  402. }
  403. }
  404. return 0;
  405. }
  406. char WaitModemStart(void)
  407. {
  408. int t,i;
  409. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  410. SlwTrace(INF, "WaitModemRun:",0);
  411. for(i=0;i<100;i++)
  412. {
  413. t=50;
  414. ModemSendAT("ATE0\r\n");
  415. while(t--)
  416. {
  417. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  418. {
  419. if(0==ModemStrCmp((char *)pMsg->MsgData,"OK") ||
  420. 0==ModemStrCmp((char *)pMsg->MsgData,"+POC:START"))
  421. {
  422. SlwTrace(INF, "Runing",1);
  423. return 0;
  424. }
  425. }else
  426. os_dly_wait(1);
  427. }
  428. }
  429. SlwTrace(INF, "TimeOut",1);
  430. return 1;
  431. }
  432. void ModemInfo(void)
  433. {
  434. int t;
  435. int i,len,ver,j;
  436. char bufTemp[30],version[10],type,countFlag;
  437. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  438. RunMake(THIS_FILE_ID);
  439. ver=0;
  440. SlwTrace(INF, "[03]ModemInfo:",1);
  441. type=0;
  442. for(i=0;i<10;i++)
  443. {
  444. if(type==0) ModemSendAT("ATI\r\n");//模块型号
  445. else ModemSendAT("AT+LCTSW\r\n");//版本信息
  446. t=50;
  447. while(t--)
  448. {
  449. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  450. {
  451. if(type==0)
  452. {//Manufacturer: LONGSUNG
  453. //Model: U9507C 全网通模块版本
  454. //Model: U9507C_SXNT 单电信模块版本
  455. //Model: U9507C_SXNM 移动联通模块版本
  456. if(0==ModemStrCmp((char *)pMsg->MsgData,"Manufacturer:")) SlwTrace(INF, pMsg->MsgData, 0);
  457. else if(0==ModemStrCmp((char *)pMsg->MsgData,"Model:"))
  458. {
  459. if(0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C_SXNT")){
  460. //单电信
  461. support_type=ONLY_Telecom;
  462. }else if(0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C_SXNM")){
  463. //移动联通版
  464. support_type=Mobile_unicom;
  465. }else if(0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C")){
  466. support_type=All_Netcom;
  467. //全网通
  468. }else {
  469. //未知
  470. support_type=Un_Known;
  471. }
  472. SlwTrace(INF, pMsg->MsgData, 0);
  473. type ++;
  474. break;
  475. }
  476. }else{
  477. //SoftwareVersion: LLA0029.1.2_M005
  478. //InnerVersion: LLA0029_0016_1.0.57_L0901_EFS2.6
  479. //AP: LLA0029_0016_0.0.57_L0901_M005
  480. if(0==ModemStrCmp((char *)pMsg->MsgData,"SoftwareVersion:")) SlwTrace(INF, pMsg->MsgData, 0);
  481. else if(0==ModemStrCmp((char *)pMsg->MsgData,"AP:"))
  482. {
  483. SlwTrace(INF, pMsg->MsgData, 0);
  484. return;
  485. }
  486. else if(0==ModemStrCmp((char *)pMsg->MsgData,"InnerVersion:"))
  487. {
  488. SlwTrace(INF, pMsg->MsgData, 0);
  489. countFlag=0;
  490. for(j=0;j<strlen(pMsg->MsgData);j++)
  491. {
  492. if(pMsg->MsgData[j] == '_')
  493. {
  494. countFlag++;
  495. if(countFlag == 1)
  496. {
  497. version[0] = pMsg->MsgData[j+3];
  498. version[1] = pMsg->MsgData[j+4];
  499. }else if(countFlag == 3)
  500. {
  501. version[2] = pMsg->MsgData[j+2];
  502. version[3] = pMsg->MsgData[j+3];
  503. version[4] = pMsg->MsgData[j+4];
  504. version[5] = pMsg->MsgData[j+5];
  505. version[6] = 0;
  506. snprintf(bufTemp, sizeof(bufTemp), "[03]ModemVer:%s",version);
  507. SlwTrace(INF, bufTemp, 1);
  508. g_iModemVer=atoi(version);
  509. }
  510. }
  511. }
  512. }
  513. }
  514. }else os_dly_wait(1);
  515. }
  516. }
  517. }
  518. int ModemGetIMEI(void)
  519. {
  520. int t,j;
  521. int i,len;
  522. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  523. for(i=0;i<50;i++){
  524. ModemSendAT("AT+GSN\r\n");//0x80DA219D
  525. //862015030301209 两种情况都会返回
  526. t=50;
  527. while(t--)
  528. {
  529. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  530. {
  531. len=strlen((char *)&(pMsg->MsgData));
  532. if(0==ModemStrCmp((char *)pMsg->MsgData,"0x"))
  533. {
  534. len -=4;
  535. memcpy(sutProductPara.HARDID, &pMsg->MsgData[2], len);
  536. if(len < sizeof(sutProductPara.HARDID))
  537. sutProductPara.HARDID[len]=0;
  538. return 1;
  539. }else if(len == 17)
  540. {
  541. len -= 2;
  542. memcpy(sutProductPara.HARDID, pMsg->MsgData, len);
  543. if(len < sizeof(sutProductPara.HARDID))
  544. sutProductPara.HARDID[len]=0;
  545. return 2;
  546. }
  547. }else
  548. os_dly_wait(1);
  549. }
  550. }
  551. return 0;
  552. }
  553. void ModemPocVersionCheck(void)
  554. {
  555. char bufTemp[40];
  556. short t,i,len,ver,j;
  557. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  558. for(i=0;i<5;i++)
  559. {
  560. t=50;
  561. ModemSendAT("AT+POC_VER?\r\n");
  562. while(t--)
  563. {
  564. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  565. {
  566. if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC_VER:"))
  567. {
  568. len = strlen(pMsg->MsgData);
  569. j=0;
  570. for(i=0;i<len;i++)
  571. {
  572. if(pMsg->MsgData[i] == '\r')
  573. {
  574. bufTemp[j]=0;
  575. ver=atoi(bufTemp);
  576. snprintf(bufTemp, sizeof(bufTemp),"[04]POCver:%d<->%s", ver,pMsg->MsgData);
  577. SlwTrace(INF, bufTemp,0);
  578. g_iPocVer=ver;
  579. return;
  580. }else if(pMsg->MsgData[i] >= '0' && pMsg->MsgData[i] <= '9') bufTemp[j++]=pMsg->MsgData[i];
  581. }
  582. }
  583. }else
  584. os_dly_wait(1);
  585. }
  586. }
  587. snprintf(bufTemp, sizeof(bufTemp),"[04]PocVer=%d", ver);
  588. SlwTrace(INF, bufTemp, 1);
  589. }
  590. void ModemApnConfig(void)
  591. {
  592. char buf[100],index;
  593. char buf2[80];
  594. char i;
  595. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  596. snprintf(buf, sizeof(buf), "[11]Accessp:");
  597. if(sutProductPara.APNApn[0]==0)
  598. {//接入点为空时不配置,因为模块不支持
  599. strcat(buf, "unsupport-Empty");
  600. }else
  601. {
  602. snprintf(buf2, sizeof(buf2), "AT+MIPPROFILE=1,\"%s\"\r\n",sutProductPara.APNApn);
  603. ModemSendAT(buf2);
  604. snprintf(buf2, sizeof(buf2), "%s",sutProductPara.APNApn);
  605. strcat(buf,buf2);
  606. }
  607. SlwTrace(INF,buf,0);
  608. snprintf(buf, sizeof(buf), ",Name-Pass:");
  609. if(sutProductPara.APNName[0] ==0 ||
  610. sutProductPara.APNPass[0] ==0)
  611. {//名称或密码为空不配置,因为模块不支持
  612. strcat(buf, "unsupport-Empty");
  613. }else
  614. {
  615. snprintf(buf2, sizeof(buf2),"AT^PPPCFG=\"%s\",\"%s\"\r\n",sutProductPara.APNName,sutProductPara.APNPass);
  616. ModemSendAT(buf2);
  617. snprintf(buf2, sizeof(buf2), "%s,%s",sutProductPara.APNName,sutProductPara.APNPass);
  618. strcat(buf,buf2);
  619. }
  620. SlwTrace(INF,buf,1);
  621. }
  622. void M9507CSendTcpData(unsigned char socket, unsigned char *pData, unsigned short len)
  623. {
  624. char buf[20];
  625. snprintf(buf, sizeof(buf), "AT+TCPSEND=%d,%d,",socket, len);
  626. ModemSendAT(buf);
  627. ModemSendData(pData, len);
  628. ModemSendAT("\r\n");
  629. }
  630. void ModemSetSpeed(void)
  631. {
  632. char i,t;
  633. int Volume;
  634. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  635. for(i=0;i<5;i++)
  636. {
  637. t=50;
  638. REGO:
  639. ModemSendAT("AT+LSHTTSSPEED?\r\n");
  640. while(t--)
  641. {
  642. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  643. {
  644. if(0==ModemStrCmp((char *)pMsg->MsgData,"+LSHTTSSPEED:"))
  645. {
  646. Volume=atoi(&pMsg->MsgData[13]);
  647. if(7000 != Volume)
  648. {
  649. ModemSendAT("AT+LSHTTSSPEED=-1,7000\r\n");
  650. os_dly_wait(1);
  651. goto REGO;
  652. }
  653. else
  654. {
  655. SlwTrace(INF, "[06]SetTTS Speed Ok",1);
  656. return;
  657. }
  658. }
  659. }else
  660. os_dly_wait(1);
  661. }
  662. }
  663. SlwTrace(INF, "[06]SetTTS Speed Failed",1);
  664. }
  665. void VolumeSet(void)
  666. {
  667. char i,t;
  668. int Volume;
  669. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  670. //先配置一次,再查,因为默认就查有可能是没有返回的
  671. ModemSendAT("at+syscmd=start_pcm volume 7 5\r\n");//TTS 音量/ MIC 输入音量
  672. for(i=0;i<10;i++)
  673. {
  674. t=100;
  675. REGO:
  676. ModemSendAT("at+syscmd=start_pcm volume\r\n");
  677. while(t--)
  678. {
  679. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  680. {
  681. if(0==ModemStrCmp((char *)pMsg->MsgData,"7 5"))
  682. {
  683. SlwTrace(INF, "[07]Set Volume ok",1);
  684. return;
  685. }else{
  686. if(t==0) ModemSendAT("at+syscmd=start_pcm volume 7 5\r\n");
  687. }
  688. }else
  689. os_dly_wait(1);
  690. }
  691. }
  692. SlwTrace(INF, "[07]Set Volume failed",1);
  693. }
  694. void SpeakTTSVoice(void)
  695. {
  696. int len,timeout;
  697. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  698. if(sysStartTTS[0]==0) return;
  699. len=strlen(sysStartTTS);
  700. len = len+(8-len%8);//8倍数
  701. timeout=len/8;//两个中文需要播报1秒算
  702. timeout *= 100;
  703. MeSpeak(ENCODE_UNICODE, sysStartTTS,0);
  704. while(timeout--)
  705. {
  706. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  707. {
  708. if(0==ModemStrCmp((char *)pMsg->MsgData,"+LSHTTS: END"))
  709. {
  710. SpeakerCtrl(0);
  711. return;
  712. }
  713. }else os_dly_wait(1);
  714. }
  715. SpeakerCtrl(0);
  716. }
  717. void ServerTimeGet(void)
  718. {
  719. static unsigned short timeCnt=12000;
  720. if(++timeCnt < 12000) return;
  721. timeCnt=0;
  722. ModemSendAT("AT+CCLK?\r\n");
  723. }
  724. //total 成员总数
  725. //一次获取个数最多5个,取决于显示条目个数
  726. //前提是要使用简短模式
  727. void SimpleUserInfoScan(uint8_t firstIn,uint8_t direction)
  728. {
  729. uint16_t i;
  730. uint16_t timeout;
  731. char buf[30];
  732. uint16_t thisStartIndex;
  733. uint8_t readNum;
  734. if(firstIn) sutPocStatus.handleIndex=0;
  735. ShowMessageBox("请稍候...");
  736. os_dly_wait(1);
  737. snprintf(buf, sizeof(buf),"AT+POC=0E0000%08x\r\n",sutPocStatus.LocalGroup.ID);//先更新总数
  738. ModemSendAT(buf);
  739. SlwTrace(INF,buf,0);
  740. timeout=1000;
  741. sutPocStatus.UserNum_Update=0;
  742. sutPocStatus.UserOnLineNum=0;
  743. while(timeout)
  744. {
  745. timeout--;
  746. OsDelayTime(1);
  747. if(sutPocStatus.UserNum_Update) break;
  748. if(timeout % 200 == 0)
  749. ModemSendAT(buf);
  750. }
  751. if(sutPocStatus.UserOnLineNum<=0) goto QUIT_FUNCTION;
  752. if(sutPocStatus.handleIndex >= sutPocStatus.UserOnLineNum)
  753. {
  754. snprintf(buf, sizeof(buf), "over:%d",sutPocStatus.handleIndex);
  755. SlwTrace(INF, buf, 1);
  756. sutPocStatus.handleIndex=sutPocStatus.UserOnLineNum-1;
  757. }
  758. //然后根据最新总数来获取每个成员信息
  759. if(direction==1)//递增索引
  760. {
  761. thisStartIndex=sutPocStatus.handleIndex;
  762. if(sutPocStatus.UserOnLineNum-thisStartIndex>=5) readNum=5;
  763. else readNum=sutPocStatus.UserOnLineNum-thisStartIndex;
  764. }else{//递减索引
  765. if(sutPocStatus.handleIndex <5)
  766. {
  767. thisStartIndex=0;
  768. readNum=sutPocStatus.UserOnLineNum;
  769. }
  770. else
  771. {
  772. thisStartIndex=sutPocStatus.handleIndex-5;
  773. readNum=5;
  774. }
  775. }
  776. if(readNum >= 5) readNum=5;
  777. sutPocStatus.FillUserIndex=0;
  778. for(i=thisStartIndex;i<(thisStartIndex+readNum);i++)
  779. {
  780. sutPocStatus.GetOneUserFlag=0;
  781. snprintf(buf, sizeof(buf), "AT+POC=10000021%04x\r\n",i);
  782. ModemSendAT(buf);
  783. SlwTrace(INF, buf,0);
  784. timeout=200;
  785. while(1)
  786. {
  787. OsDelayTime(1);
  788. if(sutPocStatus.GetOneUserFlag)
  789. {
  790. sutPocStatus.FillUserIndex++;
  791. break;
  792. }
  793. if(--timeout==0) break;
  794. }
  795. }
  796. if(direction==1) sutPocStatus.handleIndex += readNum;
  797. else sutPocStatus.handleIndex -= readNum;
  798. //最终成功读了多少个回来,存在sutPocStatus.FillUserIndex中
  799. QUIT_FUNCTION:
  800. GuiClearRect(0, 40, LCD_WIDTH-1, LCD_HEIGHT-32);
  801. }
  802. void SetModemPocSimpleMode(void)
  803. {//设置使用简短模式获取成员信息
  804. short t,i;
  805. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  806. for(i=0;i<5;i++)
  807. {
  808. t=50;
  809. ModemSendAT("AT+POC=10000020\r\n");
  810. while(t--)
  811. {
  812. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  813. {
  814. if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:10000000"))
  815. {
  816. SlwTrace(INF, "[14]SimpleMode_Ok",1);
  817. return;
  818. }
  819. }else
  820. os_dly_wait(1);
  821. }
  822. }
  823. SlwTrace(INF, "[14]SimpleMode_Tout",1);
  824. }
  825. char GetUniStringByID(char *HardIDString)
  826. {//输出15个字节的字符串
  827. unsigned char id[12];
  828. unsigned char string[16];
  829. long long temp;
  830. short i;
  831. unsigned char seed;
  832. if(HardIDString == '\0') return 0;
  833. GetSTM32ID(id);
  834. printf("STM32 ID==");
  835. for(i=0;i<12;i++)printf("%02x",id[i]);
  836. printf("\r\n");
  837. for(i=5;i>=0;i--){
  838. temp <<=8;
  839. temp |= id[i];
  840. }
  841. temp &= 0xffffffffffff;
  842. printf("temp=%015llu\r\n",temp);
  843. snprintf(string,sizeof(string),"%015llu",temp);
  844. for(i=0;i<15;i++) HardIDString[i]=string[i];
  845. HardIDString[15]='\0';
  846. //snprintf(HardIDString,16,"%015llu",temp);
  847. return 1;
  848. }
  849. void sysnetinfo()
  850. {
  851. short t,i;
  852. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  853. for(i=0;i<5;i++)
  854. {
  855. t=50;
  856. ModemSendAT("AT^SYSINFO\r\n");
  857. while(t--)
  858. {
  859. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  860. {
  861. if(0==ModemStrCmp((char *)pMsg->MsgData,"^SYSINFO:"))
  862. {
  863. pMsg->MsgData[15];
  864. return;
  865. }
  866. }else
  867. os_dly_wait(1);
  868. }
  869. }
  870. }
  871. int ModemIpReset()
  872. {
  873. int t,j;
  874. int i,len;
  875. char buf[60];
  876. char buf1[130];
  877. char buf2[40];
  878. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  879. RunMake(THIS_FILE_ID);
  880. for(i=0;i<5;i++)
  881. {
  882. ModemSendAT("AT+POC=020000\r\n");
  883. //+POC:0200000069643D3135393930303130313B69703D3235352E3235352E3235352E3235353B7077643D4131303030303542313134313432 len <= 13 + 100
  884. //id=159900101;ip=255.255.255.255;pwd=A100005B114142
  885. t=50;
  886. while(t--)
  887. {
  888. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  889. {
  890. if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:02"))
  891. {
  892. snprintf(buf, sizeof(buf), "id=%lu;",sutProductPara.PSN);
  893. if(sutProductPara.Ipselect==0){
  894. snprintf(buf2, sizeof(buf2), "ip=%s;",sutProductPara.PIP);
  895. }else
  896. snprintf(buf2, sizeof(buf2), "ip=%s;",sutProductPara.PIP2);
  897. strcat(buf, buf2);
  898. snprintf(buf2, sizeof(buf2), "pwd=%s;",sutProductPara.HARDID);
  899. strcat(buf, buf2);
  900. AscStrToHexStr(buf,buf1);
  901. for(j=0;j<strlen(pMsg->MsgData);j++) if(pMsg->MsgData[j]== '\r') pMsg->MsgData[j] = 0;
  902. if(0!=strcasecmp((char *)&pMsg->MsgData[13],buf1))
  903. {
  904. ModemSendAT("AT+POC=010000");
  905. ModemSendAT(buf1);
  906. ModemSendAT("\r\n");
  907. return 1;
  908. }else return 0;
  909. }
  910. }else os_dly_wait(1);
  911. }
  912. }
  913. return 0;
  914. }
  915. /***********************************************************************************/