📄 xsmsfrm.c
字号:
ret = gprs_delall(fd);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nsiemens fails to delete all SMS");
}
else
{
WMMP_TRACE(debugType, "\r\nsiemens success to delete all SMS");
}
return ret;
}
//huawei SMS
int huawei_init(int fd, uchar ucSmsType, uchar ucSmsCode)
{
int ret = 0;
cleartty(fd);
memset(xSmsbuf, 0, sizeof(xSmsbuf));
memcpy(xSmsbuf, "AT+CSMP?\x0D\x0A", strlen("AT+CSMP?\x0D\x0A"));
//check AT+CSMP?
WMMP_TRACE(debugType, "\r\nHuawei check AT+CSMP");
while(1)
{
ret = writetty(fd, strlen(xSmsbuf), 2, xSmsbuf);
if(ret == 0)
{
ret = wait_for_OK(fd, "+CSMP:", 1);
if(ret == 0)
{
WMMP_TRACE(debugType, "\r\nHuawei AT+CSMP? is OK");
break;
}
}
}
cleartty(fd);
ret = gprs_init(fd, ucSmsType, ucSmsCode);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: fail to initialize huawei");
}
return ret;
}
int huawei_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: huawei fails to send SMS\r\n");
}
return ret;
}
/*
TEXT:
at+cmgr=7
+CMGR: "REC READ","8613358271936",,"06/10/19,11:35:58+32",145,36,0,4,"8613800594500",145,5
0D55070809
OK
at+cmgr=1
+CMGR: "REC READ","8613615052569",,"06/12/18,17:39:06+32",145,4,0,8,"8613800591500",145,4
4F60597D
OK
PDU:
at+cmgr=1
+CMGR: 1,,24
0891683108501905F0040D91683116052565F9000860218171936023044F60597D
OK
*/
int huawei_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: huawei failed to receive SMS");
goto huawei_recv_fail;
}
if (ucSmsType == SMS_TEXT)
{
ret = huawei_parse_text(rawSmsbuf, rawSmslen, pSms, len, pFrom);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: huawei failed to parse raw message");
goto huawei_recv_fail;
}
}
else if(ucSmsType == SMS_PDU)
{
ret = gprs_parse_pdu(rawSmsbuf, rawSmslen, pSms, len, pFrom);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: huawei failed to parse raw message");
goto huawei_recv_fail;
}
}
return 0;
huawei_recv_fail:
return ret;
}
int huawei_ifnew(int fd, uchar ucSmsType, uchar ucSmsCode)
{
int ret = 0;
ret = gprs_ifnew(fd, ucSmsType, ucSmsCode);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: huawei have not new SMS");
}
return ret;
}
//raw message format:
//+CMGR: "REC READ","8613358271936",,"06/10/18,09:14:20+32"
//\x0D\x0A010203000DFFFD\x0D\x0A
//no "+" in callback phone number
int huawei_parse(const uchar * pRawSms, int rawlen, uchar * pMsg, int * msgLen, char *pFrom)
{
int ret = 0;
if (EG_ucSmsType == SMS_TEXT)
{
ret = huawei_parse_text(pRawSms, rawlen, pMsg, msgLen, pFrom);
}
else if (EG_ucSmsType == SMS_PDU)
{
ret = gprs_parse_pdu(pRawSms, rawlen, pMsg, msgLen, pFrom);
}
return ret;
}
int huawei_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_PARAMS;
goto huawei_parse_text_fail;
}
p1 = strstr(pRaw, ",\"");
if (p1 == NULL)
{
WMMP_TRACE(debugType, "\r\nError: raw message");
ret = -SMS_ERR_NEWSMS_FORM;
goto huawei_parse_text_fail;
}
p1 += 4; //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 huawei_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 = -SMS_ERR_MSG_DATA;
goto huawei_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_MSG_DATA;
goto huawei_parse_text_fail;
}
len = p2 - p1;
memcpy(pData, p1, len);
*msgLen = len;
//transform message to binary format by application
return 0;
huawei_parse_text_fail:
return ret;
}
int huawei_delall(int fd)
{
int ret =0;
ret = gprs_delall(fd);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nhuawei fails to delete all SMS");
}
else
{
WMMP_TRACE(debugType, "\r\nhuawei success to delete all SMS");
}
return ret;
}
//simcom SMS
int simcom_init(int fd, uchar ucSmsType, uchar ucSmsCode)
{
int ret = 0, i = 0;
cleartty(fd);
memset(xSmsbuf, 0, sizeof(xSmsbuf));
memcpy(xSmsbuf, "AT+CSMP?\x0D", strlen("AT+CSMP?\x0D"));
//check AT+CSMP?
WMMP_TRACE(debugType, "\r\nSimcom check AT+CSMP");
while(1)
{
ret = writetty(fd, strlen(xSmsbuf), 2, xSmsbuf);
if(ret == 0)
{
ret = wait_for_OK(fd, "+CSMP:", 1);
if(ret == 0)
{
WMMP_TRACE(debugType, "\r\nSimcom AT+CSMP? is OK");
break;
}
}
}
cleartty(fd);
//general initialization
ret = gprs_init(fd, ucSmsType, ucSmsCode);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: fail to initialize simcom");
// ret = -1;
goto simcom_init_fail;
}
// if (ucSmsCode != SMS_ENCODE_7BIT)
{
cleartty(fd);
//control simcom TE character set = "UCS2", it should not be "GSM"!!!
memset(xSmsbuf, 0, sizeof(xSmsbuf));
memcpy(xSmsbuf, "AT+CSCS=\"UCS2\"\x0D", strlen("AT+CSCS=\"UCS2\"\x0D"));
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: TE does not return OK");
break;
}
}
}
if(i == 5 && ret < 0)
{
WMMP_TRACE(debugType, "\n\rERROR: Simcom TE character set does not return OK");
ret = -SMS_ERR_AT_NOTOK;
goto simcom_init_fail;
}
}
return 0;
simcom_init_fail:
return ret;
}
/*
at+cmgs="00310033003300350038003200370031003900330036"
> 06050400BB\x1A
*/
int simcom_send(int fd, const uchar *pSms, int len, const char *pDest, uchar ucSmsType, uchar ucSmsCode)
{
int ret = 0, msglen = 0, datalen = 0;
int tempsmslen;
uchar szTempNum[512];
uchar szTempSms[1024];
//transform phone number
memset(szTempNum, 0, sizeof(szTempNum));
ret = toucsnum(szTempNum, pDest, strlen(pDest));
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: transforming number to ucs format");
ret = -SMS_ERR_CONV_DATA;
goto simcom_send_fail;
}
cleartty(fd); //clear tty read buffer
//AT+CMGS
memset(xSmsbuf, 0, sizeof(xSmsbuf));
if (ucSmsType == SMS_TEXT)
{
sprintf(xSmsbuf, "AT+CMGS=\"%s\"\x0D", szTempNum);
}
else if (ucSmsType == SMS_PDU)
{
sprintf(xSmsbuf, "AT+CMGS=%d\x0D", len);
}
else
{
ret = -SMS_ERR_SMS_TYPE;
}
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: Issue AT+CMGS");
ret = -SMS_ERR_SEND_ATCMD;
goto simcom_send_fail;
}
ret = wait_for_OK(fd, ">", 3);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: AT+CMGS does not get > flag");
ret = -SMS_ERR_AT_NOTOK;
goto simcom_send_fail;
}
//send message body //data + 0x1A
memset(xSmsbuf, 0x00, sizeof(xSmsbuf));
if (ucSmsType == SMS_TEXT && ucSmsCode == SMS_ENCODE_7BIT)
{
memset(szTempSms, 0, sizeof(szTempSms));
tempsmslen = 0;
ret = convsmsdata(pSms, len, szTempSms, &tempsmslen, GB_TO_UCS16);
if (ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: Convert data from GB to UCS2");
goto simcom_send_fail;
}
sprintf(xSmsbuf, "%s\x1A", szTempSms);
datalen = strlen(xSmsbuf);
}
else
{
sprintf(xSmsbuf, "%s\x1A", pSms);
datalen = strlen(xSmsbuf);
}
WMMP_TRACE(debugType, "\r\nWrite: %s, Length: %d\r\n", xSmsbuf, strlen(xSmsbuf));
ret = writetty(fd, datalen, 2, xSmsbuf);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: Write tty to send SMS");
ret = -SMS_ERR_SEND_ATCMD;
goto simcom_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 simcom_send_fail;
}
return 0;
simcom_send_fail:
return ret;
}
/*
//first read message
AT+CMGR=6
+CMGR: "REC UNREAD","002b0038003600310033003300350038003200370031003900330036",,"06/10/19,11:25:18+32"
\x0D\x0ABB00040507\x0D\x0A
\x0D\x0AOK\x0D\x0A
//second read message
at+cmgr=7
+CMGR: "REC READ","002b0038003600310033003300350038003200370031003900330036",,"06/10/19,11:35:58+32"
\x0D\x0A0D55070809\x0D\x0A
\x0D\x0AOK\x0D\x0A
*/
int simcom_recv(int fd, uchar *pSms, int *len, char *pFrom, uchar ucSmsType, uchar ucSmsCode)
{
int ret = 0, convlen;
uchar szConvData[512];
memset(rawSmsbuf, 0, sizeof(rawSmsbuf));
rawSmslen = 0;
ret = gprs_recv(fd, rawSmsbuf, &rawSmslen, ucSmsType, ucSmsCode);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: simcom failed to recv SMS");
goto simcom_recv_fail;
}
if (ucSmsType == SMS_TEXT)
{
memset(szConvData, 0, sizeof(szConvData));
convlen = 0;
ret = simcom_parse_text(rawSmsbuf, rawSmslen, szConvData, &convlen, pFrom);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: simcom failed to parse TEXT raw message");
goto simcom_recv_fail;
}
if (ucSmsCode == SMS_ENCODE_7BIT)
{
ret = convsmsdata(szConvData, convlen, pSms, len, UCS16_TO_GB);
if (ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: simcom convert data from UCS to GB");
goto simcom_recv_fail;
}
}
else
{
memcpy(pSms, szConvData, convlen);
*len = convlen;
}
}
else if (ucSmsType == SMS_PDU)
{
ret = gprs_parse_pdu(rawSmsbuf, rawSmslen, pSms, len, pFrom);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: simcom failed to parse PDU raw message");
goto simcom_recv_fail;
}
}
else
{
ret = -SMS_ERR_SMS_TYPE;
goto simcom_recv_fail;
}
return 0;
simcom_recv_fail:
return ret;
}
int simcom_ifnew(int fd, uchar ucSmsType, uchar ucSmsCode)
{
int ret = 0;
ret = gprs_ifnew(fd, ucSmsType, ucSmsCode);
if(ret < 0)
{
WMMP_TRACE(debugType, "\r\nError: simcom have not new SMS");
}
return ret;
}
int simcom_parse(const uchar *pRawSms, int rawlen, uchar *pMsg, int *msgLen, char *pFrom)
{
int ret = 0;
if (EG_ucSmsType == SMS_TEXT)
{
ret = simcom_parse_text(pRawSms, rawlen, pMsg, msgLen, pFrom);
}
else if (EG_ucSmsType == SMS_PDU)
{
ret = gprs_parse_pdu(pRawSms, rawlen, pMsg, msgLen, pFrom);
}
return ret;
}
/*second read message
at+cmgr=7
+CMGR: "REC READ","002b0038003600310033003300350038003200370031003900330036",,"06/10/19,11:35:58+32"
\x0D\x0A0D55070809\x0D\x0A
*/
int simcom_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;
uchar szUcsNum[200];
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 simcom_parse_fail;
}
//phone number
//"002b0038003600310033003300350038003200370031003900330036"
p1 += 31; //now p1 points to the first c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -