📄 xsmsfrm.c
字号:
//read all data by finding string " \x0D\x0AOK\x0D\x0A"
memset(rawSmsbuf, 0, sizeof(rawSmsbuf));
p1 = inSmsbuf;
if(p2 = strstr(inSmsbuf, "\x0D\x0AOK\x0D\x0A"))
{
rawSmslen = p2 - p1;
memcpy(rawSmsbuf, p1, rawSmslen); //get message body including 0x0D and 0x0A
// *len = msglen;
}
else
{
WMMP_TRACE(debugType, "Error:Bellwave Not new SMS");
pSms = NULL;
*len = 0;
ret = -SMS_ERR_NEWSMS_FORM;
goto bellwave_recv_fail;
}
//bellwave_parse return the decoding SMS data to application
ret = bellwave_parse(rawSmsbuf, rawSmslen, pSms, len, pFrom);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nBellwave failed to parse raw message");
ret = -SMS_ERR_NEWSMS_FORM;
goto bellwave_recv_fail;
}
return 0;
bellwave_recv_fail:
return ret;
}
/*
AT$MTCNT?
\x0D\x0A2,1\x0D\x0A
\x0D\x0AOK\x0D\x0A
*/
int bellwave_ifnew(int fd, uchar ucSmsType, uchar ucSmsCode)
{
int ret = 0, msglen = 0;
int i = 0;
int iRetLen = 0;
char *p1 = NULL, *p2 = NULL;
uchar szTemp[10];
cleartty(fd); //clear tty read and send buffer
memset(xSmsbuf, 0, sizeof(xSmsbuf));
sprintf(xSmsbuf, "AT$MTCNT?\x0D");
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)
{
memset(inSmsbuf, 0x00, sizeof(inSmsbuf));
ret = readtty(fd, sizeof(inSmsbuf), 3, inSmsbuf, &iRetLen);
if(ret < 0)
{
WMMP_TRACE(debugType, "\n\rError: Bellwave read SMS cnt");
ret = -SMS_ERR_READ_TTY;
goto bellwave_ifnew_fail;
}
if((p1 = strstr(inSmsbuf, ",")) && (p2 = strstr(inSmsbuf, "OK")))
{
p1 += 1;//point to the first number
p2 -= 4;//point to the last number
memset(szTemp, 0, sizeof(szTemp));
for(i = 0; i < p2 - p1; i++)
{
szTemp[i] = *(p1 + i);
}
ret = atoi(szTemp);
WMMP_TRACE(debugType, "\r\nBellwave has %d new SMS\r\n", ret);
return ret;
}
else
{
WMMP_TRACE(debugType, "Error: Not new sms");
ret = -SMS_ERR_NONEWSMS;
goto bellwave_ifnew_fail;
}
return 0;
}
else// if(ret < 0)
{
WMMP_TRACE(debugType, "\n\rError: Bellwave query new SMS");
ret = -SMS_ERR_SEND_ATCMD;
goto bellwave_ifnew_fail;
}
return 0;
bellwave_ifnew_fail:
return ret;
}
int bellwave_parse(const uchar *pRawSms, int rawlen, uchar * pMsg, int * msgLen, char *pFrom)
//20060608173840,10109862,4098,4,"unicode coding"\x0D\x0A
//20061020134847,13328657218,4098,0,"010203FF0D"\x0D\x0A
//20061108144656,15960095351,4098,0,"0F0E030201"\x0D\x0A
//20061108144656,15960095351,4098,2,"This is a test"\x0D\x0A
//Notion: the msg_encoding value, only support 0, 2 and 4.
{
int ret = 0, len = 0;
const uchar *pRaw = NULL, *pData = NULL;
uchar *p1 = NULL, *p2 = NULL;
uchar szTemp[10];
int msgCode = 0;
pRaw = pRawSms;
pData = pMsg;
//get callback number
if(p1 = strstr(pRaw, ","))
{
p1 += 1;
pRaw = p1;
if(p2 = strstr(pRaw, ","))
{
len = p2 - p1;
memcpy(pFrom, p1, len);
}
else
{
WMMP_TRACE(debugType, "\r\nError: bellwave callback phone number 2");
ret = -SMS_ERR_NEWSMS_FORM;
goto bellwave_parse_fail;
}
//point to TI first character
p2 += 1;
p1 = p2;
pRaw = p2;
}
else
{
WMMP_TRACE(debugType, "\r\nError: bellwave callback phone number 1");
ret = -SMS_ERR_CALLBACK_NUM;
goto bellwave_parse_fail;
}
//get msg_encoding
p1 = strstr(pRaw, ",");
if(p1 == NULL)
{
WMMP_TRACE(debugType, "\r\nError: bellwave message encoding 1");
ret = -SMS_ERR_MSG_CODING;
goto bellwave_parse_fail;
}
p1 += 1; //p1 now points to the first character of message encoding
pRaw = p1;
p2 = strstr(pRaw, ",");
if(p2 == NULL)
{
WMMP_TRACE(debugType, "\r\nError: bellwave message encoding 2");
ret = -SMS_ERR_MSG_CODING;
goto bellwave_parse_fail;
}
//get message encoding value
memset(szTemp, 0, sizeof(szTemp));
memcpy(szTemp, p1, p2 - p1);
msgCode = atoi(szTemp);
WMMP_TRACE(debugType, "\r\nmsg code = %d\r\n", msgCode);
if( !(msgCode == 0 || msgCode == 2 || msgCode == 4) )
{
WMMP_TRACE(debugType, "\r\nError: bellwave messge encoding 3");
ret = -SMS_ERR_MSG_CODING;
goto bellwave_parse_fail;
}
//get message body
//20061108144656,15960095351,4098,0,"0F0E030201"\x0D\x0A
p1 = strstr(pRaw, "\"");
if(p1 == NULL)
{
WMMP_TRACE(debugType, "\r\nError: bellwave message body");
ret = -SMS_ERR_MSG_DATA;
goto bellwave_parse_fail;
}
p1 += 1;
pRaw = p1;
p2 = strstr(pRaw, "\"");
if(p2 == NULL)
{
WMMP_TRACE(debugType, "\r\nError: bellwave message body");
ret = -SMS_ERR_MSG_DATA;
goto bellwave_parse_fail;
}
len = p2 - p1;
if (msgCode == 0)
{//8-bit, //transform data to binary
ret = tofdbin(pMsg, p1, len);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: bellwave transfer");
ret = -SMS_ERR_CONV_DATA;
goto bellwave_parse_fail;
}
*msgLen = len/2;
}
else if (msgCode == 2)
{//7-bit, unnecessary to transform data
memcpy(pMsg, p1, len);
*msgLen = len;
}
else //msgCode == 4
{//unicode
ret = convsmsdata(p1, len, pMsg, msgLen, UCS16_TO_GB);
if (ret < 0)
{
ret = -SMS_ERR_CONV_DATA;
goto bellwave_parse_fail;
}
}
return 0;
bellwave_parse_fail:
return ret;
}
/*
AT$MTCNT?
\x0D\x0A2,1\x0D\x0A
\x0D\x0AOK\x0D\x0A
*/
int bellwave_delall(int fd)
{
int smscnt = 0;
int ret = 0;
smscnt = bellwave_getsmscnt(fd);
if(smscnt < 0)
{
WMMP_TRACE(debugType, "\r\nBellwave fidelix to get sms counts");
ret = -SMS_ERR_GET_SMSCNT;
goto bellwave_delall_fail;
}
while(smscnt > 0)
{
cleartty(fd);
memset(xSmsbuf, 0, sizeof(xSmsbuf));
sprintf(xSmsbuf, "AT$DELMT=%d\x0D", smscnt - 1);
ret = writetty(fd, strlen(xSmsbuf), 2, xSmsbuf);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: delete bellwave sms");
ret = -SMS_ERR_SEND_ATCMD;
goto bellwave_delall_fail;
}
ret = wait_for_OK(fd, "OK", 2);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: delete bellwave sms return no OK");
}
else
{
WMMP_TRACE(debugType, "\r\nBellave delete one sms");
}
smscnt--;
}
return 0;
bellwave_delall_fail:
return ret;
}
int bellwave_delone(int fd)
{
int ret = 0;
int smscnt = 0;
smscnt = bellwave_getsmscnt(fd);
if(smscnt <=0 )
{
ret = -SMS_ERR_GET_SMSCNT;
goto bellwave_delone_succ;
}
cleartty(fd);
memset(xSmsbuf, 0, sizeof(xSmsbuf));
sprintf(xSmsbuf, "AT$DELMT=%d\x0D", smscnt - 1);
ret = writetty(fd, strlen(xSmsbuf), 2, xSmsbuf);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: delete bellwave sms");
ret = -SMS_ERR_SEND_ATCMD;
goto bellwave_delone_fail;
}
ret = wait_for_OK(fd, "OK", 2);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: delete bellwave sms return no OK");
}
else
{
WMMP_TRACE(debugType, "\r\nBellave delete one sms");
}
bellwave_delone_succ:
return 0;
bellwave_delone_fail:
return ret;
}
int bellwave_getsmscnt(fd)
{
int ret = 0, msglen = 0;
int i = 0;
int iRetLen = 0;
char *p1 = NULL, *p2 = NULL;
uchar szTemp[10];
int smscnt = 0;
cleartty(fd); //clear tty read and send buffer
memset(xSmsbuf, 0, sizeof(xSmsbuf));
sprintf(xSmsbuf, "AT$MTCNT?\x0D");
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)
{
memset(inSmsbuf, 0x00, sizeof(inSmsbuf));
ret = readtty(fd, sizeof(inSmsbuf), 3, inSmsbuf, &iRetLen);
if(ret < 0)
{
WMMP_TRACE(debugType, "\n\rError: Bellwave_getsmscnt read SMS cnt");
ret = -SMS_ERR_READ_TTY;
goto bellwave_getsmscnt_fail;
}
if((p1 = strstr(inSmsbuf, ",")) && (p2 = strstr(inSmsbuf, "\x0D\x0A")))
{
p2 += 2;//point to the last number
memset(szTemp, 0, sizeof(szTemp));
for(i = 0; i < p1 - p2; i++)
{
szTemp[i] = *(p2 + i);
}
smscnt = atoi(szTemp);
WMMP_TRACE(debugType, "\r\nBellwave_getsmscnt has %d SMS\r\n", smscnt);
}
else
{
WMMP_TRACE(debugType, "Error: Bellwave_getsmscnt check new sms");
ret = -SMS_ERR_GET_SMSCNT;
goto bellwave_getsmscnt_fail;
}
}
else// if(ret < 0)
{
WMMP_TRACE(debugType, "\n\rError: Bellwave_getsmscnt query new SMS");
ret = -SMS_ERR_SEND_ATCMD;
goto bellwave_getsmscnt_fail;
}
return smscnt;
bellwave_getsmscnt_fail:
return ret;
}
int gprs_init(int fd, uchar ucSmsType, uchar ucSmsCode)
{
int ret = 0;
int i, j, cmdCnt, cmdsize;
uchar ucAtCmd[4][50];
cmdsize = sizeof(ucAtCmd)/sizeof(ucAtCmd[0]);
for (i = 0; i < cmdsize; i++)
{
memset(ucAtCmd[i], 0, sizeof(ucAtCmd[i]));
}
//ATE0
//control echo display
sprintf(ucAtCmd[0], "ATE0\x0D");
//if text: AT+CMGF=1
//if 7-bit AT+CSCS="GSM" AT+CSMP=17,167,0,241
//if 8-bit AT+CSCS="GSM" AT+CSMP=17,167,0,21
//if UCS16 AT+CSCS="GSM" AT+CSMP=17,167,0,25
//if pdu: AT+CMGF=0 for 7-bit, 8-bit and UCS16-bit
if (ucSmsType == SMS_TEXT)
{
sprintf(ucAtCmd[1], "AT+CMGF=1\x0D"); //first command
sprintf(ucAtCmd[2], "AT+CSCS=\"GSM\"\x0D"); //second command
if (ucSmsCode == SMS_ENCODE_7BIT)
{
sprintf(ucAtCmd[3], "AT+CSMP=17,167,0,17\x0D");
}
else if (ucSmsCode == SMS_ENCODE_8BIT)
{
sprintf(ucAtCmd[3], "AT+CSMP=17,167,0,21\x0D");
}
else if (ucSmsCode == SMS_ENCODE_UCS16)
{
sprintf(ucAtCmd[3], "AT+CSMP=17,167,0,25\x0D");
}
else
{
ret = -SMS_ERR_SMS_CODE;
goto gprs_init_fail;
}
cmdCnt = 4; //3 AT commands
}
else if (ucSmsType == SMS_PDU)
{//PDU only just one AT command
sprintf(ucAtCmd[1], "AT+CMGF=0\x0D");
cmdCnt = 2; //only one AT commands
}
else
{
ret = -SMS_ERR_SMS_TYPE;
goto gprs_init_fail;
}
//send AT command individually
for(j = 0; j < cmdCnt; j++)
{
for (i = 0; i < 5; i++)
{
cleartty(fd);
WMMP_TRACE(debugType, "\r\nWrite: %s, Length: %d\r\n", ucAtCmd[j], strlen(ucAtCmd[j]));
ret = writetty(fd, strlen(ucAtCmd[j]), 2, ucAtCmd[j]);
if(ret == 0)
{
ret = wait_for_OK(fd, "OK", 2);
if(ret == 0)
{
break;
}
}
}
if(i == 5 && ret < 0)
{
WMMP_TRACE(debugType, "\n\rERROR: TE character set does not return OK");
ret = -SMS_ERR_AT_NOTOK;
goto gprs_init_fail;
}
}
EG_ucSmsType = ucSmsType;
EG_ucSmsCode = ucSmsCode;
return 0;
gprs_init_fail:
return ret;
}
//AT+CMGS="13615052569"\x0D
//> 010203000DFF\x1A
//that is to send 0x01,0x02,0x03,0x00,0x0D and 0xFF
int gprs_send(int fd, const uchar *pSms, int len, const char *pDest, uchar ucSmsType, uchar ucSmsCode)
{
int ret = 0, msglen = 0, datalen = 0;
int i, cmdCnt;
uchar ucAtCmd[3][512];
for (i = 0; i < 3; i++)
{
memset(ucAtCmd[i], 0, sizeof(ucAtCmd[i]));
}
//AT+CMGS=da or pdu length
if (ucSmsType == SMS_TEXT)
{
sprintf(ucAtCmd[0], "AT+CMGS=\"%s\"\x0D", pDest);
}
else if (ucSmsType == SMS_PDU)
{
sprintf(ucAtCmd[0], "AT+CMGS=%d\x0D", len);
}
else
{
WMMP_TRACE(debugType, "\r\nError: unknown sms type");
ret = -SMS_ERR_SMS_TYPE;
goto gprs_send_fail;
}
//sending data<ctrl-Z>, text or PDU
sprintf(ucAtCmd[1], "%s\x1A", pSms);
cmdCnt = 2;
//transform to PDU format is performed by application
cleartty(fd); //clear tty read buffer
//AT+CMGS
WMMP_TRACE(debugType, "\r\nWrite: %s, Length: %d\r\n", ucAtCmd[0], strlen(ucAtCmd[0]));
ret = writetty(fd, strlen(ucAtCmd[0]), 2, ucAtCmd[0]);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: Send AT+CMGS");
ret = -SMS_ERR_SEND_ATCMD;
goto gprs_send_fail;
}
ret = wait_for_OK(fd, ">", 2);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: AT+CMGS does not get > flag");
ret = -SMS_ERR_AT_NOTOK;
goto gprs_send_fail;
}
//send message body
//data + 0x1A
// cleartty(fd);
WMMP_TRACE(debugType, "\r\nWrite: %s, Length: %d\r\n", ucAtCmd[1], strlen(ucAtCmd[1]));
ret = writetty(fd, strlen(ucAtCmd[1]), 2, ucAtCmd[1]);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: Write tty to send SMS");
ret = -SMS_ERR_SEND_ATCMD;
goto gprs_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 gprs_send_fail;
}
return 0;
gprs_send_fail:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -