| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263 |
- /**********************************************************************************
- * 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();
- }
- char ModemLCCCheck(void)
- {
- int t,i;
- SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
- SlwTrace(INF, "check version type",1);
- for(i=0;i<100;i++)
- {
- t=50;
- ModemSendAT("AT+LSPOCPF?\r\n");
- while(t--)
- {
- if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
- {
- if((0==ModemStrCmp((char *)pMsg->MsgData,"ERROR"))){
- SlwTrace(INF, "It is not 3 in 1 version quit this check",1);
- return 0;
- }else if(0==ModemStrCmp((char *)pMsg->MsgData,"+LSPOCPF:")){//+LSPOCPF:hgs(1)
- //这个模块支持三合一指令,即为三合一模块版本
- if(pMsg->MsgData[13] == '1'){
- SlwTrace(INF, "It is hgs version now",1);
- return 0;
- }else{
- SlwTrace(INF, "Reset to hgs version and reboot",1);
- ModemSendAT("AT+LSPOCPF=hgs\r\n");
- ShowMessageBox("切换海高思版本");
- t=0;
- while(++t<50){
- DelayMs(2);
- IWDG_ReloadCounter();
- }
- return 1;
- }
- }
- }else
- os_dly_wait(1);
- }
- }
- SlwTrace(INF, "TimeOut",1);
- return 0;
- }
- /**********************************************************************************
- 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;i<len;i++)
- {
- HexToAsc(HexStr[i],&AscStr[j]);
- j+=2;
- }
- }
- /***********************************************************************************
- *ModemSendUdpData WCDMA没有UDP指令
- ************************************************************************************/
- int ModemSendUdpData(unsigned char socket,unsigned char *pData,unsigned short len)
- {
- int i;
- char buf[142];
- char tmp[5];
- unsigned char temp=0;
- snprintf(buf, sizeof(buf),"AT+ZIPSENDU=%d,%d\r",socket,len);
- ModemSendAT(buf);
- ModemSendData(pData,len);
-
- snprintf(buf, sizeof(buf),"UdpSend[%d]",len);
- SlwTrace(INF,buf,1);
-
- #ifdef SLW_DEBUG
- if(len>45)len=45;
- buf[0]='>';buf[1]='>';buf[2]=0;
- for(i=0;i<len;i++){
- snprintf(tmp, sizeof(tmp),"%02x,",pData[i]);
- strcat(buf,tmp);
- }
- SlwTrace(DEBUG,buf,1);
- #endif
- return 0;
-
- }
- /***********************************************************************************
- *StrToNum
- ************************************************************************************/
- unsigned short StrToNum(char *str)
- {
- unsigned short num;
- if(str[0]>0x2f && 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;
- }
- unsigned char AsciiHexStringToHexBytes(char *src, unsigned char *des)
- {//"3031"-->0x30,0x31
- unsigned char temp[2];
- unsigned char i,k;
- int len;
-
- len=strlen(src);
- if(len % 2) return 0;//不能为单数
- for(i=0;i<len/2;i++){
- temp[0]=src[2*i];
- temp[1]=src[2*i+1];
- for(k=0;k<2;k++){
- if(temp[k] >= '0' && temp[k] <= '9') temp[k] -= 0x30;
- else if(temp[k] >= 'a' && temp[k] <= 'f') temp[k] -= 0x57;
- else if(temp[k] >= 'A' && temp[k] <= 'F') temp[k] -= 0x37;
- }
- des[i] = ((temp[0]<<4)&0xf0) | temp[1];
- }
- return i;
- }
- /*******************************************************************
- *ModemCheckPocParam
- return:
- 1--not same, Reset
- 0--same,no reset
- ********************************************************************/
- int ModemCheckPocParam(void)
- {
- int t,j;
- int i,len;
- char buf[40];
- char buf1[100];
- char idFlag=0;
- char ipFlag=0;
- char pwdFlag=0;
- SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
- // #error "也测试一下这个函数正常与否呗"
- for(i=0;i<5;i++)
- {
- ModemSendAT("AT+POC=020000\r\n");
- //+POC:0200000069643D313030303031343031343B69703D3138332E3133312E31332E31303B7077643D3135303034343739303438383931343B646F6D61696E3D7777772E6869676F73706F632E636F6D3B
- //id=1000014014;ip=183.131.13.10;pwd=150044790488914;domain=www.higospoc.com;
- t=50;
- while(t--)
- {
- if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
- {
- if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:02"))
- {
- pMsg->MsgData[pMsg->MsgLen-3]=0;
- len=AsciiHexStringToHexBytes(&pMsg->MsgData[13], pMsg->MsgData);
- pMsg->MsgData[len]=0;
- //找id
- len=GetParaFromStr(pMsg->MsgData,"id",buf);
- snprintf(buf1, sizeof(buf1),"%lu",sutProductPara.PSN);
- if(0!=strcmp(buf1, buf)) idFlag=1;;
- //找ip
- len=GetParaFromStr(pMsg->MsgData,"ip",buf);
- snprintf(buf1, sizeof(buf1), "%s", getPIPAddr());
- if(0!=strcmp(buf1, buf)) ipFlag=1;
- //找pwd
- len=GetParaFromStr(pMsg->MsgData,"pwd",buf);
- snprintf(buf1, sizeof(buf1), "%s",DEV_HARDID);
- if(0!=strcmp(buf1, buf)) pwdFlag=1;
- if(idFlag == 0 && ipFlag==0 && pwdFlag==0) return 0;
- RESET_ALL:
- ModemSendAT("AT+POC=010000");
- //更新id
- //if(idFlag != 0){
- snprintf(buf, sizeof(buf),"id=%lu;",sutProductPara.PSN);
- AscStrToHexStr(buf,buf1);
- ModemSendAT(buf1);
- //}
- //更新ip
- //if(ipFlag != 0){
- snprintf(buf, sizeof(buf), "ip=%s;", getPIPAddr());
- AscStrToHexStr(buf,buf1);
- ModemSendAT(buf1);
- //}
- //更新pwd
- //if(pwdFlag != 0){
- snprintf(buf, sizeof(buf), "pwd=%s;",DEV_HARDID);
- AscStrToHexStr(buf,buf1);
- ModemSendAT(buf1);
- //}
- ModemSendAT("\r\n");
- return 1;
- }
- }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 移动联通模块版本
- //Model: U9507C V3 全网通版本
- 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 V3")|| 0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C SXNT")){
- //单电信
- support_type=ONLY_Telecom;
- }else if(0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C_SXNM")|| 0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C SXNM")){
- //移动联通版
- support_type=Mobile_unicom;
-
- }else if(0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C POCC") ){
-
- 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;j<strlen(pMsg->MsgData);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(DEV_HARDID, &pMsg->MsgData[2], len);
- if(len < sizeof(DEV_HARDID))
- DEV_HARDID[len]=0;
- return 1;
- }else if(len == 17)
- {
- len -= 2;
- memcpy(DEV_HARDID, pMsg->MsgData, len);
- if(len < sizeof(DEV_HARDID))
- DEV_HARDID[len]=0;
- return 2;
- }
- }else
- os_dly_wait(1);
- }
- }
- return 0;
- }
- void CheckPocType(void)
- {
- //19001 19002 19003 自研POC版本号
- //1184 1191 西安POC版本号
- hgs_poc_type=POC_XIAN;//默认是西安的,然后通过POC版本号来判断是西安的还是自研的POC
-
- if(g_iPocVer > 19000){
- hgs_poc_type=POC_OWN;
- SlwTrace(INF, "poc-own",1);
- }else SlwTrace(INF, "poc-xian",1);
- }
- void ModemPocVersionCheck(void)
- {
- char bufTemp[40];
- short t,i,len,j;
- int ver;
- 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;i<len;i++)
- {
- if(pMsg->MsgData[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 needAuthLogin=0;
- char buf[100];
- char buf2[80];
- char i,t;
- char ApnSetFlag=0;
- char *apnName=newPara.apnList.apnList[newPara.apnList.defaultuse].account;
- char *apnPass=newPara.apnList.apnList[newPara.apnList.defaultuse].pass;
- SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
-
- snprintf(buf, sizeof(buf), "[11]Accessp:");
- if(newPara.apnList.APN_Name[0]==0)
- {//接入点为空时不配置,因为模块不支持
- strcat(buf, "unsupport-Empty");
- }else
- {
- snprintf(buf2, sizeof(buf2), "AT+MIPPROFILE=1,\"%s\"\r\n",newPara.apnList.APN_Name);
- ModemSendAT(buf2);
- snprintf(buf2, sizeof(buf2), "%s",newPara.apnList.APN_Name);
- strcat(buf,buf2);
- }
- SlwTrace(INF,buf,0);
-
- snprintf(buf, sizeof(buf), ",Name-Pass:");
- if(apnName[0] ==0 ||
- apnPass[0] ==0)
- {//名称或密码为空不配置,因为模块不支持
- strcat(buf, "unsupport-Empty");
- }else
- {
- snprintf(buf2, sizeof(buf2),"AT^PPPCFG=\"%s\",\"%s\"\r\n",apnName,apnPass);
- ModemSendAT(buf2);
- snprintf(buf2, sizeof(buf2), "%s,%s",apnName,apnPass);
- strcat(buf,buf2);
- needAuthLogin=1;
- }
- SlwTrace(INF, buf,1);
- if(needAuthLogin != 0){
- //认证
- snprintf(buf, sizeof(buf),"AUTH-LOGIN:");
- switch(newPara.authType){
- case AUTH_LOGIN_PAP:strcat(buf, "PAP");
- snprintf(buf2, sizeof(buf2),"AT$QCPDPP=1,%d,%s,%s\r\n",newPara.authType,apnPass,apnName);
- break;
- case AUTH_LOGIN_CHAP:strcat(buf, "CHAP");
- case AUTH_LOGIN_NONE:strcat(buf, "NONE");
- default:strcat(buf, " Do nothing");
- snprintf(buf2, sizeof(buf2),"AT$QCPDPP=1,%d\r\n",newPara.authType);
- break;
- }
- SlwTrace(INF,buf, 1);
- ModemSendAT(buf2);
- SlwTrace(INF,buf2,0);
- os_dly_wait(20);
- SlwTrace(INF,"AuthLogin Done",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;
- char sendBuf[40],readBuf[30];
- char target[5];
-
- snprintf(sendBuf, sizeof(sendBuf), "at+syscmd=start_pcm volume ");
- snprintf(readBuf, sizeof(readBuf), "at+syscmd=start_pcm volume\r\n");
- if(newPara.SoundMode==0) snprintf(target, sizeof(target), "7 5");
- else snprintf(target, sizeof(target), "7 7");
- strcat(sendBuf, target);
- strcat(sendBuf, "\r\n");
-
- //先配置一次,再查,因为默认就查有可能是没有返回的
- ModemSendAT(sendBuf);//TTS 音量/ MIC 输入音量
- for(i=0;i<10;i++)
- {
- t=100;
- ModemSendAT(readBuf);
- while(t--)
- {
- if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
- {
- if(0==ModemStrCmp((char *)pMsg->MsgData,target))
- {
- SlwTrace(INF, "[07]Set Volume ok",1);
- return;
- }else{
- if(t==0) ModemSendAT(sendBuf);
-
- }
- }else
- os_dly_wait(1);
- }
- }
- SlwTrace(INF, "[07]Set Volume failed",1);
- }
- void SpeakTTSVoice(void)
- {
- int len,timeout;
- SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
- unsigned char codeType=ENCODE_UNICODE;
-
- if(newPara.ttsMessage[0]==0) return;
- len=strlen(newPara.ttsMessage);
- len = len+(8-len%8);//8倍数
- timeout=len/8;//两个中文需要播报1秒算
- timeout *= 100;
- if(newPara.ttsCodeType==TTS_UNICODE) codeType=ENCODE_UNICODE;
- else if(newPara.ttsCodeType==TTS_GBK) codeType=ENCODE_GBK;
- MeSpeak(codeType, newPara.ttsMessage,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) {
- 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=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;
- }
- //检查并设置POC域名
- int ModemCheckFotaDomain(void)
- {
- #if 1
- return 0;
- #else
- int t,j;
- int i,len;
-
- 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=21000000\r\n");
-
- t=50;
- while(t--)
- {
- if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
- {
- if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:21000000"))
- {
-
- snprintf(buf2,sizeof(buf2),"%s",sutProductPara.fota_pocdomain);
- //strcat(buf,buf2);
- for(j=0;j<strlen(pMsg->MsgData);j++) if(pMsg->MsgData[j]== '\r') pMsg->MsgData[j] = 0;
- if(0!=strcasecmp((char *)&pMsg->MsgData[13],buf2))
- {
- snprintf(buf1,sizeof(buf1),"AT+POC=21000001%s",buf1);
- return 1;
- }else return 0;
- }
- }else os_dly_wait(1);
- }
- }
- return 0;
- #endif
- }
- int htoi(char s[])
- {
- int i = 0;
- int n = 0;
- if (s[0] == '0' && (s[1]=='x' || s[1]=='X'))
- {
- i = 2;
- }
- else
- {
- i = 0;
- }
- for (; (s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z') || (s[i] >='A' && s[i] <= 'Z');++i)
- {
- if (tolower(s[i]) > '9')
- {
- n = 16 * n + (10 + tolower(s[i]) - 'a');
- }
- else
- {
- n = 16 * n + (tolower(s[i]) - '0');
- }
- }
- return n;
- }
- int ModemSetCodec(unsigned char addr,unsigned short value)
- {
- int t,j;
- int i,len;
- SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
- char buf[50];
- for(i=0;i<10;i++){
- t=50;
- sprintf(buf,"AT+CODEC=3,%2x,%4x\r\n",addr,value);
- ModemSendAT(buf);
- while(t--)
- {
- if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
- {
- len=strlen((char *)&(pMsg->MsgData));
- if(0==ModemStrCmp((char *)pMsg->MsgData,"OK"))
- {
- //SlwTrace(INF,(char *)pMsg->MsgData,1);
- return 0;
- }
- }else os_dly_wait(1);
- }
- }
-
- return addr;
- }
- void VolumeSetSpk(void)
- {
- char i,t;
- int Volume;
- SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
- char sendBuf[40],readBuf[30];
- char target[5];
- char tmp;
- if(newPara.SoundMode==0)tmp=newPara.lvl;
- else tmp=newPara.OutDoorLvl;
-
- snprintf(sendBuf,sizeof(sendBuf),"AT+LVL=4,%d\r\n",tmp);
- snprintf(readBuf,sizeof(readBuf),"+LVL:4,%d\r\n",tmp);
-
- SlwTrace(INF,sendBuf,0);
- for(i=0;i<15;i++)
- {
- t=100; //100
- ModemSendAT(sendBuf);//TTS 音量/ MIC 输入音量
- os_dly_wait(100);
- ModemSendAT("AT+LVL?\r\n");
- while(t--)
- {
- if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
- {
- if(0==ModemStrCmp((char *)pMsg->MsgData,readBuf))
- {
- SlwTrace(INF, "[07-02]Set SPK ok",1);
- return;
- }
-
- }else
- os_dly_wait(1);
- }
- }
- SlwTrace(INF, "[07-02]Set Volume failed",1);
- }
- void VolumeSetMIC(void)
- {
- char i,t;
- char buf[40];
- char readbuf[20];
- int Volume;
- SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
- snprintf(buf,sizeof(buf),"AT+MIC=4,255\r\n");
- snprintf(readbuf,sizeof(readbuf),"+MIC:4,255\r\n");
-
- ModemSendAT(buf);//TTS 音量/ MIC 输入音量
- SlwTrace(INF,buf,0);
- SlwTrace(INF,readbuf,0);
- for(i=0;i<15;i++)
- {
- t=50; //100
- os_dly_wait(10);
- ModemSendAT("AT+MIC?\r\n");
- while(t--)
- {
- if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
- {
- if(0==ModemStrCmp((char *)pMsg->MsgData,readbuf))
- {
- SlwTrace(INF, "[07-03]Set MIC ok",1);
- return;
- }else{
- if(t==0) ModemSendAT(buf);
-
- }
- }else
- os_dly_wait(1);
- }
- }
- SlwTrace(INF, "[07-03]Set MIC failed",1);
- }
- /***********************************************************************************/
|