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

📄 cbcbscunpack.c

📁 CBS(小区广播)程序实现手稿
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "..\Sys\Include.h"
#include "CbcBscPack.h"
#include "pack.h"

#define CHECKLEN
#define CELLID_DISC_LEN        1
#define CELLID_LEN             4 
#define INTEGERTYPE_LEN        3
#define CAUSE_LEN              1 
#define DIAGNOSTIC_LEN         20          
#define CHANNEL_INDICATOR_LEN  1 
#define OPERTOR_LEN            20
#define BILATERAL_AGREEM_LEN   20
#define Xl2lADDRESS_LEN        20
#define PASSWORD_LEN           20


int Unpackcbse_REPORT_SUCCESS(int handle);
int UnPackPara_MESSAGEIDENTIFER(int handle);
int UnPackPara_SERIALNUMBER(int handle);
int UnPack_NOOFBROADCASTSCOML(int handle,NOOFBROADCASTSCOML_t *s_NOOFBROADCASTSCOML);
int UnpackPara_CHANNELINDICATOR(int handle);
int UnPackPara_NOOFBROADCASTSCOMPLLIST(int handle);
int UnPackPara_FAILURELIST(int handle);
int UnPack_FAILUREREPORT(int handle,FAILUREREPORT_t *s_FAILUREREPORT);
int Unpackcbse_STATUS_CBCH_QUERY_RESP(handle);
int UnPack_CBCHLoading(int handle,CBCLOADINGSTATUS_t *s_CBCLOADINGSTATUS);
int UnPackPara_CBCHLoadingList(int handle);
int ConvertASN1INTEGERToint(unsigned char *ptr,int len);
int UnPackcbse_BSC_RESTART(int handle);
int Unpack_CellList(int handle);
int Unpack_UplinkCellList(int handle);
int Unpack_RecoveryIndication(int handle);
int UnPackcbse_RESET(int handle);
int UnPackcbse_FAILURE_IND(int handle);
int UnPackcbse_SET_DRX_REPORT(int handle);
int Unpack_NAME(int handle);
int UnpackPara_Operator(int handle);
int UnpackPara_BilateralAgreem(int handle);
int UnpackPara_DataNetworkAddress(int handle);
int Unpackcbse_REJECT_RESPONSE(int handle);



//补充
int Unpackcbse_WRITE_REPLACE(int handle);

//标签全为1字节
int CbcBscUnpackAMessage(MESSAGE_t *s_MessageRecord,int Len)
{
	int		para_id;
	int		flag;
	int		handle;
	int     ReturnValue;

#ifdef  OPEN_WARNING
	unsigned char  cWarningDescription[WARNING_DESC_LEN];
#endif

	handle=SolidUnPackBegin();
	if (handle<0) return FAILURE;

	flag=SolidUnPackAttach(handle,s_MessageRecord->cMessage,Len);
	ReturnValue=SUCCESS;
	if (flag==0)
	{
			para_id=SolidUnPackGetID(handle);
			if (para_id>=0)
			{ 
				switch (para_id)
				{
				case 3://CBSE_REPORT_SUCCESS:
					{
						ReturnValue=Unpackcbse_REPORT_SUCCESS(handle);
#ifdef  OPEN_WARNING
						if (ReturnValue==FAILURE)
						{
							/* 发送告警给OMP */
							memset(cWarningDescription,0,WARNING_DESC_LEN);
   							sprintf(cWarningDescription,"响应包无法解释");
							SendWarningToOmp(PACK_UNPACK,UNRECOGNIZED_PACK,cWarningDescription);
						}
#endif						
					}
					break;
				
				case 2:  /* 0x82 0x00 解除绑定原因 */
					{
						ReturnValue=SUCCESS;
						/* handle BIND-failure */
					}
					break;

				case 5://CBSE_STATUS_CBCH_QUERY_RESP:
					{
						ReturnValue=Unpackcbse_STATUS_CBCH_QUERY_RESP(handle);
#ifdef  OPEN_WARNING
                        if (ReturnValue==FAILURE)
						{
							/* 发送告警给OMP */
							memset(cWarningDescription,0,WARNING_DESC_LEN);
   							sprintf(cWarningDescription,"信道查询响应包无法解释");
							SendWarningToOmp(PACK_UNPACK,UNRECOGNIZED_PACK,cWarningDescription);
						}
#endif						
    					
					}
					break;
				case 7://CBSE_STATUS_MESS_QUERY_RESP:
					{
						ReturnValue=Unpackcbse_REPORT_SUCCESS(handle);//考虑Old MessageIdentifier
#ifdef  OPEN_WARNING
						if (ReturnValue==FAILURE)	
						{
							/* 发送告警给OMP */
							memset(cWarningDescription,0,WARNING_DESC_LEN);
   							sprintf(cWarningDescription,"消息查询响应包无法解释");
							SendWarningToOmp(PACK_UNPACK,UNRECOGNIZED_PACK,cWarningDescription);
						}
#endif						
						
					}
					break;
				case 8://CBSE_REJECT_RESPONSE:
					{
#ifdef DEBUG_PRINT
						printf("Receive REPORT-FAILURE \n");
#endif
						ReturnValue=Unpackcbse_REJECT_RESPONSE(handle);
#ifdef  OPEN_WARNING
						if (ReturnValue==FAILURE)
						{
							/* 发送告警给OMP */
							memset(cWarningDescription,0,WARNING_DESC_LEN);
   							sprintf(cWarningDescription,"消息查询响应包无法解释");
							SendWarningToOmp(PACK_UNPACK,UNRECOGNIZED_PACK,cWarningDescription);
						}
#endif						
					}
					break;
				case 9://CBSE_BSC_RESTART:
					{
						ReturnValue=UnPackcbse_BSC_RESTART(handle);
#ifdef  OPEN_WARNING
						if (ReturnValue==FAILURE)
						{
							/* 发送告警给OMP */
							memset(cWarningDescription,0,WARNING_DESC_LEN);
   							sprintf(cWarningDescription,"重启指示包无法解释");
							SendWarningToOmp(PACK_UNPACK,UNRECOGNIZED_PACK,cWarningDescription);
						}
#endif						
					}
					break;
				case 11://CBSE_FAILURE_IND: 
					{
						ReturnValue=UnPackcbse_FAILURE_IND(handle);
#ifdef  OPEN_WARNING
						if (ReturnValue==FAILURE)
						{
							/* 发送告警给OMP */
							memset(cWarningDescription,0,WARNING_DESC_LEN);
   							sprintf(cWarningDescription,"失败指示包无法解释");
							SendWarningToOmp(PACK_UNPACK,UNRECOGNIZED_PACK,cWarningDescription);
						}
#endif						
					}
					break;
//				case 13://CBSE_SET_DRX_REPORT:        
//					ReturnValue=UnPackcbse_SET_DRX_REPORT(handle);
//					break;

				default:
					{
#ifdef  OPEN_WARNING
						/* 发送告警给OMP */
						memset(cWarningDescription,0,WARNING_DESC_LEN);
						sprintf(cWarningDescription,"不识别的包类型");
						SendWarningToOmp(PACK_UNPACK,UNRECOGNIZED_PACK,cWarningDescription);

#endif						

						ReturnValue=FAILURE;
					}

					break;

				}
			}
			else//标签码失败
			{
				ReturnValue=FAILURE;
			}
		
	}
	else
	{
		ReturnValue=FAILURE;
	}
	SolidUnPackRelease(handle);

	return ReturnValue;

}


int Unpackcbse_REPORT_SUCCESS(int handle)
{
	int ParaMeterTag;
	int len;

//	if (SolidUnPackFORWARD(handle)==0)
//		return FAILURE;

	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;
	
	/* MessageIdentifier */
	UnPackPara_MESSAGEIDENTIFER(handle);
	
	/* serialnumber */
	if (SolidUnPackSkipBODY(handle)==0)
		return FAILURE;
	UnPackPara_SERIALNUMBER(handle);

	/* ComlList */
	if (SolidUnPackSkipBODY(handle)==0)
		return FAILURE;

	ParaMeterTag=SolidUnPackGetID(handle);
	if (ParaMeterTag<0)
		return FAILURE;

	len=SolidUnPackGetLEN(handle);
	if(len>0)
	{
		if (UnPackPara_NOOFBROADCASTSCOMPLLIST(handle)==FAILURE)
		{
			return FAILURE;
		}
	}

	/* FailureList (O)*/
	if (SolidUnPackSkipBODY(handle)==0)
		return SUCCESS;  /* 没有失败列表 */

	ParaMeterTag=SolidUnPackGetID(handle);
	if (ParaMeterTag<0)
		return FAILURE;

	len=SolidUnPackGetLEN(handle);
	if(len>0)
	{
		if(UnPackPara_FAILURELIST(handle)==FAILURE)
		{
			return FAILURE;
		}
	}

/*  更高版本
	for(;;)
	{
		ParaMeterTag=SolidUnPackGetID(handle);
		if (ParaMeterTag<0)
			return FAILURE;

		switch (ParaMeterTag)
		{
		case 0://NOOFBROADCASTSCOMPLLIST:
            UnPackPara_NOOFBROADCASTSCOMPLLIST(handle);
			break;
		case 1://FAILURELIST:                    
			UnPackPara_FAILURELIST(handle);
			break;
		case 4://CHANNELINDICATOR:       
			UnpackPara_CHANNELINDICATOR(handle);
			break;
		}
	if (SolidUnPackSkipBODY(handle)==0)
		break;
	}
*/
	return SUCCESS;
}

int UnPackPara_MESSAGEIDENTIFER(int handle)
{
	char*	para_body;
	int     len;

	para_body=SolidUnPackGetBODY(handle);
	if (para_body==NULL) 
	{
		return FAILURE;
	}
	len=SolidUnPackGetLEN(handle);
	CBCBSC_Unpack.p_MessageIdentifier.iMessageIdentifier=
		ConvertASN1INTEGERToint(para_body,len);
	CBCBSC_Unpack.p_MessageIdentifier.bFlag=1;
	
	return SUCCESS;
}

int UnPackPara_SERIALNUMBER(int handle)
{
	char*	para_body;
	int len;

	para_body=SolidUnPackGetBODY(handle);
	if (para_body==NULL) return FAILURE;
	len=SolidUnPackGetLEN(handle);
	CBCBSC_Unpack.p_Serialnumber.iSerialNumber=
		ConvertASN1INTEGERToint(para_body,len);
	CBCBSC_Unpack.p_Serialnumber.bFlag=1;
	return SUCCESS;
}

/* 解一个NOOFBROADCASTSCOML */
int UnPack_NOOFBROADCASTSCOML(int handle,NOOFBROADCASTSCOML_t *s_NOOFBROADCASTSCOML)
{
	char*  	para_body;
	int len;
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;
    /* 深入到Cell节点 */
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	/* CellIdDisc */
	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);
    #ifdef CHECKLEN
	if (len!=CELLID_DISC_LEN)
		return FAILURE;
    #endif
	memcpy(&s_NOOFBROADCASTSCOML->s_Cellid.cCellIdDisc,para_body,len);

    /* CellId */
	SolidUnPackSkipBODY(handle);
	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);
    #ifdef CHECKLEN
	if (len>CELLID_LEN)	
		return FAILURE;
    #endif
	memcpy(&s_NOOFBROADCASTSCOML->s_Cellid.cCellId[0],para_body,len);


	/* 得到完成次数 */
    SolidUnPackBACKWARD(handle);
	SolidUnPackSkipBODY(handle);
	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);
    #ifdef CHECKLEN
	if (len>INTEGERTYPE_LEN)	
		return FAILURE;
    #endif
	s_NOOFBROADCASTSCOML->iNoOfBroadcastsCompl=ConvertASN1INTEGERToint(para_body,len);

/*
	if (SolidUnPackSkipBODY(handle)==0)
	{
		//不存在该参数
		s_NOOFBROADCASTSCOML->cNoOfBroadcastsComplType=2;
	}else
	{
		para_body=SolidUnPackGetBODY(handle);		
		s_NOOFBROADCASTSCOML->cNoOfBroadcastsComplType=*para_body;
	}
*/
	/* 退回 */
	SolidUnPackBACKWARD(handle);
	   
	return SUCCESS;
}


/* 参数NOOFBROADCASTSCOMPLLIST */
int UnPackPara_NOOFBROADCASTSCOMPLLIST(int handle)
{

    int i=0;

	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;


	for(;;)
	{
		if(UnPack_NOOFBROADCASTSCOML(handle,&CBCBSC_Unpack.p_NoofBroadcastComlList.s_NoOfBroadcastComl[i])==FAILURE)
		{
			SolidUnPackBACKWARD(handle);
			return FAILURE;
		}
		i++;
		if (SolidUnPackSkipBODY(handle)==0)
			break;
	}

	if (i>0)
	{
		CBCBSC_Unpack.p_NoofBroadcastComlList.bFlag=1;
		CBCBSC_Unpack.p_NoofBroadcastComlList.ilength=i;				
	}
	SolidUnPackBACKWARD(handle);

	return SUCCESS;
}



//解一个FAILUREREPORT
int UnPack_FAILUREREPORT(int handle,FAILUREREPORT_t *s_FAILUREREPORT)
{
	char*  	para_body;
	int len;
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;
    //深入到Cell节点
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	/* CellIddisc */
	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);
    #ifdef CHECKLEN
	if (len>CELLID_DISC_LEN)
		return FAILURE;
    #endif
	memcpy(&s_FAILUREREPORT->s_Cellid.cCellIdDisc,para_body,len);

	/* CellId */
	SolidUnPackSkipBODY(handle);
	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);
    #ifdef CHECKLEN
	if (len>CELLID_LEN)
		return FAILURE;
    #endif
	memcpy(&s_FAILUREREPORT->s_Cellid.cCellId,para_body,len);


	/* 得到Cause */
    SolidUnPackBACKWARD(handle);
	SolidUnPackSkipBODY(handle);
	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);
    #ifdef CHECKLEN
	if (len>CAUSE_LEN)
		return FAILURE;
    #endif
	memcpy(&s_FAILUREREPORT->cCause,para_body,len);

/*  更高版本
	//得到Diagnost optional
	if (SolidUnPackSkipBODY(handle)!=0)
	{
			para_body=SolidUnPackGetBODY(handle);		
        	len=SolidUnPackGetLEN(handle);
            #ifdef CHECKLEN
			if (len>DIAGNOSTIC_LEN)
         		return FAILURE;
            #endif
        	memcpy(&s_FAILUREREPORT->cDiagnostic,para_body,len);
	}
*/
	/* 退回 */
	SolidUnPackBACKWARD(handle);
	   
	return SUCCESS;
}

/* 参数FAILURELIST */
int UnPackPara_FAILURELIST(int handle)
{
    int i=0;
	int iPacklen;
	
	iPacklen=SolidUnPackGetLEN(handle);
	if(iPacklen==0)
	{
		return SUCCESS;
	}
//	if (SolidUnPackFORWARD(handle)==0)
//		return FAILURE;
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	for(;;)
	{
		if(UnPack_FAILUREREPORT(handle,&CBCBSC_Unpack.p_FailureReportList.s_FailureReason[i])==FAILURE)
		{
//			SolidUnPackBACKWARD(handle);
			SolidUnPackBACKWARD(handle);
			return FAILURE;
		}
		i++;
		if (SolidUnPackSkipBODY(handle)==0)
			break;
	}

	if (i>0)
	{
		CBCBSC_Unpack.p_FailureReportList.bFlag=1;
		CBCBSC_Unpack.p_FailureReportList.iLength=i;				
	}

	SolidUnPackBACKWARD(handle);
//	SolidUnPackBACKWARD(handle);
	return SUCCESS;
}

//参数CHANNELINDICATOR
int UnpackPara_CHANNELINDICATOR(int handle)
{
	char*	para_body;
	int     len;


	para_body=SolidUnPackGetBODY(handle);		
	len=*(unsigned char *)(para_body+1);
#ifdef CHECKLEN
	if (len>CHANNEL_INDICATOR_LEN)
		return FAILURE;
#endif
	memcpy(&CBCBSC_Unpack.p_ChannelIndicator.cChannelIndicator,(para_body+2),len);

	CBCBSC_Unpack.p_ChannelIndicator.bFlag=1;     

	return SUCCESS;

}



/* 对cbse_STATUS_CBCH_QUERY_RESP操作元素解包 */
int Unpackcbse_STATUS_CBCH_QUERY_RESP(int handle)
{
	int ParaMeterTag;
	int len;

//	if (SolidUnPackFORWARD(handle)==0)
//		return FAILURE;
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	/* CBCHLoadingList */
	ParaMeterTag=SolidUnPackGetID(handle);
	if (ParaMeterTag<0)
		return FAILURE;
	len=SolidUnPackGetLEN(handle);
	if (len>0)
	{
		if(UnPackPara_CBCHLoadingList(handle)==FAILURE)
		{
			return FAILURE;
		}
	}

	/* FailureList */
    if (SolidUnPackSkipBODY(handle)==0)
		return FAILURE;

	len=SolidUnPackGetLEN(handle);
	if (len>0)
	{
		if(UnPackPara_FAILURELIST(handle)==FAILURE)
		{
			return FAILURE;
		}
	}

/*	更高版本
	for(;;)
	{
		ParaMeterTag=SolidUnPackGetID(handle);
		if (ParaMeterTag<0)
			return FAILURE;

		switch (ParaMeterTag)
		{
		case 0://CBCH-Loading-List
            UnPackPara_CBCHLoadingList(handle);
			break;

⌨️ 快捷键说明

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