377 lines
12 KiB
C++
377 lines
12 KiB
C++
// 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_)
|