www.pudn.com > SMS.rar > HwMobile.h


// HwMobile.h: interface for the CHwMobile class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#if !defined(AFX_HWMOBILE_H__799F4BF1_E829_4BFB_A78C_EB4642F19C1C__INCLUDED_) 
#define AFX_HWMOBILE_H__799F4BF1_E829_4BFB_A78C_EB4642F19C1C__INCLUDED_ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
 
/**************************************************************************************************************** 
		投稿说明: 
****************************************************************************************************************/ 
#define NOTE_HwMobile \ 
_T("\ 
        【软件名称】\r\n\ 
    《收发手机短信读写手机电话本的开发库源代码》\r\n\ 
        【版    本】\r\n\ 
    1.0.0\r\n\ 
        【操作系统】\r\n\ 
    Windows 系列\r\n\ 
        【作    者】\r\n\ 
    谢红伟 · chrys · chrys@163.com · http://www.howa.com.cn\r\n\ 
        【软件说明】\r\n\ 
    本源代码完全实现手机短信收发和操作电话本的功能,示例程序可当作一个简单的短信处理小工具来使用。支持中文、英文、数字多种文字类型,自动\r\n\ 
识别文字编码,自动选择最佳的编码方式(7Bit、8Bit或USC2),超长短信能自动拆分成多条发送,还可群发短信,收到短信自动通过声音提示,还能识别\r\n\ 
来电信息,显示来电号码。可以对本机、SIM卡、已拨电话纪录、未接电话纪录等多个电话本进行读写操作。能自动查找设备接口。另外还演示了UNICODE编\r\n\ 
程的方法。\r\n\ 
    你可以任意修改复制本代码,但请保留这段文字不要修改。\r\n\ 
    希望我能为中国的软件行业尽一份薄力!\r\n\ 
        【开发日期】\r\n\ 
    2007-10-07 06:26:24\r\n\ 
") 
 
 
#include  
 
// 手机工作线程休息时间(毫秒) 
#ifdef _DEBUG 
#define MOBILE_THREAD_SLEEP_TIME	1000 
#else 
#define MOBILE_THREAD_SLEEP_TIME	(5*1000) 
#endif 
 
#ifndef _SMS_DISABLE 
// 应答状态 
#define GSM_UNKNOWN							0		// 不确定 
#define GSM_OK								1		// OK 
#define GSM_ERR								-1		// ERROR 
// 短信内容的编码方式 
#define GSM_7BIT							0 
#define GSM_8BIT							4 
#define GSM_UCS2							8 
#define GET_DCS(c)							( ((c)&12) ) 
#define UDMAXLEN_7BIT						160 
#define UDMAXLEN_8BIT						140 
#define UDMAXLEN_UCS2						70 
 
// 最大允许读写错误次数,超过这个次数就认为设备不存在了 
#define MAX_RWERROR_TIMES					3 
// 等待 GSM 模块回应数据的时间 
#define WAIT_GSM_DATA_TIME_SLOW				(10*WAIT_DATA_TIMEOUT) 
#define WAIT_GSM_DATA_TIME_QUICK			(3*WAIT_DATA_TIMEOUT) 
// 最小手机号码长度 
#define MIN_MOBILENO_LENGTH					3 
// 一条短信文本信息长度 
#define ONE_SMS_TEXT_LENGTH					UDMAXLEN_7BIT 
// 电话号码的长度 
#define PHONENO_LENGTH						24 
// Code Page 
#define CHARCODEPAGE_GB						936 
#define CHARCODEPAGE_BIG5					950 
 
// 当从手机中取到短信中心号码时调用这个回调函数来保存 
typedef void (*FUNC_SaveSMSCFromGSM) ( LPCTSTR lpszSMSC ); 
// 当有新的来电拨打手机模块号码时,调用该函数来处理 
typedef void (*FUNC_IncomingFromGSM) ( LPCTSTR lpszCallerID ); 
// 两次选择电话本的时间间隔 (秒),否则选择将失败 
#define SELECT_PHONEBOOK_INTVERVAL			2 
// 得到用户信息最大字符数, 这里,将一个英文字母、一个汉字和一个数据字节都视为一个字符 
#define GET_UD_MAX_CHAR_NUM(dcs)	( ((dcs) == GSM_7BIT)?UDMAXLEN_7BIT:(((dcs) == GSM_8BIT)?UDMAXLEN_8BIT:UDMAXLEN_UCS2) ) 
// 群组名中不能包含的字符 
#define GROUP_NAME_ILLEGAL					_T(",;:|\"\'") 
 
// 短消息参数结构,编码/解码共用 
// 其中,字符串以'\0'结尾 
typedef struct _sm_param 
{ 
	char SCA[PHONENO_LENGTH];				// 短消息服务中心号码(SMSC地址) 
	char TPA[PHONENO_LENGTH];				// 目标号码或回复号码(TP-DA或TP-RA) 
	char TP_PID;							// 用户信息协议标识(TP-PID) 
	char TP_DCS;							// 用户信息编码方式(TP-DCS) 
	char TP_SCTS[16];						// 服务时间戳字符串(TP_SCTS), 接收时用到 
	short index;							// 短消息序号,在读取时用到 
	char TP_UD_Byte[ONE_SMS_TEXT_LENGTH+1];	// 单字符的短信内容(编码前或解码后的TP-UD) 
	BOOL bInternationalMobileNO;			// 用国际格式号码 
} SM_PARAM; 
// 最大允许使用的串口号 
#define MAX_COM_NO							16 
 
// 
// 电话本信息 
// 
typedef struct _phone_book 
{ 
	int nIndex; 
	TCHAR szName[16]; 
	TCHAR szPhoneNO[PHONENO_LENGTH]; 
	TCHAR szPhoneBookName[8]; 
} t_PhoneBook; 
typedef CArray t_Ary_PhoneBook; 
 
class DLL_INTERNAL CHwMobile : public CHwCOM 
{ 
public: 
	FUNC_SaveSMSCFromGSM m_Proc_SaveSMSCFromGSM; 
	FUNC_IncomingFromGSM m_Proc_IncomingFromGSM; 
	BOOL InsertPhoneBook ( LPCTSTR lpszName, LPCTSTR lpszPhoneNO, LPCTSTR lpszPhoneBookName ); 
	char* Convert_SCTS2Standard ( char *szSCTS, char *szStandardTime, int nSize ); 
	char* Convert_Standard2SCTS ( char *szStandardTime, char *szSCTS, int nSize ); 
	BOOL Init (); 
	CHwMobile(); 
	virtual ~CHwMobile(); 
	inline void Enable_SoundPrompt ( BOOL bSoundPrompt=TRUE ) 
	{ 
		m_bSoundPrompt = bSoundPrompt; 
	} 
	BOOL DemandMobileInfo ( char *szCmd, OUT CString &csAns ); 
	BOOL GetSMSCNO (); 
	inline void SetModulePara ( int nComNO, int nBaudRate=0 ) 
	{ 
		if ( nComNO > 0 ) 
			m_nComNO = nComNO; 
		if ( nBaudRate > 0 ) 
			m_nBaudRate = nBaudRate; 
	} 
	inline CString RetrievesSMSC () 
	{ 
		return m_csSMSC; 
	} 
	BOOL gsmReadPhoneBook ( LPCTSTR lpszPhoneBookName, t_Ary_PhoneBook *pAry_PhoneBook); 
	BOOL gsmDeleteOneRecordFromPhoneBook ( int nIndex ); 
 
protected: 
	BOOL m_bInitMobileLastRes; 
	void ShowGSMModuleInfo(); 
	void RestoreRecvSMSNotifyMode(); 
	BOOL QueryDeviceExist (); 
	CUIntArray m_UIntAry_NeedDelSMS; 
	virtual BOOL HandleRecvSMS ( SM_PARAM *pSMRecv ); 
	virtual int Write ( char *szData ); 
	virtual int Read ( char *data, int size ); 
	BOOL gsmReadMessageContent ( const char *szSMSFlag, char *szSupplement=NULL, const int nSupplementSize=0 ); 
	BOOL gsmDeleteSMS ( int nIndex ); 
	BOOL SendOneSMSPkt ( SM_PARAM *pSMSend ); 
	virtual int HandleCOMRW(int nRet); 
	BOOL gsmSelectPhoneBook ( LPCTSTR lpszPhoneBookName ); 
	void SMSBeep ( BOOL bRecv ); 
	BOOL m_nInitOK; 
 
	// 接口信息 
	int m_nComNO; 
	int m_nBaudRate; 
 
	// 短信中心号码 
	CString m_csSMSC; 
	HANDLE m_hEvt_IsBusy; 
 
private: 
	CString m_csCurPhoneBookName; 
	int HandleNewIncoming ( char *data, int size ); 
	BOOL QueryExistByRWCmd (); 
	BOOL m_bSoundPrompt; 
 
	BOOL gmsGetPhoneBookInfo ( 
		int &nStoreStartPos, 
		int &nStoreEndPos, 
		int &nMaxPhoneNOSize,  
		int &nMaxInfoSize, 
		int &nMaxRecSize 
	); 
	BOOL gsmGetAllPhoneBookRec ( int nMaxRecSize, int nMaxRecNum, LPCTSTR lpszPhoneBookName, OUT t_Ary_PhoneBook *pAry_PhoneBook ); 
	BOOL gsmDecodeOnePhoneBook ( char *szPhoneBookRec, t_PhoneBook &PhoneBook ); 
	int gsmDecodePhoneBook ( 
		LPCTSTR lpszPhoneBookName, 
		char *szPhoneBookRec, 
		OUT t_Ary_PhoneBook *pAry_PhoneBook, 
		OUT char *szRemainData,					// 处理后剩下的数据放到这里 
		const int nRemainSize 
	); 
	int gsmPhoneBookEncode ( 
		OUT char *szPhoneBookRec, 
		int nPhoneBookRecSize, 
		IN LPCTSTR lpszType, 
		IN t_PhoneBook &PhoneBook 
	); 
	int gsmParseOneMessage ( const char *szSMSFlag, char *szRecvedData, int nRecvedDataLen, SM_PARAM *pSMRecv ); 
	int gsmParseMessage ( IN const char *szSMSFlag, IN char *szRecvedData, int nRecvedDataLen ); 
	int gsmSerializeNumbers(const char* pSrc, char* szDst, int nSrcLength, int nDstSize); 
	int gsmDecodePdu ( char* pSrc, int &nHandleBytes, SM_PARAM* pDst); 
	BOOL ReadResponse ( char* szResponse, BOOL bQuick=TRUE, char *szAns=NULL, int nSize=0 ); 
	BOOL gsmInit(); 
	int gsmString2Bytes(const char* pSrc, BYTE* szDst, int nSrcLength, int nDstSize); 
	int gsmEncode8bit(const char* pSrc, BYTE* szDst, int nSrcLength, int nDstSize); 
	int gsmDecode8bit(const BYTE* pSrc, char* szDst, int nSrcLength, int nDstSize); 
	int gsmEncodeUcs2(const char *pSrcByte, BYTE *szDst, int nSrcLength, int nDstSize, WCHAR *wzSrc=NULL ); 
	int gsmDecodeUcs2( 
		const BYTE* pSrc, 
		char* szDst, 
		int nSrcLength, 
		int nDstSize, 
		WCHAR* wzSMSContent_Wide=NULL, 
		int nWideSize=0 
	); 
	int gsmEncode7bit(const char* pSrc, BYTE* szDst, int nSrcLength, int nDstSize); 
	int gsmDecode7bit(const BYTE* pSrc, char* szDst, int nSrcLength, int nDstSize); 
	int gsmInvertNumbers(const char* pSrc, char* szDst, int nSrcLength, int nDstSize); 
	int gsmBytes2String(const BYTE *pSrc, char *szDst, int nSrcLength, int nDstSize); 
	int gsmEncodePdu(const SM_PARAM *pSrc, char *szDst, int nDstSize ); 
	int gsmSendMessage(SM_PARAM* pSrc); 
}; 
 
DLL_INTERNAL int GetStringEncodeType ( char *pStr, int nSize); 
DLL_INTERNAL int ParseSMSContentAttr ( 
		IN char* szSMSContent, 
		OUT int *pnTotalCharNum=NULL, 
		OUT int *pnFreeCharNum=NULL, 
		OUT int *pTP_DCS=NULL 
	); 
DLL_INTERNAL CStringArray* PartMessengerOrSMSText( 
		IN LPCTSTR lpszText, 
		IN int nSegmentCount=0, 
		IN BOOL bTextIsSMS=TRUE, 
		OUT int *pnFreeCharNum=NULL, 
		OUT CUIntArray *pUIntAry_DCS=NULL 
	); 
 
#endif 
#endif // !defined(AFX_HWMOBILE_H__799F4BF1_E829_4BFB_A78C_EB4642F19C1C__INCLUDED_)