// Cmpp3.h: interface for the CCmpp3 class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_CMPP3_H__7DF8EA3F_89A5_4FC9_8D87_131385D01734__INCLUDED_) #define AFX_CMPP3_H__7DF8EA3F_89A5_4FC9_8D87_131385D01734__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define CMPP3_3_0 //cmpp属于3.0 /* #include "Winsock2.h" #pragma comment(lib, "Ws2_32.lib") */ #pragma pack( push ) #pragma pack( 1 ) typedef struct _Cmpp3_Data_Recv { ULONG lDataLen; //应收字节数 ULONG lRecvLen; //已收字节数 BOOL bRecvFrame; //是否正在收Frame; BYTE * pRecvFrame; //收到的Frame }Cmpp3_Data_Recv; typedef struct _Cmpp3_Head { ULONG Total_Length; ULONG Command_Id; ULONG Sequence_Id; }Cmpp3_Head; typedef struct _Cmpp3_Connect { char Source_Addr[6]; UCHAR AuthenticatorSource[16]; UCHAR Version; ULONG Timestamp; }Cmpp3_Connect; typedef struct _Cmpp3_Connect_Resp { #ifdef CMPP3_3_0 ULONG Status; #else UCHAR Status; #endif UCHAR AuthenticatorSource[16]; UCHAR Version; }Cmpp3_Connect_Resp; typedef struct _Cmpp3_Submit { LONGLONG Msg_ID; UCHAR Pk_total; UCHAR Pk_number; UCHAR Registered_Delivery; UCHAR Msg_level; UCHAR Service_Id[10]; UCHAR Fee_UserType; #ifdef CMPP3_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 CMPP3_3_0 UCHAR Dest_terminal_Id[32]; UCHAR Dest_terminal_Type; #else UCHAR Dest_terminal_Id[21]; #endif UCHAR Msg_Length; }Cmpp3_Submit; typedef struct _Cmpp3_Submit_Resp { LONGLONG Msg_ID; #ifdef CMPP3_3_0 ULONG Result; #else UCHAR Result; #endif }Cmpp3_Submit_Resp; typedef struct _Cmpp3_Send_List { ULONG lSendID; //数据库中记录的SendID ULONG lSeq; //发送cmpp里的序号 ULONG lCmpp3Seq; //使用cmpp转接的源序号 ULONG lSendTime; //最后一次发送时间 ULONG lReSendCount; //重复发送了多少次 UCHAR Msg[512]; //信息内容 Cmpp3_Submit Submit; }Cmpp3_Send_List; //发送返回状态 typedef struct _Cmpp3_Send_Resp { ULONG lSendID; //数据库中记录的SendID ULONG lResult; //返回状态 ULONG lReSendCount; //重复发送了多少次 LONGLONG lMsgID; //发送成功时有此返回 }Cmpp3_Send_Resp; typedef struct _Cmpp3_Deliver { LONGLONG Msg_ID; UCHAR Dest_Id[21]; UCHAR Service_Id[10]; UCHAR TP_pid; UCHAR TP_udhi; UCHAR Msg_Fmt; #ifdef CMPP3_3_0 UCHAR Src_terminal_Id[32]; UCHAR Src_terminal_Type; #else UCHAR Src_terminal_Id[21]; #endif UCHAR Registered_Delivery; UCHAR Msg_Length; }Cmpp3_Deliver; typedef struct _Cmpp3_Status { LONGLONG Msg_ID; UCHAR Stat[7]; UCHAR Submit_time[10]; UCHAR Done_time[10]; #ifdef CMPP3_3_0 UCHAR Dest_terminal_Id[32]; #else UCHAR Dest_terminal_Id[21]; #endif ULONG SMSC_sequence; }Cmpp3_Status; typedef struct _Cmpp3_Deliver_Resp { LONGLONG Msg_ID; #ifdef CMPP3_3_0 ULONG Result; #else UCHAR Result; #endif }Cmpp3_Deliver_Resp; typedef struct _Cmpp3_Deliver_List { ULONG lSendID; Cmpp3_Deliver deliver; Cmpp3_Status status; UCHAR szMsg[512]; }Cmpp3_Deliver_List; #define MAX_CMPP3EXCHANGE 50 typedef struct _Cmpp3Exchange { char szNum[32]; //端口号 SOCKET sock; //Socket接口 long lIndex; //序号 ULONG lID; //回复序号 long lSendCount; //发送计数 long lSendRetCount; //发送返回计数 ULONG lExID; //用于区分状态报告的ID char szIP[32]; ULONG lNodeID; ULONG Sequence_Id; }Cmpp3Exchange; typedef struct _Cmpp3ExchangeResp { 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]; }Cmpp3ExchangeResp; #pragma pack( pop ) typedef void (*RECVPROC_Cmpp3)(Cmpp3_Data_Recv * pDataRecv); #define CMPP3_PORT 7890 //cmpp端口号 #define CMPP3_EXCHANGE_PORT 8910 #define CMPP3_EXCHANGE_PORT2 6666 //adc下,采用此端口 #define CMPP3_CONNECT 0x00000001 //请求连接 #define CMPP3_CONNECT_RESP 0x80000001 //请求连接应答 #define CMPP3_TERMINATE 0x00000002 //终止连接 #define CMPP3_TERMINATE_RESP 0x80000002 //终止连接应答 #define CMPP3_SUBMIT 0x00000004 //提交短信 #define CMPP3_SUBMIT_RESP 0x80000004 //提交短信应答 #define CMPP3_DELIVER 0x00000005 //短信下发 #define CMPP3_DELIVER_RESP 0x80000005 //下发短信应答 #define CMPP3_QUERY 0x00000006 //发送短信状态查询 #define CMPP3_QUERY_RESP 0x80000006 //发送短信状态查询应答 #define CMPP3_CANCEL 0x00000007 //删除短信 #define CMPP3_CANCEL_RESP 0x80000007 //删除短信应答 #define CMPP3_ACTIVE_TEST 0x00000008 //激活测试 #define CMPP3_ACTIVE_TEST_RESP 0x80000008 //激活测试应答 #define CMPP3_FWD 0x00000009 //消息前转 #define CMPP3_FWD_RESP 0x80000009 //消息前转应答 #define CMPP3_MT_ROUTE 0x00000010 //MT路由请求 #define CMPP3_MT_ROUTE_RESP 0x80000010 //MT路由请求应答 #define CMPP3_MO_ROUTE 0x00000011 //MO路由请求 #define CMPP3_MO_ROUTE_RESP 0x80000011 //MO路由请求应答 #define CMPP3_GET_ROUTE 0x00000012 //获取路由请求 #define CMPP3_GET_ROUTE_RESP 0x80000012 //获取路由请求应答 #define CMPP3_MT_ROUTE_UPDATE 0x00000013 //MT路由更新 #define CMPP3_MT_ROUTE_UPDATE_RESP 0x80000013 //MT路由更新应答 #define CMPP3_MO_ROUTE_UPDATE 0x00000014 //MO路由更新 #define CMPP3_MO_ROUTE_UPDATE_RESP 0x80000014 //MO路由更新应答 #define CMPP3_PUSH_MT_ROUTE_UPDATE 0x00000015 //MT路由更新 #define CMPP3_PUSH_MT_ROUTE_UPDATE_RESP 0x80000015 //MT路由更新应答 #define CMPP3_PUSH_MO_ROUTE_UPDATE 0x00000016 //MO路由更新 #define CMPP3_PUSH_MO_ROUTE_UPDATE_RESP 0x80000016 //MO路由更新应答 #ifdef CMPP3_3_0 #define CMPP3_SMS_MAX_LIST 512 //最大的队列数 #else #define CMPP3_SMS_MAX_LIST 512 //最大的队列数 #endif #define CMPP3_SMS_MAX_RESP 2048 //最大的队列数 #define CMPP3_SMS_MAX_DELIVER 2048 //最大的队列数 #define CMPP3_SMS_MAX_STATUS 2048 //最大的队列数 #define CMPP3_SMS_MAX_CMPP3EXCHANGERESP 2048 //最大的队列数 #define CMPP3_ACTIVE_TESTTIME 30000 //多长时间进行链路检测 #define CMPP3_ACTIVE_TIMEOUT 20000 //链路检测超时时间 #define CMPP3_ACTIVE_COUNTOUT 3 //链路检测超过次数 #define CMPP3_SENDSMS_TIMEOUT 20000 //发送短信超时时间 #define CMPP3_SENDSMS_RECOUNT 1 //发送短信重试次数 //typedef CList CSendList; typedef CTypedPtrList CSendList_Cmpp3; //typedef CTypedPtrList CSendResp; //typedef CTypedPtrList CDeliverList; class CCmpp3 { 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_bLoginCmpp3; //CSendList_Cmpp3 m_SendList; //CSendResp m_SendResp; //CDeliverList m_DeliverList; ULONG m_lSendID; Cmpp3_Send_List * m_pSendList; Cmpp3_Send_Resp * m_pRespList; Cmpp3_Deliver_List* m_pDeliverList; Cmpp3_Deliver_List* m_pStatusList; Cmpp3ExchangeResp * m_pCmpp3ExchangeResp; CmppExchange * m_pCmppExchange; long m_lCmppExchange; long m_lSendList; long m_lRespList; long m_lDeliverList; long m_lStatusList; long m_lCmpp3ExchangeRespList; char m_szCmpp3IP[32]; char m_szCmpp3User[32]; char m_szCmpp3Passwd[32]; char m_szCmpp3CorpID[32]; BOOL m_bInitCmpp3; CRITICAL_SECTION m_CriSendSms; CRITICAL_SECTION m_CriRespList; CRITICAL_SECTION m_CriDeliverList; CRITICAL_SECTION m_CriStatusList; CRITICAL_SECTION m_CriCmpp3ExchangeResp; CRITICAL_SECTION m_CriSendFrame; BOOL m_bAdc; ULONG m_lID; ULONG m_lID_Begin; RECVPROC_Cmpp3 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 Sms_Get(Cmpp3_Send_List*& pSms); BOOL Sms_Add(Cmpp3_Send_List sms); BOOL isConnectGateWay(); void SetErrMsg(CString str); CString GetErrMsg(); long GetReportSms(); long GetWFSms(); void SetSendSpeed(long lSpeed); void SetCmpp3ExchangeNum(CmppExchange * pCmppExchange , long lCmppExchange); BOOL Cmpp3ExchangeResp_Add(Cmpp3ExchangeResp resp); BOOL GetCmpp3ExchangeResp(Cmpp3ExchangeResp &resp); long Cmpp3_GetReport(TCHAR * No ,TCHAR * Stat , TCHAR * Done_time,TCHAR * MsgID ); long Cmpp3_Get(TCHAR *SendNo,TCHAR * RecvNo, BYTE *Msg, TCHAR *Msg_Fmt, TCHAR *Msg_Length,long & lLongMsgRand,long & lLongMsgAll ,long & lLongMsgIndex); BOOL Status_Add(Cmpp3_Deliver_List Deliver); BOOL GetStatus(Cmpp3_Deliver_List &deliver); 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 Cmpp3_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(Cmpp3_Deliver_List Deliver); BOOL SendResp_Add(Cmpp3_Send_Resp resp); void UCS2ToAscii2( char * pUCS2 , char * pAscii , long lSrcLen ); BOOL Cmpp3_Exit(); BOOL GetDeliver(Cmpp3_Deliver_List &deliver); long Process_Deliver(Cmpp3_Head head,BYTE *pData, long lLen); long Process_Active(Cmpp3_Head head,BYTE *pData, long lLen); BOOL GetSendResp( Cmpp3_Send_Resp & resp ); long Process_Submit(Cmpp3_Head head,BYTE *pData, long lLen); BOOL Socket_SendSms(Cmpp3_Send_List * pSend ); long Back_Send(); BOOL InitCmpp32(); BOOL SendSms(Cmpp3_Send_List sms ); long Process_Connect(Cmpp3_Head head, BYTE * pData , long lLen ); static long SendFrame(SOCKET sock,ULONG &lID,DWORD &dwEndSendTime,ULONG lCommandID,UCHAR * pData , long lDataLen,ULONG & lSeq ); long Cmpp3_Init( const char * pIP,long lPort,const char * pUser,const char * pPasswd,const char * pCorpID ); BOOL RecvFrame(Cmpp3_Data_Recv &Drecv); static BOOL ReadFrame(SOCKET s, Cmpp3_Data_Recv *pRecv); void SetRecvProc(RECVPROC_Cmpp3 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 ); CCmpp3(); virtual ~CCmpp3(); }; #endif // !defined(AFX_CMPP3_H__7DF8EA3F_89A5_4FC9_8D87_131385D01734__INCLUDED_)