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

📄 xsmsfrm.c

📁 在GPRS或者CDMA modem上实现发送/接收短信的C代码;支持Siemens
💻 C
📖 第 1 页 / 共 5 页
字号:
	{
		WMMP_TRACE(debugType, "\r\nFidelix failed to parse raw message");
		ret = -SMS_ERR_PARSE;
		goto fidelix_recv_fail;
	}
	
	return 0;

fidelix_recv_fail:
	return ret;
}

//return value > 0 ,success and the value represents the number of new SMS
//$FXMGL:2 FOUND
//fidelix_ifnew has nothing to do with SMS type and code
int  fidelix_ifnew(int fd, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0, i = 0;
	char *p1 = NULL, *p2 = NULL;
	char szTemp[10];
	int iRetLen = 0;

	cleartty(fd); //clear tty recv and read buffer
	
	memset(xSmsbuf, 0, sizeof(xSmsbuf));
	memcpy(xSmsbuf, "AT$FXMGL=1\x0D\x0A", strlen("AT$FXMGL=1\x0D\x0A"));
	
	WMMP_TRACE(debugType, "\r\nWrite: %s, Length: %d\r\n", xSmsbuf, strlen(xSmsbuf));
	ret = writetty(fd, strlen(xSmsbuf), 2, xSmsbuf);
	if(ret == 0)
	{
		memset(inSmsbuf, 0x00, sizeof(inSmsbuf));
		ret = readtty(fd, sizeof(inSmsbuf), 5, inSmsbuf, &iRetLen);
		if(ret < 0)
		{
			WMMP_TRACE(debugType, "\n\rError: Read SMS list");
			goto fidelix_ifnew_fail;
		}
		if((p1 = strstr(inSmsbuf, "$FXMGL:")) && (p2 = strstr(inSmsbuf, "FOUND")))
		{
			p1 += 7;
			memset(szTemp, 0, sizeof(szTemp));
			for(i = 0; i < p2 - p1; i++)
			{
				szTemp[i] = *(p1 + i);
			}
			ret = atoi(szTemp);
			WMMP_TRACE(debugType, "\r\nFidelix has %d new SMS\r\n", ret);
			
			return ret; //success to get new SMS number
		}
		else if(p1 = strstr(inSmsbuf, "EMPTY"))//no more new SMS
		{
			WMMP_TRACE(debugType, "\r\nFidelix has not new sms\r\n");
			ret = 0;
		//	goto fidelix_ifnew_fail;
			return ret; //return 0 presents no new SMS
		}
		
	}
	else// if(ret < 0)
	{
		WMMP_TRACE(debugType, "\n\rError: Issue query SMS cmd");
		ret = -SMS_ERR_SEND_ATCMD;
		goto fidelix_ifnew_fail;
	}
	
	return 0;

fidelix_ifnew_fail:
	return ret;
}

/*
$FXRDRM:0,13615052569,06/12/23,20:08:39,*NEW*another bug,.123

OK

*/
int fidelix_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;
	const uchar* p3 = NULL;
	uchar szTemp[512];
	int len = 0;
	
	pRaw = pRawSms;
	pData = pMsg;

	//get source phone number from raw SMS
	p1 = strstr(pRaw, "$FXRDRM:");
	if(p1 == NULL)
	{
		WMMP_TRACE(debugType, "Error: No $FXRDRM in raw SMS\r\n");
		ret = -SMS_ERR_PARAMS;
		goto fidelix_parse_text_fail;
	}
	p1 += 10; //p1 point to source phone number
	p2 = strstr(p1, ",");
	if(p2 == NULL)
	{
		WMMP_TRACE(debugType, "Error: No \",\" character in raw SMS\r\n");
		ret = -SMS_ERR_NEWSMS_FORM;
		goto fidelix_parse_text_fail;
	}
	len = p2 - p1;
	//get server phone number
	memcpy(pFrom, p1, len);

//	$FXRDRM:0,15960095351,06/11/08,13:19:26,5,*NEW*030201000D
	//get message
	p1 = strstr(pRaw, "*NEW*");
	p2 = strstr(pRaw, "\x0D\x0A");
	if (p1 == NULL || p2 == NULL)
	{
		ret = -SMS_ERR_NEWSMS_FORM;
		goto fidelix_parse_text_fail;
	}
//	p2++; //now p2 points to the first character of the raw SMS
	p1 += 5;//because there is string "*NEW*"
	len = p2 - p1;
	memcpy(pData, p1, len);
	WMMP_TRACE(debugType, "\r\nFidelix szTemp: %s\r\n", szTemp);
		
	return 0;

fidelix_parse_text_fail:
	return -ret;
}

int fidelix_parse_pdu(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;
	const uchar* p3 = NULL;
	uchar szTemp[512];
	int len = 0;
	
	pRaw = pRawSms;
	pData = pMsg;

	//get source phone number from raw SMS
	p1 = strstr(pRaw, "$FXRLRM:");
	if(p1 == NULL)
	{
		WMMP_TRACE(debugType, "Error: No $FXRDRM in raw SMS\r\n");
		ret = -SMS_ERR_PARAMS;
		goto fidelix_parse_pdu_fail;
	}
	p1 += 10; //p1 point to source phone number
	p2 = strstr(p1, ",");
	if(p2 == NULL)
	{
		WMMP_TRACE(debugType, "Error: No \",\" character in raw SMS\r\n");
		ret = -SMS_ERR_NEWSMS_FORM;
		goto fidelix_parse_pdu_fail;
	}
	len = p2 - p1;
	//get server phone number
	memcpy(pFrom, p1, len);

//	$FXRLRM:0,15960095351,06/11/08,13:19:26,5,*NEW*030201000D
	//get message
	p1 = strstr(pRaw, "*NEW*");
	p2 = strstr(pRaw, "\x0D\x0A");
	if (p1 == NULL || p2 == NULL)
	{
		ret = -SMS_ERR_NEWSMS_FORM;
		goto fidelix_parse_pdu_fail;
	}
//	p2++; //now p2 points to the first character of the raw SMS
	p1 += 5;//because there is string "*NEW*"
	len = p2 - p1;
	memcpy(pData, p1, len);
	WMMP_TRACE(debugType, "\r\nFidelix szTemp: %s\r\n", szTemp);
		
	return 0;

fidelix_parse_pdu_fail:
	return -ret;
}
//binary data in Fidelix module 
//$FXRLRM:0,15960095351,06/11/08,13:19:26,5,*NEW*030201000D
int fidelix_parse(const uchar *pRawSms, int rawlen, uchar * pMsg, int * msgLen, char *pFrom)
{
	int ret;

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

	return ret;
}

int fidelix_delall(int fd)
{
	int ret = 0, i = 0;
	char *p1 = NULL, *p2 = NULL;
	int iRetLen = 0;
	int smscnt = 0;

	smscnt = fidelix_getsmscnt(fd);
	if(smscnt < 0)
	{
		WMMP_TRACE(debugType, "\r\nFidelix failed to get sms counts");
		ret = -SMS_ERR_GET_SMSCNT;
		goto fidelix_delall_fail;
	}

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

fidelix_delall_fail:
	return ret;
}

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

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

fidelix_delone_succ:
	return 0;

fidelix_delall_fail:
	return ret;
}

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

	cleartty(fd); //clear tty recv and read buffer
	
	memset(xSmsbuf, 0, sizeof(xSmsbuf));
	memcpy(xSmsbuf, "AT$FXMGL=0\x0D\x0A", strlen("AT$FXMGL=0\x0D\x0A"));
	WMMP_TRACE(debugType, "\r\nWrite: %s, Length: %d\r\n", xSmsbuf, strlen(xSmsbuf));
	ret = writetty(fd, strlen(xSmsbuf), 2, xSmsbuf);
	if(ret == 0)
	{
		memset(inSmsbuf, 0x00, sizeof(inSmsbuf));
		ret = readtty(fd, sizeof(inSmsbuf), 5, inSmsbuf, &iRetLen);
		if(ret < 0)
		{
			WMMP_TRACE(debugType, "\n\rError: Fidelix_delall Read SMS list");
			ret = -SMS_ERR_READ_TTY;
			goto fidelix_getsmscnt_fail;
		}
		if((p1 = strstr(inSmsbuf, "$FXMGL:")) && (p2 = strstr(inSmsbuf, "FOUND")))
		{
			p1 += 7;
			memset(szTemp, 0, sizeof(szTemp));
			for(i = 0; i < p2 - p1; i++)
			{
				szTemp[i] = *(p1 + i);
			}
			smscnt = atoi(szTemp);
			WMMP_TRACE(debugType, "\r\nFidelix_delall has %d SMS", smscnt);
		}
		else if(p1 = strstr(inSmsbuf, "ALL EMPTY"))//no more new SMS
		{
			WMMP_TRACE(debugType, "\r\nFidelix has not more sms\r\n");
			smscnt = 0;
		}
		
	}
	else// if(ret < 0)
	{
		WMMP_TRACE(debugType, "\n\rError: Fidelix_delall Issue query SMS cmd");
		ret = -SMS_ERR_SEND_ATCMD;
		goto fidelix_getsmscnt_fail;
	}

	return smscnt;
	
fidelix_getsmscnt_fail:
	return ret;
}

//sms ops for bellwave
//ucSmsType is nothing to bellwave
//and only ucSmsCode is relative to this module.
int bellwave_init(int fd, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0;
	int i = 0;

	//control echo display
	memset(xSmsbuf, 0, sizeof(xSmsbuf));
	memcpy(xSmsbuf, "ATE0\x0D\x0A", strlen("ATE0\x0D\x0A"));

	cleartty(fd); //for clear tty recv buffer

	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: ATE0 does not return OK");
				break;
			}
		}
	}
	if(i == 5 && ret != 0)
	{
		WMMP_TRACE(debugType, "\n\rERROR: Bellwave ATE0 does not return OK");
		ret = -SMS_ERR_AT_NOTOK;
		goto bellwave_init_fail;
	}

	//control message data format
	memset(xSmsbuf, 0, sizeof(xSmsbuf));
	if (ucSmsCode == SMS_ENCODE_7BIT)
	{//type = 0, representing to print string type to be used in printf function of the C language
        memcpy(xSmsbuf, "AT$SMSTYPE=0\x0D", strlen("AT$SMSTYPE=1\x0D"));
	}
	else if (ucSmsCode == SMS_ENCODE_8BIT || ucSmsCode == SMS_ENCODE_UCS16)
	{//type = 1, representing print each byte to 2-digit hexidecimal
        memcpy(xSmsbuf, "AT$SMSTYPE=1\x0D", strlen("AT$SMSTYPE=1\x0D"));
	}
	else
	{
        ret = -SMS_ERR_SMS_CODE;
		goto bellwave_init_fail;
	}

	cleartty(fd);//clear tty read buffer
	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)
			{
				break;
			}
		}
	}
	if(i == 5 && ret != 0)
	{
		WMMP_TRACE(debugType, "\n\rERROR: Bellwave init message data format does not return OK");
		ret = -SMS_ERR_AT_NOTOK;
		goto bellwave_init_fail;
	}
	
	return 0;
	
bellwave_init_fail:
	return ret;
}

//AT$SMSMO00=13950398019,,4098,0,MSG<CR>
//using 0 msg_encoding,
//for example: 
//AT$SMSMO00=13358271936,,4098,0,010203000DFF
//that is to send message 0x01 0x02 0x03 0x00 0x0D 0xFF
int bellwave_send(int fd, const uchar *pSms, int len, const char *pDest, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0, msglen = 0;
    
	memset(xSmsbuf, 0, sizeof(xSmsbuf));
	//AT cmd
	//0--OCTET(8-bit)  2--ASCII(7-bit)  4--Unicode(16-bit)
	//when coding is 0 or 4, transit to visual character by application!!!
	if (ucSmsCode == SMS_ENCODE_7BIT)
	{
		sprintf(xSmsbuf, "AT$SMSMO00=%s,,4098,2,\"%s\"\x0D", pDest, pSms);
	//	sprintf(xSmsbuf, "AT$SMSMO00=%s,,4098,%s\x0D", pDest, pSms);
	}
	else if (ucSmsCode == SMS_ENCODE_8BIT)
	{
        sprintf(xSmsbuf, "AT$SMSMO00=%s,,4098,0,%s\x0D", pDest, pSms);
	}
	else if (ucSmsCode == SMS_ENCODE_UCS16)
	{
        sprintf(xSmsbuf, "AT$SMSMO00=%s,,4098,4,%s\x0D", pDest, pSms);
	}
	else
	{
		WMMP_TRACE(debugType, "\r\nError: SMS coding value");
		ret = -SMS_ERR_SMS_CODE;
		goto bellwave_send_fail;
	}
    msglen = strlen(xSmsbuf);

	cleartty(fd); //clear tty recv and send buffer
	//bellwave send pdu data
	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, "\n\rError: Write tty");
		ret = -SMS_ERR_SEND_ATCMD;
		goto bellwave_send_fail;
	}

	ret = wait_for_OK(fd, "$SMSMOACK", 10);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\n\rError: Fidelix does not receive OK after sending SMS");
		ret = -SMS_ERR_SEND_SMS;
		goto bellwave_send_fail;
	}
	
	return 0;

bellwave_send_fail:
	return ret;
}

//20061108144656,15960095351,4098,0,"0F0E030201"\x0D\x0A
//20060608173840,10109862,4098,4,"1234567890"\x0D\x0A
//20061020134847,13328657218,4098,0,"010203FF0D"\x0D\x0A
//\x0D\x0AOK\x0D\x0A
int bellwave_recv(int fd, uchar *pSms, int *len, char *pFrom, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0;
	int msglen = 0;
	char *p1 = NULL, *p2 = NULL, *p3 = NULL;
	int iRetLen = 0;
	int newcnt = 0;
	
	if(pSms == NULL || len == NULL)
	{
		WMMP_TRACE(debugType, "\n\rError: Bellwave Null params");
		ret = -SMS_ERR_PARAMS;
		goto bellwave_recv_fail;
	}

	ret = bellwave_ifnew(fd, ucSmsType, ucSmsCode);
	if(ret <= 0)
	{
		WMMP_TRACE(debugType, "\n\rBellwave has no new SMS");
		ret = -SMS_ERR_NONEWSMS;
		goto bellwave_recv_fail;
	}
	newcnt = ret;
	
	cleartty(fd);//clear tty read buffer
	memset(xSmsbuf, 0, sizeof(xSmsbuf));
	msglen = 0;
	sprintf(xSmsbuf, "AT$SMSNEWMT%d?\x0D", newcnt - 1);
	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, "Error: Bellwave issue read new SMS\r\n");
		ret = -SMS_ERR_SEND_ATCMD;
		goto bellwave_recv_fail;
	}
	
	memset(inSmsbuf, 0, sizeof(inSmsbuf));
	ret = readtty(fd, sizeof(inSmsbuf), 5, inSmsbuf, &iRetLen);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\n\rError: Bellwave read new SMS, not OK");
		pSms = NULL;
		*len = 0;
		ret = -SMS_ERR_READ_TTY;
		goto bellwave_recv_fail;
	}

⌨️ 快捷键说明

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