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

📄 main.c

📁 这是TCP/IP协议组播的实现代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	{
       	rev_multi_audio.sin_addr[i] = 0;
	}
	rev_multi_audio.sin_addr[12] = rev_para_audio[1][0];
    rev_multi_audio.sin_addr[13] = rev_para_audio[1][1];
    rev_multi_audio.sin_addr[14] = rev_para_audio[1][2];
   	rev_multi_audio.sin_addr[15] = rev_para_audio[1][3];
   	rev_multi_audio.sin_port = REV_G711_PORT;
	if(leave(g711_revhandle,&rev_multi_audio,sizeof(struct sockaddr)) == 0)
	{
		puts("leave from rev_multi_audio success! - 1");
	}
	else
	{
		puts("leave from rev_multi_audio failure! - 1");
	}


	for (i=0;i<18;i++)
	{
       	rev_multi_audio.sin_addr[i] = 0;
	}
	rev_multi_audio.sin_addr[12] = rev_para_audio[2][0];
    rev_multi_audio.sin_addr[13] = rev_para_audio[2][1];
    rev_multi_audio.sin_addr[14] = rev_para_audio[2][2];
   	rev_multi_audio.sin_addr[15] = rev_para_audio[2][3];
   	rev_multi_audio.sin_port = REV_G711_PORT;
	if(leave(g711_revhandle,&rev_multi_audio,sizeof(struct sockaddr)) == 0)
	{
		puts("leave from rev_multi_audio success! - 2");
	}
	else
	{
		puts("leave from rev_multi_audio failure! - 2");
	}
}

void wait_millis(unsigned int waitTime)//延时等待函数
{
    unsigned int result;
    struct TIME time1;
    struct TIME time2;

    task_entercritsection();

    task_gettimemillis(&time1);
    result = 0;
    while (result < waitTime)
    {
        task_gettimemillis(&time2);
        result = time2.millis - time1.millis;
    }

    task_leavecritsection();
    printf("Waited for %ld msec\r\n", (time2.millis - time1.millis));
}

void do_static()//配置本端网络属性
{
    unsigned int result;
    unsigned char xdata config[56];
    unsigned int i;
    for (i=0;i<56;i++)
        config[i] = 0;

    //set the ip address
    config[12] = static_ip[0];
    config[13] = static_ip[1];
    config[14] = static_ip[2];
    config[15] = static_ip[3];

    //set the subnet mask
    config[16] = yan_ma[0];
    config[17] = yan_ma[1];
    config[18] = yan_ma[2];
    config[19] = yan_ma[3];

    //set the iP4 prefix
    config[20] = STATIC_IPV4_PREFIX;

    //set the gateway
    config[33] = gate_ip[0];
    config[34] = gate_ip[1];
    config[35] = gate_ip[2];
    config[36] = gate_ip[3];

    result = setnetworkparams(config);
    printf("Set network parameters result: %u\r\n", result);
	
}

void network_config()//读取本端网络属性
{
    unsigned char result;
    unsigned char xdata config[56];
    unsigned int i;
    for (i=0;i<56;i++)
        config[i] = 0;

    result = getnetworkparams(config);
    printf("Network params result: %d\r\n", result);

    printf("IP    : %bu %bu %bu %bu\r\n", config[12], config[13], config[14], config[15]);
    printf("Subnet: %bu %bu %bu %bu\r\n", config[16], config[17], config[18], config[19]);
    printf("Prefix: %bu\r\n", config[20]);
    printf("Gate  : %bu %bu %bu %bu\r\n", config[33], config[34], config[35], config[36]);
}

void init()//初始化自己定义的量
{
	send_addr_video 	= 0x050000;//视频发送地址指针
	rev_addr_video  	= 0x051000;//视频接收地址指针
	send_addr_audio 	= 0x052000;//音频发送地址指针
	rev_addr_audio 		= 0x053000;//音频接收地址指针
	send_addr_command 	= 0x054000;//命令字发送地址指针
	rev_addr_command 	= 0x055000;//命令字接收地址指针
	rd_fifo_hf 			= 0x280000;//读取音频发送FIFO半满地址指针
	rd_fifo_ef			= 0x2a0000;//读取视频发送FIFO空地址指针
	dual_send 			= 0x240200;//双口RAM写地址指针
	dual_rev 			= 0x240000;//双口RAM读地址指针
	dual_ip 			= 0x240400;//网络参数配置地址指针
	command_length 	= 0;
	head_r 			= 0;
	tail_r 			= 0;
	for(i = 0;i < 2048;i++)
	{
		rev_buf[i] = 0;
	}
	
	for(i = 0; i < 4;i++)
	{
		for(j = 0; j < 4;j++)
		{
			send_para[i][j] = 0;
		}
	}

	for(i = 0; i < 3;i++)
	{
		for(j = 0; j < 4;j++)
		{
			rev_para_video[i][j] = 0;
			rev_para_audio[i][j] = 0;
		}
	}

	send_video_flag = 0xff;
	rev_video_flag = 0xff;
	send_audio_flag = 0xff;
	rev_audio_flag = 0xff;

	static_ip[0] 	= 192;
	static_ip[1] 	= 168;
	static_ip[2] 	= 128;
	static_ip[3] 	= 47;
	
	gate_ip[0] 		= 192;
	gate_ip[1] 		= 168;
	gate_ip[2] 		= 128;
	gate_ip[3] 		= 1;

	yan_ma[0] 		= 255;
	yan_ma[1] 		= 255;
	yan_ma[2] 		= 255;
	yan_ma[3] 		= 0;

	SEND_VIDEO_PORT 	= 10026;
	REV_VIDEO_PORT 		= 10025;
	SEND_G711_PORT 		= 10028;
	REV_G711_PORT 		= 10027;
    SEND_COMMAND_PORT 	= 10030;
	REV_COMMAND_PORT 	= 10029;
}

void moveto_buf()//将收到的命令字转移到接收缓冲区
{
	unsigned char tem,length;
	length = rev_length_command - 1;

	for(tem = 0;tem < length;tem++)
	{
		rev_buf[head_r] = *(rev_addr_command + tem + 1);
		head_r = (head_r + 1) & 0x7ff;	
	}
}


void send_command()//通过双口RAM发送命令字
{
	unsigned char flag,length,total;

	flag = (*dual_send) & 0x01;	

	if(flag == 0)//文景顺已经读走了命令字,可以写
	{
		total = 0;
		length = rev_buf[tail_r];

		if((length < 2) || (length > 30))
		{
			head_r = 0;
			tail_r = 0;
			for(i = 0;i < 2048;i++)
			{
				rev_buf[i] = 0;
			}
			total = 0;
		}
		while((head_r != tail_r) && ((total + length) < 120))
		{
			for(i = 0;i < length;i++)
			{
				temp = rev_buf[tail_r];
				*(dual_send + total + 2) = temp;
				tail_r = (tail_r + 1) & 0x7ff;
				total++;
			}
			length = rev_buf[tail_r];
			if(head_r != tail_r)
			{
				if((length < 2) || (length > 30))
				{
					head_r = 0;
					tail_r = 0;
					for(i = 0;i < 2048;i++)
					{
						rev_buf[i] = 0;
					}
					total = 0;
				}
			}			
		}
		if((total > 0) && (total < 128))
		{
			*(dual_send + 1) = total;
			*dual_send = 0x01;
		}
	}
}

void analyse_current_state(unsigned char state,unsigned num)
//根据8031提供的情况调整视频、音频的收发
{
	unsigned char connect_state,connect_num;
	connect_state = state & 0x03;
	connect_num = num & 0x03;
	if(connect_state != 0x01)
	{
		adjust_rev_video(connect_num,connect_state);
	}

	connect_state = (state >> 2) & 0x03;
	connect_num = (num >> 2) & 0x03;
	if(connect_state != 0x01)
	{
		adjust_send_video(connect_num,connect_state);
	}

	connect_state = (state >> 4) & 0x03;
	connect_num = (num >> 4) & 0x03;
	if(connect_state != 0x01)
	{
		adjust_rev_audio(connect_num,connect_state);
	}

	connect_state = (state >> 6) & 0x03;
	connect_num = (num >> 6) & 0x03;
	if(connect_state != 0x01)
	{
		adjust_send_audio(connect_num,connect_state);
	}
}

void adjust_send_video(unsigned char num,unsigned char flag)
//调整视频的发送
{
	switch(flag)
	{
		case 0://禁止
		{
			printf("close send video! - %bu\r\n",send_video_flag);
			send_video_flag = 0xff;
		}
		break;
		case 2://打开
		case 3://调整
		{
			if(send_video_flag != num)
			{
				memset(&send_udp_video, 0, sizeof(struct sockaddr));
				send_udp_video.sin_addr[12] = send_para[num][0];
    			send_udp_video.sin_addr[13] = send_para[num][1];
    			send_udp_video.sin_addr[14] = send_para[num][2];
    			send_udp_video.sin_addr[15] = send_para[num][3];
    			send_udp_video.sin_port = SEND_VIDEO_PORT;
				syn_setDatagramAddress(video_sendhandle, 1, &send_udp_video);//设置UDP命令字发送连接地址
				printf("send video num is %bu\r\n", num);
				send_video_flag = num;
			}
		}
		break;
		default:
		break;
	}
}

void adjust_send_audio(unsigned char num,unsigned char flag)
//调整音频的发送
{
	switch(flag)
	{
		case 0://禁止
		{
			printf("close send audio! - %bu\r\n",send_audio_flag);
			send_audio_flag = 0xff;
		}
		break;
		case 2://打开
		case 3://调整
		{
			if(send_audio_flag != num)
			{
				memset(&send_udp_audio, 0, sizeof(struct sockaddr));
				send_udp_audio.sin_addr[12] = send_para[num][0];
    			send_udp_audio.sin_addr[13] = send_para[num][1];
    			send_udp_audio.sin_addr[14] = send_para[num][2];
    			send_udp_audio.sin_addr[15] = send_para[num][3];
    			send_udp_audio.sin_port = SEND_G711_PORT;
				syn_setDatagramAddress(g711_sendhandle, 1, &send_udp_audio);//设置UDP命令字发送连接地址
				printf("send audio num is %bu\r\n", num);
				send_audio_flag = num;
			}
		}
		break;
		default:
		break;
	}
}

void adjust_rev_video(unsigned char num,unsigned char flag)
//调整视频的接收
{
	switch(flag)
	{
		case 0:
		{
			if(rev_video_flag != 0xff)
			{
				for (i=0;i<18;i++)
				{
       				rev_multi_video.sin_addr[i] = 0;
				}
				rev_multi_video.sin_addr[12] = rev_para_video[rev_video_flag][0];
    			rev_multi_video.sin_addr[13] = rev_para_video[rev_video_flag][1];
    			rev_multi_video.sin_addr[14] = rev_para_video[rev_video_flag][2];
   				rev_multi_video.sin_addr[15] = rev_para_video[rev_video_flag][3];
				rev_multi_video.sin_port = REV_VIDEO_PORT;
				if(leave(video_revhandle,&rev_multi_video,sizeof(struct sockaddr)) == 0)
				{
					printf("leave from rev_multi_video success! - %bu\r\n",rev_video_flag);
				}
				else
				{
					printf("leave from rev_multi_video failure! - %bu\r\n",rev_video_flag);
				}
				rev_video_flag = 0xff;
			}
		}
		break;
		case 2://打开
		case 3://调整
		{
			if(num != rev_video_flag)
			{
				if(rev_video_flag != 0xff)
				{
					for (i=0;i<18;i++)
					{
       					rev_multi_video.sin_addr[i] = 0;
					}
					rev_multi_video.sin_addr[12] = rev_para_video[rev_video_flag][0];
    				rev_multi_video.sin_addr[13] = rev_para_video[rev_video_flag][1];
    				rev_multi_video.sin_addr[14] = rev_para_video[rev_video_flag][2];
   					rev_multi_video.sin_addr[15] = rev_para_video[rev_video_flag][3];
					rev_multi_video.sin_port = REV_VIDEO_PORT;
					if(leave(video_revhandle,&rev_multi_video,sizeof(struct sockaddr)) == 0)
					{
						printf("leave from rev_multi_video success! - %bu\r\n",rev_video_flag);
					}
					else
					{
						printf("leave from rev_multi_video failure! - %bu\r\n",rev_video_flag);
					}
				}

				for (i=0;i<18;i++)
				{
       				rev_multi_video.sin_addr[i] = 0;
				}
				rev_multi_video.sin_addr[12] = rev_para_video[num][0];
    			rev_multi_video.sin_addr[13] = rev_para_video[num][1];
    			rev_multi_video.sin_addr[14] = rev_para_video[num][2];
   				rev_multi_video.sin_addr[15] = rev_para_video[num][3];
   				rev_multi_video.sin_port = REV_VIDEO_PORT;   	
				if(join(video_revhandle,&rev_multi_video,sizeof(struct sockaddr)) == 0)
				{
					printf("join to rev_multi_video success! - %bu\r\n",num);
				}
				else
				{
					printf("join to rev_multi_video failure! - %bu\r\n",num);
				}
				rev_video_flag = num;
				syn_setDatagramAddress(video_revhandle, 0, &rev_multi_video);
			}
		}
		break;
		default:
		break;
	}
}

void adjust_rev_audio(unsigned char num,unsigned char flag)
//调整音频的接收
{
	switch(flag)
	{
		case 0:
		{
			if(rev_audio_flag != 0xff)
			{
				for (i=0;i<18;i++)
				{
       				rev_multi_audio.sin_addr[i] = 0;
				}
				rev_multi_audio.sin_addr[12] = rev_para_audio[rev_audio_flag][0];
    			rev_multi_audio.sin_addr[13] = rev_para_audio[rev_audio_flag][1];
    			rev_multi_audio.sin_addr[14] = rev_para_audio[rev_audio_flag][2];
   				rev_multi_audio.sin_addr[15] = rev_para_audio[rev_audio_flag][3];
   				rev_multi_audio.sin_port = REV_G711_PORT;
				if(leave(g711_revhandle,&rev_multi_audio,sizeof(struct sockaddr)) == 0)
				{
					printf("leave from rev_multi_audio success! - %bu\r\n",rev_audio_flag);
				}
				else
				{
					printf("leave from rev_multi_audio failure! - %bu\r\n",rev_audio_flag);
				}
				rev_audio_flag = 0xff;
			}
		}
		break;
		case 2://打开
		case 3://调整
		{
			if(num != rev_audio_flag)
			{
				if(rev_audio_flag != 0xff)
				{
					for (i=0;i<18;i++)
					{
       					rev_multi_audio.sin_addr[i] = 0;
					}
					rev_multi_audio.sin_addr[12] = rev_para_audio[rev_audio_flag][0];
    				rev_multi_audio.sin_addr[13] = rev_para_audio[rev_audio_flag][1];
    				rev_multi_audio.sin_addr[14] = rev_para_audio[rev_audio_flag][2];
   					rev_multi_audio.sin_addr[15] = rev_para_audio[rev_audio_flag][3];
   					rev_multi_audio.sin_port = REV_G711_PORT;
					if(leave(g711_revhandle,&rev_multi_audio,sizeof(struct sockaddr)) == 0)
					{
						printf("leave from rev_multi_audio success! - %bu\r\n",rev_audio_flag);
					}
					else
					{
						printf("leave from rev_multi_audio failure! - %bu\r\n",rev_audio_flag);
					}
				}

				for (i=0;i<18;i++)
				{
       				rev_multi_audio.sin_addr[i] = 0;
				}
				rev_multi_audio.sin_addr[12] = rev_para_audio[num][0];
    			rev_multi_audio.sin_addr[13] = rev_para_audio[num][1];
    			rev_multi_audio.sin_addr[14] = rev_para_audio[num][2];
   				rev_multi_audio.sin_addr[15] = rev_para_audio[num][3];
   				rev_multi_audio.sin_port = REV_G711_PORT;

				if(join(g711_revhandle,&rev_multi_audio,sizeof(struct sockaddr)) == 0)
				{
					printf("join to rev_multi_audio success! - %bu\r\n",num);
				}
				else
				{
					printf("join to rev_multi_audio failure! -  %bu\r\n",num);
				} 
				rev_audio_flag = num;
				syn_setDatagramAddress(g711_revhandle, 0, &rev_multi_audio);	
			}
		}
		break;
		default:
		break;
	}
} 

⌨️ 快捷键说明

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