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

📄 x25function.c

📁 CBS(小区广播)程序实现手稿
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "..\sys\Include.h "


int AllocBscConnectInfo();
int ReleaseBscConnectInfo(int Tid);
int Process_BSC_Message(char *MessageBuf,int Len,int Tid);
/* 从X25发送消息缓冲区中取出一条消息信息 
   WaitTime_len: 等待时长ms
 * 返回
    <0: 超时
	>1: 成功
 */
int X25GetCBESendMsg(BSCMESSAGE_t *s_BSCMessage,int Tid, int WaitTime_len);
//检查绑定参数
int Process_VBind_init(VBIND_t *s_VBind);

/*
//连接到BSC并绑定
int ConnectToBsc(CBEMESSAGE_t *s_CBEMessage)
{
	int           iReturnValue;
	int           Tid;
	char          *BscIdetifier;
	VBIND_t       *LPVbind;
	char          PackBindBuf[1024];
	char          UnpackBind[1024]; 
	int           len;
	unsigned char sUserInfo[128];
	unsigned char nUserInfoLen=1;

	memset(PackBindBuf,0,1024);

	LPVbind=(VBIND_t *)&s_CBEMessage->cMessage[0];

	iReturnValue=Process_VBind_init(LPVbind);
	if (iReturnValue<0)
	{
		return iReturnValue;
	}
     
	BscIdetifier=LPVbind->BSCIdentifier;

	//BscConnectInfo是否配置
	if (Tid=GetTid(BscIdetifier)<0)
	{
		printf("Unrecognized BSC!\n");
		return UNRECOGNIZED_BSC;
	}

	//是否已经绑定
	if (s_BscConnectInfo[Tid].DownlinkStatus==BSC_STEADY)
	{
		printf("Already bind!\n");
		return ALREADY_BIND;
	}

	if ((s_BscConnectInfo[Tid].X25DownlinkHandle=CallToRemote(s_BscConnectInfo[Tid].BscAddr, g_X25LocalAddr,  s_BscConnectInfo[Tid].BscPort, sUserInfo, nUserInfoLen, 1))<0)
	{
		printf("X25connect error!\n");
		return X25_ERROR;
	}
	else
	{
		printf("X25 connected!\n");


		//进行绑定操作
        //结果报告给cbc_proxy 
		//set cbc status
		len=Pack_cbse_VBIND(LPVbind,PackBindBuf);
        
		//发送X25绑定请求数据
		X25SendData(s_BscConnectInfo[Tid].X25DownlinkHandle,PackBindBuf,len );
        
		//接受绑定结果参数
		len=X25RecvData(s_BscConnectInfo[Tid].X25DownlinkHandle, UnpackBind);		
		if (len<0)
		{
			return X25_ERROR;
		}

		//绑定失败
		if (UnpackBind[0]!=CBSE_BIND_CONFIRM)
		{
			memset(&CBCBSC_Unpack,0,sizeof(CBC_BSC_UNPACK_t));
			CbcBscUnpackAMessage((MESSAGE_t *)&UnpackBind[0],len);
			return BSC_BIND_FAILURE;			
		}
		//==========

		//发送接受线程互斥量
		s_BscConnectInfo[Tid].ThreadEvent=CreateEvent(NULL,TRUE,TRUE,NULL);
		//创建接受数据线程
		s_BscConnectInfo[Tid].X25ReceiveThreadHandle=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)X25DownLinkRecieveData,&Tid,0,NULL);
		/* 创建发送数据线程 
		s_BscConnectInfo[Tid].X25SendThreadHandle=
			CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)X25SendMessage,&Tid,0,NULL);

		memset(&s_BscConnectInfo[Tid].s_X25SendMessageBuf,0,sizeof(X25_SEND_MESSAGE_BUF_t));

		s_BscConnectInfo[Tid].s_X25SendMessageBuf.MsgFull = CreateSemaphore(NULL,0,X25MSG_QUEUE_SIZE,NULL);
		s_BscConnectInfo[Tid].s_X25SendMessageBuf.MsgEmpty = CreateSemaphore(NULL,X25MSG_QUEUE_SIZE,X25MSG_QUEUE_SIZE,NULL);
		s_BscConnectInfo[Tid].s_X25SendMessageBuf.MsgMutex = CreateMutex(NULL,FALSE,NULL);



	}

	/* 延迟一秒,保证创建线程时传递的参数不被释放 
	Sleep(1000);

	return SUCCESS;
}
*/

void initBscConnectInfo()
{
	int i;
	memset(s_BscConnectInfo,0,sizeof(BSC_CONNECT_INFO_t)*MAX_BSC_CONNECT);
	/* 设置连接状态 */
	for (i=0;i<MAX_BSC_CONNECT;i++)
	{
		s_BscConnectInfo[i].DownlinkStatus=BSC_DISCONNECT;
		s_BscConnectInfo[i].UplinkStatus=BSC_DISCONNECT;
	}
}

/* 根据BscIdentifier返回s_BscConnectInfo的数组下标Tid */
int GetTid(char *Bsc)
{
	int i;
	for(i=0;i<MAX_BSC_CONNECT; i++)
	{
		if (memcmp(&s_BscConnectInfo[i].BscIdentifier,Bsc,BSC_INDENTIFIER_LEN)==0)
		{
			return i;
		}
	}
	return FAILURE;
}

//分配连接信息数组
/*
int AllocBscConnectInfo()
{
	int i;
	for(i=0;i<MAX_BSC_CONNECT; i++)
	{
		if (s_BscConnectInfo[i].InUse==0)
			return i;
	}
	return FAILURE;
}

//释放连接信息数组
int ReleaseBscConnectInfo(int Tid)
{
	if ((Tid<0)||(Tid>=MAX_BSC_CONNECT))
		return FAILURE;

	s_BscConnectInfo[Tid].InUse=0;
	ReleaseMutex(s_BscConnectInfo[Tid].ThreadMutex);
	return SUCCESS;
}
*/

/* 接受X25数据 */
void X25DownLinkRecieveData(int *Tid)
{
	int           nTid;
	int           Len;
	unsigned char ReceiveBuf[MESSAGE_LEN];

#ifdef  OPEN_WARNING	
	/* 统计告警描述字串 */
	unsigned char cWarningDescription[WARNING_DESC_LEN];
#endif

	nTid=*Tid;

	for(;;)
	{
		/* 需要退出连接 */
		if (s_BscConnectInfo[nTid].ConnectOpen==OFF)
		{
			if (s_BscConnectInfo[nTid].DownlinkStatus==BSC_STEADY)
			{
				HangupConnectNOWAIT(s_BscConnectInfo[nTid].X25DownlinkHandle,NULL, NULL ,NULL,0);
//    			HangupConnect(s_BscConnectInfo[nTid].X25DownlinkHandle,&s_BscConnectInfo[nTid].BscAddr[0], g_X25LocalAddr ,NULL,0);
			    Del_Port_lsn(nTid,0);
				s_BscConnectInfo[nTid].DownlinkStatus=BSC_DISCONNECT;				
			}
			ExitThread(1);
		}


		if ((Len=X25NoWaitRecvData(s_BscConnectInfo[nTid].X25DownlinkHandle , ReceiveBuf ,XD_NOTO,nTid))<=0)
		{
			s_BscConnectInfo[nTid].DownlinkStatus=BSC_DISCONNECT;
            HangupConnectNOWAIT(s_BscConnectInfo[nTid].X25DownlinkHandle,NULL, NULL ,NULL,0);
//   		HangupConnect(s_BscConnectInfo[nTid].X25DownlinkHandle,&s_BscConnectInfo[nTid].BscAddr[0], g_X25LocalAddr ,NULL,0);
		    Del_Port_lsn(nTid,0);

			printf("X25 downlinkConnect Exit,RemoteAddr=%s\n",s_BscConnectInfo[nTid].BscAddr);

			/* 告警 */
#ifdef  OPEN_WARNING
			memset(cWarningDescription,0,sizeof(WARNING_DESC_LEN));
			sprintf(cWarningDescription,"下行连路断连,BSCID=%d",*((unsigned short *)s_BscConnectInfo[nTid].BscIdentifier));
			SendWarningToOmp(LINK_WARNING,BSC_LINK,cWarningDescription);
#endif

			ExitThread(1);
			break;
		}
		else
		{
			Process_BSC_Message(ReceiveBuf,Len,nTid);
		}
	}
	


	ExitThread(1);
}

/* 处理BSC消息 */
int Process_BSC_Message(char *MessageBuf,int Len,int Tid)
{
	unsigned char MessageType;
	int iReturnValue;

	MessageType=*(unsigned char *)MessageBuf;

	memset(&CBCBSC_Unpack,0,sizeof(CBC_BSC_UNPACK_t));

	/* 解包BSC操作参数 */
	iReturnValue=CbcBscUnpackAMessage((MESSAGE_t *)MessageBuf, Len);
	if (iReturnValue<0)
	{
		printf("Unpack BSC Message Error !\n");
		return FAILURE;
	}

	switch (MessageType)
	{
		case CBSE_REPORT_SUCCESS: /* Report_Success */
			{

#ifdef DEBUG_PRINT
            printf("Receive REPORT_SUCCESS Message from BSC, Tid=%d.\n",Tid); 
			Print_BSC_Response(s_BscConnectInfo[Tid].s_Pid,
							   	s_BscConnectInfo[Tid].MessageType,
        					    Tid,
		        			    &CBCBSC_Unpack);
#endif

				iReturnValue=Process_Response(Tid);
				/* 释放进程 */
				if (iReturnValue==END)
				{
					if (free_pid((char *)&s_BscConnectInfo[Tid].s_Pid)<0)
					{
						//sys error
						printf("Warning! Free Pid Error.pid=%d\n",s_BscConnectInfo[Tid].s_Pid.iProcessId);
					}
				}

	//			if (iReturnValue<0)
	//				break;
				/* 事件有信号 */
/*
				if ((s_BscConnectInfo[Tid].MessageType!=CBSE_STATUS_CBCH_QUERY)
					&&(s_BscConnectInfo[Tid].MessageType!=CBSE_STATUS_MESSAGE_QUERY)
					&&(s_BscConnectInfo[Tid].MessageType!=CBSE_SET_DRX)
					)
					SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
*/
			}
			break;

		case CBSE_STATUS_CBCH_QUERY_RESP:/* Status_CBCH_Resp */
			{			
#ifdef DEBUG_PRINT
            printf("Receive STATUS_CBCH_QUERY_RESP from BSC, Tid=%d.\n",Tid); 
			Print_Status_CBCH_Query_RESP(s_BscConnectInfo[Tid].s_Pid,
							   			s_BscConnectInfo[Tid].MessageType,
        								Tid,
		        						&CBCBSC_Unpack);
#endif

				iReturnValue=Process_StatusCBCH_QUERY_RESP(Tid);
				/* 释放进程 */
				if (iReturnValue==END)
				{
					if (free_pid((char *)&s_BscConnectInfo[Tid].s_Pid)<0)
					{
						//sys error
						printf("Warning! Free Pid Error.pid=%d\n",s_BscConnectInfo[Tid].s_Pid.iProcessId);
					}
				}


				/* 事件有信号 */
/*				if (s_BscConnectInfo[Tid].MessageType==CBSE_STATUS_CBCH_QUERY)
					SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
*/
			}
			break;

		case CBSE_STATUS_MESS_QUERY_RESP: /* Status_Mess_Resp */
			{
#ifdef DEBUG_PRINT
            printf("Receive STATUS_MESSAGE_QUERY_RESP from BSC, Tid=%d.\n",Tid); 
			Print_StatusMessageQuery_Response(s_BscConnectInfo[Tid].s_Pid,
							   				s_BscConnectInfo[Tid].MessageType,
        									Tid,
		        							&CBCBSC_Unpack);
#endif				
				iReturnValue=Process_StatusMessage_QUERY_RESP(Tid);
				/* 释放进程 */
				if (iReturnValue==END)
				{
					if (free_pid((char *)&s_BscConnectInfo[Tid].s_Pid)<0)
					{
						//sys error
						printf("Warning! Free Pid Error.pid=%d\n",s_BscConnectInfo[Tid].s_Pid.iProcessId);
					}
				}


				/* 事件有信号 */
/*				if (s_BscConnectInfo[Tid].MessageType==CBSE_STATUS_MESSAGE_QUERY)
					SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
					*/
			}
			break;

        case CBSE_REJECT_RESPONSE: /* Report_Failure */
			{			
				/* 事件有信号 */
//				SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
			}
			break;

		case CBSE_BSC_RESTART: /* BSC_Restart */
			{
#ifdef DEBUG_PRINT
				printf("Receive BSC_RESTART from BSC, Tid=%d.\n",Tid); 
				Print_RestartIndication_Response(s_BscConnectInfo[Tid].s_Pid,
		    					   				s_BscConnectInfo[Tid].MessageType,
        					    				Tid,
		        				    			&CBCBSC_Unpack);
#endif			
				iReturnValue=Process_BSC_Restart_IND(Tid);
				/* 释放进程 */
				if (iReturnValue==END)
				{
					if (free_pid((char *)&s_BscConnectInfo[Tid].s_Pid)<0)
					{
						//sys error
						printf("Warning! Free Pid Error.pid=%d\n",s_BscConnectInfo[Tid].s_Pid.iProcessId);
					}
				}

				/* 事件有信号 */
/*   				if (s_BscConnectInfo[Tid].MessageType==CBSE_RESET)
				{
    				SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
				}
*/
			}
			break;

		case CBSE_FAILURE_IND:/* Failure_Ind */
			{
#ifdef DEBUG_PRINT
            printf("Receive CBSE_FAILURE_IND from BSC, Tid=%d.\n",Tid); 
			Print_FailureIndication_Response(s_BscConnectInfo[Tid].s_Pid,
		    					   			s_BscConnectInfo[Tid].MessageType,
        					    			Tid,
		        				    		&CBCBSC_Unpack);
#endif	
				Process_Failure_IND(Tid);
			}
			break;

		case CBSE_SET_DRX_REPORT:
			{
#ifdef DEBUG_PRINT
            printf("Receive SET_DRX_REPORT BSC, Tid=%d.\n",Tid); 
			Print_SETDRX_REPORT_Response(s_BscConnectInfo[Tid].s_Pid,
		    				   			s_BscConnectInfo[Tid].MessageType,
        					    		Tid,
		        				   		&CBCBSC_Unpack);
#endif	
				iReturnValue=Process_SET_DRX_REPORT(Tid);
				/* 释放进程 */
				if (iReturnValue==END)
				{
					if (free_pid((char *)&s_BscConnectInfo[Tid].s_Pid)<0)
					{
						//sys error
						printf("Warning! Free Pid Error.pid=%d\n",s_BscConnectInfo[Tid].s_Pid.iProcessId);
					}
				}
				/* 事件有信号 */
/*				if (s_BscConnectInfo[Tid].MessageType==CBSE_SET_DRX)
					SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
*/
			}
			break;

		default:
			printf("Unrecognized Message sent by BSC!\n");
			break;
	}

	return SUCCESS;
}

/* 发送消息线程函数 */
void X25SendMessage(int *Tid)
{
	int            nTid;
	BSCMESSAGE_t   s_BSCMessage;
	int            len;
	unsigned char  ReceiveBuf[MESSAGE_LEN];

#ifdef  OPEN_WARNING
	/* 统计告警描述字串 */
	unsigned char cWarningDescription[WARNING_DESC_LEN];
#endif

	nTid=*Tid;
    
	for(;;)
	{

	
		/* 从消息队列中取一条数据 */
		for(;;)
		{
			if(X25GetCBESendMsg(&s_BSCMessage,nTid,2000)==SUCCESS)
			{
    			break;
			}

			/* 需要退出连接 */
			if (s_BscConnectInfo[nTid].ConnectOpen==OFF)
			{

⌨️ 快捷键说明

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