// Cmpp.h: interface for the CCmpp class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_CMPP_H__7DF8EA3F_89A5_4FC9_8D87_131385D01734__INCLUDED_) #define AFX_CMPP_H__7DF8EA3F_89A5_4FC9_8D87_131385D01734__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 //#define CMPP_3_0 //cmpp属于3.0 /* #include "Winsock2.h" #pragma comment(lib, "Ws2_32.lib") */ #pragma pack( push ) #pragma pack( 1 ) typedef struct _Data_Recv { ULONG lDataLen; //应收字节数 ULONG lRecvLen; //已收字节数 BOOL bRecvFrame; //是否正在收Frame; BYTE * pRecvFrame; //收到的Frame }Data_Recv; typedef struct _Cmpp_Head { ULONG Total_Length; ULONG Command_Id; ULONG Sequence_Id; }Cmpp_Head; typedef struct _Cmpp_Connect { char Source_Addr[6]; UCHAR AuthenticatorSource[16]; UCHAR Version; ULONG Timestamp; }Cmpp_Connect; typedef struct _Cmpp_Connect_Resp { #ifdef CMPP_3_0 ULONG Status; #else UCHAR Status; #endif UCHAR AuthenticatorSource[16]; UCHAR Version; }Cmpp_Connect_Resp; typedef struct _Cmpp_Submit { LONGLONG Msg_ID; UCHAR Pk_total; UCHAR Pk_number; UCHAR Registered_Delivery; UCHAR Msg_level; UCHAR Service_Id[10]; UCHAR Fee_UserType; #ifdef CMPP_3_0 UCHAR Fee_terminal_Id[32]; UCHAR Fee_terminal_Type; #else UCHAR Fee_terminal_Id[21]; #endif UCHAR TP_pId; UCHAR TP_udhi; UCHAR Msg_Fmt; UCHAR Msg_src[6]; UCHAR FeeType[2]; UCHAR FeeCode[6]; UCHAR ValId_Time[17]; UCHAR At_Time[17]; UCHAR Src_Id[21]; UCHAR DestUsr_tl; #ifdef CMPP_3_0 UCHAR Dest_terminal_Id[32]; UCHAR Dest_terminal_Type; #else UCHAR Dest_terminal_Id[21]; #endif UCHAR Msg_Length; }Cmpp_Submit; typedef struct _Cmpp_Submit_Resp { LONGLONG Msg_ID; #ifdef CMPP_3_0 ULONG Result; #else UCHAR Result; #endif }Cmpp_Submit_Resp; typedef struct _Send_List { ULONG lSendID; //数据库中记录的SendID ULONG lSeq; //发送cmpp里的序号 ULONG lCmppSeq; //使用cmpp转接的源序号 ULONG lSendTime; //最后一次发送时间 ULONG lReSendCount; //重复发送了多少次 UCHAR Msg[512]; //信息内容 Cmpp_Submit Submit; }Send_List; //发送返回状态 typedef struct _Send_Resp { ULONG lSendID; //数据库中记录的SendID ULONG lResult; //返回状态 ULONG lReSendCount; //重复发送了多少次 LONGLONG lMsgID; //发送成功时有此返回 }Send_Resp; typedef struct _Cmpp_Deliver { LONGLONG Msg_ID; UCHAR Dest_Id[21]; UCHAR Service_Id[10]; UCHAR TP_pid; UCHAR TP_udhi; UCHAR Msg_Fmt; #ifdef CMPP_3_0 UCHAR Src_terminal_Id[32]; UCHAR Src_terminal_Type; #else UCHAR Src_terminal_Id[21]; #endif UCHAR Registered_Delivery; UCHAR Msg_Length; }Cmpp_Deliver; typedef struct _Cmpp_Status { LONGLONG Msg_ID; UCHAR Stat[7]; UCHAR Submit_time[10]; UCHAR Done_time[10]; #ifdef CMPP_3_0 UCHAR Dest_terminal_Id[32]; #else UCHAR Dest_terminal_Id[21]; #endif ULONG SMSC_sequence; }Cmpp_Status; typedef struct _Cmpp_Deliver_Resp { LONGLONG Msg_ID; #ifdef CMPP_3_0 ULONG Result; #else UCHAR Result; #endif }Cmpp_Deliver_Resp; typedef struct _Deliver_List { ULONG lSendID; Cmpp_Deliver deliver; Cmpp_Status status; UCHAR szMsg[512]; }Deliver_List; #define MAX_CMPPEXCHANGE 50 typedef struct _CmppExchange { char szNum[32]; //端口号 char szNum2[32]; //端口号 SOCKET sock; //Socket接口 long lIndex; //序号 ULONG lID; //回复序号 ULONG lID_Begin; //ID开始序号,用于收到resp时判断是谁的回复 long lSendCount; //发送计数 long lSendRetCount; //发送返回计数 ULONG lExID; //用于区分状态报告的ID char szIP[32]; ULONG lNodeID; ULONG Sequence_Id; }CmppExchange; typedef struct _Cmpp_Active_Test_Resp { #ifdef CMPP_3_0 ULONG Reserved; #else UCHAR Reserved; #endif }Cmpp_Active_Test_Resp; typedef struct _CmppExchangeResp { long lType; //0 Submit rest , 1 deliver long lSendID; //发送ID , lType==0时有效 char szNum[32]; //目标号码, lType==1时有效 long lExNum; //adc特殊转发时用到 long lLen; ULONG lCmd; ULONG lSeq; BYTE Data[512]; }CmppExchangeResp; #pragma pack( pop ) typedef void (*RECVPROC)(Data_Recv * pDataRecv); #define CMPP_PORT 7890 //cmpp端口号 #define CMPP_EXCHANGE_PORT 8910 #define CMPP_EXCHANGE_PORT2 6666 //adc下,采用此端口 #define CMPP_CONNECT 0x00000001 //请求连接 #define CMPP_CONNECT_RESP 0x80000001 //请求连接应答 #define CMPP_TERMINATE 0x00000002 //终止连接 #define CMPP_TERMINATE_RESP 0x80000002 //终止连接应答 #define CMPP_SUBMIT 0x00000004 //提交短信 #define CMPP_SUBMIT_RESP 0x80000004 //提交短信应答 #define CMPP_DELIVER 0x00000005 //短信下发 #define CMPP_DELIVER_RESP 0x80000005 //下发短信应答 #define CMPP_QUERY 0x00000006 //发送短信状态查询 #define CMPP_QUERY_RESP 0x80000006 //发送短信状态查询应答 #define CMPP_CANCEL 0x00000007 //删除短信 #define CMPP_CANCEL_RESP 0x80000007 //删除短信应答 #define CMPP_ACTIVE_TEST 0x00000008 //激活测试 #define CMPP_ACTIVE_TEST_RESP 0x80000008 //激活测试应答 #define CMPP_FWD 0x00000009 //消息前转 #define CMPP_FWD_RESP 0x80000009 //消息前转应答 #define CMPP_MT_ROUTE 0x00000010 //MT路由请求 #define CMPP_MT_ROUTE_RESP 0x80000010 //MT路由请求应答 #define CMPP_MO_ROUTE 0x00000011 //MO路由请求 #define CMPP_MO_ROUTE_RESP 0x80000011 //MO路由请求应答 #define CMPP_GET_ROUTE 0x00000012 //获取路由请求 #define CMPP_GET_ROUTE_RESP 0x80000012 //获取路由请求应答 #define CMPP_MT_ROUTE_UPDATE 0x00000013 //MT路由更新 #define CMPP_MT_ROUTE_UPDATE_RESP 0x80000013 //MT路由更新应答 #define CMPP_MO_ROUTE_UPDATE 0x00000014 //MO路由更新 #define CMPP_MO_ROUTE_UPDATE_RESP 0x80000014 //MO路由更新应答 #define CMPP_PUSH_MT_ROUTE_UPDATE 0x00000015 //MT路由更新 #define CMPP_PUSH_MT_ROUTE_UPDATE_RESP 0x80000015 //MT路由更新应答 #define CMPP_PUSH_MO_ROUTE_UPDATE 0x00000016 //MO路由更新 #define CMPP_PUSH_MO_ROUTE_UPDATE_RESP 0x80000016 //MO路由更新应答 #ifdef CMPP_3_0 #define SMS_MAX_LIST 512 //最大的队列数 #else #define SMS_MAX_LIST 512 //最大的队列数 #endif #define SMS_MAX_RESP 2048 //最大的队列数 #define SMS_MAX_DELIVER 2048 //最大的队列数 #define SMS_MAX_STATUS 2048 //最大的队列数 #define SMS_MAX_CMPPEXCHANGERESP 2048 //最大的队列数 #define CMPP_ACTIVE_TESTTIME 28000 //多长时间进行链路检测 #define CMPP_ACTIVE_TIMEOUT 25000 //链路检测超时时间 #define CMPP_ACTIVE_COUNTOUT 3 //链路检测超过次数 #define CMPP_SENDSMS_TIMEOUT 30000 //发送短信超时时间 #define CMPP_SENDSMS_RECOUNT 1 //发送短信重试次数 //typedef CList CSendList; typedef CTypedPtrList CSendList; //typedef CTypedPtrList CSendResp; //typedef CTypedPtrList CDeliverList; class CCmpp { public: SOCKET m_hSocket; char m_szIP[64]; long m_lPort; BOOL m_bQuitThread; DWORD m_dwEndSendTime; DWORD m_dwEndRecvTime; DWORD m_dwTestCount; BOOL m_bRecvFrame; BOOL m_bConnect; long m_bLoginCmpp; //CSendList m_SendList; //CSendResp m_SendResp; //CDeliverList m_DeliverList; ULONG m_lSendID; Send_List * m_pSendList; Send_Resp * m_pRespList; Deliver_List* m_pDeliverList; Deliver_List* m_pStatusList; CmppExchangeResp * m_pCmppExchangeResp; CmppExchange * m_pCmppExchange; long m_lCmppExchange; long m_lSendList; long m_lRespList; long m_lDeliverList; long m_lStatusList; long m_lCmppExchangeRespList; char m_szCmppIP[32]; char m_szCmppUser[32]; char m_szCmppPasswd[32]; char m_szCmppCorpID[32]; BOOL m_bInitCmpp; CRITICAL_SECTION m_CriSendSms; CRITICAL_SECTION m_CriRespList; CRITICAL_SECTION m_CriDeliverList; CRITICAL_SECTION m_CriStatusList; CRITICAL_SECTION m_CriCmppExchangeResp; CRITICAL_SECTION m_CriSendFrame; BOOL m_bAdc; ULONG m_lID; ULONG m_lID_Begin; RECVPROC m_pRecvProc; //用于控制发送速度 DWORD m_dwEndSocketSendTime; //最后短信发出间隔 long m_lSendInterval; //发送间隔时间 long m_lSendIntervalCount; //发送间隔数量 long m_lSendIntervalIndex; //发送间隔统计 HANDLE m_hThread; HANDLE m_hThread_Send; CRITICAL_SECTION m_CriErrMsg; CString m_strErrMsg; public: BOOL isConnectGateWay(); void SetErrMsg(CString str); CString GetErrMsg(); long GetReportSms(); long GetWFSms(); void SetSendSpeed(long lSpeed); void SetCmppExchangeNum(CmppExchange * pCmppExchange , long lCmppExchange); BOOL CmppExchangeResp_Add(CmppExchangeResp resp); BOOL GetCmppExchangeResp(CmppExchangeResp &resp); long Cmpp_GetReport(TCHAR * No ,TCHAR * Stat , TCHAR * Done_time,TCHAR * MsgID ); long Cmpp_Get(TCHAR *SendNo,TCHAR * RecvNo, BYTE *Msg, TCHAR *Msg_Fmt, TCHAR *Msg_Length,long & lLongMsgRand,long & lLongMsgAll ,long & lLongMsgIndex); BOOL Status_Add(Deliver_List Deliver); BOOL GetStatus(Deliver_List &deliver); BOOL Sms_Get(Send_List * & pSms); BOOL Sms_Add(Send_List sms); int CharHex(char ch); void AsciiToHex(const char *pszOrgRandom , TCHAR *pszDesRandom , long lLen); void ExchangeUniCode( char * pData ); void HexToAscii(const char *pszOrgRandom , char *pszDesRandom ); long UCS2ToAscii( const WCHAR * pUCS2 , char * pAscii); long AsciiToUCS2(const char * pAscii , WCHAR * pUCS2); BOOL isChinese(const TCHAR *pSrc, long lSrcLen); unsigned char GetMobilePhoneTON(const char *pSrc, char *pOrg); long Cmpp_SendSms(const char * SendNo , const char * RecvNo,long Msg_Fmt,long udhi,long Msg_Length,BOOL bHandFree,const BYTE * Msg ,const char * Service_Id,long Fee_UserType,const char * FeeType, const char * FeeCode ,long Registered_Delivery,const char *ValId_Time,const char *At_Time,long lSendID,char * MsgID, BOOL bNo86); BOOL Deliver_Add(Deliver_List Deliver); BOOL SendResp_Add(Send_Resp resp); void UCS2ToAscii2( char * pUCS2 , char * pAscii , long lSrcLen ); BOOL Cmpp_Exit(); BOOL GetDeliver(Deliver_List &deliver); long Process_Deliver(Cmpp_Head head,BYTE *pData, long lLen); long Process_Active(Cmpp_Head head,BYTE *pData, long lLen); BOOL GetSendResp( Send_Resp & resp ); long Process_Submit(Cmpp_Head head,BYTE *pData, long lLen); BOOL Socket_SendSms(Send_List * pSend ); long Back_Send(); BOOL InitCmpp2(); BOOL SendSms(Send_List sms ); long Process_Connect(Cmpp_Head head, BYTE * pData , long lLen ); static long SendFrame(SOCKET sock,ULONG &lID,DWORD &dwEndSendTime,ULONG lCommandID,UCHAR * pData , long lDataLen,ULONG & lSeq ); long Cmpp_Init( const char * pIP,long lPort,const char * pUser,const char * pPasswd,const char * pCorpID ); BOOL RecvFrame(Data_Recv &Drecv); static BOOL ReadFrame(SOCKET s, Data_Recv *pRecv); void SetRecvProc(RECVPROC proc); static DWORD WINAPI SocketRecv( LPVOID lParam ); static DWORD WINAPI SocketSend( LPVOID lParam ); static long Send(SOCKET sock,BYTE *pData, long lLen); void Close(); static BOOL isSocketClose(SOCKET s); void Stop(); BOOL isConnect(); BOOL Connect2(); BOOL Connect( const char * pAddr , long lPort , BOOL bReConnect = true ); CCmpp(); virtual ~CCmpp(); }; #endif // !defined(AFX_CMPP_H__7DF8EA3F_89A5_4FC9_8D87_131385D01734__INCLUDED_)