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

📄 cbcbscunpack.c

📁 CBS(小区广播)程序实现手稿
💻 C
📖 第 1 页 / 共 3 页
字号:
		ConvertASN1INTEGERToint(para_body,len);
	CBCBSC_Unpack.p_NoOfBroadcastReq.bFlag=1;
	
	return SUCCESS;
}

//解参数PAGE_INF
int UnPackPara_PAGE_INF(int handle,int i)
{
	char*	para_body;
	int     len;
	//深入到MessageInfoUsefulOctets
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;
     
	//取页长
	para_body=SolidUnPackGetBODY(handle);
	if (para_body==NULL) 
	{
		return FAILURE;
	}
	len=SolidUnPackGetLEN(handle);
	CBCBSC_Unpack.p_CBSPageINF.s_CbsPageInf[i].cMessageInfoUsefulOctets=
		ConvertASN1INTEGERToint(para_body,len);
    
	if (SolidUnPackSkipBODY(handle)==0)
		return FAILURE;   //缺PAGE内容

	//取页内容
	para_body=SolidUnPackGetBODY(handle);
	if (para_body==NULL) 
	{
		return FAILURE;
	}
	len=SolidUnPackGetLEN(handle);
	if (len!=MESSAGE_INFO_PAGE_LEN)
		return FAILURE;
	memcpy(&CBCBSC_Unpack.p_CBSPageINF.s_CbsPageInf[i].cMessageInfoPage[0],para_body,len);

	SolidUnPackBACKWARD(handle);	

	return SUCCESS;
}

//解参数CBS_PAGE_INF
int UnPackPara_CBS_PAGE_INF(int handle)
{
//	char*	para_body;
	int i;

	//深入到SEQUENCE
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	for(i=0;i<15;i++)
	{
		if (UnPackPara_PAGE_INF(handle,i)<0)
		{	
			SolidUnPackBACKWARD(handle);
			return FAILURE;
		}
		if (SolidUnPackSkipBODY(handle)==0)
			break;
	}
	CBCBSC_Unpack.p_CBSPageINF.bFlag=1;

	SolidUnPackBACKWARD(handle);
	return SUCCESS;
}

//参数Old_Serial_Number
int UnPackPara_OLD_SERIAL_NUMBER(int handle)
{
	char*	para_body;
	int     len;

	//
	para_body=SolidUnPackGetBODY(handle);		
	len=*(unsigned char *)(para_body+1);
#ifdef CHECKLEN
	if (len>2)
		return FAILURE;
#endif
	CBCBSC_Unpack.p_OldSerialNumber.iSerialNumber=
		ConvertASN1INTEGERToint((para_body+2),len);
	CBCBSC_Unpack.p_OldSerialNumber.bFlag=1;
	
	return SUCCESS;
}

//参数Category
int UnPackPara_CATEGORY(int handle)
{
	char*	para_body;
	int     len;


	para_body=SolidUnPackGetBODY(handle);		
	len=*(unsigned char *)(para_body+1);
#ifdef CHECKLEN
	if (len>1)
		return FAILURE;
#endif
	CBCBSC_Unpack.p_Category.cCategory=
		ConvertASN1INTEGERToint((para_body+2),len);
	CBCBSC_Unpack.p_Category.bFlag=1;
	

	return SUCCESS;

}




//实际中不会用,较简略
int Unpackcbse_WRITE_REPLACE(int handle)
{
	int ParaMeterTag;
	int len;
//	char*	para_body;

	//深入到SEQUENCE
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;
	//深入到MessageIdentifier
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;


	//MessageIdentifier
	ParaMeterTag=SolidUnPackGetID(handle);
	if (ParaMeterTag<0)
		return FAILURE;
	UnPackPara_MESSAGEIDENTIFER(handle);
	if (SolidUnPackSkipBODY(handle)==0)
		return FAILURE;

	//SerrialNumber
	ParaMeterTag=SolidUnPackGetID(handle);
	if (ParaMeterTag<0)
		return FAILURE;
	UnPackPara_SERIALNUMBER(handle);
	if (SolidUnPackSkipBODY(handle)==0)
		return FAILURE;

   //NoOfPages
	ParaMeterTag=SolidUnPackGetID(handle);
	if (ParaMeterTag<0)
		return FAILURE;
	UnPackPara_NO_OF_PAGES(handle);
	if (SolidUnPackSkipBODY(handle)==0)
		return FAILURE;

   //DataCodingScheme
	ParaMeterTag=SolidUnPackGetID(handle);
	if (ParaMeterTag<0)
		return FAILURE;
	UnPackPara_DATA_CODING_SCHEME(handle);
	if (SolidUnPackSkipBODY(handle)==0)
		return FAILURE;

	//celllist
	ParaMeterTag=SolidUnPackGetID(handle);
	if (ParaMeterTag<0)
		return FAILURE;
	Unpack_CellList(handle);
	if (SolidUnPackSkipBODY(handle)==0)
		return FAILURE;

	//RepetitionRate
	ParaMeterTag=SolidUnPackGetID(handle);
	if (ParaMeterTag<0)
		return FAILURE;
    UnPackPara_REPETITION_RATE(handle);	
	if (SolidUnPackSkipBODY(handle)==0)
		return FAILURE;

	//NoOfBroadcastReq
	ParaMeterTag=SolidUnPackGetID(handle);
	if (ParaMeterTag<0)
		return FAILURE;
    UnPackPara_NO_OF_BROADCAST_REQ(handle);	
	if (SolidUnPackSkipBODY(handle)==0)
		return FAILURE;

	//CBSPageINFO
	ParaMeterTag=SolidUnPackGetID(handle);
	if (ParaMeterTag<0)
		return FAILURE;
    UnPackPara_CBS_PAGE_INF(handle);	
	if (SolidUnPackSkipBODY(handle)==0)
		return FAILURE;

	for(;;)
	{
		ParaMeterTag=SolidUnPackGetID(handle);
		len=SolidUnPackGetLEN(handle);
		if (ParaMeterTag<0)
			return FAILURE;

		switch (ParaMeterTag)
		{
		case 3://old-Serial-Number
			UnPackPara_OLD_SERIAL_NUMBER(handle);
			break;
		case 2://category  
//			para_body=SolidUnPackGetBODY(handle);		
			UnPackPara_CATEGORY(handle);
			break;
		case 4://channel-indicator       
//			para_body=SolidUnPackGetBODY(handle);		
			UnpackPara_CHANNELINDICATOR(handle);
			break;
		}
	if (SolidUnPackSkipBODY(handle)==0)
		break;
	}


	return SUCCESS;
}

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

	//
	para_body=SolidUnPackGetBODY(handle);		
	len=*(unsigned char *)(para_body+1);
#ifdef CHECKLEN
	if (len>2)
		return FAILURE;
#endif
	CBCBSC_Unpack.p_Serialnumber.iSerialNumber=
		ConvertASN1INTEGERToint((para_body+2),len);
	CBCBSC_Unpack.p_Serialnumber.bFlag=1;
	
	return SUCCESS;
}

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

	//
	para_body=SolidUnPackGetBODY(handle);		
	len=*(unsigned char *)(para_body+1);
#ifdef CHECKLEN
	if (len>2)
		return FAILURE;
#endif
	CBCBSC_Unpack.p_MessageIdentifier.iMessageIdentifier=
		ConvertASN1INTEGERToint((para_body+2),len);
	CBCBSC_Unpack.p_MessageIdentifier.bFlag=1;
	
	return SUCCESS;
}

int Unpackcbse_REJECT_RESPONSE(handle)
{
//	int ParaMeterTag;
	int len;
	char*	para_body;

	/* 深入到SEQUENCE */
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;
	/* 深入到cause */
//	if (SolidUnPackFORWARD(handle)==0)
//		return FAILURE;

	/* cause */
	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);		
#ifdef CHECKLEN
	if (len>CAUSE_LEN)
		return FAILURE;
#endif
    CBCBSC_Unpack.p_FailuerReason.bFlag=1;
	CBCBSC_Unpack.p_FailuerReason.cCause=*(unsigned char *)(para_body+2);

	//没有其它参数
	if (SolidUnPackSkipBODY(handle)==0)
		return SUCCESS;

	//diagnostic
	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);		
#ifdef CHECKLEN
	if (len>DIAGNOSTIC_LEN)
		return FAILURE;
#endif
    CBCBSC_Unpack.p_Diagnostic.bFlag=1;
	memcpy(CBCBSC_Unpack.p_Diagnostic.cDiagnostic,para_body,len);

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

		switch (ParaMeterTag)
		{
		case 3://Serial-Number
			UnPackPara_SERIAL_NUMBER_OnlyForREJECT(handle);
			break;
		case 7://MessageIdentifier  
			UnPackPara_MESSAGE_IDENTIFIER_OnlyForREJECT(handle);
			break;
		default:
			return FAILURE;
		}
	if (SolidUnPackSkipBODY(handle)==0)
		break;
	}
*/
	return SUCCESS;
}

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

	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);		
#ifdef CHECKLEN
	if (len>OPERTOR_LEN)
		return FAILURE;
#endif
	CBCBSC_Unpack.p_BindConfirm.p_Name.s_Operate.clength=len;
    CBCBSC_Unpack.p_BindConfirm.p_Name.s_Operate.bFlag=1;
	memcpy(&CBCBSC_Unpack.p_BindConfirm.p_Name.s_Operate.cOperator[0],para_body,len);
	return SUCCESS;
}

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

	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);		
#ifdef CHECKLEN
	if (len>BILATERAL_AGREEM_LEN)
		return FAILURE;
#endif
	CBCBSC_Unpack.p_BindConfirm.p_Name.s_BilateralAgreem.clength=len;
    CBCBSC_Unpack.p_BindConfirm.p_Name.s_BilateralAgreem.bFlag=1;
	memcpy(&CBCBSC_Unpack.p_BindConfirm.p_Name.s_BilateralAgreem.cBilateralAgreem[0],para_body,len);
	return SUCCESS;
}

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

	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);		
#ifdef CHECKLEN
	if (len>Xl2lADDRESS_LEN)
		return FAILURE;
#endif
	CBCBSC_Unpack.p_BindConfirm.p_Name.s_DataNetWorkAddress.clength=len;
    CBCBSC_Unpack.p_BindConfirm.p_Name.s_DataNetWorkAddress.bFlag=1;
	memcpy(&CBCBSC_Unpack.p_BindConfirm.p_Name.s_DataNetWorkAddress.cXl2lAddress[0],para_body,len);
	return SUCCESS;
}

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

	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);		
#ifdef CHECKLEN
	if (len>Xl2lADDRESS_LEN)
		return FAILURE;
#endif
	CBCBSC_Unpack.p_BindConfirm.p_Name.s_DataNetWorkAddress.clength=len;
    CBCBSC_Unpack.p_BindConfirm.p_Name.s_DataNetWorkAddress.bFlag=1;
	memcpy(&CBCBSC_Unpack.p_BindConfirm.p_Name.s_DataNetWorkAddress.cXl2lAddress[0],para_body,len);
	return SUCCESS;
}


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

	//深入到SEQUENCE
//	if (SolidUnPackFORWARD(handle)==0)
//		return FAILURE;
	//深入到Operator
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	for(;;)
	{
		ParaMeterTag=SolidUnPackGetID(handle);
		len=SolidUnPackGetLEN(handle);
		if (ParaMeterTag<0)
			return FAILURE;

		switch (ParaMeterTag)
		{
		case 0:/* Operator */
			UnPackPara_Operator(handle);
			break;
		case 1:/* BilateralAgreem */
			UnPackPara_BilateralAgreem(handle);
			break;
		case 2:/* dataNetworkAddress */
			UnPackPara_DataNetworkAddress(handle);
			break;
		case 3:/* iSDNAddress */
			UnPackPara_ISDNAddress(handle);
			break;
		default:
			return FAILURE;
		}
	if (SolidUnPackSkipBODY(handle)==0)
		break;
	}

	return SUCCESS;
}

/* 解包Password参数 */
int UnPackPara_PASSWORD(int handle)
{
	int len;
	char*	para_body;

	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);		
#ifdef CHECKLEN
	if (len>PASSWORD_LEN)
		return FAILURE;
#endif

	CBCBSC_Unpack.p_BindConfirm.p_PassWord.clength=len;
    CBCBSC_Unpack.p_BindConfirm.p_PassWord.bFlag=1;
	memcpy(&CBCBSC_Unpack.p_BindConfirm.p_PassWord.cPassword[0],para_body,len);
	return SUCCESS;	
}


int UnPackcbse_BIND_CONFIRM(unsigned char *LpBindConfirmMessage,int MessageLen)
{
	int ParaMeterTag;
	int len;
	int handle;

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

	if (SolidUnPackAttach(handle,LpBindConfirmMessage,MessageLen)!=0)
	{
	    SolidUnPackRelease(handle);
		return FAILURE;
	}

	/* 深入到respId */
	if (SolidUnPackFORWARD(handle)==0)
	{
	    SolidUnPackRelease(handle);
		return FAILURE;
	}

	for(;;)
	{
		ParaMeterTag=SolidUnPackGetID(handle);
		len=SolidUnPackGetLEN(handle);
		if (ParaMeterTag<0)
		{
			SolidUnPackRelease(handle);
			return FAILURE;
		}

		switch (ParaMeterTag)
		{
		case 0:/* respId */
			{
				if (UnPackPara_RESPID(handle)==FAILURE)
				{
					SolidUnPackRelease(handle);
					return FAILURE;
				}
			}
			break;
		case 1:/* password */
			{
     			if (UnPackPara_PASSWORD(handle)==FAILURE)
				{
					SolidUnPackRelease(handle);
					return FAILURE;
				}
			}
			break;
		default:
			{
				SolidUnPackRelease(handle);
				return FAILURE;
			}
		}
	if (SolidUnPackSkipBODY(handle)==0)
		break;
	}

    SolidUnPackRelease(handle);

	return SUCCESS;
}

int UnPackcbse_BIND_DISCONNECT(unsigned char *LpUnbindMessage )
{

	switch (*LpUnbindMessage)
	{
	case 0x81:/* bindfail */
		{
			CBCBSC_Unpack.p_BindFailure.bFlag=1;
			CBCBSC_Unpack.p_BindFailure.p_ConnectFailureReason=*(LpUnbindMessage+2);		
		}
   		break;
	case 0x82:/* unbindreq */
		{
    		CBCBSC_Unpack.p_Unbind.bFlag=1;
		}
		break;
	default:
		return FAILURE;
		}

	return SUCCESS;
}

int UnPackcbse_BIND(unsigned char *Lp_mbind,int len)
{
	int		flag;
	int		handle;
	int     ReturnValue;

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

	ReturnValue=SUCCESS;

	flag=SolidUnPackAttach(handle,Lp_mbind,len);

	if (flag==0)
	{
        /* 深入到name */ 
	    if (SolidUnPackFORWARD(handle)!=0)
		{
			ReturnValue=Unpack_NAME(handle);
		}
		else
		{
			ReturnValue=FAILURE;
		}

	}
	else
	{
		ReturnValue=FAILURE;
	}


	SolidUnPackRelease(handle);

	return ReturnValue;
}

⌨️ 快捷键说明

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