/********************************************************************************** * 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 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; } void ModemCtrlInit(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; MODEM_DTR_HIGH; MODEM_RING_HIGH; MODEM_DSR_HIGH; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = MODEM_DTR_PIN; GPIO_Init(MODEM_DTR_PORT, &GPIO_InitStructure); MODEM_DTR_HIGH; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = MODEM_RING_PIN; GPIO_Init(MODEM_RING_PORT, &GPIO_InitStructure); MODEM_RING_HIGH; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = MODEM_DSR_PIN; GPIO_Init(MODEM_DSR_PORT, &GPIO_InitStructure); MODEM_DSR_HIGH; MODEM_DCD_HIGH; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = MODEM_DCD_PIN; GPIO_Init(MODEM_DCD_PORT, &GPIO_InitStructure); } /************************************************************************* *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, ENABLE); 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); MODEM_RESET_HIGH; MODEM_PWRKEY_LOW; } /********************************************************************************** ModemInit 返回:1 初始化成功 0-失败 ***********************************************************************************/ int ModemInit(void) { RunMake(THIS_FILE_ID); MsgQueueSet();//初始化队列 g_ucModemSentTcpCt=0; RunMake(THIS_FILE_ID); MODEM_RESET_HIGH; os_dly_wait(100); MODEM_RESET_LOW; MODEM_PWRKEY_HIGH; os_dly_wait(100); MODEM_PWRKEY_LOW; //等待模块开机并能接受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; } /********************************************************************************** *ModemSetDTRLow ***********************************************************************************/ void ModemSetDtrLow(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Pin = MODEM_DTR_PIN; GPIO_Init(MODEM_DTR_PORT, &GPIO_InitStructure); MODEM_DTR_LOW; } /********************************************************************************** *ModemSetRINGLow ***********************************************************************************/ void ModemSetRingLow(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Pin = MODEM_RING_PIN; GPIO_Init(MODEM_RING_PORT, &GPIO_InitStructure); MODEM_RING_LOW; } /******************************************************************* *ModemCheckPocParam return: 1--not same, Reset 0--same,no reset ********************************************************************/ int ModemCheckPocParam(void) { int t,j; int i,len; char buf[60]; char buf1[130]; char buf2[40]; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; RunMake(THIS_FILE_ID); for(i=0;i<5;i++) { ModemSendAT("AT+POC=020000\r\n"); //+POC:0200000069643D3135393930303130313B69703D3235352E3235352E3235352E3235353B7077643D4131303030303542313134313432 len <= 13 + 100 //id=159900101;ip=255.255.255.255;pwd=A100005B114142 t=50; while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:02")) { snprintf(buf, sizeof(buf), "id=%lu;",sutProductPara.PSN); if(sutProductPara.Ipselect==0){ snprintf(buf2, sizeof(buf2), "ip=%s;",sutProductPara.PIP);} else snprintf(buf2, sizeof(buf2), "ip=%s;",sutProductPara.PIP2); strcat(buf, buf2); snprintf(buf2, sizeof(buf2), "pwd=%s;",sutProductPara.HARDID); strcat(buf, buf2); AscStrToHexStr(buf,buf1); for(j=0;jMsgData);j++) if(pMsg->MsgData[j]== '\r') pMsg->MsgData[j] = 0; if(0!=strcasecmp((char *)&pMsg->MsgData[13],buf1)) { ModemSendAT("AT+POC=010000"); ModemSendAT(buf1); ModemSendAT("\r\n"); return 1; }else return 0; } }else os_dly_wait(1); } } return 0; } char WaitModemStart(void) { int t,i; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; SlwTrace(INF, "WaitModemRun:",0); for(i=0;i<100;i++) { t=50; ModemSendAT("ATE0\r\n"); while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,"OK") || 0==ModemStrCmp((char *)pMsg->MsgData,"+POC:START")) { SlwTrace(INF, "Runing",1); return 0; } }else os_dly_wait(1); } } SlwTrace(INF, "TimeOut",1); return 1; } void ModemInfo(void) { int t; int i,len,ver,j; char bufTemp[30],version[10],type,countFlag; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; RunMake(THIS_FILE_ID); ver=0; SlwTrace(INF, "[03]ModemInfo:",1); type=0; for(i=0;i<10;i++) { if(type==0) ModemSendAT("ATI\r\n");//模块型号 else ModemSendAT("AT+LCTSW\r\n");//版本信息 t=50; while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(type==0) {//Manufacturer: LONGSUNG //Model: U9507C 全网通模块版本 //Model: U9507C_SXNT 单电信模块版本 //Model: U9507C_SXNM 移动联通模块版本 if(0==ModemStrCmp((char *)pMsg->MsgData,"Manufacturer:")) SlwTrace(INF, pMsg->MsgData, 0); else if(0==ModemStrCmp((char *)pMsg->MsgData,"Model:")) { if(0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C_SXNT")){ //单电信 support_type=ONLY_Telecom; }else if(0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C_SXNM")){ //移动联通版 support_type=Mobile_unicom; }else if(0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C")){ support_type=All_Netcom; //全网通 }else { //未知 support_type=Un_Known; } SlwTrace(INF, pMsg->MsgData, 0); type ++; break; } }else{ //SoftwareVersion: LLA0029.1.2_M005 //InnerVersion: LLA0029_0016_1.0.57_L0901_EFS2.6 //AP: LLA0029_0016_0.0.57_L0901_M005 if(0==ModemStrCmp((char *)pMsg->MsgData,"SoftwareVersion:")) SlwTrace(INF, pMsg->MsgData, 0); else if(0==ModemStrCmp((char *)pMsg->MsgData,"AP:")) { SlwTrace(INF, pMsg->MsgData, 0); return; } else if(0==ModemStrCmp((char *)pMsg->MsgData,"InnerVersion:")) { SlwTrace(INF, pMsg->MsgData, 0); countFlag=0; for(j=0;jMsgData);j++) { if(pMsg->MsgData[j] == '_') { countFlag++; if(countFlag == 1) { version[0] = pMsg->MsgData[j+3]; version[1] = pMsg->MsgData[j+4]; }else if(countFlag == 3) { version[2] = pMsg->MsgData[j+2]; version[3] = pMsg->MsgData[j+3]; version[4] = pMsg->MsgData[j+4]; version[5] = pMsg->MsgData[j+5]; version[6] = 0; snprintf(bufTemp, sizeof(bufTemp), "[03]ModemVer:%s",version); SlwTrace(INF, bufTemp, 1); g_iModemVer=atoi(version); } } } } } }else os_dly_wait(1); } } } 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 ModemPocVersionCheck(void) { char bufTemp[40]; short t,i,len,ver,j; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; for(i=0;i<5;i++) { t=50; ModemSendAT("AT+POC_VER?\r\n"); while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC_VER:")) { len = strlen(pMsg->MsgData); j=0; for(i=0;iMsgData[i] == '\r') { bufTemp[j]=0; ver=atoi(bufTemp); snprintf(bufTemp, sizeof(bufTemp),"[04]POCver:%d<->%s", ver,pMsg->MsgData); SlwTrace(INF, bufTemp,0); g_iPocVer=ver; return; }else if(pMsg->MsgData[i] >= '0' && pMsg->MsgData[i] <= '9') bufTemp[j++]=pMsg->MsgData[i]; } } }else os_dly_wait(1); } } snprintf(bufTemp, sizeof(bufTemp),"[04]PocVer=%d", ver); SlwTrace(INF, bufTemp, 1); } void ModemApnConfig(void) { char buf[100],index; char buf2[80]; char i; 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,0); 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); snprintf(buf2, sizeof(buf2), "%s,%s",sutProductPara.APNName,sutProductPara.APNPass); strcat(buf,buf2); } SlwTrace(INF,buf,1); } 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"); } void ModemSetSpeed(void) { char i,t; int Volume; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; for(i=0;i<5;i++) { t=50; REGO: ModemSendAT("AT+LSHTTSSPEED?\r\n"); while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,"+LSHTTSSPEED:")) { Volume=atoi(&pMsg->MsgData[13]); if(7000 != Volume) { ModemSendAT("AT+LSHTTSSPEED=-1,7000\r\n"); os_dly_wait(1); goto REGO; } else { SlwTrace(INF, "[06]SetTTS Speed Ok",1); return; } } }else os_dly_wait(1); } } SlwTrace(INF, "[06]SetTTS Speed Failed",1); } void VolumeSet(void) { char i,t; int Volume; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; //先配置一次,再查,因为默认就查有可能是没有返回的 ModemSendAT("at+syscmd=start_pcm volume 7 5\r\n");//TTS 音量/ MIC 输入音量 for(i=0;i<10;i++) { t=100; REGO: ModemSendAT("at+syscmd=start_pcm volume\r\n"); while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,"7 5")) { SlwTrace(INF, "[07]Set Volume ok",1); return; }else{ if(t==0) ModemSendAT("at+syscmd=start_pcm volume 7 5\r\n"); } }else os_dly_wait(1); } } SlwTrace(INF, "[07]Set Volume failed",1); } void SpeakTTSVoice(void) { int len,timeout; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; if(sysStartTTS[0]==0) return; len=strlen(sysStartTTS); len = len+(8-len%8);//8倍数 timeout=len/8;//两个中文需要播报1秒算 timeout *= 100; MeSpeak(ENCODE_UNICODE, sysStartTTS,0); while(timeout--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,"+LSHTTS: END")) { SpeakerCtrl(0); return; } }else os_dly_wait(1); } SpeakerCtrl(0); } void ServerTimeGet(void) { static unsigned short timeCnt=12000; if(++timeCnt < 12000) return; timeCnt=0; ModemSendAT("AT+CCLK?\r\n"); } //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; if(firstIn) sutPocStatus.handleIndex=0; ShowMessageBox("请稍候..."); os_dly_wait(1); snprintf(buf, sizeof(buf),"AT+POC=0E0000%08x\r\n",sutPocStatus.LocalGroup.ID);//先更新总数 ModemSendAT(buf); SlwTrace(INF,buf,0); 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); } if(sutPocStatus.UserOnLineNum<=0) goto QUIT_FUNCTION; if(sutPocStatus.handleIndex >= sutPocStatus.UserOnLineNum) { snprintf(buf, sizeof(buf), "over:%d",sutPocStatus.handleIndex); SlwTrace(INF, buf, 1); sutPocStatus.handleIndex=sutPocStatus.UserOnLineNum-1; } //然后根据最新总数来获取每个成员信息 if(direction==1)//递增索引 { thisStartIndex=sutPocStatus.handleIndex; if(sutPocStatus.UserOnLineNum-thisStartIndex>=5) readNum=5; else readNum=sutPocStatus.UserOnLineNum-thisStartIndex; }else{//递减索引 if(sutPocStatus.handleIndex <5) { thisStartIndex=0; readNum=sutPocStatus.UserOnLineNum; } else { thisStartIndex=sutPocStatus.handleIndex-5; readNum=5; } } if(readNum >= 5) readNum=5; sutPocStatus.FillUserIndex=0; for(i=thisStartIndex;i<(thisStartIndex+readNum);i++) { sutPocStatus.GetOneUserFlag=0; snprintf(buf, sizeof(buf), "AT+POC=10000021%04x\r\n",i); ModemSendAT(buf); SlwTrace(INF, buf,0); timeout=200; while(1) { OsDelayTime(1); if(sutPocStatus.GetOneUserFlag) { sutPocStatus.FillUserIndex++; break; } if(--timeout==0) break; } } if(direction==1) sutPocStatus.handleIndex += readNum; else sutPocStatus.handleIndex -= readNum; //最终成功读了多少个回来,存在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 sysnetinfo() { short t,i; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; for(i=0;i<5;i++) { t=50; ModemSendAT("AT^SYSINFO\r\n"); while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,"^SYSINFO:")) { pMsg->MsgData[15]; return; } }else os_dly_wait(1); } } } int ModemIpReset() { int t,j; int i,len; char buf[60]; char buf1[130]; char buf2[40]; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; RunMake(THIS_FILE_ID); for(i=0;i<5;i++) { ModemSendAT("AT+POC=020000\r\n"); //+POC:0200000069643D3135393930303130313B69703D3235352E3235352E3235352E3235353B7077643D4131303030303542313134313432 len <= 13 + 100 //id=159900101;ip=255.255.255.255;pwd=A100005B114142 t=50; while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:02")) { snprintf(buf, sizeof(buf), "id=%lu;",sutProductPara.PSN); if(sutProductPara.Ipselect==0){ snprintf(buf2, sizeof(buf2), "ip=%s;",sutProductPara.PIP); }else snprintf(buf2, sizeof(buf2), "ip=%s;",sutProductPara.PIP2); strcat(buf, buf2); snprintf(buf2, sizeof(buf2), "pwd=%s;",sutProductPara.HARDID); strcat(buf, buf2); AscStrToHexStr(buf,buf1); for(j=0;jMsgData);j++) if(pMsg->MsgData[j]== '\r') pMsg->MsgData[j] = 0; if(0!=strcasecmp((char *)&pMsg->MsgData[13],buf1)) { ModemSendAT("AT+POC=010000"); ModemSendAT(buf1); ModemSendAT("\r\n"); return 1; }else return 0; } }else os_dly_wait(1); } } return 0; } /***********************************************************************************/