www.pudn.com > SendMsgOCX.rar > WMsgPacket.h


// WMsgFrame.h: interface for the CWMsgPacket class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#if !defined(AFX_WMSGFRAME_H__A49013A0_E397_45F7_BAC4_2D1B7FE06678__INCLUDED_) 
#define AFX_WMSGFRAME_H__A49013A0_E397_45F7_BAC4_2D1B7FE06678__INCLUDED_ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
 
const int MAX_PHONE_NUMBER_LEN = 15;			// may has +86 
const int MAX_SHORT_MSG_LEN = 160;				// 160 ASCII 
 
const int MAX_ASCII_MSG_LEN_PER_PACKET = MAX_SHORT_MSG_LEN - 7;  // cf protocol  
const int MAX_ASCII_MSG_LEN_OF_LASTPACKET = MAX_ASCII_MSG_LEN_PER_PACKET - 1; // last packet will use one more byte than other packets 
 
const int MAX_BIN_MSG_BODY_LEN_PER_PACKET = MAX_ASCII_MSG_LEN_PER_PACKET / 2; 
const int MAX_BIN_MSG_BODY_LEN_OF_LASTPACKET = MAX_ASCII_MSG_LEN_OF_LASTPACKET / 2; 
 
const BYTE MIN_FRAME_NO = 0x20; 
const BYTE MAX_FRAME_NO = 0x7B; 
const BYTE MIN_PACKET_NO = MIN_FRAME_NO; 
const BYTE MAX_PACKET_NO = MAX_FRAME_NO; 
const BYTE MAX_PACKETS_PER_FRAME = MAX_PACKET_NO - MIN_PACKET_NO + 1; 
const BYTE MAX_FRAMES_PER_PHONE_NO = MAX_FRAME_NO - MIN_FRAME_NO + 1; 
 
const int MAX_ASCII_MSG_LEN_PER_FRAME = MAX_ASCII_MSG_LEN_PER_PACKET * (MAX_PACKETS_PER_FRAME - 1) +  
										MAX_ASCII_MSG_LEN_OF_LASTPACKET;  
 
const int MAX_BIN_MSG_LEN_PER_FRAME = MAX_BIN_MSG_BODY_LEN_PER_PACKET * (MAX_PACKETS_PER_FRAME - 1) +  
									  MAX_BIN_MSG_BODY_LEN_OF_LASTPACKET;		 
 
const BYTE FRAME_BEGIN_ID = 0x7D; 
const BYTE FRAME_END_ID = 0X7E; 
const BYTE LAST_PACKET_ID = 0X7C; 
const BYTE PHONE_NUMBER_BEGIN = '\"'; 
const BYTE PHONE_NUMBER_END = PHONE_NUMBER_BEGIN;  
 
class CWMsgPacket   
{ 
public: 
	 
	// 参见:协议修改建议.txt 
 
	enum MessageType 
	{ 
	  // 以下命令类型由发送时指定 
	  DASHI_MSG = '^',					// 0x5E :  达示数据命令;正文为达示数据; 
	  DIAODU_MSG_NEED_ANSWER =':',		// 0X3A:   调度命令,此条命令要求由司机确认;正文; 
	  DIAODU_MSG_NEEDNOT_ANSWER = ';',	// 0X3B:   调度命令,此条命令不要求由司机确认;正文; 
 
	  // 以下命令类型由发送程序处理,wParam调度信息ID, lParam为指向对应电话号码的指针 
	  ANSWER_FRAME_MSG = '\\',			// 0X5C:   此调度信息已经司机确认、由车载机回复。此时包号、帧号均为0X20,正文为四个字节的调度信息编号(见调度信息组织); 
 
	  // 以下命令类型全部由收发程序处理,与主界面无关 
	  SEND_PACKET_AGAIN_MSG = '?',		//  0X3F:  车载机包数据接收错误,请求重发。此时帧号、包号为所接收错误帧的包号、帧号;正文无 
	  SEND_FRAME_AGAIN_MSG = '['		//  0X5B:  车载机帧数据接收错误,请求重发。此时帧号为出错的帧,包号为0X20,正文无; 
 
	}; 
 
	CWMsgPacket(); 
	~CWMsgPacket(); 
 
 
	// for parser 
	BOOL SetPhoneNumberBegin(BYTE toSet); 
	BOOL SetPhoneNumberDigit(BYTE toSet); 
	BOOL SetPhoneNumberEnd(BYTE toSet); 
 
	BOOL SetFrameBegin(BYTE toSet); 
	BOOL SetFrameNo(BYTE toSet); 
	BOOL SetPacketNo(BYTE toSet);			// packet no or last packet flag 
	BOOL SetLastPacketFlag(BYTE toSet); 
	BOOL SetMessageType(BYTE toSet); 
	BOOL AppendMsgTextOrCheckSum(BYTE toSet); 
 
	BOOL SetFrameEnd(BYTE toSet); 
	BOOL CheckCheckSum(); 
	void Reset(); 
 
	// for sender 
	void GenerateMsgPacket(LPCSTR lpszPhoneNumber, BYTE msgType, BYTE frameNo, BYTE packetNo, const BYTE* lpBinData, DWORD dwDataSize, BOOL bLastPacket); 
	const BYTE* GetDataAndSize(int& dataSize) const;		// data is in text format 
 
	static BYTE PacketIndex2PacketNo(int idx); 
	static int  PacketNo2PacketIndex(BYTE byNo); 
	 
	static BOOL IsValidPacketNo(BYTE byNo); 
	static BOOL IsValidFrameNo(BYTE byNo); 
 
	static BOOL IsValidMsgType(BYTE byType); 
	static BOOL IsValidTextOrCheckSumByte(BYTE byData); 
	static BOOL IsValidPhoneNumberDigit(BYTE byDigit); 
 
	//  
	LPCSTR GetPhoneNumber() const; 
	BYTE GetMessageType() const; 
	int  GetMsgBinaryData(LPBYTE lpDest) const;		// return size of binary data 
	BYTE GetFrameNo() const; 
	BYTE GetPacketNo() const; 
	BOOL IsLastPacket() const; 
 
private: 
	 
	void AppendPhoneNumberDigit(BYTE byDigit); 
	void AppendPacketByte(BYTE byData); 
	void AppendCheckSum();				// for sender 
	void ConvertAndAppend(const BYTE* lpBinData, int binDataSize); 
 
	BYTE CalculateSum(int nBytes) const; 
 
	char  m_szPhoneNumber[MAX_PHONE_NUMBER_LEN+1];	// to where 
	int   m_numberDigitReceived; 
 
	// ready for sent or received 
	BYTE m_msgFrameData[MAX_SHORT_MSG_LEN]; 
 
	// for sender 
	int  m_dataReceived; 
	BOOL m_bLastPacket; 
}; 
 
 
#endif // !defined(AFX_WMSGFRAME_H__A49013A0_E397_45F7_BAC4_2D1B7FE06678__INCLUDED_)