UDP组播开发测试实例

一 前言

(1)负责项目中组播开发测试工作。期间由于缺乏设备的原因,中间搁置了好久。直到昨天下午临近下班,终于,完成udp组播整个的开发测试工作。


二 开发过程

(1)首先从实现udp协议说起。udp协议使用的结构体如下:

typedef struct socketaddr {
  uint16_t sin_Family;	//协议族
  uint16_t sin_port;	//端口号
  uint32_t sin_addr;/*mac[6] / udp/tcp port[2] + ip[4]*/
}SSockAddr;

(2)实现udp协议的几个主要函数,这里不提供详细的源代码,只是提供函数名及其参数,以供参考,回忆复习:

uint8_t fn_W5100S_Socket(uint8_t uc_Minor,uint8_t uc_Type,uint8_t uc_Proto)
{
	uint8_t uc_Ret=SYS_YES;
	if(uc_Proto==SOCK_DGRAM)
	{
		W5100S_Init(uc_Minor);    //内部网卡初始化
		uc_Ret=SYS_YES;
	}
	else
	{
		uc_Ret=SYS_NO;
	}
	return uc_Ret;

}
uint8_t fn_W5100S_Bind(uint8_t uc_Minor,SSockAddr *pst_SockAddr,uint32_t ui_Gw, uint32_t ui_Mask)    //绑定网卡,网关
{
	SocketTypeDef *Pst_Addr=NULL;
	Pst_Addr=(SocketTypeDef *)pst_SockAddr;
	W5100S_SetIP(uc_Minor,Pst_Addr->ui_SinAddr,ui_Gw,ui_Mask);    //配置局域网,
	return 0;
}																													

uint32_t fn_W5100S_Recvfrom(uint8_t uc_Minor,uint8_t uc_Port,uint8_t auc_RecvBuf[],uint32_t BufLen,SSockAddr *pst_SockAddr)
{
	uint32_t ui_Recv_Len=0;
	SocketTypeDef *Pst_SocAddr=NULL;
	Pst_SocAddr=(SocketTypeDef *)pst_SockAddr;
	ui_Recv_Len=RecvFrom_RXQueue(uc_Minor,uc_Port,Pst_SocAddr,auc_RecvBuf,BufLen);   //应用读取接收队列中的数据,最终存到了auc_SocAddr中
	return ui_Recv_Len;
}

uint8_t fn_W5100S_Sendto(uint8_t uc_Minor,uint8_t uc_Port,uint8_t auc_SendBuf[],uint32_t BufLen,SSockAddr *pst_SockAddr)
{
	uint8_t uc_Ret=SYS_YES;
	SocketTypeDef *Pst_SocAddr=NULL;
	Pst_SocAddr=(SocketTypeDef *)pst_SockAddr;
	uc_Ret=WriteDataToSendQueue(uc_Minor,uc_Port,Pst_SocAddr,auc_SendBuf,BufLen);
	return uc_Ret;
}

(3)以上程序的叙述,都是从应用层的角度进行分析的,没有提到驱动层的程序,以下简述以下,驱动层的开发:

参考原理图,初始化配置引脚。引脚输入输出模式,选择指定的引脚,时钟配置,等等。
网卡的配置,SRAM,FLASH,等存储空间的配置。参考STM32技术开发手册,网卡配置开发手册等。
驱动开开发是一个需要耐心的工作,认真,仔细,写好程序后,还要编写测试程序,对代码进行检测
驱动开发有趣的地方是,它需要对硬件进行操作,经常用到的设备有:可调节电源,示波器,仿真器,开发板,有时会用到电焊。开发板如下:
在这里插入图片描述
(4)组播配置程序,这里应用的网卡是W5100网卡,详细内容参考它的技术开发手册,程序是对直接对寄存器进行操作的,程序如下:

	/*设置Socket的传输协议为UDP*/
	W5100S_WriteReg(uc_EthNum,W5100S_Sn_Addr(uc_SocketNum,Sn_MR),SN_MR_UDP|SN_MR_MF_ENABLE|SN_MR_MULTI_ENABLE);
	/*配置Socket的源UDP端口号*/
	Short_To_Byte(auc_Temp,Pst_Addr->sin_port);
	W5100S_WriteBuff(uc_EthNum,W5100S_Sn_Addr(uc_SocketNum,Sn_PORTR0),auc_Temp,ARRAY_SIZE(auc_Temp));
	
            uint8_t auc_ip[4]={225,0,0,20};  //目标ip地址
            uint8_t auc_port[4]={6,0,0,0};   //目标端口
            uint8_t auc_mac[6]={1,0,225,0,0,20};  //目标mac地址

            /*配置Socket的 目标端口*/
            W5100S_WriteBuff(uc_EthNum,W5100S_Sn_Addr(uc_SocketNum,Sn_DPORTR0),auc_port,4);

            //目标ip地址
            W5100S_WriteBuff(uc_EthNum,W5100S_Sn_Addr(uc_SocketNum,Sn_DIPR0),auc_ip, 4);

            //目标mac地址
            W5100S_WriteBuff(uc_EthNum,W5100S_Sn_Addr(uc_SocketNum,Sn_DHAR0),auc_mac, 6);

            //udp多播模式,1开启组播 Sn_MR[MULTI] = 1
            W5100S_WriteReg(uc_EthNum, W5100S_Sn_Addr(uc_SocketNum,Sn_MR), 0xc2);  

            /*启动被设置的Socket*/
	W5100S_WriteReg(uc_EthNum,W5100S_Sn_Addr(uc_SocketNum,Sn_CR),SN_CR_OPEN);

(5)组播测试环境,两台电脑,一台二层交换机,待测开发板,这是udp组播测试主要的硬件设备。还有其他的像是引脚线,电源,网线等。

(6)组播测试所需要的软件,cmd终端环境,ping指令检测网卡是否配置成功,是否在同一网段,组播测试主要用的软件就是:
在这里插入图片描述

(7)将两台电脑,开发板(也可以看作可以独立运行的一个小电脑),通过网线都连接到同一个交换机上,使用ping指令监测三台设备是否在同一个网段。然后启动运行设备,两台电脑都打开,上面的测试工具。
(8)当开发板发送的数据,两台电脑同时都可以收到时,就代表组播程序开发成功了,项目的这一个阶段可以收尾了。哈哈哈哈,我可是忙了好久,才搞成功的。


三 总结
(1)对自己写出的程序要有自信,我写好的程序就是正确的,问题肯定是出在其他的地方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值