📄 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 <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 + -