FXSend/Cmpp3/Cmpp3.h

377 lines
12 KiB
C++
Raw Permalink 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.

// 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<Send_List , Send_List&> CSendList;
typedef CTypedPtrList<CPtrList, Cmpp3_Send_List*> CSendList_Cmpp3;
//typedef CTypedPtrList<CPtrList, Cmpp3_Send_Resp*> CSendResp;
//typedef CTypedPtrList<CPtrList, Cmpp3_Deliver_List*> 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_)