⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xsmsfrm.c

📁 在GPRS或者CDMA modem上实现发送/接收短信的C代码;支持Siemens
💻 C
📖 第 1 页 / 共 5 页
字号:
	//read all data by finding string " \x0D\x0AOK\x0D\x0A"
	memset(rawSmsbuf, 0, sizeof(rawSmsbuf));
	p1 = inSmsbuf;
	if(p2 = strstr(inSmsbuf, "\x0D\x0AOK\x0D\x0A"))
	{
		rawSmslen = p2 - p1;
		memcpy(rawSmsbuf, p1, rawSmslen); //get message body including 0x0D and 0x0A
	//	*len = msglen;
	}
	else
	{
		WMMP_TRACE(debugType, "Error:Bellwave Not new SMS");
		pSms = NULL;
		*len = 0;
		ret = -SMS_ERR_NEWSMS_FORM;
		goto bellwave_recv_fail;
	}
    //bellwave_parse return the decoding SMS data to application
	ret = bellwave_parse(rawSmsbuf, rawSmslen, pSms, len, pFrom);
	if(ret  < 0)
	{
		WMMP_TRACE(debugType, "\r\nBellwave failed to parse raw message");
		ret = -SMS_ERR_NEWSMS_FORM;
		goto bellwave_recv_fail;
	}
	
	return 0; 
	
bellwave_recv_fail:
	return ret;
}

/*
AT$MTCNT?
\x0D\x0A2,1\x0D\x0A
\x0D\x0AOK\x0D\x0A
*/
int  bellwave_ifnew(int fd, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0, msglen = 0;
	int i = 0;
	int iRetLen = 0;
	char *p1 = NULL, *p2 = NULL;
	uchar szTemp[10];

	cleartty(fd); //clear tty read and send buffer
	
	memset(xSmsbuf, 0, sizeof(xSmsbuf));
	sprintf(xSmsbuf, "AT$MTCNT?\x0D");
	msglen = strlen(xSmsbuf);

    WMMP_TRACE(debugType, "\r\nWrite: %s, Length: %d\r\n", xSmsbuf, strlen(xSmsbuf));
	ret = writetty(fd, msglen, 2, xSmsbuf);
	if(ret == 0)
	{
		memset(inSmsbuf, 0x00, sizeof(inSmsbuf));
		ret = readtty(fd, sizeof(inSmsbuf), 3, inSmsbuf, &iRetLen);
		if(ret < 0)
		{
			WMMP_TRACE(debugType, "\n\rError: Bellwave read SMS cnt");
			ret = -SMS_ERR_READ_TTY;
			goto bellwave_ifnew_fail;
		}
		if((p1 = strstr(inSmsbuf, ",")) && (p2 = strstr(inSmsbuf, "OK")))
		{
			p1 += 1;//point to the first number
			p2 -= 4;//point to the last number
			memset(szTemp, 0, sizeof(szTemp));
			for(i = 0; i < p2 - p1; i++)
			{
				szTemp[i] = *(p1 + i);
			}
			
			ret = atoi(szTemp);
			WMMP_TRACE(debugType, "\r\nBellwave has %d new SMS\r\n", ret);
			return ret;
		}
		else
		{
			WMMP_TRACE(debugType, "Error: Not new sms");
			ret = -SMS_ERR_NONEWSMS;
			goto bellwave_ifnew_fail;
		}
		return 0;
	}
	else// if(ret < 0)
	{
		WMMP_TRACE(debugType, "\n\rError: Bellwave query new SMS");
		ret = -SMS_ERR_SEND_ATCMD;
		goto bellwave_ifnew_fail;
	}
	
	return 0;

bellwave_ifnew_fail:
	return ret;
}

int bellwave_parse(const uchar *pRawSms, int rawlen, uchar * pMsg, int * msgLen, char *pFrom)
//20060608173840,10109862,4098,4,"unicode coding"\x0D\x0A
//20061020134847,13328657218,4098,0,"010203FF0D"\x0D\x0A
//20061108144656,15960095351,4098,0,"0F0E030201"\x0D\x0A
//20061108144656,15960095351,4098,2,"This is a test"\x0D\x0A
//Notion: the msg_encoding value, only support 0, 2 and 4.
{
	int ret = 0, len = 0;
	const uchar *pRaw = NULL, *pData = NULL;
	uchar *p1 = NULL, *p2 = NULL;
	uchar szTemp[10];
	int msgCode = 0;
	
	pRaw = pRawSms;
	pData = pMsg;

	//get callback number
	if(p1 = strstr(pRaw, ","))
	{
		p1 += 1;
		pRaw = p1;
		if(p2 = strstr(pRaw, ","))
		{
			len = p2 - p1;
			memcpy(pFrom, p1, len);
		}
		else
		{
			WMMP_TRACE(debugType, "\r\nError: bellwave callback phone number 2");
			ret = -SMS_ERR_NEWSMS_FORM;
			goto bellwave_parse_fail;
		}
		//point to TI first character
		p2 += 1;
		p1 = p2;
		pRaw = p2;
	}
	else
	{
		WMMP_TRACE(debugType, "\r\nError: bellwave callback phone number 1");
		ret = -SMS_ERR_CALLBACK_NUM;
		goto bellwave_parse_fail;
	}

	//get msg_encoding
	p1  = strstr(pRaw, ",");
	if(p1 == NULL)
	{
		WMMP_TRACE(debugType, "\r\nError: bellwave message encoding 1");
		ret = -SMS_ERR_MSG_CODING;
		goto bellwave_parse_fail;
	}
	p1 += 1; //p1 now points to the first character of message encoding
	pRaw = p1;
	p2 = strstr(pRaw, ",");
	if(p2 == NULL)
	{
		WMMP_TRACE(debugType, "\r\nError: bellwave message encoding 2");
		ret = -SMS_ERR_MSG_CODING;
		goto bellwave_parse_fail;
	}
	//get message encoding value
	memset(szTemp, 0, sizeof(szTemp));
	memcpy(szTemp, p1, p2 - p1);
	msgCode = atoi(szTemp);
	WMMP_TRACE(debugType, "\r\nmsg code = %d\r\n", msgCode);
	if( !(msgCode == 0 || msgCode == 2 || msgCode == 4) )
	{
		WMMP_TRACE(debugType, "\r\nError: bellwave messge encoding 3");
		ret = -SMS_ERR_MSG_CODING;
		goto bellwave_parse_fail;		
	}

	//get message body
	//20061108144656,15960095351,4098,0,"0F0E030201"\x0D\x0A
	p1 = strstr(pRaw, "\"");
	if(p1 == NULL)
	{
		WMMP_TRACE(debugType, "\r\nError: bellwave message body");
		ret = -SMS_ERR_MSG_DATA;
		goto bellwave_parse_fail;
	}
	p1 += 1;
	pRaw = p1;
	p2 = strstr(pRaw, "\"");
	if(p2 == NULL)
	{
		WMMP_TRACE(debugType, "\r\nError: bellwave message body");
		ret = -SMS_ERR_MSG_DATA;
		goto bellwave_parse_fail;
	}
	len = p2 - p1;

	if (msgCode == 0)
	{//8-bit, //transform data to binary
		ret = tofdbin(pMsg, p1, len);
		if(ret < 0)
		{
			WMMP_TRACE(debugType, "\r\nError: bellwave transfer");
			ret = -SMS_ERR_CONV_DATA;
			goto bellwave_parse_fail;
		}
		*msgLen = len/2;
	}
	else if (msgCode == 2)
	{//7-bit, unnecessary to transform data
        memcpy(pMsg, p1, len);
		*msgLen = len;
	}
	else //msgCode == 4
	{//unicode
        ret = convsmsdata(p1, len, pMsg, msgLen, UCS16_TO_GB);
		if (ret < 0)
		{
			ret = -SMS_ERR_CONV_DATA;
			goto bellwave_parse_fail;
		}
	}
	
	return 0;

bellwave_parse_fail:
	return ret;
}


/*
AT$MTCNT?
\x0D\x0A2,1\x0D\x0A
\x0D\x0AOK\x0D\x0A
*/
int bellwave_delall(int fd)
{
	int smscnt = 0;
	int ret = 0;

	smscnt = bellwave_getsmscnt(fd);
	if(smscnt < 0)
	{
		WMMP_TRACE(debugType, "\r\nBellwave fidelix to get sms counts");
		ret = -SMS_ERR_GET_SMSCNT;
		goto bellwave_delall_fail;
	}
	
	while(smscnt > 0)
	{
		cleartty(fd);
		
		memset(xSmsbuf, 0, sizeof(xSmsbuf));
		sprintf(xSmsbuf, "AT$DELMT=%d\x0D", smscnt - 1);
	    ret = writetty(fd, strlen(xSmsbuf), 2, xSmsbuf);
		if(ret < 0)
		{
			WMMP_TRACE(debugType, "\r\nError: delete bellwave sms");
			ret = -SMS_ERR_SEND_ATCMD;
			goto bellwave_delall_fail;
		}
		ret = wait_for_OK(fd, "OK", 2);
		if(ret < 0)
		{
			WMMP_TRACE(debugType, "\r\nError: delete bellwave sms return no OK");
		}
		else
		{
			WMMP_TRACE(debugType, "\r\nBellave delete one sms");
		}
		smscnt--;
	}
	
	return 0;

bellwave_delall_fail:
	return ret;
}

int bellwave_delone(int fd)
{
	int ret = 0;
	int smscnt = 0;

	smscnt = bellwave_getsmscnt(fd);
	if(smscnt <=0 )
	{
		ret = -SMS_ERR_GET_SMSCNT;
		goto bellwave_delone_succ;
	}

	cleartty(fd);
		
	memset(xSmsbuf, 0, sizeof(xSmsbuf));
	sprintf(xSmsbuf, "AT$DELMT=%d\x0D", smscnt - 1);
	ret = writetty(fd, strlen(xSmsbuf), 2, xSmsbuf);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: delete bellwave sms");
		ret = -SMS_ERR_SEND_ATCMD;
		goto bellwave_delone_fail;
	}
	ret = wait_for_OK(fd, "OK", 2);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: delete bellwave sms return no OK");
	}
	else
	{
		WMMP_TRACE(debugType, "\r\nBellave delete one sms");
	}	

bellwave_delone_succ:
	return 0;

bellwave_delone_fail:
	return ret;
}

int bellwave_getsmscnt(fd)
{
	int ret = 0, msglen = 0;
	int i = 0;
	int iRetLen = 0;
	char *p1 = NULL, *p2 = NULL;
	uchar szTemp[10];
	int smscnt = 0;

	cleartty(fd); //clear tty read and send buffer
	
	memset(xSmsbuf, 0, sizeof(xSmsbuf));
	sprintf(xSmsbuf, "AT$MTCNT?\x0D");
	msglen = strlen(xSmsbuf);

    WMMP_TRACE(debugType, "\r\nWrite: %s, Length: %d\r\n", xSmsbuf, strlen(xSmsbuf));
	ret = writetty(fd, msglen, 2, xSmsbuf);
	if(ret == 0)
	{
		memset(inSmsbuf, 0x00, sizeof(inSmsbuf));
		ret = readtty(fd, sizeof(inSmsbuf), 3, inSmsbuf, &iRetLen);
		if(ret < 0)
		{
			WMMP_TRACE(debugType, "\n\rError: Bellwave_getsmscnt read SMS cnt");
			ret = -SMS_ERR_READ_TTY;
			goto bellwave_getsmscnt_fail;
		}
		if((p1 = strstr(inSmsbuf, ",")) && (p2 = strstr(inSmsbuf, "\x0D\x0A")))
		{
			p2 += 2;//point to the last number
			memset(szTemp, 0, sizeof(szTemp));
			for(i = 0; i < p1 - p2; i++)
			{
				szTemp[i] = *(p2 + i);
			}
			
			smscnt = atoi(szTemp);
			WMMP_TRACE(debugType, "\r\nBellwave_getsmscnt has %d SMS\r\n", smscnt);
		}
		else
		{
			WMMP_TRACE(debugType, "Error: Bellwave_getsmscnt check new sms");
			ret = -SMS_ERR_GET_SMSCNT;
			goto bellwave_getsmscnt_fail;
		}
	}
	else// if(ret < 0)
	{
		WMMP_TRACE(debugType, "\n\rError: Bellwave_getsmscnt query new SMS");
		ret = -SMS_ERR_SEND_ATCMD;
		goto bellwave_getsmscnt_fail;
	}
	
	return smscnt;

bellwave_getsmscnt_fail:
	return ret;
	
}

int gprs_init(int fd, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0;
	int i, j, cmdCnt, cmdsize;
    
	uchar ucAtCmd[4][50];

	cmdsize = sizeof(ucAtCmd)/sizeof(ucAtCmd[0]);
	for (i = 0; i < cmdsize; i++)
	{
		memset(ucAtCmd[i], 0, sizeof(ucAtCmd[i]));
	}

	//ATE0
	//control echo display
	sprintf(ucAtCmd[0], "ATE0\x0D");
	//if text: AT+CMGF=1
	//if 7-bit AT+CSCS="GSM" AT+CSMP=17,167,0,241
	//if 8-bit AT+CSCS="GSM" AT+CSMP=17,167,0,21
	//if UCS16 AT+CSCS="GSM" AT+CSMP=17,167,0,25
    //if pdu: AT+CMGF=0 for 7-bit, 8-bit and UCS16-bit
    if (ucSmsType == SMS_TEXT)
    {
		sprintf(ucAtCmd[1], "AT+CMGF=1\x0D");        //first command
		sprintf(ucAtCmd[2], "AT+CSCS=\"GSM\"\x0D");  //second command
		if (ucSmsCode == SMS_ENCODE_7BIT)
		{
            sprintf(ucAtCmd[3], "AT+CSMP=17,167,0,17\x0D");
		}
		else if (ucSmsCode == SMS_ENCODE_8BIT)
		{
			sprintf(ucAtCmd[3], "AT+CSMP=17,167,0,21\x0D");
		}
		else if (ucSmsCode == SMS_ENCODE_UCS16)
		{
			sprintf(ucAtCmd[3], "AT+CSMP=17,167,0,25\x0D");
		}
		else
		{
            ret = -SMS_ERR_SMS_CODE;
			goto gprs_init_fail;
		}
		cmdCnt = 4; //3 AT commands
    }
	else if (ucSmsType == SMS_PDU)
	{//PDU only just one AT command
        sprintf(ucAtCmd[1], "AT+CMGF=0\x0D");
		cmdCnt = 2;  //only one AT commands
	}
	else
	{
		ret = -SMS_ERR_SMS_TYPE;
		goto gprs_init_fail;
	}
	
	//send AT command individually
	for(j = 0; j < cmdCnt; j++)
	{
		for (i = 0; i < 5; i++)
		{
			cleartty(fd);
			WMMP_TRACE(debugType, "\r\nWrite: %s, Length: %d\r\n", ucAtCmd[j], strlen(ucAtCmd[j]));
			ret = writetty(fd, strlen(ucAtCmd[j]), 2, ucAtCmd[j]);
			if(ret == 0)
			{
				ret = wait_for_OK(fd, "OK", 2);
				if(ret == 0)
				{
					break;
				}
			}
		}
		if(i == 5 && ret < 0)
		{
			WMMP_TRACE(debugType, "\n\rERROR: TE character set does not return OK");
			ret = -SMS_ERR_AT_NOTOK;
			goto gprs_init_fail;
		}
	}

	EG_ucSmsType = ucSmsType;
	EG_ucSmsCode = ucSmsCode;

	return 0;

gprs_init_fail:
	return ret;
}

//AT+CMGS="13615052569"\x0D
//> 010203000DFF\x1A
//that is to send 0x01,0x02,0x03,0x00,0x0D and 0xFF
int gprs_send(int fd, const uchar *pSms, int len, const char *pDest, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0, msglen = 0, datalen = 0;
	int i, cmdCnt;
	uchar ucAtCmd[3][512];
    
    for (i = 0; i < 3; i++)
    {
		memset(ucAtCmd[i], 0, sizeof(ucAtCmd[i]));
    }
    //AT+CMGS=da or pdu length
    if (ucSmsType == SMS_TEXT)
    {
        sprintf(ucAtCmd[0], "AT+CMGS=\"%s\"\x0D", pDest);
    }
	else if (ucSmsType == SMS_PDU)
	{
        sprintf(ucAtCmd[0], "AT+CMGS=%d\x0D", len);
	}
	else
	{
		WMMP_TRACE(debugType, "\r\nError: unknown sms type");
		ret = -SMS_ERR_SMS_TYPE;
		goto gprs_send_fail;
	}
    //sending data<ctrl-Z>, text or PDU
	sprintf(ucAtCmd[1], "%s\x1A", pSms);
	cmdCnt = 2;

    //transform to PDU format is performed by application
	cleartty(fd); //clear tty read buffer
    //AT+CMGS
    WMMP_TRACE(debugType, "\r\nWrite: %s, Length: %d\r\n", ucAtCmd[0], strlen(ucAtCmd[0]));
	ret = writetty(fd, strlen(ucAtCmd[0]), 2, ucAtCmd[0]);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: Send AT+CMGS");
		ret = -SMS_ERR_SEND_ATCMD;
		goto gprs_send_fail;
	}
	ret = wait_for_OK(fd, ">", 2);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: AT+CMGS does not get > flag");
		ret = -SMS_ERR_AT_NOTOK;
		goto gprs_send_fail;
	}

	//send message body
	//data + 0x1A
//	cleartty(fd);
    WMMP_TRACE(debugType, "\r\nWrite: %s, Length: %d\r\n", ucAtCmd[1], strlen(ucAtCmd[1]));
	ret = writetty(fd, strlen(ucAtCmd[1]), 2, ucAtCmd[1]);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: Write tty to send SMS");
		ret = -SMS_ERR_SEND_ATCMD;
		goto gprs_send_fail;
	}
	ret = wait_for_OK(fd, "+CMGS:", 10);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: Send SMS");
		ret = -SMS_ERR_SEND_SMS;
		goto gprs_send_fail;	
	}
	
	return 0;

gprs_send_fail:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -