⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 protocol.cpp

📁 电信机房MDF、电源柜监控源码,主要用在通信机房配线设备监控、电源柜监控
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}
//单个低4位十六进制转ASCII *******
//##ModelId=44B6F884016C
UCHAR CProtocol::HexToASCII(UCHAR *buf)
{
	
	UCHAR ucTemp ;

	const UCHAR tab[]="0123456789ABCDEF";	// 0x0-0xf的字符查找表

	ucTemp = tab[*buf & 0x0f];	// 输出低4位

	return ucTemp ;

}
//获的2个字节的LENGTH长度的ASCII码4字节表示表示 ******
//##ModelId=44B6F884016A
CString CProtocol::GetLENGTH(UINT iNum)
{
	int i ;
	UCHAR ucTemp ;
	UCHAR ucSum ;
	CString strTemp ;

	strTemp.Empty() ;
	ucSum = 0 ;

	if( iNum < 4096 )
	{
		for( i=0 ; i < 3 ; i++ )
		{
			ucTemp = iNum & 0X0F ;		//获得各位的十六进制数
			ucSum += ucTemp ;			//计算LCHKSUM

			strTemp.Insert( 0 , HexToASCII(&ucTemp) ) ;

			iNum >>= 4 ;				//右移4位
		}
		//计算LCHKSUM 
		ucSum = ~ucSum  + 1 ;			//取反加一
		ucSum &= 0X0F ;					//取低4位

		strTemp.Insert( 0 , HexToASCII(&ucSum) ) ;

		return strTemp ;
	}
	else
	{
		return "LENGTH 的值需小于4096" ; //错误描述的长度必须大于4个字符
	}

}

//获取协议命令的描述
//##ModelId=44B6F8840167
CString CProtocol::GetCmdNote(UCHAR ucCmd )
{
	CString strNote ;
	switch( ucCmd )
	{
		case 0x00 :
			strNote = "响应包" ;
			break ;
		case 0x44 :
			strNote = "获取监测模块告警" ;
			break ;
		case 0x4d :
			strNote = "获取检测模块时间" ;
			break ;
		case 0x4e :
			strNote = "设定检测模块时间" ;
			break ;
		case 0x4f :
			strNote = "获取通信协议版本号" ;
			break ;
		case 0x50 :
			strNote = "获取设备地址" ;
			break ;
		case 0x51 :
			strNote = "获取设备厂家信息" ;
			break ;
		case 0x55 :
			strNote = "程序测试用码(获取命令格式)" ;
			break ;
		case 0x58 :
			strNote = "系统复位启动" ;
			break ;
		case 0x60 :
			strNote = "初始化检测模块" ;
			break ;
		case 0xe0 :
			strNote = "设备告警上传" ;
			break ;
		default :
			strNote = "未知命令" ;
			break ;
	}
	return strNote ;

}

//##ModelId=44B6F884015C
CString CProtocol::GetCID2Error(UCHAR ucCID2)
{
	CString strError ;

	switch( ucCID2 )
	{
		case 0x01 :
			strError = "VER 出错" ;
			break ;
		case 0x02 :
			strError = "CHKSUM 出错" ;
			break ;
		case 0x03 :
			strError = "LCHKSUM 出错" ;
			break ;
		case 0x04 :
			strError = "CID2 无效" ;
			break ;
		case 0x05 :
			strError = "命令格式出错" ;
			break ;
		case 0x06 :
			strError = "无效数据" ;
			break ;
		default :
			strError = "其它错误" ;
			break ;
	}
	return strError ;
}

//##ModelId=44B6F884015A
/*
int CProtocol::Transact(sCommItem* pItem)
{
	

	return 0 ;

}
*/

//##ModelId=44B6F884014A


// 返回数据信息字节数组
int CProtocol::GetDataInfo(CInfoFrame m_frame, CByteArray & m_btData)
{
	char *cBuf;
	m_btData.RemoveAll();
	cBuf =(char *) m_frame.InPack.INFO;
	for(int i =0; i <  (long)m_frame.InPack.DataLen;i+=2 )
	{
		m_btData.Add(*cBuf++);

	}
	return 0;
}


CString CProtocol::Build( CString strAddr,CString strType, UCHAR ucCmd)
{
	UCHAR* ucpSend ;
	DWORD dwCHKSUM ;
	DWORD len ;
	int nYear ;
	char cTemp[3] ;
	//BYTE btTemp;
	UCHAR cTimeSrc[10] ;
	char cTimeDst[10] ;
	
	CString strSend; 

	CString strCHKSUM ;
	CString strTemp ;
	CString strTime ;
	CString strTip ;
	
	try
	{
		
		BytesToString(&ucCmd,cTemp,1) ;
		

		strSend.Empty();
		strTemp.Empty();

		if( strAddr.GetLength() == 0  )
		{
			return "";
		}

		if( strType.GetLength() == 0 )
		{
			return "" ;
		}

		strSend = char(0X7E) ;
		strSend += PROTOCOL_VER ;
		strSend += strAddr ;
		strSend += strType ;


		if( ucCmd > 0xF0 )
			strSend += "00" ;
		else
		{
			
			String2Hex(strTemp,&ucCmd,1);
			strSend += strTemp;
		}

		switch (ucCmd)
		{
			case 0x4E : //设置监测模块时间
				strTemp = GetLENGTH(14)	;	//生成LENGTH
				nYear = atoi(CTime::GetCurrentTime().Format("%Y")) ;

				cTimeSrc[0] = nYear >> 8 ;
				cTimeSrc[1] = nYear & 0xFF ;
				cTimeSrc[2] = atoi(CTime::GetCurrentTime().Format("%m")) ;
				cTimeSrc[3] = atoi(CTime::GetCurrentTime().Format("%d")) ;
				cTimeSrc[4] = atoi(CTime::GetCurrentTime().Format("%H")) ;
				cTimeSrc[5] = atoi(CTime::GetCurrentTime().Format("%M")) ;
				cTimeSrc[6] = atoi(CTime::GetCurrentTime().Format("%S")) ;
				BytesToString(cTimeSrc,cTimeDst,7) ;
				strTime = (LPSTR)cTimeDst ;
				strSend += strTemp + strTime ;
				break ;
			case 0xF2 ://生成相应报警包
				break ;
			default :
				strTemp = GetLENGTH(0) ;
				strSend += strTemp ;
				break ;

		}

		//if(strTemp.GetLength() > 4) //出错误的LENGTH将大于正常的4字节
			//return -1 ;

		len = strSend.GetLength() - 1 ;	//数据内容长度

		ucpSend = (UCHAR*)strSend.GetBuffer(0) ;
		dwCHKSUM = GetCHKSUM(++ucpSend,len) ;
		strSend += CHKSUMToString(dwCHKSUM) ;
		strSend += char(0X0D) ;

		return strSend;
	}
	catch(_com_error e)
	{
		strTip.Format( "监测模块发生异常:%s",(LPCSTR)e.Description() ) ;
		TRACE0(strTip) ;
		return "";
	}
	return "";
}

CString CProtocol::ToHexString(char * cBuf, int iLen)
{
	CString sResult,strTemp;
	BYTE bt;
	sResult.Empty();
	if (iLen > 0)
	{
		for(int i=0;i<iLen;i++)
		{
			bt = *cBuf++;
			strTemp.Format("%0.2X",bt);
			sResult += strTemp;
			//ToHex(bt);

		}
	}
	return sResult;
}
int CProtocol::FindCmd(UCHAR ucCmd , CString &strName)
{
	int nResult = 0 ;

	switch( ucCmd )
	{
		case 0x00 :
			strName = "响应包" ;
			break ;
		case 0x44 :
			strName = "获取监测模块告警" ;
			break ;
		case 0x4d :
			strName = "获取检测模块时间" ;
			break ;
		case 0x4e :
			strName = "设定检测模块时间" ;
			break ;
		case 0x4f :
			strName = "获取通信协议版本号" ;
			break ;
		case 0x50 :
			strName = "获取设备地址" ;
			break ;
		case 0x51 :
			strName = "获取设备厂家信息" ;
			break ;
		case 0x55 :
			strName = "程序测试用码(获取命令格式)" ;
			break ;
		case 0x58 :
			strName = "系统复位启动" ;
			break ;
		case 0x60 :
			strName = "初始化检测模块" ;
			break ;
		case 0xe0 :
			strName = "设备告警上传" ;
			break ;
		default :
			strName = "未知命令" ;
			nResult = -1 ;
			break ;
	}

	return nResult ;
}

int CProtocol::BytesToString(const UCHAR* pSrc, char* pDst, int nSrcLength)
{
	const char tab[]="0123456789ABCDEF";	// 0x0-0xf的字符查找表
	CString strError ;
	try
	{
		for (int i = 0; i < nSrcLength; i++)
		{
			*pDst++ = tab[*pSrc >> 4];		// 输出高4位
			*pDst++ = tab[*pSrc & 0x0f];	// 输出低4位
			pSrc++;
		}

		// 输出字符串加个结束符
		*pDst = '\0';
	}
	catch(_com_error e)
	{
		strError = "异常:将为十六进制转换字符时内存溢出" ;
		TRACE0(strError) ;
		return -1 ;
	}

	// 返回目标字符串长度
	return (nSrcLength * 2);
}

int CProtocol::StringToBytes(const char* pSrc, UCHAR* pDst, int nSrcLength)
{
	CString strError ;
	//pDst = new UCHAR[nSrcLength/2];
	memset(pDst,0,nSrcLength/2);
	try
	{
		int nChange = 0 ;
		for (int i = 0; i < nSrcLength; i += 2)
		{
			// 输出高4位
			if ((*pSrc >= '0') && (*pSrc <= '9'))
				*pDst = (*pSrc - '0') << 4;
			else if((*pSrc >= 'A') && (*pSrc <= 'F'))
				*pDst = (*pSrc - 'A' + 10) << 4;
			else if((*pSrc >= 'a') && (*pSrc <= 'f'))
				*pDst = (*pSrc - 'a' + 10) << 4;
			else
				*pDst = 0x00 << 4 ;

			pSrc++;
			
			// 输出低4位
			if ((*pSrc>='0') && (*pSrc<='9'))
				*pDst |= *pSrc - '0';
			else if((*pSrc >= 'A') && (*pSrc <= 'F'))
				*pDst |= *pSrc - 'A' + 10 ;
			else if((*pSrc >= 'a') && (*pSrc <= 'z'))
				*pDst |= *pSrc - 'a' + 10 ;
			else
				*pDst &= 0xF0 ;

			pSrc++;
			if( i < nSrcLength - 2 )
			{
				pDst++;
			}
		}

	}
	catch(_com_error e)
	{
		strError = "异常:将字符转换为十六进制时内存溢出" ;
		TRACE0(strError);
		return -1 ;
	}
	 //返回目标数据长度
	return (nSrcLength / 2);
}

int CProtocol::MsgCopy(const char* pSrc, char* pDst,int nSrcLength)
{
	int nResult = 0 ;

	while( nResult < nSrcLength )
	{
		if( *pSrc < 0 )
		{
			*pDst++ = *pSrc++ ;
			nResult++ ;
		}
		*pDst++ = *pSrc++ ;
		nResult++ ;
	}
	return nResult ;
}

int CProtocol::String2Hex(CString& str, BYTE *senddata,int iLen)
{
	CString sChar,sResult,strTemp;
	//strTemp.Format("%s",senddata);
	sChar.Empty();
	sResult.Empty();
	for(int i=0;i< iLen;i++)
	{
		sChar.Format("%.2X",*senddata++);
		sResult += sChar;
	}
	str = sResult;	
	return(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -