/********************************************************************************** * 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); //os_mbx_declare (AtMsgBox, 10); /* Declare an RTX mailbox */ //_declare_box(AtMpool,sizeof(SUT_MODEM_AT_MSG),10); SUT_MODEM_AT_MSG sutAtm,sutAtmPro; unsigned char g_ucModemSentTcpCt;//TCP 发送计数器 /************************************************************************************ * Usart3_DMA_Send(ucData,strlen((void *)ucData)); *************************************************************************************/ void ModemSendAT(char *p) { Uart2Send((unsigned char *)p,strlen(p)); } /************************************************************************************ * *************************************************************************************/ void ModemSendData(unsigned char *pData,unsigned short datalen) { Uart2Send(pData,datalen); } /********************************************************************************** 等待模块启动完成 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\r\n"); 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(100); } return 1; } void ModemCtrlInit(void) { } /********************************************************************************** ModemInit 返回:1 初始化成功 0-失败 ***********************************************************************************/ int ModemInit(void) { GPIO_InitTypeDef GPIO_InitStructure; MsgQueueSet(); 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); RunMake(THIS_FILE_ID); 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; //return 0;//测试天线 if(WaitModemStart())return 0; //return ModemGetIMEI(); return 1; } /********************************************************************************** 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) { int r; SUT_MODEM_AT_MSG *Msg=&sutAtmPro; ModemSendAT(pATCmd); while(timeout){ if((Msg->MsgLen = MsgQueueAccept(Msg->MsgData,sizeof(Msg->MsgData)))){ if(0==ModemStrCmp((char *)Msg->MsgData,pAck)){ *pMsg=Msg; return 1; }else{ } }else { timeout--; os_dly_wait(1); } } return 0; } int ModemSendTcpData(unsigned char socket,unsigned char *pData,unsigned short len) { int i; char buf[142]; char tmp[5]; unsigned char temp=0; unsigned short debuglen; sprintf(buf,"AT+ZIPSEND=%d,%d\r",socket,len); ModemSendAT(buf); ModemSendData(pData,len); if(g_ucModemSentTcpCt<255)g_ucModemSentTcpCt++; sprintf(buf,"TcpSend[%d]",len); SlwTrace(INF,buf,1); #if 0 if(len>45)debuglen=45; else debuglen=len; buf[0]='>';buf[1]='>';buf[2]=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; } 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; } /******************************************************************* *GetIPStatus 返回:0--未获取 1--获取成功 ********************************************************************/ //int ModemGetMEID(void) //{ // int t,j; // int i,len; // SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; // for(i=0;i<50;i++) // { // t=50; // ModemSendAT("AT^MEID\r\n");//0xA100005B114142 // while(t--) // { // if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) // { // len=strlen((char*)pMsg->MsgData); // if(pMsg->MsgLen == 19) j= 14; // else if(pMsg->MsgLen == 20) j=15; // else continue; // memcpy(sutProductPara.MEID, &pMsg->MsgData[2], j); // if(jMsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) // { // len=strlen((char *)&(pMsg->MsgData)); // if(0==ModemStrCmp((char *)pMsg->MsgData,"0x")) // { // len -=4; // memcpy(sutProductPara.IMEI, &pMsg->MsgData[2], len); // if(len < sizeof(sutProductPara.IMEI)) // sutProductPara.IMEI[len]=0; // // memset(aucIMEI,0,sizeof(aucIMEI)); // tempa=15-strlen(sutProductPara.IMEI); // for(tempb=0;tempbMsgData, len); // if(len < sizeof(sutProductPara.IMEI)) // sutProductPara.IMEI[len]=0; //可以不做保存 // return 2; // } // }else // os_dly_wait(1); // } // } // return 0; //} // char SetModemTCPHexMode(TCPUDP_DEF mode) { int t,i; char buf[40]; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; for(i=0;i<3;i++){ t=50; ModemSendAT("AT+MIPHEX?\r\n"); while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData, sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,"+MIPHEX:")) { if(pMsg->MsgData[8] != mode) { sprintf(buf, "AT+MIPHEX=%c\r\n", mode); ModemSendAT(buf); }else { SlwTrace(INF, "[11]TcpDataMode->HEX",1); return 1; } } }else os_dly_wait(1); } } SlwTrace(INF, "[11]TCPModeSet failed",1); return 0; } /******************************************************************* *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")) { sprintf(buf, "id=%lu;",sutProductPara.PSN); sprintf(buf2, "ip=%d.%d.%d.%d;",sutNewSegmentPara.PIP[0],sutNewSegmentPara.PIP[1],sutNewSegmentPara.PIP[2],sutNewSegmentPara.PIP[3]); strcat(buf, buf2); sprintf(buf2, "pwd=%s;",sutNewSegmentPara.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; } 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 if(0==ModemStrCmp((char *)pMsg->MsgData,"Manufacturer:")) SlwTrace(INF, pMsg->MsgData, 0); else if(0==ModemStrCmp((char *)pMsg->MsgData,"Model:")) { 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; sprintf(bufTemp, "[03]ModemVer:%s",version); SlwTrace(INF, bufTemp, 1); g_iModemVer=atoi(version); } } } } } }else os_dly_wait(1); } } } 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); sprintf(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); } } sprintf(bufTemp,"[04]PocVer=%d", ver); SlwTrace(INF, bufTemp, 1); } int ModemCheckUIM(void) { unsigned char t,round=0; int i,len,ver; char cmd[10]; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; RunMake(THIS_FILE_ID); ver=0; for(i=0;i<30;i++) { t=50; if(round==0) { round=1; ModemSendAT("AT+QCPIN?\r\n"); sprintf(cmd, "+QCPIN:"); }else{ round=0; ModemSendAT("AT+CPIN?\r\n"); sprintf(cmd, "+CPIN:"); } while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,cmd)) {//+QCPIN: READY //+CPIN: READY if(pMsg->MsgData[7+round]=='R' && pMsg->MsgData[9+round]=='A'){ return 1; } } }else os_dly_wait(1); } } return 0; } void M9507CSendTcpData(unsigned char socket, unsigned char *pData, unsigned short len) { char buf[20]; sprintf(buf, "AT+TCPSEND=%d,%d,",socket, len); ModemSendAT(buf); ModemSendData(pData, len); ModemSendAT("\r\n"); } void MC8332ModemSendTcpData(unsigned char socket,unsigned char *pData,unsigned short len) { M9507CSendTcpData(socket, pData, len); PrintTcpData(pData,len); if(socket == GPS_DATA_SOCKET) if(g_ucModemSentTcpCt<255)g_ucModemSentTcpCt++; if(socket == GPS_DATA_SOCKET) sutGpsInfo.isServerLogin = OPEN; } int ModemGPSStart(void) { int t; int i; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; RunMake(THIS_FILE_ID); for(i=0;i<5;i++) { t=100; ModemSendAT("AT+GPSSTART\r\n");//此指令一旦设置了一次后,下次会返回ERROR while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,"RING") || 0==ModemStrCmp((char *)pMsg->MsgData,"ERROR")){ return 0; } }else os_dly_wait(1); } } return 1; } char GPSModeSet(void) { int t,i; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; RunMake(THIS_FILE_ID); for(i=0;i<3;i++) { t=100; ModemSendAT("AT+NMEAS?\r\n"); while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,"+NMEAS:")) { if(pMsg->MsgData[7] == '0') return 0; //OK else ModemSendAT("AT+NMEAS=0\r\n"); } }else os_dly_wait(1); } } return 1; } void ModemApnConfig(void) { char buf[60],index; char buf2[40]; char i; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; sprintf(buf, "[11]Accessp:"); if(sutProductPara.APNApn[0]==0) {//接入点为空时不配置,因为模块不支持 strcat(buf, "unsupport-Empty"); }else { sprintf(buf2, "AT+MIPPROFILE=1,\"%s\"\r\n",sutProductPara.APNApn); ModemSendAT(buf2); sprintf(buf2, "%s",sutProductPara.APNApn); strcat(buf,buf2); } SlwTrace(INF,buf,0); sprintf(buf, ",Name-Pass:"); if(sutProductPara.APNName[0] ==0 || sutProductPara.APNPass[0] ==0) {//名称或密码为空不配置,因为模块不支持 strcat(buf, "unsupport-Empty"); }else { sprintf(buf2,"AT^PPPCFG=\"%s\",\"%s\"\r\n",sutProductPara.APNName,sutProductPara.APNPass); ModemSendAT(buf2); sprintf(buf2, "%s,%s",sutProductPara.APNName,sutProductPara.APNPass); strcat(buf,buf2); } SlwTrace(INF,buf,1); } 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 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); } 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; } /***********************************************************************************/