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