/********************************************************************************** * File Name: Modem.c * Function Describe:device for modem * Relate Module: * Explain: the modem must be using ZTE MC8332 * Writer: ShiLiangWen * Date: 2015.1.20 ***********************************************************************************/ #define THIS_FILE_ID 2 /* Includes ------------------------------------------------------------------*/ #include "includes.h" //os_mbx_declare (PocMsgBox, 5); /* Declare an RTX mailbox */ //_declare_box(PocMpool,sizeof(SUT_MODEM_POC_MSG),5); //SUT_SMS_PARA sutSMSpara; //os_mbx_declare (AtMsgBox, 7); /* Declare an RTX mailbox */ //_declare_box(AtMpool,sizeof(SUT_MODEM_AT_MSG),7); SUT_MODEM_AT_MSG sutAtm,sutAtmPro; unsigned char Modem_TypeSetFlag; unsigned char g_ucModemSentTcpCt;//TCP 发送计数器 unsigned char g_usModeMTime=0x00; unsigned char g_usModeSTime=0x00; unsigned char g_usModeHTime=0x00; unsigned char g_usModeYTime=0x00;//年 unsigned char g_usModemTime=0x00;//月 unsigned char g_usModeDTime=0x00;//日 //MODEM_TYPE MODEM_TYPE; /************************************************************************************ * *************************************************************************************/ void ModemSendAT(char *p) { unsigned short len; len=strlen(p); RunMake(THIS_FILE_ID); #if UART2_TX_USE_DMA==0 Uart2Send(p,len); #else USART2_Send(p,len); #endif } /************************************************************************************ * *************************************************************************************/ void ModemSendData(unsigned char *pData,unsigned short datalen) { #if UART2_TX_USE_DMA==0 Uart2Send(pData,datalen); #else USART2_Send((char *)pData,datalen); #endif } /********************************************************************************** 等待模块启动完成 0:成功 -1:超时 ***********************************************************************************/ int WaitModemIsOpened(void) { int i; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; RunMake(THIS_FILE_ID); for(i=0;i<100;i++){ SlwTrace(INF,"AT",1); ModemSendAT("AT\r\n"); //if(OS_R_TMO!=os_mbx_wait(AtMsgBox,(void **)&pMsg,50)){ if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))){ if('O'==pMsg->MsgData[0] && 'K'==pMsg->MsgData[1]){ return 0; } //free(pMsg); }else os_dly_wait(1); } return -1; } /************************************************************************* *ModemWaitAtReady **************************************************************************/ int ModemWaitAtReady(void) { int i; SUT_MODEM_AT_MSG *pMsg; for(i=0;i<20;i++){ if(ModemSendAT2WaitAckMsg("AT\r\n","OK",&pMsg,100)){ //_free_box(AtMpool,pMsg); return 1; } } return 0; } /************************************************************************* ModemWaitOpen 等待模块开机 通过检查模块主动上报: **************************************************************************/ int ModemWaitOpen(int timeout) { //char *pAck; //SUT_MODEM_AT_MSG **pMsg; SUT_MODEM_AT_MSG *Msg; SlwTrace(DEBUG,"ModemWaitOpen",1); while(timeout--){ //if(OS_R_TMO!=os_mbx_wait(AtMsgBox,(void **)&Msg,1)){ if((Msg->MsgLen = MsgQueueAccept(Msg->MsgData,sizeof(Msg->MsgData)))){ SlwTrace(DEBUG,(char *)Msg->MsgData,0); // if(0==ModemStrCmp((char *)Msg->MsgData,pAck)){ // *pMsg=Msg; // return 1; // }else{ // _free_box(AtMpool,Msg); //} }else os_dly_wait(1); } return 1; } //模块的电源以及复位引脚的配置 //这段配置要放要最开始 //目的是一开机时确保模块是没有电源的 //解决原来问题:当开机到模块播报“欢迎.....”时马上关机,看到屏幕灭后马上又开机,此次开机会失败 void ModemPinConfig(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE); RCC_LSEConfig( RCC_LSE_OFF ); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = MODEM_RESET_PIN; GPIO_Init(MODEM_RESET_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = MODEM_PWRKEY_PIN; GPIO_Init(MODEM_PWRKEY_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = MODEN_POWER_EN_PIN; GPIO_Init(MODEN_POWER_EN_PORT,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = MODEM_VBUS_EN_PIN; GPIO_Init(MODEM_VBUS_EN_PORT,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Pin = MODEN_BOOT_EN_PIN; GPIO_Init(MODEN_BOOT_EN_PORT,&GPIO_InitStructure); MODEN_BOOT_EN_LOW; MODEN_POWER_EN_LOW; MODEM_RESET_LOW; } /********************************************************************************** ModemInit 返回:1 初始化成功 0-失败 ***********************************************************************************/ int ModemInit(void) { RunMake(THIS_FILE_ID); Uart2Init(); MsgQueueSet();//初始化队列 g_ucModemSentTcpCt=0; RunMake(THIS_FILE_ID); //return 0;//测试 MODEM_PWRKEY_HIGH; MODEM_RESET_HIGH; os_dly_wait(200);//100 MODEM_RESET_LOW; MODEN_POWER_EN_HIGH; os_dly_wait(100); MODEN_POWER_EN_LOW; sutPocStatus.ModemPowerOn=1; //等待模块开机并能接受AT命令 if(WaitModemStart())return 0; return 1; //ModemGetIMEI(); } /********************************************************************************** CSQ2Num ***********************************************************************************/ int CSQ2Num(char *str) { int csq; csq=atoi(str); if(csq<0 || csq>99)return 99; else return csq; } /********************************************************************************** ModemStrCmp ***********************************************************************************/ int ModemStrCmp(char *msg,char *str) { char *p1=str; char *p2=msg; while(*p1!=0){ if(*p1!=*p2)return 1; p1++; p2++; } return 0; } /********************************************************************************** ModemWaitAckMsg Input: pATCmd--AT Command string pAck --期待回的ACK,头相同即可 pMsg --实际消息内容,可能比pAck长 timeout --超时,10ms为单位 Output: if timeout return 0 else return 1 注意,处理完消息要调用_free_box释放消息 ***********************************************************************************/ int ModemSendAT2WaitAckMsg(char *pATCmd,char *pAck,SUT_MODEM_AT_MSG **pMsg,int timeout) { SUT_MODEM_AT_MSG *Msg=&sutAtmPro; ModemSendAT(pATCmd); while(timeout){ //if(OS_R_TMO!=os_mbx_wait(AtMsgBox,(void **)&Msg,1)){ if((Msg->MsgLen = MsgQueueAccept(Msg->MsgData,sizeof(Msg->MsgData)))){ //SlwTrace(DEBUG,(char *)Msg->MsgData); if(0==ModemStrCmp((char *)Msg->MsgData,pAck)){ *pMsg=Msg; return 1; }else{ //_free_box(AtMpool,Msg); } }else { timeout--; os_dly_wait(1); } } return 0; } /******************************************** *0x12 --> "12" --> 0x31 0x32 **********************************************/ void HexToAsc(unsigned char Hex,char *pAsc) { unsigned char h,l; l=Hex & 0x0f; h=Hex >> 4; if((l>=0)&&(l<=9))l += 0x30; else if((l>=10)&&(l<=15))l += ('A'-10); if((h>=0)&&(h<=9))h += 0x30; else if((h>=10)&&(h<=15))h += ('A'-10); pAsc[0]=h; pAsc[1]=l; } void HexToStr(unsigned char *HexStr,char *AscStr,unsigned short len) { int i,j=0; for(i=0;i45)len=45; buf[0]='>';buf[1]='>';buf[2]=0; for(i=0;i0x2f && str[0]<0x3a){ if(str[1]>0x2f && str[1]<0x3a){ if(str[2]>0x2f && str[2]<0x3a){ if(str[3]>0x2f && str[3]<0x3a){ num=1000*(str[0]-0x30); num+=100*(str[1]-0x30); num+=10*(str[2]-0x30); num+=(str[3]-0x30); }else{ num=100*(str[0]-0x30); num+=10*(str[1]-0x30); num+=(str[2]-0x30); } }else{ num=10*(str[0]-0x30); num+=(str[1]-0x30); } }else{ num= str[0]-0x30; } }else{ num=0; } return num; } /*********************************************************************************** *ModemPoweroff ************************************************************************************/ void ModemPoweroff(void) { ModemSendAT("AT+ZPWROFF\r\n"); os_dly_wait(50); ModemSendAT("AT+ZPWROFF\r\n"); IWDG_ReloadCounter();//喂狗 os_dly_wait(100); IWDG_ReloadCounter();//喂狗 os_dly_wait(100); IWDG_ReloadCounter();//喂狗 os_dly_wait(50); IWDG_ReloadCounter();//喂狗 MODEM_PWRKEY_LOW; MODEM_RESET_HIGH; os_dly_wait(10); MODEM_RESET_LOW; } //0==ModemStrCmp((char *)pMsg->MsgData,"OK") || char WaitModemStart(void) { int t,i; char buf[50]; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; SlwTrace(INF, "WaitModemRun:",0); for(i=0;i<10;i++)//100 { t=500;//50 //ModemSendAT("ATE0\r\n"); ModemSendAT("AT\r\n"); while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { //+CPIN: READY //RDY if( (0==ModemStrCmp((char *)pMsg->MsgData,"RDY"))||(0==ModemStrCmp((char *)pMsg->MsgData,"OK"))) { SlwTrace(INF, "Runing",1); return 0; } }else os_dly_wait(1); } } SlwTrace(INF, "TimeOut",1); return 1; } char WaitPocInit(void) { int t,i; char buf[50]; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; SlwTrace(INF, "WaitPocInit:",0); ModemSendAT("AT+POC=605\r\n"); for(i=0;i<100;i++) { t=50; while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if( (0==ModemStrCmp((char *)pMsg->MsgData,">605&1"))) { SlwTrace(INF, "PocInit Ok\r\n",1); return 0; } }else os_dly_wait(1); } } SlwTrace(INF, "PocInit TimeOut",1); return 1; } char GetPocVer() { int t,j; int i,len; char *p=0; j=0; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; for(i=0;i<50;i++){ ModemSendAT("AT+POC=508\r\n"); t=50; while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { len=strlen((char *)&(pMsg->MsgData)); if((0==ModemStrCmp((char *)pMsg->MsgData,">120&"))&& len>7) { strcpy(g_iPocVer,&pMsg->MsgData[5]); p=g_iPocVer; while(*p!=0x0d){ p++; j++; } g_iPocVer[j]=0; printf("[2]GET POC_VER OK--%s\r\n",g_iPocVer); return 1; } }else os_dly_wait(10); } } SlwTrace(INF,"[2]GET POC_VER FAILD\r\n",1); return 0; } char SetCodec(char *setcodec,char *readcodec,char*turecodec) { int t,j; int i,len; char Tempbuf[40]; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; for(i=0;i<50;i++){ ModemSendAT(readcodec); t=50; while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { len=strlen((char *)&(pMsg->MsgData)); if(len>7){ if((0==ModemStrCmp((char *)pMsg->MsgData,turecodec))) { snprintf(Tempbuf,sizeof(Tempbuf),"Set Ok-->%s",setcodec); SlwTrace(INF,Tempbuf,1); return 1; }else { ModemSendAT(setcodec); printf("setnew-->%s",setcodec); } } }else os_dly_wait(1); } } snprintf(Tempbuf,sizeof(Tempbuf),"Set Failed-->%s",setcodec); SlwTrace(INF,Tempbuf,1); return 0; } char GetModemVer() { int t,j=0; int i,len; char Tempbuf[30]; unsigned char *p=NULL; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; for(i=0;i<50;i++){ ModemSendAT("ATI\r\n"); t=50; while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { len=strlen((char *)&(pMsg->MsgData)); if((0==ModemStrCmp((char *)pMsg->MsgData,"Revision"))&& len>7) { strcpy(HardRevision,&pMsg->MsgData[10]); p=HardRevision; while(*p!=0x0a){ p++; j++; } HardRevision[j]=0; if(pMsg->MsgData[19]=='U'){ Modem_type=USA_Modem; }else if(pMsg->MsgData[19]=='C'){ Modem_type=Europe_Modem; }else{ Modem_type=Un_KnownModem; } Modem_TypeSetFlag=1; SlwTrace(INF,"[3]GET MODEM Type OK \r\n",1); return 1; } }else os_dly_wait(10); } SlwTrace(INF,"[3]GET MODEM Type failed\r\n",1); return 0; } } int ModemGetIMEI(void) { int t,j; int i,len; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; for(i=0;i<50;i++){ ModemSendAT("AT+GSN\r\n");//0x80DA219D //862015030301209 两种情况都会返回 t=50; while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { len=strlen((char *)&(pMsg->MsgData)); if(0==ModemStrCmp((char *)pMsg->MsgData,"0x")) { len -=4; memcpy(sutProductPara.HARDID, &pMsg->MsgData[2], len); if(len < sizeof(sutProductPara.HARDID)) sutProductPara.HARDID[len]=0; return 1; }else if(len == 17) { len -= 2; memcpy(sutProductPara.HARDID, pMsg->MsgData, len); if(len < sizeof(sutProductPara.HARDID)) sutProductPara.HARDID[len]=0; return 2; } }else os_dly_wait(1); } } return 0; } void ModemApnConfig(void) { char buf[100],index; char buf2[80]; char i,t; char ApnSetFlag=0; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; snprintf(buf, sizeof(buf), "[11]Accessp:"); if(sutProductPara.APNApn[0]==0) {//接入点为空时不配置,因为模块不支持 strcat(buf, "unsupport-Empty"); }else { snprintf(buf2, sizeof(buf2), "AT+MIPPROFILE=1,\"%s\"\r\n",sutProductPara.APNApn); ModemSendAT(buf2); snprintf(buf2, sizeof(buf2), "%s",sutProductPara.APNApn); strcat(buf,buf2); } SlwTrace(INF,buf,1); snprintf(buf, sizeof(buf), ",Name-Pass:"); if(sutProductPara.APNName[0] ==0 || sutProductPara.APNPass[0] ==0) {//名称或密码为空不配置,因为模块不支持 strcat(buf, "unsupport-Empty"); }else { snprintf(buf2, sizeof(buf2),"AT^PPPCFG=\"%s\",\"%s\"\r\n",sutProductPara.APNName,sutProductPara.APNPass); ModemSendAT(buf2); SlwTrace(INF,buf2,0); snprintf(buf, sizeof(buf), "^PPPCFG:\"%s\",\"%s\"",sutProductPara.APNName,sutProductPara.APNPass); for(i=0;i<5;i++) { t=50; ModemSendAT("at^pppcfg\r\n"); while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,buf)) { ApnSetFlag=1; break; }else{ if(t==0)ModemSendAT(buf2); } }else os_dly_wait(1); } } if(ApnSetFlag==1){ SlwTrace(INF,"PPPCFG is OK",1); }else SlwTrace(INF,"PPPCFG is failed",1); ApnSetFlag=0; memset(buf,0,sizeof(buf)); memset(buf2,0,sizeof(buf2)); if(sutProductPara.ApnAuthType!=0){ snprintf(buf2, sizeof(buf2),"AT$QCPDPP=1,%d,%s,%s\r\n",sutProductPara.ApnAuthType,sutProductPara.APNPass,sutProductPara.APNName); ModemSendAT(buf2); SlwTrace(INF,buf2,0); snprintf(buf, sizeof(buf), "$QCPDPP: 1,%d,\"%s\"",sutProductPara.ApnAuthType,sutProductPara.APNName); for(i=0;i<5;i++) { t=50; ModemSendAT("AT$QCPDPP?\r\n"); while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,buf)) { ApnSetFlag=1; break; }else { if(t==0)ModemSendAT(buf2); // break; } }else os_dly_wait(1); } } if(ApnSetFlag==1){ SlwTrace(INF,"QCPDPP is OK",1); }else SlwTrace(INF,"QCPDPP is failed",1); }else { for(i=0;i<3;i++){ snprintf(buf2, sizeof(buf2),"AT$QCPDPP=1,%d\r\n",sutProductPara.ApnAuthType); ModemSendAT(buf2); os_dly_wait(30); } } } } void M9507CSendTcpData(unsigned char socket, unsigned char *pData, unsigned short len) { char buf[20]; snprintf(buf, sizeof(buf), "AT+TCPSEND=%d,%d,",socket, len); ModemSendAT(buf); ModemSendData(pData, len); ModemSendAT("\r\n"); } //LoginPocInfo(); void LoginSetPocPara(void) { char i,t; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; //先配置一次,再查,因为默认就查有可能是没有返回的 char Tempbuf[100]; snprintf(Tempbuf,sizeof(Tempbuf),"AT+POC=504&%s&%s&%s&%s&%s&%s&%d&%d&%d&%s\r\n",sutProductPara.PIP,sutProductPara.APNApn,sutProductPara.Net_Mode \ ,sutProductPara.Language,sutProductPara.Local,sutProductPara.Channel,sutProductPara.SendToneEnadble,sutProductPara.RecvToneEnadble,sutProductPara.PromptToneEnable,sutProductPara.IMEI); SlwTrace(INF,Tempbuf,1); for(i=0;i<10;i++) { t=300; ModemSendAT(Tempbuf);; while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,">504&1")) { SlwTrace(INF, "Set PocPara",1); return; }else{ //if(t==0) ModemSendAT(buf); } }else os_dly_wait(1); } } SlwTrace(INF, "Set PocPara failed",1); } void VolumeSet(void) { char i,t; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; char buf[20]; //先配置一次,再查,因为默认就查有可能是没有返回的 snprintf(buf,sizeof(buf),"AT+POC=607&%d\r\n",sutProductPara.VolLv); for(i=0;i<10;i++) { t=100; ModemSendAT(buf); while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,">607&1")) { SlwTrace(INF, "[03]Set Volume ok",1); return; }else{ //if(t==0) ModemSendAT(buf); } }else os_dly_wait(1); } } SlwTrace(INF, "[03]Set Volume failed",1); } void ServerTimeGet(void) { static unsigned short timeCnt=12000; if(++timeCnt < 12000) return; timeCnt=0; ModemSendAT("AT+CCLK?\r\n"); } //total 群组总数 //一次获取个数最多5个,取决于显示条目个数 void SimpleGroupInfoScan(char firstIn,char direction) { uint16_t i; uint16_t timeout; char buf[30]; uint16_t thisStartIndex; uint8_t readNum; char flag=0; char trycnt=0; if(firstIn) sutPocStatus.handleIndex=0; // if(0==strcmp(sutProductPara.Language,"cn"))ShowMessageBox("请稍候..."); //0 // else ShowMessageBox("Please Wait..."); // os_dly_wait(1); // snprintf(buf, sizeof(buf),"AT+POC=0E0000%08x\r\n",sutPocStatus.LocalGroup.ID);//先更新总数 // ModemSendAT(buf); ModemSendAT(POC_CMD_GROUP_SUM); SlwTrace(INF,buf,0); timeout=1000; sutPocStatus.GroupNum_Update=0; sutPocStatus.GroupOnLineNum=0; while(timeout) { timeout--; OsDelayTime(1); //if(sutPocStatus.UserNum_Update) break; if(sutPocStatus.GroupNum_Update)break; if(timeout % 200 == 0) ModemSendAT(POC_CMD_GROUP_SUM); } if(sutPocStatus.GroupOnLineNum<=0){ sutPocStatus.FillGroupIndex=0; goto QUIT_FUNCTION; } // if(sutPocStatus.handleIndex >= sutPocStatus.GroupOnLineNum) // { // snprintf(buf, sizeof(buf), "over:%d",sutPocStatus.handleIndex); // SlwTrace(INF, buf, 1); // sutPocStatus.handleIndex=0; // } if(sutPocStatus.GroupOnLineNum%5==0)flag=5; else flag=sutPocStatus.GroupOnLineNum%5; printf("*********flag==%d********handleIndex====%d,readNum==%d\r\n",flag,sutPocStatus.handleIndex,readNum); //然后根据最新总数来获取每个成员信息 if(direction==1)//递增索引 { thisStartIndex=sutPocStatus.handleIndex; if(sutPocStatus.GroupOnLineNum-thisStartIndex>=5) readNum=5; else { readNum=sutPocStatus.GroupOnLineNum-thisStartIndex; } }else{//递减索引 thisStartIndex=sutPocStatus.handleIndex; if(sutPocStatus.handleIndex <5) //< { thisStartIndex=0;//0 readNum=sutPocStatus.GroupOnLineNum; //(sutPocStatus.UserOnLineNum%5) } else if(sutPocStatus.GroupOnLineNum-thisStartIndex<=flag){ if((sutPocStatus.GroupOnLineNum%5)==0){ SlwTrace(INF,"GO UPUPUP-------------------\r\n",1); readNum=5; } else readNum=(sutPocStatus.GroupOnLineNum%5); //Z //thisStartIndex=sutPocStatus.UserOnLineNum-readNum; } else { //thisStartIndex=sutPocStatus.handleIndex-5; readNum=5; } } if(readNum >= 5) readNum=5; sutPocStatus.FillGroupIndex=0; printf("this=====%d===handleIndex====%d,readNum==%d\r\n",thisStartIndex,sutPocStatus.handleIndex,readNum); for(i=thisStartIndex;i<(thisStartIndex+readNum);i++) { RETRYGROUP: sutPocStatus.GetOneGroupFlag=0; snprintf(buf, sizeof(buf), "AT+POC=534&%d&1\r\n",i); ModemSendAT(buf); SlwTrace(INF, buf,0); timeout=50; while(1) { OsDelayTime(1); if(sutPocStatus.GetOneGroupFlag) { sutPocStatus.FillGroupIndex++; break; } if(--timeout==0) { if(++trycnt>10){ trycnt=0; UISetNextStatus(UIS_MENU_MAIN); return; } goto RETRYGROUP; break; } } } // if(direction==1) sutPocStatus.handleIndex += readNum; // else { // sutPocStatus.handleIndex -= readNum; // } if(firstIn) { sutPocStatus.handleIndex=0; //lastOption=1; } //最终成功读了多少个回来,存在sutPocStatus.FillUserIndex中 QUIT_FUNCTION: //GuiClearRect(0, 40, LCD_WIDTH-1, LCD_HEIGHT-32); } //total 成员总数 //一次获取个数最多5个,取决于显示条目个数 //前提是要使用简短模式 void SimpleUserInfoScan(uint8_t firstIn,uint8_t direction) { uint16_t i; uint16_t timeout; char buf[30]; uint16_t thisStartIndex; uint8_t readNum; static char flag; char trycnt=0; if(firstIn) { sutPocStatus.handleIndex=0; } // if(0==strcmp(sutProductPara.Language,"cn"))ShowMessageBox("请稍候..."); //0 // else ShowMessageBox("Please Wait..."); // os_dly_wait(1); ModemSendAT(POC_CMD_USER_SUM); timeout=1000; sutPocStatus.UserNum_Update=0; sutPocStatus.UserOnLineNum=0; while(timeout) { timeout--; OsDelayTime(1); if(sutPocStatus.UserNum_Update) break; if(timeout % 200 == 0) //ModemSendAT(buf); ModemSendAT(POC_CMD_USER_SUM); } if(sutPocStatus.UserOnLineNum<=0) { sutPocStatus.FillUserIndex=0; goto QUIT_FUNCTION; } // if(sutPocStatus.handleIndex >= sutPocStatus.UserOnLineNum) // { // snprintf(buf, sizeof(buf), "over:%d",sutPocStatus.handleIndex); // SlwTrace(INF, buf, 1); // sutPocStatus.handleIndex=0; // } if(sutPocStatus.UserOnLineNum%5==0)flag=5; else flag=sutPocStatus.UserOnLineNum%5; //然后根据最新总数来获取每个成员信息 if(direction==1)//递增索引 { thisStartIndex=sutPocStatus.handleIndex; if(sutPocStatus.UserOnLineNum-thisStartIndex>=5) readNum=5; else { readNum=sutPocStatus.UserOnLineNum-thisStartIndex; } }else{//递减索引 thisStartIndex=sutPocStatus.handleIndex; if(sutPocStatus.handleIndex <5) //< { thisStartIndex=0;//0 readNum=sutPocStatus.UserOnLineNum; //(sutPocStatus.UserOnLineNum%5) } else if(sutPocStatus.UserOnLineNum-thisStartIndex<=flag){ if((sutPocStatus.UserOnLineNum%5)==0)readNum=5; else readNum=(sutPocStatus.UserOnLineNum%5); //Z //thisStartIndex=sutPocStatus.UserOnLineNum-readNum; } else { //thisStartIndex=sutPocStatus.handleIndex-5; readNum=5; } } if(readNum >= 5) readNum=5; sutPocStatus.FillUserIndex=0; for(i=thisStartIndex;i<(thisStartIndex+readNum);i++) { RETRYUSR: sutPocStatus.GetOneUserFlag=0; snprintf(buf, sizeof(buf), "AT+POC=537&%d&1\r\n",i); ModemSendAT(buf); SlwTrace(INF, buf,0); timeout=50; while(1) { OsDelayTime(1); if(sutPocStatus.GetOneUserFlag) { sutPocStatus.FillUserIndex++; break; } if(--timeout==0) { if(++trycnt>10){ trycnt=0; UISetNextStatus(UIS_MENU_MAIN); return; } goto RETRYUSR; break; } } } if(firstIn){ sutPocStatus.handleIndex=0; } //最终成功读了多少个回来,存在sutPocStatus.FillUserIndex中 QUIT_FUNCTION: //GuiClearRect(0, 40, LCD_WIDTH-1, LCD_HEIGHT-32); } void SimpleVoiceInfoScan(uint8_t firstIn,uint8_t direction) { uint16_t i; uint16_t timeout; char buf[30]; uint16_t thisStartIndex; uint8_t readNum; char trycnt=0; if(firstIn) sutPocStatus.voicehandleIndex=0; sutPocStatus.VoiceOnLineNum=0; // if(0==strcmp(sutProductPara.Language,"cn"))ShowMessageBox("请稍候..."); //0 // else ShowMessageBox("Please Wait..."); os_dly_wait(1); RETRYVOICE1: sutPocStatus.VoiceNum_Update=0; snprintf(buf,sizeof(buf),"AT+POC=550&%d\r\n",sutPocStatus.recordID); printf("***VoiceNum_Update===%d\r\n",sutPocStatus.VoiceNum_Update); ModemSendAT(buf); SlwTrace(INF, buf,0); timeout=30; //20 while(1) { OsDelayTime(1); if(sutPocStatus.VoiceNum_Update) { //sutPocStatus.VoiceNum_Update=0; break; } if(--timeout==0) { //未做防护 有可能卡死 printf("超时了===========\r\n"); goto RETRYVOICE1; break; } } printf("VoiceNum_Update===%d\r\n",sutPocStatus.VoiceNum_Update); sutPocStatus.VoiceNum_Update=0; if(sutPocStatus.VoiceOnLineNum<=0) { sutPocStatus.FillVoiceIndex=0; printf("GOTO------------"); // goto QUIT_FUNCTION; } if(sutPocStatus.voicehandleIndex >= sutPocStatus.VoiceOnLineNum) { snprintf(buf, sizeof(buf), "over:%d",sutPocStatus.voicehandleIndex); SlwTrace(INF, buf, 1); sutPocStatus.voicehandleIndex=sutPocStatus.VoiceOnLineNum-1; } printf("step0======%d\r\n",sutPocStatus.VoiceOnLineNum); if(sutPocStatus.VoiceOnLineNum<=5){ thisStartIndex=0; readNum=sutPocStatus.VoiceOnLineNum; printf("step1 ====%d\r\n",readNum); }else if(firstIn){ thisStartIndex=0; if(sutPocStatus.VoiceOnLineNum%5==0){ readNum=5; }else{ readNum=sutPocStatus.VoiceOnLineNum%5; } }else if(sutPocStatus.voicehandleIndex>4){ if(sutPocStatus.VoiceOnLineNum%5==0)thisStartIndex=5; else thisStartIndex=sutPocStatus.VoiceOnLineNum%5; readNum=5; }else { thisStartIndex=0; readNum=5; } if(readNum >= 5) readNum=5; sutPocStatus.FillVoiceIndex=0; os_dly_wait(1); ///// for(i=thisStartIndex;i<(thisStartIndex+readNum);i++) { //sutPocStatus.GetOneVoiceFlag=0; RETRYVOICE: printf("this===%d readnum===%d\r\n",thisStartIndex,readNum); snprintf(buf, sizeof(buf), "AT+POC=551&%d&%d&1\r\n",sutPocStatus.recordID,i); //AT+POC=551&群组ID&序号&个数 ModemSendAT(buf); SlwTrace(INF, buf,0); timeout=5; //300 while(1) { OsDelayTime(3); if(sutPocStatus.GetOneVoiceFlag) { sutPocStatus.FillVoiceIndex++; sutPocStatus.GetOneVoiceFlag=0; break; } if(--timeout==0) { printf("超时了===========\r\n"); if(++trycnt>10){ trycnt=0; UISetNextStatus(UIS_MENU_MAIN); return; } goto RETRYVOICE; break; } } } //最终成功读了多少个回来,存在sutPocStatus.FillUserIndex中 QUIT_FUNCTION: //GuiClearRect(0, 40, LCD_WIDTH-1, LCD_HEIGHT-32); } void SetModemPocSimpleMode(void) {//设置使用简短模式获取成员信息 short t,i; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; for(i=0;i<5;i++) { t=50; ModemSendAT("AT+POC=10000020\r\n"); while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:10000000")) { SlwTrace(INF, "[14]SimpleMode_Ok",1); return; } }else os_dly_wait(1); } } SlwTrace(INF, "[14]SimpleMode_Tout",1); } char GetUniStringByID(char *HardIDString) {//输出15个字节的字符串 unsigned char id[12]; unsigned char string[16]; long long temp; short i; unsigned char seed; if(HardIDString == '\0') return 0; GetSTM32ID(id); printf("STM32 ID=="); for(i=0;i<12;i++)printf("%02x",id[i]); printf("\r\n"); for(i=5;i>=0;i--){ temp <<=8; temp |= id[i]; } temp &= 0xffffffffffff; printf("temp=%015llu\r\n",temp); snprintf(string,sizeof(string),"%015llu",temp); for(i=0;i<15;i++) HardIDString[i]=string[i]; HardIDString[15]='\0'; //snprintf(HardIDString,16,"%015llu",temp); return 1; } void ModemNetSet() { if(sutProductPara.LowConsumption==1) { sutProductPara.Netmode=1; GetMododexWithCard(); }else { if(0==strcmp(sutProductPara.Language,"en")) { if(sutProductPara.Netmode>2)sutProductPara.Netmode=0; } GetMododexWithCard(); } } /********************************************************************************************************************** 格式:AT+ICCID +GETICCID:0x89860315402521836592 +SCID:98680036904030021872 ***********************************************************************************************************************/ short ModemGetCCID(void) { short t; short i,len,ver; char buf[80],bufTemp[3]; char CCID[21]; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; ver=0; for(i=0;i<5;i++){ t=100; ModemSendAT("AT+ZGETICCID\r\n"); while(t--) {//^SCID: 89860316452001903429 if(g_ucQuitModemInitNow==1) return -1; if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData, sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,"+ZGETICCID:"))////^SCID: { memcpy(CCID, &pMsg->MsgData[12], sizeof(CCID)); CCID[20]=0; snprintf(buf, sizeof(buf), "[5][Minit]ICCID:%s[", CCID); bufTemp[0] = CCID[4]; bufTemp[1] = CCID[5]; bufTemp[2] = 0; switch(atoi(bufTemp)) { case 1: case 6: case 9:thisYunYingShang = CHINA_UNICOM; strcat(buf, "CHINA_UNICOM]"); break; case 0: case 2: case 4: case 7:thisYunYingShang = CHINA_MOBILE; strcat(buf, "CHINA_MOBILE]"); break; case 3: case 8: case 11:thisYunYingShang = CHINA_TELECOM; strcat(buf, "CHINA_TELECOM]"); break; default:strcat(buf, "UNKNOW-ICCID]"); break; } SlwTrace(INF, buf,1); return 1; } }else os_dly_wait(1); } } SlwTrace(INF, "[5][Minit]Get CCID failed",1); return 0; } void APNSet(void) { char i,t; int Volume; char buf[50]; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; //先配置一次,再查,因为默认就查有可能是没有返回的 snprintf(buf,sizeof(buf),"AT+CGDCONT=1,\"IPV4V6\",\"%s\"\r\n",sutProductPara.APNApn); ModemSendAT(buf); for(i=0;i<10;i++) { t=50; ModemSendAT("AT+CGDCONT?\r\n"); while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp(&pMsg->MsgData[22],sutProductPara.APNApn)) { snprintf(buf,sizeof(buf),"[4]Set APN Ok--[%s]",sutProductPara.APNApn); SlwTrace(INF,buf,1); return; }else{ if(t==0) ModemSendAT(buf); } }else os_dly_wait(1); } } SlwTrace(INF, "[4]Set APN failed",1); } //+ZCDS:100,460,3,7760,77DA809,-98,99,15,0,285,460113302871543 //2.3段不为 460则非国内 char GetCountry() { char t=0; char j=0; char z=0; int i,len; char Tempbuf[30]; short buf[3]; char cnt=0; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; for(i=0;i<50;i++){ ModemSendAT("AT+ZCDS?\r\n"); t=50; while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { len=strlen((char *)&(pMsg->MsgData)); if((0==ModemStrCmp((char *)pMsg->MsgData,"+ZCDS:"))&& len>7) { //StringCatByNumb((char *)pMsg->MsgData,1,Tempbuf); // printf("buf===%s\r\n",&pMsg->MsgData[z+6]); while(cnt<3) { if(pMsg->MsgData[z+6]!=',') { Tempbuf[j]=pMsg->MsgData[z+6]; j++; }else{ Tempbuf[j]=0; j=0; buf[cnt]=atoi(Tempbuf); cnt++; } z++; } if(buf[1]==460||buf[2]==460){ //国内 SlwTrace(INF,"[6]国内----\r\n",1); }else { SlwTrace(INF,"[6]国外----\r\n",1); thisYunYingShang =FOREIGN_ALL; } return 1; } }else os_dly_wait(10); } } SlwTrace(INF,"[6]GET Country FAILD\r\n",1); return 0; } /***********************************************************************************/