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

📄 emm.c

📁 有线电视系统前端设备复用器原代码。 用语接受卫星信号
💻 C
📖 第 1 页 / 共 4 页
字号:
	pItemHead->parameter_type=EMMG2MUX_client_ID;
	pItemHead->parameter_length=4;
	*(unsigned long *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD))=g_emmg_stream_info[ucCACount].client_ID;
	pHead->message_length  +=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
	pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);

	pItemHead->parameter_type=EMMG2MUX_data_channel_ID;
	pItemHead->parameter_length=2;
	*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD))=g_emmg_stream_info[ucCACount].data_channel_ID;
	pHead->message_length  +=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
	pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);

	pItemHead->parameter_type=EMMG2MUX_data_stream_ID;
	pItemHead->parameter_length=2;
	/*---------------------------------------------------------------------------------------------------------*/
	/**(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD))=g_emmg_stream_info.data_channel_ID;*/
	/* updated 2004-02-16 by johnnyling                                                                        */
	/*---------------------------------------------------------------------------------------------------------*/
	*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD))=g_emmg_stream_info[ucCACount].data_stream_ID;
	pHead->message_length  +=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
	pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);

	pItemHead->parameter_type=EMMG2MUX_Data_id;
	pItemHead->parameter_length=2;
	*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD))=g_emmg_stream_info[ucCACount].data_id;
	pHead->message_length  +=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
	pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);

	pItemHead->parameter_type=EMMG2MUX_Data_type;
	pItemHead->parameter_length=1;
	*(unsigned char *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD))=g_emmg_stream_info[ucCACount].data_type;
	pHead->message_length  +=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
	pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);

	MsgLen=pHead->message_length + sizeof(CA_MESSAGE_HEAD);
/*	rc=ca_send(socket,EmmgSendBuf,MsgLen,g_ca_config.Para_Config[ucCACount].Network_Delay);*/
       rc=send(socket,EmmgSendBuf,MsgLen,0);
	if(rc!=MsgLen)
		return -1;
	else 
	{
		caSendLog(LOGTYPE_NORMAL,"emmg: Send stream status message,streamid=%d.",g_emmg_stream_info[ucCACount].data_stream_ID);
		return rc;		
	}
}

/*发送带宽分配信息*/
int  emmgsendstreambwallocation(int socket,unsigned char ucCACount,unsigned short bandWidth)
{
	CA_MESSAGE_HEAD      *pHead;
	CA_MESSAGE_ITEM_HEAD *pItemHead;
	int                  MsgLen=0;
	int i;
	int                  rc;

	char          EmmgSendBuf[2048];

	pHead=(CA_MESSAGE_HEAD *)EmmgSendBuf;
	pHead->protocol_version=0x02;
	pHead->message_type    =EMMG2MUX_STREAM_BW_ALLOCATION;
	pHead->message_length  =0;

	pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pHead + sizeof(CA_MESSAGE_HEAD));

	pItemHead->parameter_type=EMMG2MUX_client_ID;
	pItemHead->parameter_length=4;
	*(unsigned long *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD))=g_emmg_stream_info[ucCACount].client_ID;
	pHead->message_length  +=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
	pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);

	pItemHead->parameter_type=EMMG2MUX_data_channel_ID;
	pItemHead->parameter_length=2;
	*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD))=g_emmg_stream_info[ucCACount].data_channel_ID;
	pHead->message_length  +=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
	pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);

	pItemHead->parameter_type=EMMG2MUX_data_stream_ID;
	pItemHead->parameter_length=2;
	*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD))=g_emmg_stream_info[ucCACount].data_stream_ID;
	pHead->message_length  +=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
	pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);

	pItemHead->parameter_type=EMMG2MUX_Bandwidth;
	pItemHead->parameter_length=2;
	if(bandWidth<g_ca_config.Para_Config[ucCACount].EMM_BandWidth)
	{
	   *(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD))=bandWidth;
	}
	else
	{
	   *(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD))=g_ca_config.Para_Config[ucCACount].EMM_BandWidth;
	}
	pHead->message_length  +=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
	pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);

	MsgLen=pHead->message_length + sizeof(CA_MESSAGE_HEAD);
	/*rc=ca_send(socket,EmmgSendBuf,MsgLen,g_ca_config.Para_Config[ucCACount].Network_Delay);*/
       rc=send(socket,EmmgSendBuf,MsgLen,0);
	if(rc!=MsgLen)
		return -1;
	else 
	{
		caSendLog(LOGTYPE_NORMAL,"emmg: Send stream bandwidth allocation message,streamid=%d.",g_emmg_stream_info[ucCACount].data_stream_ID);
		return rc;		
	}
}

/*发送通道关闭应答*/
int  emmgsendchannelcloseresponse(int socket,unsigned long clientid,unsigned short channelid)
{

}

/*发送流关闭应答*/
int emmgsendstreamcloseresponse(int socket,unsigned long clientid,unsigned short channelid,unsigned short streamid,unsigned char unCACount)
{
	CA_MESSAGE_HEAD      *pHead;
	CA_MESSAGE_ITEM_HEAD *pItemHead;
	int                  MsgLen=0;
	int i;
	int                  rc;

	char              EmmgSendBuf[2048];
	
	pHead=(CA_MESSAGE_HEAD *)EmmgSendBuf;
	pHead->protocol_version=0x02;
	pHead->message_type    =EMMG2MUX_STREAM_CLOSE_RESPONSE;
	pHead->message_length  =0;

	pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pHead + sizeof(CA_MESSAGE_HEAD));
	pItemHead->parameter_type=EMMG2MUX_client_ID;
	pItemHead->parameter_length=4;
	*(unsigned long *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD))=clientid;
	pHead->message_length  +=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
	pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);
	pHead->message_length  +=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;

	pItemHead->parameter_type=EMMG2MUX_data_channel_ID;
	pItemHead->parameter_length=2;
	*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD))=channelid;
	pHead->message_length  +=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
	pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);
	pHead->message_length  +=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;

	pItemHead->parameter_type=EMMG2MUX_data_stream_ID;
	pItemHead->parameter_length=2;
	*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD))=streamid;
	pHead->message_length  +=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
	pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);
	pHead->message_length  +=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;

	MsgLen=pHead->message_length + sizeof(CA_MESSAGE_HEAD);

/*	rc=ca_send(socket,EmmgSendBuf,MsgLen,g_ca_config.Para_Config[unCACount].Network_Delay);*/

       rc=send(socket,EmmgSendBuf,MsgLen,0);
	if(rc!=MsgLen)
		return -1;
	else 
	{
		caSendLog(LOGTYPE_NORMAL,"emmg: Send stream close response message,streamid=%d.",streamid);
		return rc;	
	}
}

/*接收到EMMG后根据消息类型进入相应的处理流程*/
int  emmg_cmd_proc(char* RcvBuf,int socket,int pktlen,unsigned char ucIndex)
{
	int                  i,j=0;
	int                  rc;
	unsigned short		 cmd;
	CA_MESSAGE_HEAD      *pHead;
	CA_MESSAGE_ITEM_HEAD *pItemHead;
	unsigned long        clientid;
	unsigned short       channelid;
	unsigned short       streamid;
	unsigned char        tspkt_flag;
	unsigned char        data_type;
	unsigned short       data_id;
	unsigned short       bandwidth;
	
	int                  orgcmdlen,cmdlen;
	int                  msglen;
	char                 *pbuf;

	int            ucCACount =0;

	/*char           EmmgDatagramBuf[MAX_EMMG_BUFFER_LENGTH];*/
	
	msglen=pktlen;

	pbuf=RcvBuf;
	pHead=(CA_MESSAGE_HEAD *)pbuf;
	/*获得消息类型*/
	cmd=ca_get_message_type(pbuf);
	/*获得消息长度*/
	orgcmdlen=cmdlen=ca_get_message_length(pbuf);

	pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pHead + sizeof(CA_MESSAGE_HEAD));

	while(msglen>0)
	{
		switch(cmd)
		{
			/*建立通道请求*/
			case EMMG2MUX_CHANNEL_SET_UP:
				while(cmdlen>0)
				{
					switch(pItemHead->parameter_type)
					{
						case EMMG2MUX_client_ID:
							clientid = *(unsigned long *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
						case EMMG2MUX_data_channel_ID:
							channelid = *(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
						case EMMG2MUX_section_TSpkt_flag:
							tspkt_flag =*(unsigned char *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
					}
					cmdlen-=pItemHead->parameter_length + sizeof(CA_MESSAGE_ITEM_HEAD);
					pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);
				}

				for(i=0;i<3;i++)
				{
					 j = (g_ca_config.Para_Config[i].CA_system_id << 16) | g_ca_config.Para_Config[i].EMM_client_id;
					if(j== clientid)
					{
						g_emmg_channel_info[i].client_ID = clientid;
						g_emmg_channel_info[i].data_channel_ID = channelid;
						g_emmg_channel_info[i].section_TSpket_flag = tspkt_flag;
						break;
					}
				}

				Display("emmg:receive channel setup:ClientId:%d",clientid);				
				/*未找到相应的clientId,不进行相应处理*/
				if(i==3)
				{
					g_Emmg_connected[ucIndex]=0;
					break;
				}
				caSendLog(LOGTYPE_NORMAL,"emmg: Receive channel setup message,channelid=%d",g_emmg_channel_info[i].data_channel_ID);
				/*发送通道状态信息,表示响应通道连接请求*/

				emmgsendchannelstatus(socket,i);
				break;
			/*通道测试*/
			case EMMG2MUX_CHANNEL_TEST:
				while(cmdlen>0)
				{
					switch(pItemHead->parameter_type)
					{
						case EMMG2MUX_client_ID:
							clientid=*(unsigned long *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
						case EMMG2MUX_data_channel_ID:
							channelid=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
					}
					cmdlen-=pItemHead->parameter_length + sizeof(CA_MESSAGE_ITEM_HEAD);
					pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);
				}

				for(i=0;i<3;i++)
				{
					if(g_emmg_channel_info[i].client_ID == clientid)
						break;
				}
				/*未搜索到的clientid,不进行测试应答*/
				if(i==3)
					break;

				caSendLog(LOGTYPE_NORMAL,"emmg: Receive channel test essage,channelid=%d.",channelid);
				Display("emmg: Receive channel test essage,clientid=%d.",clientid);
				/* 通道测试住息,发送状态信息表示测试响应*/
				emmgsendchannelstatus(socket,i);
				
				break;
			case EMMG2MUX_CHANNEL_CLOSE:
                             g_Emmg_connected[ucIndex]=0;				
				break;
			case EMMG2MUX_CHANNEL_ERROR:
                             g_Emmg_connected[ucIndex]=0;				
				break;
			/*建立流请求*/
			case EMMG2MUX_STREAM_SET_UP:
				while(cmdlen>0)
				{
					switch(pItemHead->parameter_type)
					{
						case EMMG2MUX_client_ID:
							clientid=*(unsigned long *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
						case EMMG2MUX_data_channel_ID:
							channelid=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
						case EMMG2MUX_data_stream_ID:
							streamid=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
						case EMMG2MUX_Data_type:
							data_type=*(unsigned char *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
						case EMMG2MUX_Data_id:
							data_id  =*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
					}
					cmdlen-=pItemHead->parameter_length + sizeof(CA_MESSAGE_ITEM_HEAD);
					pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);
				}

				for(ucCACount = 0;ucCACount<3;ucCACount++)
				{
					if(g_emmg_channel_info[ucCACount].client_ID == clientid)
					{
						g_emmg_stream_info[ucCACount].client_ID = clientid;
						g_emmg_stream_info[ucCACount].data_channel_ID = channelid;
						g_emmg_stream_info[ucCACount].data_stream_ID = streamid;
						g_emmg_stream_info[ucCACount].data_type = data_type;
						g_emmg_stream_info[ucCACount].data_id = data_id;
						break;
					}
				}
				if(ucCACount >=3)
					break;
				caSendLog(LOGTYPE_NORMAL,"emmg: Receive stream setup message,streamid=%d.",g_emmg_stream_info[ucCACount].data_stream_ID);
				Display("emmg: Receive stream setup message,clientid=%d.",g_emmg_stream_info[ucCACount].client_ID);
				/*发送流状态信息,表示响应流建立请求*/
				emmgsendstreamstatus(socket,ucCACount);
				break;
			/*流测试请求*/
			case EMMG2MUX_STREAM_TEST:
				while(cmdlen>0)
				{
					switch(pItemHead->parameter_type)
					{
						case EMMG2MUX_client_ID:
							clientid=*(unsigned long *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
						case EMMG2MUX_data_channel_ID:
							channelid=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
						case EMMG2MUX_data_stream_ID:
							streamid=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
					}
					cmdlen-=pItemHead->parameter_length + sizeof(CA_MESSAGE_ITEM_HEAD);
					pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);
				}

				caSendLog(LOGTYPE_NORMAL,"emmg: Receive stream test message,streamid=%d.",streamid);

				for(ucCACount = 0;ucCACount<3;ucCACount++)
				{
					if(g_emmg_stream_info[ucCACount].client_ID == clientid)
					{
						break;
					}
				}
				if(ucCACount >=3)
					break;
				/*响应测试信息,发送流状态信息*/
				emmgsendstreamstatus(socket,ucCACount);
				break;
			/*流关闭请求*/	
			case EMMG2MUX_STREAM_CLOSE_REQUEST:
				while(cmdlen>0)
				{
					switch(pItemHead->parameter_type)
					{
						case EMMG2MUX_client_ID:
							clientid=*(unsigned long *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
						case EMMG2MUX_data_channel_ID:
							channelid=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
						case EMMG2MUX_data_stream_ID:
							streamid=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
					}
					cmdlen-=pItemHead->parameter_length + sizeof(CA_MESSAGE_ITEM_HEAD);
					pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);
				}
				caSendLog(LOGTYPE_NORMAL,"emmg: Receive stream close request message,streamid=%d.",streamid);
				for(ucCACount = 0;ucCACount<3;ucCACount++)
				{
					if(g_emmg_stream_info[ucCACount].client_ID == clientid)
					{
						break;
					}
				}
				if(ucCACount >=3)
					break;
				/*响应流关闭应答*/
				emmgsendstreamcloseresponse(socket,clientid,channelid,streamid,ucCACount);
				break;
			/*收到带宽请求*/				
			case EMMG2MUX_STREAM_BW_REQUEST:
		/*		MemSet(g_emmg_stram_bw_request,3*sizeof(CA_EMMG_STREAM_BW_REQUEST),0);*/
				while(cmdlen>0)
				{
					switch(pItemHead->parameter_type)
					{
						case EMMG2MUX_client_ID:
							clientid=*(unsigned long *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
						case EMMG2MUX_data_channel_ID:
							channelid=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
							break;
						case EMMG2MUX_data_stream_ID:
							streamid=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));

⌨️ 快捷键说明

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