📄 sms.cpp
字号:
int retval = -1;
SetEvent(m_hStopMonitor);
WaitForSingleObject(m_hStoppedEvent, INFINITE);
sprintf((char*) command, "at+cmgr=%d\n", nLocation);
command_len = strlen((char*) command);
ret = m_pComm->WriteBytes(command, command_len);
if(ret != command_len)
{
goto _out;
}
ret = m_pComm->ReadLine((PBYTE) resp, 1024); // 命令回显
if(!ret || strncmp((char*) resp, (char*) command, command_len) != 0)
{
goto _out;
}
ret = m_pComm->ReadLine((PBYTE) resp, 1024); // a short response header
if(strcmp((char*) resp, "ERROR\r\n") == 0)
{
goto _out;
}
if(strncmp((char*) resp, "+CMGR: ", strlen("+CMGR: ")) != 0)
{
goto _out;
}
ret = m_pComm->ReadLine((PBYTE) resp, 1024);
decode_rpdu((char*) resp, szTel, szTime, szMessage);
ret = m_pComm->ReadLine((PBYTE) resp, 1024); //\r\n
ret = m_pComm->ReadLine((PBYTE) resp, 1024); //OK\r\n
retval = 1; // success
_out:
SetEvent(m_hReMonitor);
WaitForSingleObject(m_hRestartEvent, INFINITE);
return retval;
}
int CSMS::read_message_by_type(int type, char** szTel, char** szTime, char** szMessage, int* location)
/*
0: un read. 1: read, 2: un send, 3: sent, 4: all
*/
{
BYTE command[256], resp[1024];
int command_len, ret, i;
int retval = -1;
SetEvent(m_hStopMonitor);
WaitForSingleObject(m_hStoppedEvent, INFINITE);
//1. get
sprintf((char*) command, "at+cmgl=%d\n", type);
command_len = strlen((char*) command);
ret = m_pComm->WriteBytes(command, command_len);
if(ret != command_len)
{
goto _out;
}
Sleep(30);
ret = m_pComm->ReadLine((PBYTE) resp, 1024); // 命令回显
if(!ret || strncmp((char*) resp, (char*) command, command_len) != 0 ||
strncmp((char*) resp, (char*) "+CMGL: ", strlen("+CMGL: ")) != 0)
{
goto _out;
}
for(i = 0; ; i++)
{
Sleep(10);
if(strncmp((char*) resp, (char*) "+CMGL: ", strlen("+CMGL: ")) != 0)
{
if(m_pComm->ReadLine((PBYTE) resp, 1024) <= 0 ||
strncmp((char*) resp, "ERROR\r\n", strlen("ERROR\r\n")) == 0)
{
goto _out;
}
if(strncmp((char*) resp, "OK\r\n", strlen("OK\r\n")) == 0)
break;
}
location[i] = atoi((char*) resp + 7);
Sleep(10);
if(m_pComm->ReadLine((PBYTE) resp, 1024) <= 0)
{
goto _out;
}
if(strncmp((char*) resp, "OK\r\n", strlen("OK\r\n")) == 0)
break;
szTel[i] = (char*) malloc(32);
szTime[i] = (char*) malloc(64);
szMessage[i] = (char*) malloc(256);
decode_rpdu((char*) resp, szTel[i], szTime[i], szMessage[i]);
}
retval = i;
_out:
SetEvent(m_hReMonitor);
WaitForSingleObject(m_hRestartEvent, INFINITE);
return retval;
}
int CSMS::read_phone_book(char** szName, char** szTel)
{
BYTE command[256], resp[1024];
int len, command_len, ret, used, total, i, j;
char *pResp, *pNumber, delimiter[] = ",\r\n", pTel[32], pName[64], pAnsiName[64];
USHORT t1, t2;
int retval = -1;
SetEvent(m_hStopMonitor);
WaitForSingleObject(m_hStoppedEvent, INFINITE);
//1. get
sprintf((char*) command, "at+cpbs?\n");
command_len = strlen((char*) command);
ret = m_pComm->WriteBytes(command, command_len);
if(ret != command_len)
goto _out;
ret = m_pComm->ReadLine((PBYTE) resp, 1024);
if(!ret || strncmp((char*) resp, (char*) command, command_len) != 0)
goto _out;
ret = m_pComm->ReadLine((PBYTE) resp, 1024);
if(strncmp((char*) resp, "+CPBS: ", 7) != 0)
goto _out;
pResp = (char*) &resp[7]; //1.2. get storage type
pResp = strtok(pResp, delimiter); //1.3. get entries
pResp = strtok(NULL, delimiter);
used = atoi(pResp);
pResp = strtok(NULL, delimiter); //1.4. get capacity
total = atoi(pResp);
ret = m_pComm->ReadLine((PBYTE) resp, 1024); //read OK\r\n
ret = m_pComm->ReadLine((PBYTE) resp, 1024); //read OK\r\n
pResp = (char*) malloc(4 * 1024 * 1024);
sprintf((char*) command, "at+cpbr=1,%d\n", total); //because, they didn't occupied continuous addresses.
command_len = strlen((char*) command);
ret = m_pComm->WriteBytes(command, command_len);
if(ret != command_len)
goto _out;
ret = m_pComm->ReadLine((PBYTE) pResp, 4 * 1024 * 1024);
while(ret > 0 && strncmp((char*) pResp, (char*) command, command_len) != 0)
ret = m_pComm->ReadLine((PBYTE) resp, 1024); // 命令回显
if(ret <= 0)
goto _out;
for(i = 0; i < used && ret != -1; i++)
{
ret = m_pComm->ReadLine((PBYTE) pResp, 4 * 1024 * 1024);
if(strncmp(pResp, "ERROR\r\n", strlen("ERROR\r\n")) == 0)
{
goto _out;
}
pNumber = pResp + 7;
pNumber = strtok(pNumber, delimiter); // position
pNumber = strtok(NULL, delimiter); // No.
if(strncmp(pNumber, "\"+86", 4) == 0)
strcpy(pTel, pNumber + 4); //eat two "
else
strcpy(pTel, pNumber + 1); //eat two "
pTel[strlen(pTel) - 1] = 0;
pNumber = strtok(NULL, delimiter); // type of address
pNumber = strtok(NULL, delimiter); // name
strcpy(pName, pNumber + 1); //eat two "
pName[strlen(pName) - 1] = 0;
len = strlen(pName);
if(len > 4 && pName[0] == '8' && pName[1] == '0' && strncmp(pName + len - 4, "FFFF", 4) == 0) //Chinese
{
WCHAR wcharName[32];
len = len - 4;
for(j = 2; j < len; j += 4) //skip '80'
{
t1 = ((USHORT) hex_str2int(pName[j], pName[j + 1])) & 0x00FF;
t2 = ((USHORT) hex_str2int(pName[j + 2], pName[j + 3])) & 0x00FF;
wcharName[(j - 2) / 4] = ((t1 << 8) | t2);
}
wcharName[(len - 2) / 4] = 0;
WideCharToMultiByte(CP_ACP, 0, wcharName, -1, pAnsiName, 64, NULL, NULL);
}
else
strcpy(pAnsiName, pName);
szTel[i] = (char*) malloc(strlen(pTel) + 1);
szName[i] = (char*) malloc(strlen(pAnsiName) + 1);
strcpy(szTel[i], pTel);
strcpy(szName[i], pAnsiName);
}
ret = m_pComm->ReadLine((PBYTE) pResp, 4 * 1024 * 1024); //\r\n
ret = m_pComm->ReadLine((PBYTE) pResp, 4 * 1024 * 1024); //read the last OK\r\n
free(pResp);
retval = used;
_out:
SetEvent(m_hReMonitor);
WaitForSingleObject(m_hRestartEvent, INFINITE);
return retval;
}
int CSMS::remove_message_by_type(int type)
{
char command[256], resp[512];
int ret, command_len;
int retval = -1;
sprintf(command, "at+cmgd=1,%d\n", type);
command_len = strlen(command);
SetEvent(m_hStopMonitor);
WaitForSingleObject(m_hStoppedEvent, INFINITE);
Sleep(10);
ret = m_pComm->WriteBytes((PBYTE) command, command_len);
if(ret != command_len)
goto _out;
ret = m_pComm->ReadLine((PBYTE) resp, 512);
if(!ret || strncmp((char*) resp, (char*) command, command_len) != 0)
goto _out;
ret = m_pComm->ReadLine((PBYTE) resp, 512); //\r\n
if(strcmp(resp, "ERROR\r\n") == 0)
goto _out;
retval = 1;
_out:
SetEvent(m_hReMonitor);
WaitForSingleObject(m_hRestartEvent, INFINITE);
return retval;
}
int CSMS::remove_message(int nLocation)
{
char command[256], resp[512];
int ret, command_len;
int retval = -1;
sprintf(command, "at+cmgd=%d\n", nLocation);
command_len = strlen(command);
SetEvent(m_hStopMonitor);
WaitForSingleObject(m_hStoppedEvent, INFINITE);
ret = m_pComm->WriteBytes((PBYTE) command, command_len);
if(ret != command_len)
goto _out;
ret = m_pComm->ReadLine((PBYTE) resp, 512);
if(!ret || strncmp((char*) resp, (char*) command, command_len) != 0)
goto _out;
ret = m_pComm->ReadLine((PBYTE) resp, 512); //\r\n
if(strcmp(resp, "ERROR\r\n") == 0)
goto _out;
retval = 1;
_out:
SetEvent(m_hReMonitor);
WaitForSingleObject(m_hRestartEvent, INFINITE);
return retval;
}
DWORD WINAPI CSMS::MonitorThread(LPVOID lpParam)
{
CSMS *pSms = (CSMS*) lpParam;
CSerialPort *pPort = pSms->m_pComm;
DWORD dwEventMask;
HANDLE hEvents[2];
int ret, len, location;
OVERLAPPED ov = { 0 };
char line[512], *pPos, szTel[32], szTime[32], szMessage[256];
ov.hEvent = CreateEvent(NULL, false, false, NULL);
hEvents[0] = ov.hEvent;
hEvents[1] = pSms->m_hStopMonitor;
while(pSms->m_bMonitor)
{
if(pPort->WaitEvents(&dwEventMask, &ov) == -1)
{
CloseHandle(ov.hEvent);
return 0;
}
ret = WaitForMultipleObjects(2, hEvents, false, INFINITE);
//pPort->SelectEvents(0);
switch(ret)
{
case WAIT_OBJECT_0 + 0:
if(dwEventMask & EV_RXCHAR)
{ //new message ???
if(pPort->ReadLine((PBYTE) line, 1024) > 0)
{
if(strcmp(line, "\r\n") == 0 && pPort->ReadLine((PBYTE) line, 1024) > 0)
{
len = strlen("+CMTI: ");
if(strncmp(line, "+CMTI: ", len) == 0)
{
pPos = strtok(&line[len], ",\"\r\n");
pPos = strtok(NULL, ",\"\r\n");
location = atoi(pPos);
// set events for call to read_message
SetEvent(pSms->m_hStoppedEvent);
SetEvent(pSms->m_hRestartEvent);
pSms->read_message(location, szTel, szTime, szMessage);
ResetEvent(pSms->m_hStopMonitor);
ResetEvent(pSms->m_hReMonitor);
CDialog *pDlg = (CDialog*) AfxGetApp()->GetMainWnd();
SHORT_MESSAGE short_message;
strcpy(short_message.szTel, szTel);
strcpy(short_message.szTime, szTime);
strcpy(short_message.szMessage, szMessage);
pDlg->SendMessage(USERMSG_RECEIVE_SM, (WPARAM) &short_message, 0);
}
}
}
}
break;
case WAIT_OBJECT_0 + 1:
SetEvent(pSms->m_hStoppedEvent);
WaitForSingleObject(pSms->m_hReMonitor, INFINITE);
SetEvent(pSms->m_hRestartEvent);
break;
}
//pPort->SelectEvents();
}
CloseHandle(ov.hEvent);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -