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

📄 mobilecontrol.h

📁 一个收发手机短信的源代码
💻 H
字号:
// MobileControl.h: interface for the CMobileControl class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MOBILECONTROL_H__EEC1B542_F4AC_4CF1_9E7E_8B6423BDB690__INCLUDED_)
#define AFX_MOBILECONTROL_H__EEC1B542_F4AC_4CF1_9E7E_8B6423BDB690__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "HwMobile.h"

/*
			【 手机与callgle之间的短信通信协议 】

	1、手机发短信给callgle
		1.1 短信脚本:
		1.1.1 #!##<SMSType>#[GroupName1,2,3 ...]#<SMS Content>
			! : 表示发送结果需要回应
			<SMSType> : 短信类型。公告、公众、公益
			以上表示短信类型的代码可以由客户端程序界面修改。
			[GroupName1] : 第一个群组名,指定接收的群组,如果不指定,就是发送给公司所有人。客户端可以锁定某些手机号码
				具有这种“发给所有人”的权限,如果不锁定即所有手机都可以发送。
			[GroupName2] : 第二个群组名
			<SMS Content> : 短信内容本身

		1.1.2 #!#<Recver1,Recver2,Recver3 ...>#<SMS Content>
			! : 表示发送结果需要回应
			<Recver1> : 第一个接收者PM帐号
			<Recver2> : 第二个接收者名字或PM帐号
			<SMS Content> : 短信内容本身

		1.1.3 %<OptCommand>,<CtrlCode>%<None SMS>
			<OptCommand> : 操作指令 0 - 无效; 1 - 续用(续租); 2 - 注入新安全码; 3 - 删除安全码; 4 - 停用; 5 - 恢复;
				6 - 设置 Callgle 系统的基本数据;
			<CtrlCmd> : 控制代码
			<None SMS> : 不需要输入任何短信内容,输入也不起作用

		1.1.4 <SMS Content>
			<SMS Content> : 短信内容本身
			这种短信未指定短信类型和接收者,如果发送者是callgle用户,即公司自己人,那么该短信会作为公开信息送给
			公司所有人,否则,将送给某一指定用户,默认是系统管理员,可以在客户端修改这一配置。

		1.1.5 #? 或者 #help
			获取系统帮助

		1.2 举例:
			1.3.3 #101#同仁们:今天上海展销很成功
				私聊短信,发送给PM帐号为101的用户,内容是“同仁们:今天上海展销很成功”。
			1.2.2 ##1968#通知:明天下午全公司开作战会议
				公告信息,发送给公司所有人,此时不需要指定接收者,指定了也不起作用,内容是“通知:明天
				下午全公司开作战会议”
			1.2.3 现在天气真热,大家要做好防暑准备
				“现在天气真热,大家要做好防暑准备”这条短信会被送给系统管理员或者某一指定的短信管理员
			1.2.4 #!##公告#开发部#昨天下午,谁最后一个离开公司,请告诉我一声
				发给"开发部"的公告信息, 内容为"昨天下午,谁最后一个离开公司,请告诉我一声"。Callgle系统收到后会回应结果短信给发送者
			1.2.5 %2384232*329#9232*934#24#%
			通过手机给callgle发送续用码

	2、callgle发短信给手机
		没有特殊的规定,只要指定接收者,便可将要发送的短信文字发送出去,超过140个字符的会自动被分作多条短信来发送。
		只是每条有空余17个位置的短信末尾会加上一句话“sent by \"callgle\"”

	3、callgle自主发送短信
		在以下几种情况,callgle会自主发送手机短信
		3.1 当用户不在线,有来电时,如该用户有“不在线时可以收到短信通知”的短信权限,那么callgle会自主地将该来话信息
			发送给他的手机。
		3.2 当用户不在线,有文字传讯信息或公告信息时,如该用户有“不在线时可以收到短信通知”的短信权限,那么callgle会自主
			地将该来话信息发送给他的手机。
		3.3 当有人发送寻求帮助的信息时,callgle也会自主发送包含帮助信息的文字给求助者。

	4、用户短信权限定义
		每个用户都有一个短信权限,分别为:
		4.1 允许发送短信
		4.2 允许接收短信
		4.2 不在线时可以收到短信通知
		
*/

#ifndef _2Lines
// 收到短消息时回调这个函数来处理
typedef LRESULT (*FUNC_ReceivedSMS) ( SM_PARAM *pSMRecv, WPARAM wParam, LPARAM lParam );
// 发送短消息完成时回调这个函数来处理
typedef LRESULT (*FUNC_SendSMSEnd) ( ENUM_ERROR_TYPE eResult, WPARAM wParam, LPARAM lParam );

// 两次选择电话本的时间间隔 (秒),否则选择将失败
#define SELECT_PHONEBOOK_INTVERVAL	2
// 最大短信队列数
#define MAX_SMSQUEUE_NUM	3000
// 初始化接口的时间间隔 ( 秒 )
#ifdef _DEBUG
#define INITIALIZE_INTERFACE_INTERVAL	1
#else
#define INITIALIZE_INTERFACE_INTERVAL	3
#endif
// 完全相同的短信发送必须间隔的时长(秒)
#define SAME_SMS_INTERVAL_TIMELONG		60

typedef LRESULT (*FUNC_HandleMobileStatusChange) ( ENUM_ERROR_TYPE eMobileStatus_Old, ENUM_ERROR_TYPE eMobileStatus_New );

class DLL_INTERNAL CMobileControl : public CHwMobile
{
public:
	HANDLE m_EvtThreadCanRun;				// 如果该事件被置位表示线程可以运行了
	t_MobileParameter* m_pMobileParameter;
	DWORD* m_pdwSentSMSCount;
	CHwMysql_PMData* m_pHwMysql_PMData;
	CHwMysql_PMMsg* m_pHwMysql_PMMsg;
	CHwMysql_PMFullPN* m_pHwMysql_PMFullPN;
	BOOL SMSModuleEnable ( BOOL bEnable );
	// 运行状态
	typedef enum _enum_run_state
	{
		ENUM_RunState_Start,				// 开始
		ENUM_RunState_Init,					// 初始化
		ENUM_RunState_Runing,				// 正在运行
		ENUM_RunState_NUM,
	} ENUM_RunState;

	static LPCTSTR GetObjectName();
	// 待发送的短信队列
	typedef struct _sms_send_queue
	{
		SM_PARAM sm;						// 要发送的短信
		DWORD dwPMAccount_Sender;
		FUNC_SendSMSEnd Proc_SendSMSEnd;	// 发送完成时通过该回调函数来通知请求者
		WPARAM wParam;
		LPARAM lParam;
		ENUM_MOBILESMSTYPE eMobileSMSType;
	} t_SMS_SendQueue;
	typedef CArray<t_SMS_SendQueue,t_SMS_SendQueue&> t_Ary_SMS_SendQueue;

	CMobileControl(LOG_FUNC ExternLog);
	virtual ~CMobileControl();
	inline void SetParameter ( FUNC_ReceivedSMS Proc_ReceivedSMS, WPARAM wParam, LPARAM lParam )
	{
		m_Proc_ReceivedSMS = Proc_ReceivedSMS;
		m_wParam = wParam;
		m_lParam = lParam;
	}
	BOOL ThreadProc_Mobile();
	int Runing();
	ENUM_ERROR_TYPE CMobileControl::SendSMS (
		ENUM_MOBILESMSTYPE eMobileSMSType,
		LPCTSTR lpszReceiverMobileNO,
		LPCTSTR lpszSMSContent_Byte,
		WCHAR *wzSMSContent_Wide=NULL,
		DWORD dwPMAccount_Sender=INVALID_PMACCOUNT,
		FUNC_SendSMSEnd Proc_SendSMSEnd=NULL,
		WPARAM wParam=NULL,
		LPARAM lParam=NULL
	);
	ENUM_ERROR_TYPE CMobileControl::SendOnePartSMS (
		ENUM_MOBILESMSTYPE eMobileSMSType,
		LPCTSTR lpszReceiverMobileNO,
		BOOL bInternationalMobileNO,
		LPCTSTR lpszSMSContent_Byte,
		WCHAR *wzSMSContent_Wide=NULL,
		DWORD dwPMAccount_Sender=INVALID_PMACCOUNT,
		FUNC_SendSMSEnd Proc_SendSMSEnd=NULL,
		WPARAM wParam=NULL,
		LPARAM lParam=NULL
	);
	BOOL Init (
		BOOL bRunAsServer,			// 是否当作服务器运行
		BOOL bRecvSMSEnable,		// 是否允许自动收取手机短信
		HANDLE hEvt_TerminateSys,
		int nComNO,
		int nBaudRate
	);
	t_Ary_PhoneBook* ReadPhoneBook ();
	int ParseSMSRecved ( 
		IN LPCTSTR lpszSMSContent,
		IN LPCTSTR lpszSenderMobileNO,
		OUT CStringArray **ppStrAry_GroupName_Recver,
		OUT CStringArray **ppStrAry_PMAccount_Recver,
		OUT char *szSMSContent,
		int nSMSContentSize,
		BOOL &bRequireEchoSMS,
		LPCTSTR lpszSendTime
	);
	void ClearSendQueue ();
	ENUM_ERROR_TYPE GetMobileStatus ();
	FUNC_HandleMobileStatusChange m_Proc_HandleMobileStatusChange;
	WPARAM m_paraHandleMobileStatusChange;
	int IsMobileNO ( LPCTSTR lpszPhoneNO, t_MobileNOHead *pMobileNOHead=NULL, CString *pShortMobileNO=NULL );
	t_Ary_MobileNOHead m_Ary_MobileNOHead;
	void ConfigParameter ( t_Ary_MobileNOHead *pAry_MobileNOHead );
	ENUM_ERROR_TYPE StandardMobileNO ( CString &csMobileNO, BOOL *pbInternationalMobileNO=NULL, CString *pSimplifyMobileNO=NULL );

private:
	LRESULT ChangeMobileStatus( ENUM_ERROR_TYPE eMobileStatus_New );
	int m_InitializeInterfaceInterval;
	CString m_csPartString;
	ENUM_RunState m_eRunState;
	BOOL m_bRecvSMSEnable;
	BOOL m_bRunAsServer;
	BOOL ReadExistSMSInMobile ();
	BOOL SendSMSQueue ();
	BOOL ReadNewSMS ();
	CString StandardSMSContent ( LPCTSTR lpszSMSContent );
	BOOL SendOneSMSQueue ( t_SMS_SendQueue &SMS_SendQueue );
	int HandleSMSCtrlCode ( 
		IN LPCTSTR lpszSMSContent,
		OUT CStringArray **ppStrAry_PMAccount_Recver,
		OUT char *szSMSContent,
		int nSMSContentSize
	);
	int CompareNOHead ( LPCTSTR lpszPhoneNO, LPCTSTR lpszPhoneNOHead, BOOL bSikpZeroBeforeCompare );
	LPCTSTR CheckHeadStr ( LPCTSTR lpszStr, LPCTSTR lpszHead1, LPCTSTR lpszHead2, LPCTSTR lpszHead3 );
	int HandleSMSCommon ( 
		IN LPCTSTR lpszSMSContent,
		IN LPCTSTR lpszSenderMobileNO,
		OUT CStringArray **ppStrAry_GroupName_Recver,
		OUT CStringArray **ppStrAry_PMAccount_Recver,
		OUT char *szSMSContent,
		int nSMSContentSize,
		ENUM_MOBILESMSTYPE &eMobileSMSType
	);
	BOOL ParseRecverAndContent (
		char *pHandlePos,
		OUT CStringArray **ppStrAry_Recver,
		OUT char *szSMSContent,
		int nSMSContentSize
	);
	int HandleSMSMultiRecver (
		IN LPCTSTR lpszSMSContent,
		IN LPCTSTR lpszSenderMobileNO,
		OUT CStringArray **ppStrAry_GroupName_Recver,
		OUT char *szSMSContent,
		int nSMSContentSize
	);
	int HandleSMSSingleRecver (
		IN LPCTSTR lpszSMSContent,
		IN LPCTSTR lpszSenderMobileNO,
		OUT CStringArray **ppStrAry_PMAccount_Recver,
		OUT char *szSMSContent,
		int nSMSContentSize
	);
	BOOL InitMobileControl ();
	BOOL InitMobileModule ( int &nComNO );
	BOOL InitMobileOneCOM ( int nComNO );
	BOOL IsSameSMSType ( CString &csSMSType, CString csSMSType_Bulletin );
	CString SimplifyMobileNO ( LPCTSTR lpszMobileNO );
	ENUM_ERROR_TYPE InfillSMParam ( 
		OUT SM_PARAM &SmParam,
		IN CString csReceiverMobileNO
	);
	ENUM_ERROR_TYPE StandardMobileNOHead ( CString &csMobileNOHead );
	int FindFromMobileNOHeadAry (
		LPCTSTR lpszPhoneNO,
		CString &csCountryCode,
		CString &csAreaCode
	);

	HANDLE m_hThread_Mobile;
	// 短消息接收处理时的回调函数和参数
	FUNC_ReceivedSMS m_Proc_ReceivedSMS;
	WPARAM m_wParam;
	LPARAM m_lParam;

	// 短消息发送队列
	t_Ary_SMS_SendQueue m_Ary_SMS_SendQueue;
	CCriticalSection m_CSFor_SMSSendQueue;
	HANDLE m_hEvt_SMSSendQueue;

	ENUM_ERROR_TYPE m_eMobileStatus;			// 手机状态,如果是禁用了手机模块,这个状态值一直是“禁用”,直到被控制码启用以后才会改变
	ENUM_ERROR_TYPE m_eMobileStatus_Real;		// 手机的真实状态,不管是禁用还是启用,手机当前的状态就保存到此了
	CCriticalSection m_CSFor_MobileStatus;

	HANDLE m_hEvt_TerminateSys;
	int m_nComNO_UserDefine;
protected:
	virtual BOOL HandleRecvSMS(SM_PARAM *pSMRecv);
	virtual int HandleCOMRW ( int nRet );
	void StandardShortMobileNO ( IN OUT CString &csShortMobileNO, IN LPCTSTR lpszMobileNOHead );
};

#endif

#endif // !defined(AFX_MOBILECONTROL_H__EEC1B542_F4AC_4CF1_9E7E_8B6423BDB690__INCLUDED_)

⌨️ 快捷键说明

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