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

📄 xsmsfrm.c

📁 在GPRS或者CDMA modem上实现发送/接收短信的C代码;支持Siemens
💻 C
📖 第 1 页 / 共 5 页
字号:
	
	ret = gprs_delall(fd);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nsiemens fails to delete all SMS");
	}
	else
	{
		WMMP_TRACE(debugType, "\r\nsiemens success to delete all SMS");
	}
	
	return ret;
}

//huawei SMS
int huawei_init(int fd, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0;

	cleartty(fd);

	memset(xSmsbuf, 0, sizeof(xSmsbuf));
	memcpy(xSmsbuf, "AT+CSMP?\x0D\x0A", strlen("AT+CSMP?\x0D\x0A"));
       //check AT+CSMP?
    WMMP_TRACE(debugType, "\r\nHuawei check AT+CSMP");
    while(1)
    {
	    ret = writetty(fd, strlen(xSmsbuf), 2, xSmsbuf);
	    if(ret == 0)
		{
			ret = wait_for_OK(fd, "+CSMP:", 1);
			if(ret  == 0)
			{
			    WMMP_TRACE(debugType, "\r\nHuawei AT+CSMP? is OK");
			    break;
			}
		}
    }

	cleartty(fd);

	ret = gprs_init(fd, ucSmsType, ucSmsCode);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: fail to initialize huawei");
	}
	
	return ret;
}

int huawei_send(int fd, const uchar *pSms, int len, const char *pDest, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0;

	ret = gprs_send(fd, pSms, len, pDest, ucSmsType, ucSmsCode);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: huawei fails to send SMS\r\n");
	}

	return ret;
}

/*
TEXT:
at+cmgr=7
+CMGR: "REC READ","8613358271936",,"06/10/19,11:35:58+32",145,36,0,4,"8613800594500",145,5
0D55070809
OK

at+cmgr=1
+CMGR: "REC READ","8613615052569",,"06/12/18,17:39:06+32",145,4,0,8,"8613800591500",145,4
4F60597D 
OK

PDU:
at+cmgr=1
+CMGR: 1,,24
0891683108501905F0040D91683116052565F9000860218171936023044F60597D

OK
*/
int huawei_recv(int fd, uchar *pSms, int *len, char *pFrom, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0;

	memset(rawSmsbuf, 0, sizeof(rawSmsbuf));
	rawSmslen = 0;
	
	ret = gprs_recv(fd, rawSmsbuf, &rawSmslen, ucSmsType, ucSmsCode);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: huawei failed to receive SMS");
		goto huawei_recv_fail;
	}

	if (ucSmsType == SMS_TEXT)
	{
		ret = huawei_parse_text(rawSmsbuf, rawSmslen, pSms, len, pFrom);
		if(ret < 0)
		{
			WMMP_TRACE(debugType, "\r\nError: huawei failed to parse raw message");
			goto huawei_recv_fail;
		}
	}
	else if(ucSmsType == SMS_PDU)
	{
        ret = gprs_parse_pdu(rawSmsbuf, rawSmslen, pSms, len, pFrom);
		if(ret < 0)
		{
			WMMP_TRACE(debugType, "\r\nError: huawei failed to parse raw message");
			goto huawei_recv_fail;
		}		
	}

	return 0;
	
huawei_recv_fail:
	return ret;
}


int  huawei_ifnew(int fd, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0;

	ret = gprs_ifnew(fd, ucSmsType, ucSmsCode);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: huawei have not new SMS");
	}

	return ret;
}

//raw message format:
//+CMGR: "REC READ","8613358271936",,"06/10/18,09:14:20+32"
//\x0D\x0A010203000DFFFD\x0D\x0A
//no "+" in callback phone number
int huawei_parse(const uchar * pRawSms, int rawlen, uchar * pMsg, int * msgLen, char *pFrom)
{
	int ret = 0;
	
    if (EG_ucSmsType == SMS_TEXT)
	{
		ret = huawei_parse_text(pRawSms, rawlen, pMsg, msgLen, pFrom);
    }
	else if (EG_ucSmsType == SMS_PDU)
	{
        ret = gprs_parse_pdu(pRawSms, rawlen, pMsg, msgLen, pFrom);
	}

	return ret;
}

int huawei_parse_text(const uchar *pRawSms, int rawlen, uchar *pMsg, int *msgLen, char *pFrom)
{
    int ret = 0;
	const uchar *pRaw = NULL;
	uchar *pData = NULL;
	uchar *p1 = NULL, *p2 = NULL, *p3 = NULL;
	int len = 0;

	pRaw = pRawSms;
	pData = pMsg;

	p1 = strstr(pRaw, "+CMGR");
	p2 = strstr(pRaw, "\"REC READ\"");
	if(p1 == NULL || p2 == NULL )
	{
		WMMP_TRACE(debugType, "\r\nError: raw message");
		ret = -SMS_ERR_PARAMS;
		goto huawei_parse_text_fail;
	}

	p1 = strstr(pRaw, ",\"");
	if (p1 == NULL)
	{
		WMMP_TRACE(debugType, "\r\nError: raw message");
		ret = -SMS_ERR_NEWSMS_FORM;
		goto huawei_parse_text_fail;
	}
	p1 += 4; //now p1 points to the first character of phone number
	p2 = strstr(p1, "\",");
	if(p2 == NULL)
	{
		WMMP_TRACE(debugType, "\r\nError: Source phone number");
		ret = -SMS_ERR_NEWSMS_FORM;
		goto huawei_parse_text_fail;
	}
	//get source phone number
	memcpy(pFrom, p1, p2 - p1);

	//get message body \x0D\x0A010203000DFFFD\x0D\x0A
	p1 = strstr(pRaw, "\x0D\x0A");
	if(p1 == NULL)
	{
		WMMP_TRACE(debugType, "\r\nError: message body prefix");
		ret = -SMS_ERR_MSG_DATA;
		goto huawei_parse_text_fail;
	}
	p1 += 2; //p1 now points to the first character of message body
	p2 = strstr(p1, "\x0D\x0A");
	if(p2 == NULL)
	{
		WMMP_TRACE(debugType, "\r\nError: message body postfix");
		ret = -SMS_ERR_MSG_DATA;
		goto huawei_parse_text_fail;
	}
	len = p2 - p1;
	memcpy(pData, p1, len);
	*msgLen = len;
	//transform message to binary format by application
	return 0;

huawei_parse_text_fail:
	return ret;
}

int huawei_delall(int fd)
{
	int ret =0;
	
	ret = gprs_delall(fd);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nhuawei fails to delete all SMS");
	}
	else
	{
		WMMP_TRACE(debugType, "\r\nhuawei success to delete all SMS");
	}
	
	return ret;
}

//simcom SMS
int simcom_init(int fd, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0, i = 0;

	cleartty(fd);

	memset(xSmsbuf, 0, sizeof(xSmsbuf));
	memcpy(xSmsbuf, "AT+CSMP?\x0D", strlen("AT+CSMP?\x0D"));
       //check AT+CSMP?
    WMMP_TRACE(debugType, "\r\nSimcom check AT+CSMP");
    while(1)
    {
	    ret = writetty(fd,  strlen(xSmsbuf), 2, xSmsbuf);
		if(ret == 0)
		{
			ret = wait_for_OK(fd, "+CSMP:", 1);
			if(ret  == 0)
			{
			    WMMP_TRACE(debugType, "\r\nSimcom AT+CSMP? is OK");
			    break;
			}
		}
    }

	cleartty(fd);
	//general initialization
	ret = gprs_init(fd, ucSmsType, ucSmsCode);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: fail to initialize simcom");
	//	ret = -1;
		goto simcom_init_fail;
	}

//	if (ucSmsCode != SMS_ENCODE_7BIT)
	{
		cleartty(fd);
		//control simcom TE character set = "UCS2", it should not be "GSM"!!!
		memset(xSmsbuf, 0, sizeof(xSmsbuf));
		memcpy(xSmsbuf, "AT+CSCS=\"UCS2\"\x0D", strlen("AT+CSCS=\"UCS2\"\x0D"));
		for(i = 0; i < 5; i++)
		{
			WMMP_TRACE(debugType, "\r\nWrite: %s, Length: %d\r\n", xSmsbuf, strlen(xSmsbuf));
			ret = writetty(fd, strlen(xSmsbuf), 2, xSmsbuf);
			if(ret == 0)
			{
				ret = wait_for_OK(fd, "OK", 2);
				if(ret == 0)
				{//	WMMP_TRACE(debugType, "\n\rERROR: TE  does not return OK");
					break;
				}
			}
		}
		if(i == 5 && ret < 0)
		{
			WMMP_TRACE(debugType, "\n\rERROR: Simcom TE character set does not return OK");
			ret = -SMS_ERR_AT_NOTOK;
			goto simcom_init_fail;
		}
	}
	
	return 0;

simcom_init_fail:
	return ret;
}

/*
at+cmgs="00310033003300350038003200370031003900330036"
> 06050400BB\x1A
*/
int simcom_send(int fd, const uchar *pSms, int len, const char *pDest, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0, msglen = 0, datalen = 0;
	int tempsmslen;
	uchar szTempNum[512];
	uchar szTempSms[1024];

	//transform phone number
	memset(szTempNum, 0, sizeof(szTempNum));
	ret = toucsnum(szTempNum, pDest, strlen(pDest));
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: transforming number to ucs format");
		ret = -SMS_ERR_CONV_DATA;
		goto simcom_send_fail;
	}
	
	cleartty(fd); //clear tty read buffer
	//AT+CMGS
	memset(xSmsbuf, 0, sizeof(xSmsbuf));
    if (ucSmsType == SMS_TEXT)
	{
        sprintf(xSmsbuf, "AT+CMGS=\"%s\"\x0D", szTempNum);   
    }
	else if (ucSmsType == SMS_PDU)
	{
        sprintf(xSmsbuf, "AT+CMGS=%d\x0D", len);
	}
	else
	{
		ret = -SMS_ERR_SMS_TYPE;
	}
    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)
	{
		WMMP_TRACE(debugType, "\r\nError: Issue AT+CMGS");
		ret = -SMS_ERR_SEND_ATCMD;
		goto simcom_send_fail;
	}
	
	ret = wait_for_OK(fd, ">", 3);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: AT+CMGS does not get > flag");
		ret = -SMS_ERR_AT_NOTOK;
		goto simcom_send_fail;
	}

	//send message body  //data + 0x1A
	memset(xSmsbuf, 0x00, sizeof(xSmsbuf));
	if (ucSmsType == SMS_TEXT && ucSmsCode == SMS_ENCODE_7BIT)
	{
		memset(szTempSms, 0, sizeof(szTempSms));
		tempsmslen = 0;
		ret = convsmsdata(pSms, len, szTempSms, &tempsmslen, GB_TO_UCS16);
		if (ret < 0)
		{
			WMMP_TRACE(debugType, "\r\nError: Convert data from GB to UCS2");
			goto simcom_send_fail;
		}
        sprintf(xSmsbuf, "%s\x1A", szTempSms);
		datalen = strlen(xSmsbuf);
	}
	else
	{
		sprintf(xSmsbuf, "%s\x1A", pSms);
	    datalen = strlen(xSmsbuf);
	}

    WMMP_TRACE(debugType, "\r\nWrite: %s, Length: %d\r\n", xSmsbuf, strlen(xSmsbuf));
	ret = writetty(fd, datalen, 2, xSmsbuf);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: Write tty to send SMS");
		ret = -SMS_ERR_SEND_ATCMD;
		goto simcom_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 simcom_send_fail;	
	}
	
	return 0;

simcom_send_fail:
	return ret;
}

/*
//first read message
AT+CMGR=6
+CMGR: "REC UNREAD","002b0038003600310033003300350038003200370031003900330036",,"06/10/19,11:25:18+32"
\x0D\x0ABB00040507\x0D\x0A
\x0D\x0AOK\x0D\x0A

//second read message
at+cmgr=7
+CMGR: "REC READ","002b0038003600310033003300350038003200370031003900330036",,"06/10/19,11:35:58+32"
\x0D\x0A0D55070809\x0D\x0A
\x0D\x0AOK\x0D\x0A
*/
int simcom_recv(int fd, uchar *pSms, int *len, char *pFrom, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0, convlen;
	uchar szConvData[512];

	memset(rawSmsbuf, 0, sizeof(rawSmsbuf));
	rawSmslen = 0;
	
	ret = gprs_recv(fd, rawSmsbuf, &rawSmslen, ucSmsType, ucSmsCode);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: simcom failed to recv SMS");
		goto simcom_recv_fail;
	}

	if (ucSmsType == SMS_TEXT)
	{
		memset(szConvData, 0, sizeof(szConvData));
		convlen = 0;
        ret = simcom_parse_text(rawSmsbuf, rawSmslen, szConvData, &convlen, pFrom);
		if(ret < 0)
		{
			WMMP_TRACE(debugType, "\r\nError: simcom failed to parse TEXT raw message");
			goto simcom_recv_fail;
		}
		if (ucSmsCode == SMS_ENCODE_7BIT)
		{
			ret = convsmsdata(szConvData, convlen, pSms, len, UCS16_TO_GB);
			if (ret < 0)
			{
				WMMP_TRACE(debugType, "\r\nError: simcom convert data from UCS to GB");
				goto simcom_recv_fail;
			}
		}
		else
		{
			memcpy(pSms, szConvData, convlen);
			*len = convlen;
		}
	}
	else if (ucSmsType == SMS_PDU)
	{
        ret = gprs_parse_pdu(rawSmsbuf, rawSmslen, pSms, len, pFrom);
		if(ret < 0)
		{
			WMMP_TRACE(debugType, "\r\nError: simcom failed to parse PDU raw message");
			goto simcom_recv_fail;
		}
	}
	else
	{
		ret = -SMS_ERR_SMS_TYPE;
		goto simcom_recv_fail;
	}
	
	return 0;

simcom_recv_fail:
	return ret;
}

int  simcom_ifnew(int fd, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0;

	ret = gprs_ifnew(fd, ucSmsType, ucSmsCode);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: simcom have not new SMS");
	}

	return ret;
}

int simcom_parse(const uchar *pRawSms, int rawlen, uchar *pMsg, int *msgLen, char *pFrom)
{
	int ret = 0;

	if (EG_ucSmsType == SMS_TEXT)
	{
		ret = simcom_parse_text(pRawSms, rawlen, pMsg, msgLen, pFrom);
	}
	else if (EG_ucSmsType == SMS_PDU)
	{
		ret = gprs_parse_pdu(pRawSms, rawlen, pMsg, msgLen, pFrom);
	}

	return ret;
}
/*second read message
at+cmgr=7
+CMGR: "REC READ","002b0038003600310033003300350038003200370031003900330036",,"06/10/19,11:35:58+32"
\x0D\x0A0D55070809\x0D\x0A
*/
int simcom_parse_text(const uchar *pRawSms, int rawlen, uchar *pMsg, int *msgLen, char *pFrom)
{
	int ret = 0;
	const uchar *pRaw = NULL;
	uchar *pData = NULL;
	uchar *p1 = NULL, *p2 = NULL, *p3 = NULL;
	uchar szUcsNum[200];
	int len = 0;

	pRaw = pRawSms;
	pData = pMsg;

	p1 = strstr(pRaw, "+CMGR");
	p2 = strstr(pRaw, "\"REC READ\"");
	if(p1 == NULL || p2 == NULL )
	{
		WMMP_TRACE(debugType, "\r\nError: raw message");
		ret = -SMS_ERR_NEWSMS_FORM;
		goto simcom_parse_fail;
	}

	//phone number
	//"002b0038003600310033003300350038003200370031003900330036"
	p1 += 31; //now p1 points to the first c

⌨️ 快捷键说明

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