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

📄 cbcbscpack.c

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

unsigned char Packbuf[1024];

int Pack_MessageIdentifier(unsigned short cMessageIdentifier ,char *ptr);
int Pack_SerialNumber(unsigned short cSerialNumber ,char *ptr);
int ConvertToASN1Interger(unsigned short IntValue ,char *ptr);
int Pack_NUMBEROFPAGES(unsigned char cNumberOfPages,char *ptr);
int Pack_DATACODINGSCHEME(unsigned char cDataCodingScheme,char *ptr);
int Pack_CELLLIST(CELLLIST_t *s_CELLLIST,char *ptr);
int CovertASN1LEN(int LenValue,unsigned char *ptr);
int Pack_REPETITIONRATE(unsigned short cRepetitionRate,char *ptr);
int Pack_NOOFBROADCASTREQ(unsigned short cNumberOfBroadcastReq,char *ptr);
int Pack_CBSPAGEINF(CBSPAGEINF_t *s_CBSPAGEINF,char *ptr);
int Pack_OldSerialNumber(unsigned short cSerialNumber ,char *ptr);
int Pack_CATEGORY(unsigned char cCategory, char *ptr);
int Pack_CHANNELINDICATOR(unsigned char cChannelIndicator, char *ptr);
int Pack_RecoveryIndication(RECOVERYINDICATION_t *s_RecoveryIndication, char *ptr);
int Pack_SCHEDULEPERIOD(unsigned char cSchedulePeriod, char *ptr);
int Pack_RESERVEDSLOTS(unsigned char cReservedSlots, char *ptr);

int pack_BIND_Operate(OPERATOR_t *s_Operator,char *ptr);
int pack_BilateralAgreem(BILATERALAGREEM_t *s_BilateralAgreem, char *ptr);
int pack_DataNetworkAddress(X121ADDRESS_t *s_X121Address,char *ptr);
int pack_Name(NAME_t *s_Name, char *ptr);
int pack_PassWord(PASSWORD_t *s_PassWord, char *ptr);
int pack_Version(VERSION_t  *s_Version, char *ptr);

//
int Pack_NO_OF_BROADCAST_COMLLIST(NOOFBROADCASTSCOMLLIST_t *s_NoOfBroadcastComlList,unsigned char *ptr);

//返回偏移量 Error -1
int Pack_MessageIdentifier(unsigned short cMessageIdentifier ,char *ptr)
{
	unsigned char INTEGERBuf[10];
	int           len;

	len=ConvertToASN1Interger(cMessageIdentifier,&INTEGERBuf[0]);
	if ((len==FAILURE) ||(len>10))
		return FAILURE;
	
	memcpy(ptr,&INTEGERBuf[0],len);
	return len;
}

//返回偏移量 Error -1
int ConvertToASN1Interger(unsigned short IntValue ,char *ptr)
{
	unsigned char a[2];

	memcpy(&a,&IntValue,2);
	if (IntValue<128)
	{
		//tag
		*ptr=2;
		//len
		*(ptr+1)=1;
		//content
		*(ptr+2)=a[0];
		return 3;		
	}
	if ((IntValue>127)&(IntValue<32768))
	{
		//tag
		*ptr=2;
		//len
		*(ptr+1)=2;
		//
		*(ptr+2)=a[1];
		*(ptr+3)=a[0];
		return 4;
	}
	if ((IntValue>32767)&(IntValue<65536))
	{
		//tag
		*ptr=2;
		//len
		*(ptr+1)=3;
		//
		*(ptr+2)=0;
		*(ptr+3)=a[1];
		*(ptr+4)=a[0];
		return 5;
	}
	return FAILURE;
}

//返回偏移量 Error -1
int Pack_SerialNumber(unsigned short cSerialNumber ,char *ptr)
{
	unsigned char INTEGERBuf[10];
	int           len;

	len=ConvertToASN1Interger(cSerialNumber,&INTEGERBuf[0]);
	if ((len==FAILURE) ||(len>10))
		return FAILURE;
	
	memcpy(ptr,&INTEGERBuf[0],len);
	return len;
}

//返回偏移量 Error -1
int Pack_NUMBEROFPAGES(unsigned char cNumberOfPages,char *ptr)
{
	unsigned char INTEGERBuf[10];
	int           len;

	len=ConvertToASN1Interger(cNumberOfPages,&INTEGERBuf[0]);
	if ((len==FAILURE) ||(len>10))
		return FAILURE;
	
	memcpy(ptr,&INTEGERBuf[0],len);
	return len;
}

//返回偏移量 Error -1
int Pack_DATACODINGSCHEME(unsigned char cDataCodingScheme,char *ptr)
{
	unsigned char INTEGERBuf[10];
	int           len;

	len=ConvertToASN1Interger(cDataCodingScheme,&INTEGERBuf[0]);
	if ((len==FAILURE) ||(len>10))
		return FAILURE;
	
	memcpy(ptr,&INTEGERBuf[0],len);
	return len;
}

/*
//返回偏移量 Error -1
//小区列表
//从叶子往根打包
 */
int Pack_CELLLIST(CELLLIST_t *s_CELLLIST,char *ptr)
{
	unsigned char INTEGERBuf[2048];
	int           len;
	int           lentmp1,lentmp2;
	int           i;
	int           BufOffset=2048;
	unsigned char LenBuf[10];

	memset(INTEGERBuf,0,2048);

	for(i=0;i<s_CELLLIST->iLength;i++)
	{
		BufOffset=BufOffset-sizeof(CELLID_t);
		memcpy(&INTEGERBuf[BufOffset],&s_CELLLIST->s_CellList[s_CELLLIST->iLength-i-1].cCellId[0],sizeof(CELLID_t));
		//len
		BufOffset--;
		INTEGERBuf[BufOffset]=4;
		//cell-id tag
		BufOffset--;
		INTEGERBuf[BufOffset]=4;
	}

	//SEQUENCE OF Cell-Id len 

    lentmp1=2048-BufOffset;
	lentmp2=CovertASN1LEN(lentmp1,&LenBuf[0]);
	if (lentmp2==FAILURE)
		return FAILURE;
	BufOffset=BufOffset-lentmp2;
	memcpy(&INTEGERBuf[BufOffset],&LenBuf[0],lentmp2);

	//SEQUENCE OF Cell-Id Tag
	BufOffset--;
	INTEGERBuf[BufOffset]=0x30;

	//contain of celliddisc
	BufOffset--;
	INTEGERBuf[BufOffset]=s_CELLLIST->cCellIdDisc;
	//len
	BufOffset--;
	INTEGERBuf[BufOffset]=1;
	//tag
	BufOffset--;
	INTEGERBuf[BufOffset]=0x04;

	
	//Length参数
    lentmp1=ConvertToASN1Interger(s_CELLLIST->iLength,&LenBuf[0]);
	BufOffset=BufOffset-lentmp1;
	memcpy(&INTEGERBuf[BufOffset],&LenBuf[0],lentmp1);

	len=2048-BufOffset;
	//SEQUENCE OF Celllist len 
	lentmp2=CovertASN1LEN(len,&LenBuf[0]);
	if (lentmp2==FAILURE)
		return FAILURE;
	BufOffset=BufOffset-lentmp2;
	memcpy(&INTEGERBuf[BufOffset],&LenBuf[0],lentmp2);

	//tag
    BufOffset--;
	INTEGERBuf[BufOffset]=0x30;
	
	len=2048-BufOffset;
	memcpy(ptr,&INTEGERBuf[BufOffset],len);

	return len;
}

//返回长度标签的长度
int CovertASN1LEN(int LenValue,unsigned char *ptr)
{
	unsigned char a[4];

	if (LenValue<128)
	{
		(*ptr)=LenValue;
		return 1;
	}
	if((LenValue<256)&&(LenValue>127))
	{
		(*ptr)=0x81;
		(*(ptr+1))=LenValue;
		return 2;
	}
	if((LenValue<65536)&&(LenValue>255))
	{
		memcpy(&a[0],&LenValue,4);
		(*ptr)=0x82;
		(*(ptr+1))=a[1];
		(*(ptr+2))=a[0];
		return 3;
	}
	return FAILURE;

}


/* 返回偏移量 Error -1 */
int Pack_REPETITIONRATE(unsigned short cRepetitionRate,char *ptr)
{
	unsigned char INTEGERBuf[10];
	int           len;

	len=ConvertToASN1Interger(cRepetitionRate,&INTEGERBuf[0]);
	if ((len==FAILURE) ||(len>10))
		return FAILURE;
	
	memcpy(ptr,&INTEGERBuf[0],len);
	return len;
}

/* 返回偏移量 Error -1 */
//max 65535
int Pack_NOOFBROADCASTREQ(unsigned short cNumberOfBroadcastReq,char *ptr)
{
	unsigned char INTEGERBuf[10];
	int           len;

	len=ConvertToASN1Interger(cNumberOfBroadcastReq,&INTEGERBuf[0]);
	if ((len==FAILURE) ||(len>10))
		return FAILURE;
	
	memcpy(ptr,&INTEGERBuf[0],len);
	return len;
}

//返回偏移量 Error -1
//小区列表
//从叶子往根打包
int Pack_CBSPAGEINF(CBSPAGEINF_t *s_CBSPAGEINF,char *ptr)
{
	unsigned char CBSPAGEINFBuf[2048];
	int           len;
	int           lentmp2;
	int           i;
	int           BufOffset=2048;
	unsigned char LenBuf[10];

	if (s_CBSPAGEINF->cLength>15)
		return FAILURE;

	memset(CBSPAGEINFBuf,0,2048);

	for(i=0;i<s_CBSPAGEINF->cLength;i++) 
	{
		BufOffset=BufOffset-MAXPAGELEN;
		memcpy(&CBSPAGEINFBuf[BufOffset],&s_CBSPAGEINF->s_CbsPageInf[s_CBSPAGEINF->cLength-1-i].cMessageInfoPage[0],MAXPAGELEN);
		//len
		BufOffset--;
		CBSPAGEINFBuf[BufOffset]=MAXPAGELEN;
		//message info page tag
		BufOffset--;
		CBSPAGEINFBuf[BufOffset]=4;

		//Message-Info-Useful-Octets contain
		BufOffset--;
        CBSPAGEINFBuf[BufOffset]=s_CBSPAGEINF->s_CbsPageInf[s_CBSPAGEINF->cLength-1-i].cMessageInfoUsefulOctets;
		//Message-Info-Useful-Octets len
		BufOffset--;
        CBSPAGEINFBuf[BufOffset]=1;
		//Message-Info-Useful-Octets tag
		BufOffset--;
        CBSPAGEINFBuf[BufOffset]=2;

		//Sequence page-info len
		BufOffset--;
        CBSPAGEINFBuf[BufOffset]=87;
		//Sequence page-info tag
		BufOffset--;
        CBSPAGEINFBuf[BufOffset]=0x30;
	}

	//Sequence cbs-Page-Inf len
	len=2048-BufOffset;
	lentmp2=CovertASN1LEN(len,&LenBuf[0]);
	if (lentmp2==FAILURE)
		return FAILURE;
	BufOffset=BufOffset-lentmp2;
	memcpy(&CBSPAGEINFBuf[BufOffset],&LenBuf[0],lentmp2);

	//Sequence cbs-Page-Inf tag
    BufOffset--;
	CBSPAGEINFBuf[BufOffset]=0x30;

	len=2048-BufOffset;
	memcpy(ptr,&CBSPAGEINFBuf[BufOffset],len);

	return len;
}

//返回偏移量 Error -1
int Pack_OldSerialNumber(unsigned short cSerialNumber ,char *ptr)
{
	unsigned char INTEGERBuf[10];
//	unsigned char OldSerialNumberBuf[20];
	int           len;

	len=ConvertToASN1Interger(cSerialNumber,&INTEGERBuf[0]);
	if ((len==FAILURE) ||(len>10))
		return FAILURE;
	
//	OldSerialNumberBuf[0]=0x83;
//	OldSerialNumberBuf[1]=len;
//	memcpy(&OldSerialNumberBuf[1],&INTEGERBuf[1],len-1);
//	len=len+2;

	INTEGERBuf[0]=0x83;
//	memcpy(ptr,&OldSerialNumberBuf[0],len);
	memcpy(ptr,&INTEGERBuf[0],len);
	return len;
}

//返回偏移量 Error -1
int Pack_CATEGORY(unsigned char cCategory, char *ptr)
{
	unsigned char CATEGORYBuf[10];

	//应用类标签
//	CATEGORYBuf[0]=0x82;
	//len
//	CATEGORYBuf[1]=3;

	//INTEGER tag
	CATEGORYBuf[0]=2;
	//INTEGER len
	CATEGORYBuf[1]=1;
	CATEGORYBuf[2]=cCategory;

	memcpy(ptr,&CATEGORYBuf[0],3);
	
	return 3;
}

//返回偏移量 Error -1
int Pack_CHANNELINDICATOR(unsigned char cChannelIndicator, char *ptr)
{
	unsigned char CHANNELINDICATORbuf[10];

	//应用类标签
	CHANNELINDICATORbuf[0]=0x84;
	//len
	CHANNELINDICATORbuf[1]=2;

	//INTEGER tag
//	CHANNELINDICATORbuf[2]=2;
	//INTEGER len
//	CHANNELINDICATORbuf[3]=1;
	CHANNELINDICATORbuf[2]=cChannelIndicator;

	memcpy(ptr,&CHANNELINDICATORbuf[0],3);
	
	return 3;

}

//返回偏移量 Error -1
//max 40
int Pack_SCHEDULEPERIOD(unsigned char cSchedulePeriod, char *ptr)
{
	unsigned char buf[10];

	//应用类标签
	buf[0]=0x86;
	//len
	buf[1]=3;

	//INTEGER tag
	buf[2]=2;
	//INTEGER len
	buf[3]=1;
	buf[4]=cSchedulePeriod;

	memcpy(ptr,&buf[0],5);
	
	return 5;
}

//返回偏移量 Error -1
//max 40
int Pack_RESERVEDSLOTS(unsigned char cReservedSlots, char *ptr)
{
	unsigned char buf[10];

	//应用类标签
	buf[0]=0x82;
	//len
	buf[1]=3;

	//INTEGER tag
	buf[2]=2;
	//INTEGER len
	buf[3]=1;
	buf[4]=cReservedSlots;

	memcpy(ptr,&buf[0],5);
	
	return 5;
}

//返回偏移量 Error -1
int Pack_RecoveryIndication(RECOVERYINDICATION_t *s_RecoveryIndication, char *ptr)
{
	unsigned char buf[10];

	//BOOLEAN 标签
	buf[0]=1;
	//len
	buf[1]=1;
	//
	buf[2]=s_RecoveryIndication->bRecoveryIndicator;

	memcpy(ptr,&buf[0],3);
	
	return 3;
}



//打包WRITEREPLACE_REQUEST操作元素
//返回包长  ERROR -1
int Pack_WRITEREPLACE_REQUEST(WRITEREPLACE_REQUEST_t *s_WriteReplaceRequest,unsigned char *ptr)
{
	int len;
	int lentmp;
	unsigned char LenBuf[10];
	unsigned char Buf[20];
	int i=20;
	unsigned char PackBuf[2048];
	int Offset=0;
	

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

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

    //p_NumberOfPages
	if (s_WriteReplaceRequest->p_NumberOfPages.bFlag==1)
	{	
		len=Pack_NUMBEROFPAGES(s_WriteReplaceRequest->p_NumberOfPages.cNumberOfPages,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

    //p_DataCodingScheme
	if (s_WriteReplaceRequest->p_DataCodingScheme.bFlag==1)
	{	
		len=Pack_NUMBEROFPAGES(s_WriteReplaceRequest->p_DataCodingScheme.cDataCodingScheme,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

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

	//RepetionRate
	if (s_WriteReplaceRequest->p_RepetionRate.bFlag==1)
	{
		len=Pack_REPETITIONRATE(s_WriteReplaceRequest->p_RepetionRate.iRepetitionRate,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

	//NoOfBroadcastReq
	if (s_WriteReplaceRequest->p_NoOfBroadcastReq.bFlag==1)
	{
		len=Pack_NOOFBROADCASTREQ(s_WriteReplaceRequest->p_NoOfBroadcastReq.iNumberOfBroadcastReq,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

	//CbsPageInf
	if (s_WriteReplaceRequest->p_CbsPageInf.bFlag==1)
	{
        len=Pack_CBSPAGEINF(&s_WriteReplaceRequest->p_CbsPageInf,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

	//OldSerialnumber (O)

⌨️ 快捷键说明

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