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

📄 smsdlg.cpp

📁 短信群发程序,针对WAVECOM模块开发,程序员通过该程序可以了解:1.串口编程2.GSM发送短信3.PDU编码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	pdlg->m_bt_get_message.EnableWindow(TRUE);
	pdlg->m_ctr_message.EnableWindow(TRUE);
	pdlg->issend = 0 ;
	return 1 ;
}
bool CSmsDlg::open_com()
{
/*	DCB dcb;		// 串口控制块
	COMMTIMEOUTS timeouts = {	// 串口超时控制参数
		100,				// 读字符间隔超时时间: 100 ms
		1,					// 读操作时每字符的时间: 1 ms (n个字符总共为n ms)
		500,				// 基本的(额外的)读超时时间: 500 ms
		1,					// 写操作时每字符的时间: 1 ms (n个字符总共为n ms)
		100};				// 基本的(额外的)写超时时间: 100 ms

	char port[10] ;
	GetPrivateProfileString("SYSTEM","COM","COM1",port,50,"./sms.ini");

	hComm = CreateFile(port,	// 串口名称或设备路径
			GENERIC_READ | GENERIC_WRITE,	// 读写方式
			0,				// 共享方式:独占
			NULL,			// 默认的安全描述符
			OPEN_EXISTING,	// 创建方式
			0,				// 不需设置文件属性
			NULL);			// 不需参照模板文件
	
	if(hComm == INVALID_HANDLE_VALUE) return FALSE;		// 打开串口失败

	GetCommState(hComm, &dcb);		// 取DCB
	int nBaudRate = GetPrivateProfileInt("SYSTEM","BaudRate",9600,"./sms.ini");
	dcb.BaudRate = nBaudRate;
	dcb.ByteSize = 8;
	dcb.Parity = 0;
	dcb.StopBits = 1;
	SetCommState(hComm, &dcb);		// 设置DCB
	SetupComm(hComm, 4096, 1024);	// 设置输入输出缓冲区大小
	SetCommTimeouts(hComm, &timeouts);	// 设置超时
	*/	
	return TRUE;

}

void CSmsDlg::OnButtonGetMessage() 
{
	// TODO: Add your control notification handler code here
	GetPrivateProfileString("SYSTEM","MESSAGE","",m_message.GetBuffer(0),170,"./sms.ini");
	UpdateData(FALSE);
	
}

void CSmsDlg::OnChangeEditMessage() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	UpdateData();
	// TODO: Add your control notification handler code here
	
}

void CSmsDlg::OnButtonChangeMessage() 
{
	// TODO: Add your control notification handler code here
	WCHAR wchar[1024];
	UpdateData();
	int nCount = ::MultiByteToWideChar(CP_ACP, 0, m_message, -1, wchar, 1024);
	if(nCount <= 1)
	{
		AfxMessageBox("请输入消息内容!");
		return;
	}
	else if(nCount > 71)		// 我们决定全部用UCS2编码,最大70个字符(半角/全角)
	{
		AfxMessageBox("消息内容太长,请重新输入!");
		return;
	}

	if( WritePrivateProfileString("SYSTEM","MESSAGE",m_message,"./sms.ini") ) MessageBox("群发词修改成功!");
	else MessageBox("群发词修改失败!");
}
DWORD WINAPI thread_get_number(LPARAM lParam)
{
	CSmsDlg *pdlg;
	pdlg=(CSmsDlg *)lParam;
	unsigned int len;
	unsigned long lg,cnt,num_cnt,lgtemp;
	bool number[0xffff];
	
	CStdioFile src_file,num_file;
	CString src_file_name,src_num_temp,num_temp,str;
	srand( (unsigned)time( NULL ) );
	pdlg->m_ctr_num.SetWindowText("");
	GetPrivateProfileString("SYSTEM","file","",src_file_name.GetBuffer(0),170,"./sms.ini");
	if( !src_file.Open(src_file_name,CFile::modeRead|CFile::shareDenyNone,NULL))
	{
		AfxMessageBox("号码文件未找到,请检查配置文件!");
		return 0;
	}
	pdlg->m_bt_get_number.EnableWindow(FALSE);
	
	num_file.Open("temp.txt",CFile::modeCreate | CFile::modeReadWrite|CFile::shareDenyNone,NULL);
	cnt = 0 ;
	while(src_file.ReadString(src_num_temp) != NULL)
	{
		len = src_num_temp.GetLength() ;
		if(( len > 3 ) && ( len < 12 )) 
		{
			if( len == 11 ) 
			{
				src_num_temp = src_num_temp + "\n" ;
				num_file.WriteString(src_num_temp);
				cnt++;
				str.Format("%u",cnt);
				pdlg->m_ctr_num_all.SetWindowText(str);

			}
			else
			{
				len = 11 - len ;
				num_cnt = pow(10,len) ;
				memset(number,0,sizeof(number));
				for( lg = 0 ; lg < num_cnt ; lg ++ )
				{
					lgtemp = lg ;
					num_temp.Format("%i",lgtemp);
					while( num_temp.GetLength() != len ) num_temp = "0" + num_temp ;
					num_temp = src_num_temp + num_temp +"\n";
					num_file.WriteString(num_temp);
					cnt++;
					str.Format("%u",cnt);
					pdlg->m_ctr_num_all.SetWindowText(str);
				}
			}
		}
	}
	src_file.Close();
	unsigned long file_len = num_file.GetLength()/13;
	pdlg->m_ctr_prog.SetRange(0,file_len);
	num_temp.Format("%u",file_len);
	pdlg->m_ctr_cnt.SetWindowText("0");
//以下生成随机文件
	CStdioFile rand_file;
	char *pdt ;
	unsigned long total_length;

	pdt = (char*)malloc(num_file.GetLength());
	num_file.SeekToBegin();
	total_length = num_file.GetLength() ;
	num_file.ReadHuge(pdt , total_length );
	num_file.Close();
	srand( (unsigned)time( NULL ) );
	rand_file.Open("number.txt",CFile::modeCreate | CFile::modeWrite|CFile::shareDenyNone,NULL);
	num_cnt = total_length  / 13 ;
	total_length = num_cnt * 12 ;
	lgtemp = 0 ;
	pdlg->m_ctr_prog.SetRange32(0,num_cnt);
	pdlg->m_ctr_prog.SetStep(1);
	while(num_cnt > 0 )
	{
		cnt = rand() * (num_cnt -1);
		cnt = cnt / RAND_MAX;
		cnt = cnt * 12 ;
		num_temp.Format("%s",&pdt[cnt]);
		num_temp = num_temp.Left(11) + "\n" ;
		rand_file.WriteString(num_temp) ;
		num_cnt--;
		total_length = total_length - 12 ;
		memcpy(&pdt[cnt],&pdt[cnt+12],(total_length - cnt ));
		lgtemp++;
		str.Format("%u",lgtemp);
		pdlg->m_ctr_cnt.SetWindowText(str);
		pdlg->m_ctr_prog.StepIt();
	}
	free(pdt);
	rand_file.Close();
	num_file.Remove("temp.txt");
	pdlg->m_ctr_prog.SetPos(0);
	pdlg->m_ctr_cnt.SetWindowText("0");	
	pdlg->m_bt_send.EnableWindow(TRUE);
	pdlg->m_bt_get_number.EnableWindow(TRUE);
	return 1;
}
void CSmsDlg::OnButtonGetNum() 
{
	// TODO: Add your control notification handler code here
	m_bt_send.EnableWindow(FALSE);
	CreateThread(NULL,0,LPTHREAD_START_ROUTINE(thread_get_number),this,0,NULL);
	m_ctr_prog.SetPos(0);
	m_bt_get_message.SetFocus();
}

void CSmsDlg::OnButtonSend() 
{
	// TODO: Add your control notification handler code here
	CString bt;
	m_bt_send.GetWindowText(bt);
	if(bt == "开始发送")
	{

		// 检查短消息内容是否空,或者超长

		WCHAR wchar[1024];
		UpdateData();
		int nCount = ::MultiByteToWideChar(CP_ACP, 0, m_message, -1, wchar, 1024);
		if(nCount <= 1)
		{
			AfxMessageBox("请输入消息内容!");
			return;
		}
		else if(nCount > 71)		// 我们决定全部用UCS2编码,最大70个字符(半角/全角)
		{
			AfxMessageBox("消息内容太长,无法发送!");
			return;
		}
		SM_PARAM SmParam;
		memset(&SmParam, 0, sizeof(SM_PARAM));

		// 填充短消息结构
		CString strSmsc ;
		GetPrivateProfileString("SYSTEM","SMSC","8613010911500",strSmsc.GetBuffer(0),50,"./sms.ini");
		strcpy(SmParam.SCA, strSmsc);
		strcpy(SmParam.TPA, "8613123456789");
		strcpy(SmParam.TP_UD, m_message);
		SmParam.TP_PID = 0;
		SmParam.TP_DCS = GSM_UCS2;
		int nPduLength;		// PDU串长度
		unsigned char nSmscLength;	// SMSC串长度
		char cmd[16];		// 命令串
		char pdu[512];		// PDU串
		nPduLength = gsmEncodePdu(&SmParam, pdu);	// 根据PDU参数,编码PDU串
		strcat(pdu, "\x01a");		// 以Ctrl-Z结束
		gsmString2Bytes(pdu, &nSmscLength, 2);	// 取PDU串中的SMSC信息长度
		nSmscLength++;		// 加上长度字节本身
		// 命令中的长度,不包括SMSC信息长度,以数据字节计
		sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength);	// 生成命令
		send_buf[0]=0;
		strcat(send_buf,cmd);
		strcat(&send_buf[strlen(cmd)],pdu);
		num_addr = strlen(cmd) + 28 ;	
		h_send_message = CreateThread(NULL,0,LPTHREAD_START_ROUTINE(thread_send_message),this,0,NULL);
		if( h_send_message != NULL ) issend = 1;
		m_bt_send.SetWindowText("终止发送");
		m_bt_change_message.EnableWindow(FALSE);
		m_bt_get_number.EnableWindow(FALSE);
		m_bt_get_message.EnableWindow(FALSE);
		m_ctr_message.EnableWindow(FALSE);
		m_ctr_cnt.SetWindowText("0");
		m_ctr_prog.SetPos(0);
		m_ctr_msg.DeleteAllItems();
	}
	else
	{
		issend = 0;
		m_bt_send.SetWindowText("开始发送");
		m_bt_change_message.EnableWindow(TRUE);
		m_bt_get_number.EnableWindow(TRUE);
		m_bt_get_message.EnableWindow(TRUE);
		m_ctr_message.EnableWindow(TRUE);
	}
}

void CSmsDlg::OnOK() 
{
	// TODO: Add extra validation here
	CString str;
	m_bt_send.GetWindowText(str);
	if(str == "终止发送") 
	{
		AfxMessageBox("正在发送短信,请先终止发送!");
		return;
	}
	CloseComm();
	CDialog::OnOK();
}

void CSmsDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	CString str;
	m_bt_send.GetWindowText(str);
	if(str == "终止发送") 
	{
		AfxMessageBox("正在发送短信,请先终止发送!");
		return;
	}
	CDialog::OnClose();
}

void CSmsDlg::OnDestroy() 
{
	CString str;
	m_bt_send.GetWindowText(str);
	if(str == "终止发送") 
	{
		AfxMessageBox("正在发送短信,请先终止发送!");
		return;
	}
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	
}

⌨️ 快捷键说明

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