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

📄 xsmsfrm.c

📁 在GPRS或者CDMA modem上实现发送/接收短信的C代码;支持Siemens
💻 C
📖 第 1 页 / 共 5 页
字号:
	return ret;
}

//unread received message format:
//+CMGR: "REC READ","+8613358271936",,"06/10/18,09:14:20+32"
//\x0D\x0A010203000DFFFD\x0D\x0A
//\x0D\x0AOK\x0D\x0A
//SMS message is 0x01,0x02,0x03,0x00,0x0D,0xFF,0xFD
int gprs_recv(int fd, uchar *pSms, int *len, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0, msglen = 0;
	char *p1= NULL, *p2 = NULL;
	int iRetLen = 0;
	SMS_REF *pSmsRef = NULL;

//	ret = gprs

	pSmsRef = del_queue();
	if(pSmsRef == NULL)
	{
		WMMP_TRACE(debugType, "\r\nError: not get new message in SMS reference buffer");
		ret = -SMS_ERR_NONEWSMS;
		goto gprs_recv_fail;
	}

	cleartty(fd);//clear fd read buffer

	//read SMS command
	memset(xSmsbuf, 0x00, sizeof(xSmsbuf));
	sprintf(xSmsbuf, "AT+CMGR=%d\x0D", pSmsRef->smsRef);
	msglen = strlen(xSmsbuf);

	//send recv sms command
	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: Send recv SMS cmd");
		ret =  -SMS_ERR_SEND_ATCMD;
		goto gprs_recv_fail;
	}

	memset( inSmsbuf, 0x00, sizeof(inSmsbuf)); 
	ret = readtty(fd, sizeof(inSmsbuf), 3, inSmsbuf, &iRetLen);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: Module does not read new SMS");
		pSms = NULL;
		*len = 0;
		ret  = -SMS_ERR_READ_TTY;
		goto gprs_recv_fail;
	}

	memset(rawSmsbuf, 0, sizeof(rawSmsbuf));
	//read all data 
	p1 = strstr(inSmsbuf, "+CMGR:");
	p2 = strstr(inSmsbuf, "\x0D\x0AOK\x0D\x0A");
	if(p1 != NULL && p2 != NULL)
	{
		msglen = p2 - p1;
		memcpy(pSms, p1, msglen);//including 0x0D and 0x0A
		//notion: server phone number representation is different
		//+CMGR: "REC READ","+8613358271936",,"06/10/18,09:14:20+32"
		//\x0D\x0A010203000DFFFD\x0D\x0A
		*len = msglen;
	}
	else
	{
		WMMP_TRACE(debugType, "Error:Module Not new SMS");
		pSms = NULL;
		*len = 0;
		ret = -SMS_ERR_NEWSMS_FORM;
		goto gprs_recv_fail;
	}

	//delete read message
	cleartty(fd);
	memset(xSmsbuf, 0, sizeof(xSmsbuf));
	sprintf(xSmsbuf, "AT+CMGD=%d\x0D", pSmsRef->smsRef);
	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: GPRS send delete one cmd");
	}
	ret = wait_for_OK(fd, "OK", 2);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: GPRS delete sms wait for OK");
	}
	else
	{
		WMMP_TRACE(debugType, "\r\nGPRS deleted one sms");
	}
	
	freesmsrefbuf(pSmsRef);
	return 0;

gprs_recv_fail:
	freesmsrefbuf(pSmsRef);
	return ret;
}

//if sms mode is text mode, AT+CMGL="REC UNREAD"
//set newMsgIndex variable, newMsgIndex is global variable
//+CMGL: 1,"REC UNREAD","+8613358271936",,"06/10/18,09:14:20+32"
//\x0D\x0A010203000DFFFD\x0D\x0A
//\x0D\x0AOK\x0D\x0A
//AT+CMGL will change the status of SMS
//return current new SMS counters
int  gprs_ifnew(int fd, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0, msglen = 0, leftlen = 0;
	int norecvcnt = 0;
	char *ptr = NULL, *pReadbuf = NULL;
	char *p1 = NULL, *p2 = NULL;
	char szTemp[50];
	int iRetLen = 0;
    int cnt = 0;  //new sms conter
        
    SMS_REF *pSmsRef = NULL;

	cleartty(fd);
	ret = writetty(fd, strlen("AT+CMGF?\x0D"), 2, "AT+CMGF?\x0D");
	if (ret < 0)
	{
		ret = -SMS_ERR_SEND_ATCMD;
		WMMP_TRACE(debugType, "\r\nError: Send AT+CMGF?");
        goto gprs_ifnew_fail;
	}
	memset(szTemp, 0, sizeof(szTemp));
	ret = readtty(fd, sizeof(szTemp), 2, szTemp, &iRetLen);
	if (ret < 0)
	{
		ret = -SMS_ERR_READ_TTY;
		WMMP_TRACE(debugType, "\r\nError: read tty");
		goto gprs_ifnew_fail;
	}
	memset(xSmsbuf, 0x00, sizeof(xSmsbuf));
	if (strstr(szTemp, "1") != NULL)
	{//Text
		sprintf(xSmsbuf, "at+cmgl=\"REC UNREAD\"\x0D");
	}
	else if (strstr(szTemp, "0") != NULL)
	{//PDU
        sprintf(xSmsbuf, "AT+CMGL=0\x0D");
	}
	msglen = strlen(xSmsbuf);
/*	
	memset(xSmsbuf, 0x00, sizeof(xSmsbuf));
//can do like this
	if (ucSmsType == SMS_TEXT)
	{
        sprintf(xSmsbuf, "AT+CMGL=\"REC UNREAD\"\x0D");
	}
	else if (ucSmsType == SMS_PDU)
	{
		sprintf(xSmsbuf, "AT+CMGL=0\x0D");
	}
	else
	{
		ret = -SMS_ERR_SMS_TYPE;
		goto gprs_ifnew_fail;
	}
    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: Write tty to require new SMS");
		ret = -SMS_ERR_SEND_ATCMD;
		goto gprs_ifnew_fail;
	}

//check read buffer
	memset(inSmsbuf, 0x00, sizeof(inSmsbuf));
	leftlen = sizeof(inSmsbuf);
	//here sleep for 3 seconds for HUAWEI module!!!
//	Sleep(3000);
	ret = readtty(fd, leftlen, 5, inSmsbuf, &iRetLen);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "Error: Read tty\r\n");
		goto gprs_ifnew_fail;
	}
    
	//initialize new sms counter
    cnt = 0;
	//get the first unread received message
	pReadbuf = inSmsbuf;
	while(ptr = strstr(pReadbuf, "+CMGL:"))
	{
		/* text sms is "REC UNREAD"; pdu sms is 0. May ignoring it */
		p1 = ptr + 7; //p1 points to the first character of index
		p2 = strstr(ptr, ",");
		if(p2 == NULL)
		{
			WMMP_TRACE(debugType, "\r\nError: There is not unread message");
			ret = -SMS_ERR_NEWSMS_FORM;
			goto gprs_ifnew_fail;
		}
		memset(szTemp, 0, sizeof(szTemp));
		memcpy(szTemp, p1, p2-p1);
		newMsgIndex = atoi(szTemp); //different from CDMA module
		WMMP_TRACE(debugType, "\r\nGPRS new sms index is %d\r\n", newMsgIndex);
		//put new message index into SMS reference buffer
		//alloc empty reference buffer
		pSmsRef = allocsmsrefbuf();
		if(pSmsRef == NULL)
		{
			WMMP_TRACE(debugType, "\r\nError: alloc reference buffer");
			WMMP_TRACE(debugType, "\r\nSms reference buffer is full\r\n");
			break;// end to get new more messge
		}
		pSmsRef->smsRef = newMsgIndex;
		pSmsRef->next = NULL;
		add_queue(pSmsRef);
		
		//move pReadbuf forward
		pReadbuf = p2;
        //increase new sms counter
        cnt++;
	}
	
	return cnt;//return the number of new message

gprs_ifnew_fail:
	return ret;
}

//parse raw message format
int  gprs_parse(const uchar *pRawSms, int rawlen, uchar *pMsg, int *msgLen, char *pFrom)
{
	int ret;

	if (EG_ucSmsType == SMS_TEXT)
	{
        ret = gprs_parse_text(pRawSms, rawlen, pMsg, msgLen, pFrom);
	}
	else if (EG_ucSmsType == SMS_PDU)
	{
        ret = gprs_parse_pdu(pRawSms, rawlen, pMsg, msgLen, pFrom);
	}
	else
	{
		ret = -SMS_ERR_SMS_TYPE;
	}
	return ret;
}

//PDU mode:
//1 represents read message
//0 represents unread message
//+CMGR: 1,,22\x0D\x0A
//0891683108501905F0 040D91 683116052565F9 000860 215161445123 025B50\x0D\x0A
//\x0D\x0AOK\x0D\x0A(in fact, no OK in the pRawSms buffer)
int gprs_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, *p3 = NULL;
	int len = 0;
	char phone[30];
	
	pRaw = pRawSms;
	pData = pMsg;
	
	p1 = strstr(pRaw, "+CMGR");
	if(p1 == NULL)
	{
		WMMP_TRACE(debugType, "\r\nError: No +CMGR in raw message");
		ret = -SMS_ERR_NEWSMS_FORM;
		goto gprs_parse_pdu_fail;
	}
	
	p1 = strstr(pRaw, "\x0D\x0A");
	if (p1 == NULL)
	{
		WMMP_TRACE(debugType, "\r\nError: No 0x0D0x0A in raw message");
		ret = -SMS_ERR_NEWSMS_FORM;
		goto gprs_parse_pdu_fail;
	}
	
	p1 += 2; //now p1 points to the first character of PDU format data
	len = 0;
	tofdbin((char*)&len, p1, 2);     //get the length of scsa address length
	p2 = p1 + (len + 1)*2 + 2;   //p2 points to 0D of 040D91
	len = 0;
	tofdbin((char*)&len, p2, 2); //get the length of source address length
	p2 += 6;      //pointing to 3116052565F9, ignoring 86
	              //now p1 points to the first character of phone number
	//now p3 points to the last character of phone number
	if (len%2 == 0)
	{
		p3 = p2 + len;
	}
	else
	{
        p3 = p2 + (len - 2) + 1; 
	}
	
	//get source phone number
	memset(phone, 0, sizeof(phone));
	memcpy(phone, p2, p3 - p2);
	ret = reversedata(phone, pFrom, (int)(p3 - p2));
	if (ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: reverse phone number");
		ret = -SMS_ERR_CALLBACK_NUM;
		goto gprs_parse_pdu_fail;
	}
	len = (int)(p3 - p2);
	if (*(pFrom + len - 1) == 'F')
	{
		*(pFrom + len - 1) = '\0';
	}
	
	//get message body \x0D\x0A010203000DFFFD\x0D\x0A
	p2 = strstr(p1, "\x0D\x0A");
	if(p2 == NULL)
	{
		WMMP_TRACE(debugType, "\r\nError: message body prefix");
		ret = -SMS_ERR_NEWSMS_FORM;
		goto gprs_parse_pdu_fail;
	}
	//p1 += 2; //p1 now points to the first character of message body
	len = p2 - p1;
	*msgLen = len;
	memcpy(pData, p1, len);
	
	return 0;
	
gprs_parse_pdu_fail:
	return ret;
}

//TEXT mode:
//+CMGR: "REC READ","+8613358271936",,"06/10/18,09:14:20+32"
//\x0D\x0A010203000DFFFD\x0D\x0A
int gprs_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_NEWSMS_FORM;
		goto gprs_parse_text_fail;
	}
	
	p1 = strstr(pRaw, ",\"");
	if (p1 == NULL)
	{
		WMMP_TRACE(debugType, "\r\nError: raw message");
		ret = -SMS_ERR_NEWSMS_FORM;
		goto gprs_parse_text_fail;
	}
	p1 += 5; //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 gprs_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 = -3;
		goto gprs_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_NEWSMS_FORM;
		goto gprs_parse_text_fail;
	}
	len = p2 - p1;
	*msgLen = len;
	memcpy(pData, p1, len);//0A010203000DFFFD

	return 0;
	
gprs_parse_text_fail:
	return ret;
}

int gprs_delall(int fd)
{
	int ret = 0;
	int cnt = 30;

	while(cnt > 0)
	{
		cleartty(fd);
		
		memset(xSmsbuf, 0, sizeof(xSmsbuf));
		sprintf(xSmsbuf, "AT+CMGD=%d\x0D", cnt);
        WMMP_TRACE(debugType, "\r\nWrite: %s, Lenght: %d", xSmsbuf, strlen(xSmsbuf));
		ret  = writetty(fd, strlen(xSmsbuf), 2, xSmsbuf);
		if(ret < 0)
		{
			WMMP_TRACE(debugType, "\r\ngprs_delall failed to write tty");
			break;
		}
		ret = wait_for_OK(fd, "OK", 1);
		if(ret < 0)
		{
			WMMP_TRACE(debugType, "\r\ngprs_delall failed to wait for OK");
		}
		else
		{
			WMMP_TRACE(debugType, "\r\ngprs_delall deleted one sms");
		}
		cnt--;
	}
	
	return 0;
}

//specific SMS for siemens
int siemens_init(int fd, uchar ucSmsType, uchar ucSmsCode)
{
	int ret = 0;

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

	return ret;
}

int siemens_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: siemens fails to send SMS");
	}

	return ret;
}

int siemens_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: siemens failed to receive SMS");
		goto siemens_recv_fail;
	}

	if (ucSmsType == SMS_TEXT)
	{
		ret = gprs_parse_text(rawSmsbuf, rawSmslen, pSms, len, pFrom);
		if (ret < 0)
		{
			WMMP_TRACE(debugType, "\r\nError: siemens failed to parse text SMS");
			goto siemens_recv_fail;
		}
	}
	else if (ucSmsType == SMS_PDU)
	{
		ret = gprs_parse_pdu(rawSmsbuf, rawSmslen, pSms, len, pFrom);
		if (ret < 0)
		{
			WMMP_TRACE(debugType, "\r\nError: siemens failed to parse pdu SMS");
			goto siemens_recv_fail;
		}
	}

	return 0;

siemens_recv_fail:
	return ret;
}

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

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

	return ret;
}

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

	ret = gprs_parse(pRawSms, rawlen, pMsg, msgLen, pFrom);
	if(ret < 0)
	{
		WMMP_TRACE(debugType, "\r\nError: siemens fails to parse raw SMS");
	}

	return ret;
}

int siemens_delall(int fd)
{
	int ret =0;

⌨️ 快捷键说明

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