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

📄 sms.cpp

📁 USB发送短消息 控制USB口发送短消息的源码
💻 CPP
字号:
/* ************************************************************************
	 *	 CSms.cpp:  Impliment file  of cmd Socket receive server  *
	 *	 Version :  0.07                                          *
	 *	 Date    :  30th,Nov 2002                                 * 
	 *	 Author  :  Caihy                           		  *
	 *	 Email   :  cai_hai_ying2002@163.com                      *
 *************************************************************************/

#include "stdafx.h"
#include "Sms.h"
#include "math.h"
#include "SmsDlg.h"

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

//
//	Note!
//
//		If this DLL is dynamically linked against the MFC
//		DLLs, any functions exported from this DLL which
//		call into MFC must have the AFX_MANAGE_STATE macro
//		added at the very beginning of the function.
//
//		For example:
//
//		extern "C" BOOL PASCAL EXPORT ExportedFunction()
//		{
//			AFX_MANAGE_STATE(AfxGetStaticModuleState());
//			// normal function body here
//		}
//
//		It is very important that this macro appear in each
//		function, prior to any calls into MFC.  This means that
//		it must appear as the first statement within the 
//		function, even before any object variable declarations
//		as their constructors may generate calls into the MFC
//		DLL.
//
//		Please see MFC Technical Notes 33 and 58 for additional
//		details.
//

/////////////////////////////////////////////////////////////////////////////
// CSmsApp

BEGIN_MESSAGE_MAP(CSmsApp, CWinApp)
	//{{AFX_MSG_MAP(CSmsApp)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSmsApp construction

CSmsApp::CSmsApp()
{

}

/////////////////////////////////////////////////////////////////////////////
// The one and only CSmsApp object

CSmsApp theApp;
char* m_Message;      //Message
char* m_Number;      //the called number 
int ComNum;           //port number, now not used 2002-11-25


extern "C" __declspec(dllexport) int GetStatus()
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
 return 0;  //ready
}

extern "C" __declspec(dllexport) int ReadSms()
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
//varialbe declaration
	CSmsDlg dlg;       //declare an dlg instance
	int i,j,k,InBufferCount,nowInBufferCount; //receive buffer variables
    VARIANT vResponse;
	char *str;
	BYTE Data[400];//设置BYTE数组 An 8-bit integer that is not signed.

	dlg.Create(IDD_MODEMCONNET_DIALOG,NULL);
 	dlg.m_Com.SetCommPort(4); //选择COM1
	dlg.m_Com.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
	dlg.m_Com.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes
 
	if(dlg.m_Com.GetPortOpen()) //打开串口  
	{
	//	if(dlg) dlg.DestroyWindow(); can't in for dlg is only -- 2002-11-29
		return 1;//no use
	}
	else
	{
		try
		{dlg.m_Com.SetPortOpen(TRUE);}
		catch(...)  // catch an exception 如果其它进程独占端口,则打开端口失败,返回busy
		{
			if(dlg) dlg.DestroyWindow();
			return 1;
		}
		//if(m_Com.GetPortOpen())	MessageBox("端口打开!");
	}
	dlg.m_Com.SetInputMode(1); //设置输入方式为二进制方式,default is 0 文本方式接收数据, more trouble
	dlg.m_Com.SetRThreshold(1); //为1表示有一个字符引发一个事件    
	dlg.m_Com.SetSettings("57600,n,8,1");
	//m_Com.SetHandshaking(0);
	dlg.m_Com.SetInputLen(0);//接收缓冲区的全部内容
//	m_Com.SetOutput(COleVariant(m_strArray));//发送数据
	dlg.m_Com.GetInput();   	//先预读缓冲区以清除残留数据

   	dlg.SendString("AT\r\n");    //测试连接是否成功
   	dlg.SendString("ATE0\r\n");  //设置modem无回显,即返回数据中不在包括发送指令
  	dlg.SendString("AT\r\n");    //测试连接是否成功
   	dlg.SendString("AT+CMGF=0\r\n");    //测试连接是否成功
	Sleep(500);
	dlg.m_Com.GetInput();

	dlg.SendString("AT+CMGR=7\r\n");

// query inbuffer data
	for(i=1;i<2;i++)
	{
		Sleep(1000);
		InBufferCount = dlg.m_Com.GetInBufferCount(); //接收到的字符数目
		vResponse = dlg.m_Com.GetInput();   //读缓冲区
		nowInBufferCount=dlg.m_Com.GetInBufferCount();
		str=(char*)(unsigned char*)vResponse.parray->pvData;
		for(k=0;k<=InBufferCount;k++) Data[k] = *(str+k);
		if(Data[10] != '+')
		{
			if(dlg.m_Com.GetPortOpen()) dlg.m_Com.SetPortOpen(FALSE);
			if(dlg) dlg.DestroyWindow();
			return -1; //if not 'ok', return 1 busy
		}
	}

	return 100;
}

extern "C" __declspec(dllexport) int SendShortMessage(char *Number, int NumberLen, char *Message, int MessageLen)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
// variable definition
	CString strMessage;  //send string
	CString strNumber;  //send string
	CSmsDlg dlg;       //declare an dlg instance
	
	int i,j,k,InBufferCount,nowInBufferCount; //receive buffer variables
    VARIANT vResponse;
	char *str;
	BYTE Data[200];//设置BYTE数组 An 8-bit integer that is not signed.

	m_Message = Message;
	m_Number = Number;
	strMessage=CString(Message);
	strNumber=CString(Number);

	int m_NumberLen = strlen(Number);
	int m_MessageLen = strlen(Message);

	if(m_NumberLen!=11) return 3;  // illegal number

	CString strTemp;	


// AT+CMGF=1  Test Mode 
//	dlg.SendString("AT+CMGF=1");
//	strTemp = "AT+CMGS=""+strMessage+""\r\n"; 
// AT+CMGF=0  PDU  mode
//	dlg.SendString("AT\r\n");
//	dlg.SendString("AT+CMGF=0\r\n");

	dlg.Create(IDD_MODEMCONNET_DIALOG,NULL);
 	dlg.m_Com.SetCommPort(4); //选择COM1
	dlg.m_Com.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
	dlg.m_Com.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes
 
	if(dlg.m_Com.GetPortOpen()) //打开串口  
	{
	//	if(dlg) dlg.DestroyWindow(); can't in for dlg is only -- 2002-11-29
		return 1;//no use
	}
	else
	{
		try
		{dlg.m_Com.SetPortOpen(TRUE);}
		catch(...)  // catch an exception 如果其它进程独占端口,则打开端口失败,返回busy
		{
			if(dlg) dlg.DestroyWindow();
			return 1;
		}
		//if(m_Com.GetPortOpen())	MessageBox("端口打开!");
	}
	dlg.m_Com.SetInputMode(1); //设置输入方式为二进制方式,default is 0 文本方式接收数据, more trouble
	dlg.m_Com.SetRThreshold(1); //为1表示有一个字符引发一个事件    
	dlg.m_Com.SetSettings("57600,n,8,1");
	//m_Com.SetHandshaking(0);
	dlg.m_Com.SetInputLen(0);//接收缓冲区的全部内容
//	m_Com.SetOutput(COleVariant(m_strArray));//发送数据
	dlg.m_Com.GetInput();   	//先预读缓冲区以清除残留数据

   	dlg.SendString("AT\r\n");    //测试连接是否成功
   	dlg.SendString("ATE0\r\n");  //设置modem无回显,即返回数据中不在包括发送指令
  	dlg.SendString("AT\r\n");    //测试连接是否成功
   	dlg.SendString("AT+CMGF=0\r\n");    //测试连接是否成功
	Sleep(500);
	dlg.m_Com.GetInput();

	dlg.SendString("AT+CSCA?\r\n");

// query inbuffer data
	for(i=1;i<2;i++)
	{
		Sleep(1000);
		InBufferCount = dlg.m_Com.GetInBufferCount(); //接收到的字符数目
		vResponse = dlg.m_Com.GetInput();   //读缓冲区
		nowInBufferCount=dlg.m_Com.GetInBufferCount();
		str=(char*)(unsigned char*)vResponse.parray->pvData;
		for(k=0;k<=InBufferCount;k++) Data[k] = *(str+k);
		if(Data[10] != '+')
		{
			if(dlg.m_Com.GetPortOpen()) dlg.m_Com.SetPortOpen(FALSE);
			if(dlg) dlg.DestroyWindow();
			return -1; //if not 'ok', return 1 busy
		}
		
		else 
		{
		
			dlg.SCA.Empty();
			char MidSCA[13];
			for(i=0;i<9;i=i+2)
			{
				MidSCA[i] = Data[i+14];
				MidSCA[i+1] = Data[i+13];
			}
			MidSCA[11] = Data[23];
			MidSCA[10] = 'F';
			for(i=0;i<12;i++) dlg.SCA=dlg.SCA+CString(MidSCA[i]);
			continue;
		}
	}
// if message too long, then close the port and dlg, and return 2
	int len = dlg.SmsConvertPDU();
	if(len>=140) 
	{
		if(dlg.m_Com.GetPortOpen()) dlg.m_Com.SetPortOpen(FALSE);
		if(dlg) dlg.DestroyWindow();
		return 2;// message too long
	}

   	dlg.SendString("AT\r\n");    //测试连接是否成功
// query inbuffer data
	for(i=1;i<2;i++)
	{
		Sleep(500);
		InBufferCount = dlg.m_Com.GetInBufferCount(); //接收到的字符数目
		vResponse = dlg.m_Com.GetInput();   //读缓冲区
		nowInBufferCount=dlg.m_Com.GetInBufferCount();
		str=(char*)(unsigned char*)vResponse.parray->pvData;
		for(k=0;k<=InBufferCount;k++) Data[k] = *(str+k);
		if(Data[2] != 'o' && Data[2] != 'O')
		{
			if(dlg.m_Com.GetPortOpen()) dlg.m_Com.SetPortOpen(FALSE);
			if(dlg) dlg.DestroyWindow();
			return -1; //if not 'ok', return 1 busy
		}
		
		else continue;
	}
	
// prepare for sms
	CString TotalLength;
	TotalLength.Format("%d",len);
	strTemp = "AT+CMGS="+TotalLength+"\r\n"; 
	dlg.SendString(strTemp);

// query inbuffer data
	for(i=1;i<5;i++)
	{
		Sleep(1000);
		InBufferCount = dlg.m_Com.GetInBufferCount(); //接收到的字符数目
		vResponse = dlg.m_Com.GetInput();   //读缓冲区
		nowInBufferCount=dlg.m_Com.GetInBufferCount();
		str=(char*)(unsigned char*)vResponse.parray->pvData;
		for(k=0;k<=InBufferCount;k++) Data[k] = *(str+k);
		if(Data[2]=='>')
		{
			dlg.SmsPDU();
			for(j=1;j<5;j++)
			{
				Sleep(1000);
				InBufferCount = dlg.m_Com.GetInBufferCount(); //接收到的字符数目
				vResponse = dlg.m_Com.GetInput();   //读缓冲区
				nowInBufferCount=dlg.m_Com.GetInBufferCount();
				str=(char*)(unsigned char*)vResponse.parray->pvData;
				for(k=0;k<=InBufferCount;k++) Data[k] = *(str+k);
				if(Data[2]=='+') 
				{
					if(dlg.m_Com.GetPortOpen()) dlg.m_Com.SetPortOpen(FALSE);
					dlg.DestroyWindow();
					return 0; //sms send return ok
				}
			}
		}

	}

	if(dlg.m_Com.GetPortOpen()) dlg.m_Com.SetPortOpen(FALSE);
	if(dlg) dlg.DestroyWindow();
	return -1; //not send
}


BOOL CSmsApp::InitInstance() 
{
	CoInitialize(NULL); 
	AfxEnableControlContainer(); 

	//此程序只能运行一次,用互斥量来判断程序是否已运行
//    HANDLE m_hMutex=CreateMutex(NULL,TRUE, m_pszAppName); 
//  if(GetLastError()==ERROR_ALREADY_EXISTS) { return FALSE; }
//	dlg.DoModal();  //this function can be replaced by the following codes

   //Check if new succeeded and we got a valid pointer to a dialog object
//	dlg.ShowWindow(SW_SHOW);

/*
   if(dlg!=NULL)
   {
      BOOL ret = dlg.Create(IDD_MODEMCONNET_DIALOG,this);
      if(!ret)   //Create failed.
         AfxMessageBox("Error creating Dialog");
      dlg->ShowWindow(SW_SHOW);
   }
*/
	return CWinApp::InitInstance();
}

⌨️ 快捷键说明

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