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

📄 hwmobile.h

📁 本源代码完全实现手机短信收发和操作电话本的功能
💻 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 <Afxtempl.h>

// 手机工作线程休息时间(毫秒)
#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_PhoneBook, t_PhoneBook&> 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_)

⌨️ 快捷键说明

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