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

📄 cbcbscpack.c

📁 CBS(小区广播)程序实现手稿
💻 C
📖 第 1 页 / 共 3 页
字号:
	if (s_WriteReplaceRequest->p_OldSerialnumber.bFlag==1)
	{
        len=Pack_OldSerialNumber(s_WriteReplaceRequest->p_OldSerialnumber.iSerialNumber,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}

	//Category (O)
	if (s_WriteReplaceRequest->p_Category.bFlag==1)
	{
        len=Pack_CATEGORY(s_WriteReplaceRequest->p_Category.cCategory,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}

	//ChannelIndicator (O)
	if (s_WriteReplaceRequest->p_ChannelIndicator.bFlag==1)
	{
        len=Pack_CHANNELINDICATOR(s_WriteReplaceRequest->p_ChannelIndicator.cChannelIndicator, &PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}

	lentmp=CovertASN1LEN(Offset,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=Offset+lentmp+1;//包括WriteReplace sequence标签的整个包长

	i=i-lentmp;  //len
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;       //tag

	Buf[i]=CBSE_WRITE_REPLACE;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return Offset+lentmp;


/*
	//
	lentmp=CovertASN1LEN(len,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=len+lentmp+1;//包括WriteReplace 上下文标签的整个包长
	i=i-lentmp;
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;
	Buf[i]=CBSE_WRITE_REPLACE;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return len;
*/
}

//打包Kill Message操作元素
//返回包长  ERROR -1
int Pack_KILL_MESSAGE(KILLMESSAGE_t *s_KillMessage,unsigned char *ptr)
{
	int len;
	int lentmp;
	unsigned char LenBuf[10];   //长度字段打包缓冲区
	unsigned char Buf[20];      //2Tag,2Len打包缓冲区 
	int i=20;                   //反向偏移指针
	unsigned char PackBuf[2048];//打包缓冲区
	int Offset=0;               //PackBuf偏移指针


	memset(PackBuf,0,2048);
	
	//MessageIdentifier
	if (s_KillMessage->p_MessageIdentifier.bFlag==1)
	{		
		len=Pack_MessageIdentifier(s_KillMessage->p_MessageIdentifier.iMessageIdentifier,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

    //Serialnumber
	if (s_KillMessage->p_OldSerialnumber.bFlag==1)
	{		
		len=Pack_SerialNumber(s_KillMessage->p_OldSerialnumber.iSerialNumber,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

	//p_CellList
	if (s_KillMessage->p_CellList.bFlag==1)
	{
		len=Pack_CELLLIST(&s_KillMessage->p_CellList,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

	//ChannelIndicator (O)
	if (s_KillMessage->p_ChannelIndicator.bFlag==1)
	{
        len=Pack_CHANNELINDICATOR(s_KillMessage->p_ChannelIndicator.cChannelIndicator, &PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}
/*
	lentmp=CovertASN1LEN(Offset,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=Offset+lentmp+1;//包括KillMessage sequence标签的整个包长

	i=i-lentmp;  //len
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;       //tag
	Buf[i]=0x30;
*/
	//
	lentmp=CovertASN1LEN(Offset,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=len+lentmp+1;//包括KillMessage 上下文标签的整个包长
	i=i-lentmp;
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;
	Buf[i]=CBSE_KILL_MESSAGE;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return Offset+lentmp;

}

//打包STATUS_CBCH_QUERY操作元素
//返回包长  ERROR -1
int Pack_STATUS_CBCH_QUERY(STATUSCBCH_REQ_t *s_StatusCbchReq,unsigned char *ptr)
{
	int len;
	int lentmp;
	unsigned char LenBuf[10];   //长度字段打包缓冲区
	unsigned char Buf[20];      //2Tag,2Len打包缓冲区 
	int i=20;                   //反向偏移指针
	unsigned char PackBuf[2048];//打包缓冲区
	int Offset=0;               //PackBuf偏移指针

	//p_CellList
	if (s_StatusCbchReq->p_CellList.bFlag==1)
	{
		len=Pack_CELLLIST(&s_StatusCbchReq->p_CellList,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

	//ChannelIndicator (O)
	if (s_StatusCbchReq->p_ChannelIndicator.bFlag==1)
	{
        len=Pack_CHANNELINDICATOR(s_StatusCbchReq->p_ChannelIndicator.cChannelIndicator, &PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}
	lentmp=CovertASN1LEN(Offset,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=Offset+lentmp+1;//包括WriteReplace sequence标签的整个包长

	i=i-lentmp;  //len
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;       //tag

	Buf[i]=CBSE_STATUS_CBCH_QUERY;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return Offset+lentmp;

/*
	//以下2 tag,2 len 打包
	//
	lentmp=CovertASN1LEN(Offset,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=Offset+lentmp+1;//包括KillMessage sequence标签的整个包长

	i=i-lentmp;  //len
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;       //tag
	Buf[i]=0x30;

	//
	lentmp=CovertASN1LEN(len,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=len+lentmp+1;//包括KillMessage 上下文标签的整个包长
	i=i-lentmp;
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;
	Buf[i]=CBSE_STATUS_CBCH_QUERY;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return len;
*/
}

//打包cbse_STATUS_MESSAGE_QUERY操作元素
//返回包长  ERROR -1
int Pack_STATUS_MESSAGE_QUERY(STATUSMESSAGE_QUERY_t *s_StatusMessageQuery,unsigned char *ptr)
{
	int len;
	int lentmp;
	unsigned char LenBuf[10];   //长度字段打包缓冲区
	unsigned char Buf[20];      //2Tag,2Len打包缓冲区 
	int i=20;                   //反向偏移指针
	unsigned char PackBuf[2048];//打包缓冲区
	int Offset=0;               //PackBuf偏移指针


	memset(PackBuf,0,2048);
	
	//MessageIdentifier
	if (s_StatusMessageQuery->p_MessageIdentifier.bFlag==1)
	{		
		len=Pack_MessageIdentifier(s_StatusMessageQuery->p_MessageIdentifier.iMessageIdentifier,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

    //Serialnumber
	if (s_StatusMessageQuery->p_CurrentSerialnumber.bFlag==1)
	{		
		len=Pack_SerialNumber(s_StatusMessageQuery->p_CurrentSerialnumber.iSerialNumber,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

	//p_CellList
	if (s_StatusMessageQuery->p_CellList.bFlag==1)
	{
		len=Pack_CELLLIST(&s_StatusMessageQuery->p_CellList,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

	//ChannelIndicator (O)
	if (s_StatusMessageQuery->p_ChannelIndicator.bFlag==1)
	{
        len=Pack_CHANNELINDICATOR(s_StatusMessageQuery->p_ChannelIndicator.cChannelIndicator, &PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}
/*
	lentmp=CovertASN1LEN(Offset,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=Offset+lentmp+1;//包括KillMessage sequence标签的整个包长

	i=i-lentmp;  //len
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;       //tag
	Buf[i]=0x30;
*/
	//
	lentmp=CovertASN1LEN(Offset,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=len+lentmp+1;//包括KillMessage 上下文标签的整个包长
	i=i-lentmp;
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;
	Buf[i]=CBSE_STATUS_MESSAGE_QUERY;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return Offset+lentmp;

}

//打包cbse_BSC_RESTART操作元素
//返回包长  ERROR -1
int Pack_BSC_RESTART(BSCRESTART_t *s_BscRestart,unsigned char *ptr)
{
	int len;
	int lentmp;
	unsigned char LenBuf[10];   //长度字段打包缓冲区
	unsigned char Buf[20];      //2Tag,2Len打包缓冲区 
	int i=20;                   //反向偏移指针
	unsigned char PackBuf[2048];//打包缓冲区
	int Offset=0;               //PackBuf偏移指针

	//p_CellList
	if (s_BscRestart->p_CellList.bFlag==1)
	{
		len=Pack_CELLLIST(&s_BscRestart->p_CellList,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

	if (s_BscRestart->p_RecoveryIndication.bFlag==1)
	{
		len=Pack_RecoveryIndication(&s_BscRestart->p_RecoveryIndication, &PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}

	//以下2 tag,2 len 打包
	//
	lentmp=CovertASN1LEN(Offset,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=Offset+lentmp+1;//包括KillMessage sequence标签的整个包长

	i=i-lentmp;  //len
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;       //tag
	Buf[i]=0x30;

	//
	lentmp=CovertASN1LEN(len,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=len+lentmp+1;//包括KillMessage 上下文标签的整个包长
	i=i-lentmp;
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;
	Buf[i]=CBSE_BSC_RESTART;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return len;

}

//打包cbse_SET_DRX操作元素
//返回包长  ERROR -1
int Pack_SET_DRX(SET_DRX_t *s_SetDRX,unsigned char *ptr)
{
	int len;
	int lentmp;
	unsigned char LenBuf[10];   //长度字段打包缓冲区
	unsigned char Buf[20];      //2Tag,2Len打包缓冲区 
	int i=20;                   //反向偏移指针
	unsigned char PackBuf[2048];//打包缓冲区
	int Offset=0;               //PackBuf偏移指针

	//p_CellList
	if (s_SetDRX->p_CellList.bFlag==1)
	{
		len=Pack_CELLLIST(&s_SetDRX->p_CellList,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

    //SchedulePeriod
	if (s_SetDRX->p_SchedulePeriod.bFlag==1)
	{
		len=Pack_SCHEDULEPERIOD(s_SetDRX->p_SchedulePeriod.cSchedulePeriod, &PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}
    //ReservedSlots
	if (s_SetDRX->p_ReservedSlots.bFlag==1)
	{
		len=Pack_RESERVEDSLOTS(s_SetDRX->p_ReservedSlots.cReservedSlots, &PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}

	//ChannelIndicator (O)
	if (s_SetDRX->p_ChannelIndicator.bFlag==1)
	{
        len=Pack_CHANNELINDICATOR(s_SetDRX->p_ChannelIndicator.cChannelIndicator, &PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}

	//以下2 tag,2 len 打包
	//
	lentmp=CovertASN1LEN(Offset,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=Offset+lentmp+1;//包括KillMessage sequence标签的整个包长

	i=i-lentmp;  //len
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;       //tag
	Buf[i]=0x30;

	//
	lentmp=CovertASN1LEN(len,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=len+lentmp+1;//包括KillMessage 上下文标签的整个包长
	i=i-lentmp;
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;
	Buf[i]=CBSE_BSC_RESTART;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return len;
}


/******************************
     和邦定有关的打解包
******************************/
/* Operate
 * 返回偏移量 Error -1
 */
int pack_BIND_Operate(OPERATOR_t *s_Operator,char *ptr)
{
	unsigned char Buf[30];
	int           len;

	if (s_Operator->clength>20)
		return FAILURE;

	Buf[0]=0x80;/* 上下文类 */
	Buf[1]=s_Operator->clength;

	memcpy(&Buf[2],&s_Operator->cOperator[0],s_Operator->clength);
	len=Buf[1]+2;
	memcpy(ptr,&Buf[0],len);
	return len;
}

/* BilateralAgreem
 * 返回偏移量 Error -1
 */
int pack_BilateralAgreem(BILATERALAGREEM_t *s_BilateralAgreem, char *ptr)
{
	unsigned char Buf[30];
	int           len;

	if (s_BilateralAgreem->clength>20)
		return FAILURE;

	Buf[0]=0x81;/* 上下文类 */
	Buf[1]=s_BilateralAgreem->clength;

	memcpy(&Buf[2],&s_BilateralAgreem->cBilateralAgreem[0],s_BilateralAgreem->clength);
	len=Buf[1]+2;
	memcpy(ptr,&Buf[0],len);
	return len;
}

/* DataNetworkAddress */
int pack_DataNetworkAddress(X121ADDRESS_t *s_X121Address,char *ptr)
{
	unsigned char Buf[30];
	int           len;

	if (s_X121Address->clength>15)
		return FAILURE;

	Buf[0]=0x82;/* 上下文类 */
	Buf[1]=s_X121Address->clength;

	memcpy(&Buf[2],&s_X121Address->cXl2lAddress[0],s_X121Address->clength);
	len=Buf[1]+2;
	memcpy(ptr,&Buf[0],len);
	return len;
}


//Name
//返回偏移量 Error -1
int pack_Name(NAME_t *s_Name, char *ptr)
{
	int len;
	int lentmp;
	unsigned char LenBuf[10];   /* 长度字段打包缓冲区 */
	unsigned char Buf[20];      /* 2Tag,2Len打包缓冲区 */
	int i=20;                   /* 反向偏移指针 */
	unsigned char PackBuf[2048];/* 打包缓冲区 */
	int Offset=0;               /* PackBuf偏移指针 */

	
	/* s_Operate */
	if (s_Name->s_Operate.bFlag==1)
	{
		len=pack_BIND_Operate(&s_Name->s_Operate,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}

    /* BilateralAgreem */
	if (s_Name->s_BilateralAgreem.bFlag==1)
	{
		len=pack_BilateralAgreem(&s_Name->s_BilateralAgreem, &PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}

    /* Xl2lAddress */
	if (s_Name->s_DataNetWorkAddress.bFlag==1)
	{
		len=pack_DataNetworkAddress(&s_Name->s_DataNetWorkAddress,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}

⌨️ 快捷键说明

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