📄 xsmsfrm.c
字号:
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 + -