Example #1
0
// 从列表中解析出全部短消息
// 输入: pBuff - 短消息列表缓冲区
// 输出: pMsg - 短消息缓冲区
// 返回: 短消息条数
int gsmParseMessageList(SM_PARAM* pMsg, SM_BUFF* pBuff)
{
	int nMsg;			// 短消息计数值
	char* ptr;			// 内部用的数据指针

	nMsg = 0;
	ptr = pBuff->data;

	// 循环读取每一条短消息, 以"+CMGL:"开头
	while((ptr = strstr(ptr, "+CMGL:")) != NULL)
	{
		ptr += 6;		// 跳过"+CMGL:", 定位到序号
		sscanf(ptr, "%d", &pMsg->index);	// 读取序号
//		TRACE("  index=%d\n",pMsg->index);

		ptr = strstr(ptr, "\r\n");	// 找下一行
		if (ptr != NULL)
		{
			ptr += 2;		// 跳过"\r\n", 定位到PDU

			gsmDecodePdu(ptr, pMsg);	// PDU串解码

			pMsg++;		// 准备读下一条短消息
			nMsg++;		// 短消息计数加1
		}
	}

	return nMsg;
}
Example #2
0
/////////////////////////////////////////////////////////////////////////////////
// 函数:gsmReadMessage                                                        //
// 说明:读取短消息,用+CMGL代替+CMGR,可一次性读出全部短消息                  //
// 参数:                                                                      //
//      pMsg: 短消息缓冲区,必须足够大                                         //
// 返回: 短消息条数                                                            //
/////////////////////////////////////////////////////////////////////////////////
int CSerialPort::gsmReadMessage(SM_PARAM* pMsg)
{
	int nLength;        // 串口收到的数据长度
    int nMsg;           // 短消息计数值
    char* ptr;          // 内部用的数据指针
	char *ptr1;
    char cmd[16];       // 命令串
    char ans[1024];     // 应答串
   
    nMsg = 0;
    ptr = ans;

	sprintf(cmd, "AT+CMGR=1\r");    // 生成命令
    
    WritePort(cmd, strlen(cmd));    // 输出命令串
	Sleep(ShortSleepTime);
    nLength = ReadPort(ans, 1024);    // 读应答数据
    // 根据能否找到"+CMS ERROR"决定成功与否
	ans[nLength]='\0';

	if(nLength > 0 && strncmp(ans, "+CMGR:", 6) != 0)
    {
        // 循环读取每一条短消息, 以"+CMGL:"开头
        pMsg->index=1;
        ptr = strstr(ans, "\r\n089168");
        ptr += 2;        // 跳过"\r\n"
        ptr1=ptr;
        for(int ii=0;;ii++)
        {
            ptr1=ptr1+1;
            if(*ptr1=='\r'&&*(ptr1+1)=='\n'&&*(ptr1+2)=='\r'&&*(ptr1+3)=='\n')
            {
                *ptr1=0x0;
                break;
            }
        }     
        gsmDecodePdu(ptr, pMsg);    // PDU串解码
        nMsg++;        // 短消息计数加1        
    }

    sprintf(cmd, "AT+CMGD=1,4\r");    // 生成命令
    
    WritePort(cmd, strlen(cmd));    // 输出命令串
	Sleep(ShortSleepTime);
    return nMsg;
}
Example #3
0
int ReadMsg(char *pzMsg, int nCodeType, unsigned index)
{
	if (index==0)
	{
		return -1;
	}

	if (AT_Set_CodeType(nCodeType)==FALSE)
	{
		return -2;
	}

	char szATCmd[CodeLen];
	char szOneMsg[CodeLen];
	char szTemp[CodeLen];
	char *p=NULL;

	int nhaveTrytime=0;

	sprintf(szATCmd,"AT+CMGR=%d\r", index);
	SendATCmd(szATCmd);
	
	nhaveTrytime=0;
	memset(szATCmd, 0, CodeLen);
	while (nhaveTrytime<WaitForSMSSendOKTime)
	{
		GetATCmd(szTemp);
		strcat(szATCmd, szTemp);	
		
		if (strstr(szATCmd, "\r\nERROR\r\n")!=NULL)
		{
			return -3;
		}

		if (strstr(szATCmd, "\r\nOK\r\n")!=NULL)
		{
			break;
		}

		nhaveTrytime++;
	}

	if (strstr(szATCmd, "\r\nOK\r\n")==NULL)
	{
		return -4;
	}

	//完整消息 text模式    15\r\n 这个15就是数据
	//		AT+CMGR=1\r
	//		\r\n
	//		+CMGR: "REC READ","+8615802047291",,"12/05/25,14:32:48+32"\r\n
	//		15\r\n
	//		\r\n
	//		OK\r\n

	//		AT+CMGR=11\r
	//		\r\n
	//		+CMGR: 0,,0\r\n
	//		\r\n
	//		OK
	//		\r\n

	//完整消息 PDU模式    xxxx\r\n 这个xxxx就是数据
	//		AT+CMGR=1\r
	//		\r\n
	//		+CMGR: 1,,22\r\n
	//		xxxxxxxx\r\n
	//		\r\n
	//		OK\r\n

	p=strstr(strstr(szATCmd,"\r\n")+2,"\r\n")+2;
	
	memset(szOneMsg, 0, CodeLen);
	strncpy(szOneMsg, p, strstr(p, "\r\n") - p);		

	#ifdef WIN32
	if (nCodeType == SMS_PDU)
	{
		SM_PARAM sm_p;
		memset(&sm_p, 0, sizeof(sm_p));
		gsmDecodePdu(szOneMsg, &sm_p);
		sprintf(pzMsg, "%s", sm_p.TP_UD);
	}
	else
	{
		sprintf(pzMsg, "%s", szOneMsg);
	}
	#endif

	sprintf(pzMsg, "%s", szOneMsg);
	
	return 0;
}