FXSend/Cmpp/Cmpp.h

388 lines
12 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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<Send_List , Send_List&> CSendList;
typedef CTypedPtrList<CPtrList, Send_List*> CSendList;
//typedef CTypedPtrList<CPtrList, Send_Resp*> CSendResp;
//typedef CTypedPtrList<CPtrList, Deliver_List*> 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_)