⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smspage.cpp

📁 代码为windows下的无线猫的应用程序(对AT指令的操作)。
💻 CPP
字号:
// SMSPage.cpp : implementation file
//

#include "stdafx.h"
#include "SIMTOOL.h"
#include "SMSPage.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSMSPage dialog
extern CSIMTOOLApp theApp;
DWORD WINAPI ExportSMSProc(LPVOID lpParameter);

CSMSPage::CSMSPage(CWnd* pParent /*=NULL*/)
	: CDialogResize(CSMSPage::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSMSPage)
	//}}AFX_DATA_INIT
}


void CSMSPage::DoDataExchange(CDataExchange* pDX)
{
	CDialogResize::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSMSPage)
	DDX_Control(pDX, IDC_BTNSAVE, m_btnsave);
	DDX_Control(pDX, IDC_BTNOPEN, m_btnopen);
	DDX_Control(pDX, IDC_BTNEXPORT, m_btnexport);
	DDX_Control(pDX, IDC_SMS, m_SMSList);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CSMSPage, CDialogResize)
	//{{AFX_MSG_MAP(CSMSPage)
	ON_BN_CLICKED(IDC_BTNEXPORT, OnBtnexport)
	ON_BN_CLICKED(IDC_BTNSAVE, OnBtnsave)
	ON_COMMAND(ID_DIALNUM, OnDialnum)
	ON_COMMAND(ID_SENDSMSTO, OnSendsmsto)
	ON_NOTIFY(NM_RCLICK, IDC_SMS, OnRclickSms)
	ON_WM_CONTEXTMENU()
	ON_COMMAND(ID_DELSMS, OnDelsms)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BEGIN_DLGRESIZE_MAP(CSMSPage)
	DLGRESIZE_CONTROL(IDC_SMS, DLSZ_SIZE_X | DLSZ_SIZE_Y)
	DLGRESIZE_CONTROL(IDC_BTNEXPORT, DLSZ_MOVE_X)
	DLGRESIZE_CONTROL(IDC_BTNSAVE, DLSZ_MOVE_X)
	DLGRESIZE_CONTROL(IDC_BTNOPEN, DLSZ_MOVE_X)
END_DLGRESIZE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSMSPage message handlers

BOOL CSMSPage::OnInitDialog() 
{
	CDialogResize::OnInitDialog();
	
	// TODO: Add extra initialization here
	menu.LoadMenu(MAKEINTRESOURCE(IDR_SMS));

	InitResizing(FALSE, FALSE, WS_CLIPCHILDREN);
	
	DWORD dwStyle = m_SMSList.GetExtendedStyle();
	dwStyle |= LVS_EX_FULLROWSELECT;
    m_SMSList.SetExtendedStyle(dwStyle);

	imaSmall.Create(IDB_IMAGELIST, 16, 0, RGB(0,128,128));
	m_SMSList.SetImageList(&imaSmall, LVSIL_SMALL);

	m_btnsave.SetIcon(IDI_SAVE, 16, 16);
	m_btnopen.SetIcon(IDI_OPEN, 16, 16);
	m_btnexport.SetIcon(IDI_EXPORT, 16, 16);

	InsertSMSHead("索引号", "发送者", "内容", "发送时间");

	AutoSizeColumns(&m_SMSList);
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CSMSPage::InsertSMSHead(char * index,
				   char * from,
				   char * sms,
				   char * rectime)
{
	m_SMSList.InsertColumn(0,index,LVCFMT_LEFT,80);
	m_SMSList.InsertColumn(1,from,LVCFMT_LEFT,180);
	m_SMSList.InsertColumn(2,sms,LVCFMT_LEFT,400);
	m_SMSList.InsertColumn(3,rectime,LVCFMT_LEFT,180);
}

void CSMSPage::InsertSMS(int imageindex,
				            char * index,
							char * from,
    					    char * sms,
						    char * rectime)
{
	int listindex;
	LV_ITEM lvItem;

	listindex=m_SMSList.GetItemCount();
	
	lvItem.mask = LVIF_IMAGE|LVIF_TEXT;
	lvItem.iItem =listindex;
	lvItem.iSubItem =0;
	lvItem.iImage=imageindex;
	lvItem.pszText = (LPTSTR) index;
	m_SMSList.InsertItem(&lvItem);

	lvItem.mask = LVIF_TEXT;
	lvItem.iItem =listindex;
	lvItem.iSubItem =1;
	lvItem.pszText = (LPTSTR) from;
	m_SMSList.SetItem(&lvItem);

	lvItem.mask = LVIF_TEXT;
	lvItem.iItem =listindex;
	lvItem.iSubItem =2;
	lvItem.pszText = (LPTSTR) sms;
	m_SMSList.SetItem(&lvItem);

	lvItem.mask = LVIF_TEXT;
	lvItem.iItem =listindex;
	lvItem.iSubItem =3;
	lvItem.pszText = (LPTSTR) rectime;
	m_SMSList.SetItem(&lvItem);
}

void CSMSPage::DelSMSList()
{
	m_SMSList.DeleteAllItems();
}

void CSMSPage::ShowSMSList(CString RetSMS)
{
	CIVStringSet m_setstrings;
	int nWord, front, back, front1, back1;
	CString PDU, tmp1, tmp2, tmp3, buf, smsid;
	bool isend;
	char csca[20], ToNum[20], sendtime[30], smsnr[300], smsindex[5];

	memset(csca,0,20);
	memset(ToNum,0,20);
	memset(sendtime,0,30);
	memset(smsnr,0,300);
	memset(smsindex,0,5);
	
	if (RetSMS.Find("OK") != -1)
	{
		isend = TRUE;
	}
	else
	{
		isend = FALSE;
	}
	m_setstrings.Add("+CMGL:");

	UINT nPos = m_setstrings.FindFirstIn(RetSMS, nWord);
    if (nPos != 0xFFFFFFFF)
    {
        do
        {
			front = nPos;
			nPos = m_setstrings.FindNext(nWord);
			back = nPos;
			if (back != 0xFFFFFFFF)
			{
				tmp1 = RetSMS.Left(front+12);
				tmp2 = tmp1.Right(12);
				front1 = tmp2.Find(":");
				back1 = tmp2.Find(",");
				
				tmp3 = tmp2.Left(back1);
				smsid = tmp3.Right(tmp3.GetLength()-front1-1);
				buf = tmp2.Left(back1+2);
				tmp2 = buf.Right(1);
				
				if (tmp2.Right(1) != "1")
				{
					continue;
				}
				
				tmp1 = RetSMS.Left(back);
				tmp2 = tmp1.Right(tmp1.GetLength()-front);
				buf = tmp2.Right(tmp2.GetLength()-tmp2.Find("\n"));
				PDU = buf.Left(buf.GetLength()-2);
			}
			else
			{
				if (isend)
				{
					tmp1 = RetSMS.Left(front+12);
					tmp2 = tmp1.Right(12);
					front1 = tmp2.Find(":");
					back1 = tmp2.Find(",");
					tmp3 = tmp2.Left(back1);
					smsid = tmp3.Right(tmp3.GetLength()-front1-1);

					buf = tmp2.Left(back1+2);
					tmp2 = buf.Right(1);
					
					if (tmp2.Right(1) != "1")
					{
						continue;
					}

					tmp1 = RetSMS.Right(RetSMS.GetLength()-front);
					buf = tmp1.Right(tmp1.GetLength()-tmp1.Find("\n"));
					PDU = buf.Left(buf.GetLength()-8);
					// 短信列表结束
				}
				else
				{
					tmp1 = RetSMS.Left(front+12);
					tmp2 = tmp1.Right(12);
					front1 = tmp2.Find(":");
					back1 = tmp2.Find(",");
					tmp3 = tmp2.Left(back1);
					smsid = tmp3.Right(tmp3.GetLength()-front1-1);

					buf = tmp2.Left(back1+2);
					tmp2 = buf.Right(1);
					
					if (tmp2.Right(1) != "1")
					{
						continue;
					}

					tmp1 = RetSMS.Right(RetSMS.GetLength()-front);
					buf = tmp1.Right(tmp1.GetLength()-tmp1.Find("\n"));
					PDU = buf.Left(buf.GetLength()-2);
					// 短信列表没有结束
				}
			}
			sprintf(smsindex, "%s", smsid);
			if (PDU.Find("\n") != -1)
			{
				tmp1 = PDU.Right(PDU.GetLength()-1);
				PDU = tmp1;
			}
		
			theApp.mobile.gsmDecodePdu(PDU,
									   csca,
									   ToNum,
									   sendtime,
									   smsnr);
			buf = sendtime;
			sprintf(sendtime, "%s-%s-%s %s:%s:%s",
					buf.Left(2),
					buf.Left(4).Right(2),
					buf.Left(6).Right(2),
					buf.Left(8).Right(2),
					buf.Left(10).Right(2),
					buf.Left(12).Right(2));
			// 转换PDU格式
			InsertSMS(9,smsindex,ToNum,smsnr,sendtime);
			// 插入list
        } while (nPos != 0xFFFFFFFF);
    }
}

int CSMSPage::GetItemCount()
{
	return m_SMSList.GetItemCount();
}

void CSMSPage::OnBtnexport() 
{
	// TODO: Add your control notification handler code here
	HANDLE hThread, hProc;
	char cText[100], comm[20];
	CString RetInfo, sDevComm, sStatus, sAppComm;

	memset(comm, 0, 20);
	memset(cText, 0, 100);

	sAppComm = theApp.GetAppComm();
	sprintf(comm, "%s", sAppComm);
	theApp.SetStatusText("正在寻找GPRS无线网络设备,请稍后...");
	theApp.SetDevText("");
	sDevComm = theApp.OpenDev(comm, 9600);
	if (sDevComm.GetLength() == 0)
	{
		theApp.SetStatusText("设备未被找到或端口未被初始化,正在尝试初始化...");
		sDevComm = theApp.MultiBautOpenDev(comm);
		if (sDevComm.GetLength() == 0)
		{
			theApp.mobile.CloseComm();
			theApp.SetStatusText("没有找到设备或端口波特率不匹配,请确定设备是否连接...");
			MessageBox("没有找到设备或端口波特率不匹配!", "AWS");
			return;
		}
		else
		{
			theApp.SetStatusText("端口初始化完成,正在打开端口...");
			sDevComm = theApp.OpenDev(comm, 9600);
		}
	}

	if (theApp.GetDevType() == "WAVECOM")
	{
		theApp.SetStatusText("");
		sprintf(cText, "ADBON GPRS MODEM : %s/%d", sDevComm, 9600);
		theApp.SetDevText(cText);

		DelSMSList();

		m_ProgDlg.Create(IDD_PROGDLG);

		ExitEvent=CreateEvent( NULL,    // no security
							   TRUE,    // explicit reset req
							   FALSE,   // initial event reset
							   NULL ) ; // no name
		ExitedEvent=CreateEvent( NULL,    // no security
								 TRUE,    // explicit reset req
								 FALSE,   // initial event reset
								 NULL ) ; // no name

		if ((hThread=CreateThread(NULL,0,ExportSMSProc,this,0,&ThreadId))==NULL) {
			CloseHandle(ExitEvent);
			CloseHandle(ExitedEvent);
			MessageBox("创建通讯线程失败","错误信息",MB_OK);
			return;
		}

		hProc=GetCurrentProcess();
		SetPriorityClass(hProc,HIGH_PRIORITY_CLASS);
		SetThreadPriority(hThread,THREAD_PRIORITY_TIME_CRITICAL);
	}

	if (theApp.GetDevType() == "BENQ")
	{
		theApp.SetStatusText("");
		sprintf(cText, "ADBON GPRS MODEM : %s/%d", sDevComm, 9600);
		theApp.SetDevText(cText);

		DelSMSList();

		m_ProgDlg.Create(IDD_PROGDLG);

		ExitEvent=CreateEvent( NULL,    // no security
							   TRUE,    // explicit reset req
							   FALSE,   // initial event reset
							   NULL ) ; // no name
		ExitedEvent=CreateEvent( NULL,    // no security
								 TRUE,    // explicit reset req
								 FALSE,   // initial event reset
								 NULL ) ; // no name

		if ((hThread=CreateThread(NULL,0,ExportSMSProc,this,0,&ThreadId))==NULL) {
			CloseHandle(ExitEvent);
			CloseHandle(ExitedEvent);
			MessageBox("创建通讯线程失败","错误信息",MB_OK);
			return;
		}

		hProc=GetCurrentProcess();
		SetPriorityClass(hProc,HIGH_PRIORITY_CLASS);
		SetThreadPriority(hThread,THREAD_PRIORITY_TIME_CRITICAL);
	}

	if (theApp.GetDevType() == "SAGEM MO1xx")
	{
		theApp.mobile.SetModuleType("SAGEM MO1xx");
		MessageBox("SAGEM MO1xx", "AWS");
	}
}


void CSMSPage::OnBtnsave() 
{
	// TODO: Add your control notification handler code here
	int itemcount, i;
	CFileDialog filedlg(FALSE,NULL,NULL,OFN_HIDEREADONLY,
						"TXT Files (*.txt)|*.txt|All Files (*.*)|*.*||",NULL);
	CString pathname, smsindex, sendname, content, sendtime;
	FILE * savestream;
	char savefile[MAX_PATH], itemtmp[1000];

	memset(savefile,0,MAX_PATH);
	itemcount = GetItemCount();

	if (itemcount == 0)
	{
		MessageBox("没有可以保存的电话簿数据", "AWS");
		return;
	}

	if (filedlg.DoModal() == IDOK) {
		pathname = filedlg.GetPathName();
		pathname += ".txt";
		sprintf(savefile, "%s", pathname);
		// 保存路径
		if((savestream = fopen(savefile, "w+")) == NULL)
		{
			MessageBox("文件无法打开", "AWS");
			return;
		}

		for (i=0; i<itemcount; i++)
		{
			memset(itemtmp,0,1000);
			smsindex = m_SMSList.GetItemText(i, 0);
			sendname = m_SMSList.GetItemText(i, 1);
			content = m_SMSList.GetItemText(i, 2);
			sendtime = m_SMSList.GetItemText(i, 3);
			sprintf(itemtmp, "%s\t%s\t%s\t%s\n", smsindex, sendname, content, sendtime);
			fwrite(itemtmp, sizeof(char), strlen(itemtmp), savestream);
		}

		fclose(savestream);
	}
}

DWORD WINAPI ExportSMSProc(LPVOID lpParameter)
{
	CSMSPage * pParentWnd;
	CString RetInfo;
	
	pParentWnd=(CSMSPage *) lpParameter;

	pParentWnd->m_ProgDlg.ShowWindow(TRUE);
	pParentWnd->m_ProgDlg.SetRange(0,20);
	pParentWnd->m_ProgDlg.SetStatusText("正在读取SIM卡上的短信息...");

	theApp.mobile.CMGF("0");
	Sleep(10);
	RetInfo = theApp.mobile.ReceiveInfo();
	//theApp.mobile.CMGLFORBENQ("\"ALL\"");		// 读取短信列表(BENQ)
	theApp.mobile.CMGL(4);		// 读取短信列表
	Sleep(10);
	RetInfo = theApp.mobile.ReceiveInfo();
	if (RetInfo.GetLength() == 0)
	{
		Sleep(500);
		theApp.mobile.CMGL(4);		// 读取短信列表
		Sleep(10);
		RetInfo = theApp.mobile.ReceiveInfo();
	}

	do
	{
		pParentWnd->ShowSMSList(RetInfo);
		RetInfo = theApp.mobile.ReceiveInfo();
	}
	while(RetInfo.GetLength() != 0);
	pParentWnd->m_ProgDlg.SetPos(20);
	
	pParentWnd->m_ProgDlg.SetStatusText("完成");
	pParentWnd->m_ProgDlg.SetPos(0);
	pParentWnd->m_ProgDlg.SetBtnEnable(TRUE);
	theApp.mobile.CloseComm();

	return 0;
}

void CSMSPage::OnDialnum() 
{
	// TODO: Add your command handler code here
	CString sName, sNum;
	char num[20];

	memset(num, 0, 20);
	sName = "未知";
	sNum = m_SMSList.GetItemText(iCurrIndex, 1);
	sprintf(num, "%s", sNum);
	sNum = Cut86(num);

	m_InfoDlg.InfoCreate(sName, sNum, IDD_DIALINFODLG);
}

void CSMSPage::OnSendsmsto() 
{
	// TODO: Add your command handler code here
	CString sName, sNum;
	char num[20];

	memset(num, 0, 20);
	sName = "未知";
	sNum = m_SMSList.GetItemText(iCurrIndex, 1);
	sprintf(num, "%s", sNum);
	sNum = Cut86(num);

	m_ReplyDlg.InfoCreate(sName, sNum, IDD_REPLYSMSDLG);
}

void CSMSPage::OnRclickSms(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	int nIndex = m_SMSList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED); 
	iCurrIndex = nIndex;

	*pResult = 0;
}

void CSMSPage::OnContextMenu(CWnd* pWnd, CPoint point) 
{
	// TODO: Add your message handler code here
	MousePoint = point;
	if(iCurrIndex == -1)
        return;

	menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTBUTTON, MousePoint.x, MousePoint.y, this, NULL);
}

CString CSMSPage::Cut86(char * num)
{
	CString buf, strRet;

	buf = num;
	if (buf.Left(2) == "86")
	{
		strRet = buf.Right(buf.GetLength()-2);
	}
	else
	{
		strRet = buf;
	}

	return strRet;
}

void CSMSPage::OnDelsms() 
{
	// TODO: Add your command handler code here
	CString m_DelNum, sAppComm, sDevComm;
	char buf[5], comm[20], cText[100];
	int iNum;

	memset(comm, 0, 20);
	memset(buf, 0, 5);
	memset(cText, 0, 100);

	m_DelNum = m_SMSList.GetItemText(iCurrIndex, 0);
	sprintf(buf, "%s", m_DelNum);
	iNum = atoi(buf);

	sAppComm = theApp.GetAppComm();
	sprintf(comm, "%s", sAppComm);
	theApp.SetStatusText("正在寻找GPRS无线网络设备,请稍后...");
	theApp.SetDevText("");
	sDevComm = theApp.OpenDev(comm, 9600);
	if (sDevComm.GetLength() == 0)
	{
		theApp.SetStatusText("设备未被找到或端口未被初始化,正在尝试初始化...");
		sDevComm = theApp.MultiBautOpenDev(comm);
		if (sDevComm.GetLength() == 0)
		{
			theApp.mobile.CloseComm();
			theApp.SetStatusText("没有找到设备或端口波特率不匹配,请确定设备是否连接...");
			MessageBox("没有找到设备或端口波特率不匹配!", "AWS");
			return;
		}
		else
		{
			theApp.SetStatusText("端口初始化完成,正在打开端口...");
			sDevComm = theApp.OpenDev(comm, 9600);
		}
	}

	if (theApp.GetDevType() == "WAVECOM")
	{
		theApp.SetStatusText("");
		sprintf(cText, "ADBON GPRS MODEM : %s/%d", sDevComm, 9600);
		theApp.SetDevText(cText);

		DelSMSList();
		theApp.mobile.CMGD(iNum);
		theApp.mobile.CloseComm();
	}

	if (theApp.GetDevType() == "BENQ")
	{
		theApp.SetStatusText("");
		sprintf(cText, "ADBON GPRS MODEM : %s/%d", sDevComm, 9600);
		theApp.SetDevText(cText);

		DelSMSList();

		theApp.mobile.CMGD(iNum);
		theApp.mobile.CloseComm();
	}

	OnBtnexport();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -