1.怎么获得切入切出的serverId,2.A/ABIS接口相邻小区查询如果查到怎么应答,在Abis切出投送中怎么在MAP1中查找Serverid,发送相关连接

user530736947 2012-05-15 02:37:04
/************通用包头*************/
typedef struct
{
u_int16 len; //包含长度本身两个字节和以下所有数据包长度
u_int8 type; //消息类型
u_int32 tsSec; //时间戳 秒
u_int32 tsUSec; //时间戳 微秒
u_int8 intf; //接口类型 ,1-ABIS,2-A,3-切换合成,4,A+ABIS
u_int8 serverId; //处理进程Id
char data[0]; //数据部分
}RecPkg;

/***切出事件上报包头*********/
typedef struct
{
u_int16 lac; //源Lac
u_int16 ci; //源Ci
u_int16 targetBcch; //目标Bcch
u_int8 targetBsic; //目标Bsic
u_int8 hoRef; //切换参考
u_int8 targetChannelId; //目标信道
}AbisHoOutReport;


/********切入事件上报包头***/
typedef struct
{
u_int16 lac; //本小区(切入方)Lac
u_int16 ci; //本小区(切入方)Ci
u_int16 bcch; //本小区(切入方)Bcch
u_int8 bsic; //本小区(切入方)Bsic
u_int8 horef; //本小区(切入方)切换参考
u_int8 channelId; //本小区(切入方)信道Id
}AbisHoInReport;


/***A相邻小区上报包头*****/
typedef struct
{
u_int16 lac; //源LAC 【在别的BSC】
u_int16 ci; //源Ci 【在别的BSC】
u_int16 nbrlac; //目标Lac 【当前的BSC】
u_int16 nbrci; //目标Ci 【当前的BSC】
u_int16 nbrbcch; //目标Bcch【当前的BSC】
u_int8 nbrbsic; //目标Bsic【当前的BSC】
}ANbrCellReport;

/***Abis/A接口 相邻小区查询***/
typedef struct
{
u_int16 lac; //本小区LAC
u_int16 ci; //本小区Ci
}AABISNbrCellRequest;

/***相邻小区包头********/
typedef struct
{
u_int16 nbrlac; //邻区Lac
u_int16 nbrci; //邻区ci
u_int16 nbrbcch; //邻区bcch
u_int8 nbrbsic; //邻区bisc

}NbrField;

/*******Abis/A接口 相邻小区查询应答****/
typedef struct
{
u_int16 lac; //本小区LAC
u_int16 ci; //本小区Ci
u_int8 nbrcount; //相邻小区个数
NbrField nbrs[100]; //相邻的小区
}AABISNbrCellRequestAck;


/****Abis切出投送到切换合成*****/
typedef struct
{
u_int16 targetlac; //目标LAC
u_int16 targetci; //目标Ci
u_int8 horef; //切换参考
u_int8 channelId; //信道Id
char cdr[CDRLEN]; //源Cdr内容
}AbisHoOutNotice;


/*****A切出投送到切换合成*******/
typedef struct
{
u_int16 targetlac; //目标Lac
u_int16 tartgetci; //目标Ci
u_int8 horef; //切换参考
char cdr[CDRLEN]; //源Cdr内容
}AHoOutNotice;

/**********map1表结构*******/
typedef struct
{
u_int16 lac;
u_int16 ci;
u_int32 insertTs;
u_int16 serverId;
}NbrCellMap;


/*******小区结构*****/
typedef struct
{
u_int8 cfg;
u_int16 nbrlac;
u_int16 nbrci;
u_int16 nbrbcch;
u_int8 nbrbsic;
}NbrCell;


/****map2表结构**********/
typedef struct
{
u_int8 serverId;
NbrCell Nbr[64];
}CellInfo;


/****初始化NbrClMap,CellInfoMAP*****/
typedef map< u_int64,NbrCellMap> NbrClMap;
NbrClMap mapHandover ;
typedef map <u_int16,CellInfo> CellInfoMAP;
CellInfoMAP mapCell;

/*******Abis切出事件上报***************/
void ParserHo::ProcAbisHoOutReport(RecPkg *pkg)
{
AbisHoOutReport *pOutHoReport = (AbisHoOutReport*)pkg->data;
pOutHoReport->lac;
pOutHoReport->ci;
pOutHoReport->targetBcch;
pOutHoReport->targetBsic;
pOutHoReport->targetChannelId;

u_int64 key = pOutHoReport->targetBcch;
key =( key << 8) | pOutHoReport->targetBsic;
key = (key << 8) | pOutHoReport->hoRef;
key = (key << 8) | pOutHoReport->targetChannelId;

NbrClMap::iterator iter;
iter = mapHandover.find(key);

if(iter != mapHandover.end())
{

iter->second.lac = pOutHoReport->lac;
iter->second.ci = pOutHoReport->ci;
iter->second.insertTs = pkg->tsSec;
// iter->second.serverId = pkg->serverId;

}
else
{
NbrCellMap cellmap;
cellmap.lac = pOutHoReport->lac;
cellmap.ci = pOutHoReport->ci;
cellmap.insertTs = pkg->tsSec;
cellmap.serverId = pkg->serverId;
mapHandover.insert(NbrClMap::value_type(key,cellmap));
}

}

/*****Abis切入事件上报******/
u_int32 i = 0;
void ParserHo::ProcAbisHoInReport(RecPkg *pkg)
{
AbisHoInReport *pInHoReport = (AbisHoInReport *)pkg->data;


u_int64 key = pInHoReport->bcch;
key =( key << 8) | pInHoReport->bsic;
key = (key << 8) | pInHoReport->horef;
key = (key << 8) | pInHoReport->channelId;

NbrClMap::iterator itor;
itor = mapHandover.find(key);

if(itor != mapHandover.end())
{
if ((pkg->tsSec - itor->second.insertTs) < 2)
{
u_int16 lac = itor->second.lac;
u_int16 ci = itor->second.ci;

u_int32 key = lac ;
key = (lac << 16) | ci;

CellInfoMAP::iterator itr;
itr = mapCell.find(key);

if (itr != mapCell.end())
{
CellInfo *ClInfo = (CellInfo *)itr->second;
ClInfo->serverId = pkg->serverId;

for (int i = 0; i < 64; i++)
{
if (ClInfo.Nbr[i].cfg == 1)
{
if (ClInfo.Nbr[i].nbrlac == pInHoReport->lac && ClInfo.Nbr[i].nbrci == pInHoReport->ci)
{
ClInfo.Nbr[i].nbrbcch = pInHoReport->bcch;
ClInfo.Nbr[i].nbrbsic = pInHoReport->bsic;
return;
}
}
else
{
ClInfo.Nbr[i].cfg = 1;
ClInfo.Nbr[i].nbrlac = pInHoReport->lac;
ClInfo.Nbr[i].nbrci = pInHoReport->ci;
ClInfo.Nbr[i].nbrbcch = pInHoReport->bcch;
ClInfo.Nbr[i].nbrbsic = pInHoReport->bsic;
return;
}
}
}
else
{
CellInfo ClInfo ;
ClInfo->serverId = pkg->serverId;
ClInfo.Nbr[0].cfg = 1;
ClInfo.Nbr[0].nbrlac = pInHoReport->lac;
ClInfo.Nbr[0].nbrci = pInHoReport->ci;
ClInfo.Nbr[0].nbrbcch = pInHoReport->bcch;
ClInfo.Nbr[0].nbrbsic = pInHoReport->bsic;
mapCell.insert(CellInfoMAP::value_type(key,ClInfo)); // lac ci
}

}
mapHandover.erase(itor);
}

}

/******A相邻小区上报******/
void ParserHo::ProcANbrCellReport(RecPkg *pkg)
{
ANbrCellReport *pNbrCell = (ANbrCellReport *)pkg->data;

u_int32 key = pNbrCell->lac;
key = (key << 16) | pNbrCell->ci;

CellInfoMAP::iterator iter;
iter = mapCell.find(key);


if (iter != mapCell.end())
{
iter->second.serverId = pkg->serverId;
for (int i = 0; i < 64; i++)
{
if (iter->second.Nbr[i].nbrlac == pNbrCell->lac && iter->second.Nbr[i].nbrci == pNbrCell->ci)
{
iter->second.Nbr[i].nbrbcch = pNbrCell->nbrbcch;
iter->second.Nbr[i].nbrbsic = pNbrCell->nbrbsic;
return;
}
}
}
else
{
CellInfo ClInfo ;
ClInfo->serverId = pkg->serverId;
ClInfo.Nbr[0].cfg = 1;
ClInfo.Nbr[0].nbrlac = pNbrCell->nbrlac;
ClInfo.Nbr[0].nbrci = pNbrCell->nbrci;
ClInfo.Nbr[0].nbrbcch = pNbrCell->nbrbcch;
ClInfo.Nbr[0].nbrbsic = pNbrCell->nbrbsic;
mapCell.insert(CellInfoMAP::value_type(key,ClInfo));

}

}

/*****A/ABIS接口,相邻小区查询*****/
void ParserHo::ProcAABISNbrCellRequest(RecPkg *pkg)
{
AABISNbrCellRequest *AABISNbrCell = (AABISNbrCellRequest *)pkg->data;
/*AABISNbrCell->lac
AABISNbrCell->ci
*/

u_int32 key = AABISNbrCell->lac;
key = (key << 16) | AABISNbrCell->ci;
CellInfoMAP::iterator itr;
itr = mapCell.find(key);
if (itr != mapCell.end())
{
u_int32 lens;
char buf[2048];
memset(buf,0,2048);
u_int32 time1 = time(NULL);
RecPkg *pRecPkg = (RecPkg*)buf;
u_int32 MapLen = pkg->len;
pRecPkg->serverId = pkg->serverId;
pRecPkg->intf = pkg->intf;
pRecPkg->tsSec = time1;
pRecPkg->tsUSec = GetTickCount()*1000;
pRecPkg->type = 0x84;

AABISNbrCellRequestAck *AABISNbrCellAck = (AABISNbrCellRequestAck *)pkg->data;
CellInfo Clinfo;
for (int i = 0; i < 64; i++)
{
if( Clinfo.Nbr[i].cfg == 1)
{
Clinfo.serverId = pkg->serverId;
Clinfo.Nbr[i].nbrlac = AABISNbrCellAck->nbrs[i].nbrlac;
Clinfo.Nbr[i].nbrci = AABISNbrCellAck->nbrs[i].nbrci;
Clinfo.Nbr[i].nbrbcch = AABISNbrCellAck->nbrs[i].nbrbcch;
Clinfo.Nbr[i].nbrbsic = AABISNbrCellAck->nbrs[i].nbrbsic;
}

}

TCPClient tcpcli;

memcpy(pRecPkg->data,&Clinfo,sizeof(Clinfo));
lens = MapLen + AABISNbrCellAck->nbrcount*7;
tcpcli.SendMsg(buf,lens);
}

}

/****Abis切出投送到切换合成*******/
void ParserHo::ProcAbisHoOutNotice(RecPkg *pkg)
{
AbisHoOutNotice *AbisOut = (AbisHoOutNotice *)pkg->data;
AbisOut->targetlac;
AbisOut->targetci;
AbisOut->horef;
AbisOut->channelId;
}


...全文
130 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧