?? cbcbscpack.c
字號:
#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 + -