李 林
(江西师范高等专科学校物联网学院,江西 鹰潭 335000)
随着传感网络、射频识别技术、大数据技术和云计算能力的不断发展,物联网被广泛地应用于各行各业,可实现智慧交通、智能医疗、智慧农业、智能电网、智能安防、智慧物流、智能家居和智能环境监测等[1-8]。基于物联网的环境监测系统越来越复杂,集成度也越来越高。数据传输的种类越来越多,传输的数据容量也越来越大。在环境监测系统的前端,传统数据传输通常采用串行通信(Universal Serial Bus, USB)总线接口、外围设备互联(Peripheral Component Interconnect, PCI)控制总线接口、局域网控制器(Controller Area Network, CAN)总线接口和ZigBee 无线通信技术等。USB2.0 总线的最高传输速率为480 Mbps,具有开发周期短、稳定性较高等优势,且目前具有成熟的产品,但是其存在传输距离短的缺点,严格限制了连接设备之间的位置[9]。PCI总线结构复杂,最高传输速率为266 Mbps,且在设备连接状态时不能随意进行热插拔操作[10]。CAN 总线具有开发周期短、强大的抗干扰能力和实时性等特点,被广泛地应用在车载设备中。然而CAN 总线的通信速率最高只有1 Mbps,很难满足大容量和高速率的数据传输需求[11]。ZigBee 技术是一项新型的无线通信技术,具有传输速率低、距离短、功耗低、成本低等优点,被广泛地应用于传感控制中[12]。随着网络技术的发展和普及,以太网已经成为一种非常成熟的技术,千兆以太网技术已经成为物联网环境监测系统研究的热点和趋势。与传统的通信技术相比,千兆以太网最大的优点在于传输速度快、传输距离远,尤其是在传输距离和组网构架等方面具有巨大的技术优势[13]。
本课题以XILINX 公司的FPGA 硬件作为平台,利用FPGA 芯片资源的优势。设计了一套以FPGA 为硬件平台,基于UDP(User Datagram Protocol, UDP)协议的千兆以太网环境监测系统数据传输构架。重点阐述了基于UDP 协议的千兆以太网数据传输系统构架的实现方案,然后采用仿真软件对该系统构架进行仿真验证,最后在实际的FPGA 硬件平台上具体实现和完成功能性验证,并给出了最终的硬件平台实际测试结果。
基于物联网的环境监测系统主要完成对环境中各种类型信号的采集监测,例如环境中的视频图像信号、温湿度、烟雾数据信息、消防安全信号等。所有的这些信号首先通过相应的传感器进行采集,然后通过数据传输系统将数据传输至上位机进行回读分析。根据物联网环境监测系统的工作流程,可划分在FPGA 内部系统的逻辑功能框图如图1所示。
图1 环境监测系统整体设计框图
各类传感器首先采集环境中相应的信号,然后通过对应的控制器将采集到的信号存储在各自的数据缓冲器FIFO 中,再由数据存储序列控制器通过相应的控制算法将数据通过DDR3 控制器接口存储到DDR3 硬件中。然后由千兆以太网控制器将存储于DDR3 内存中的数据取出来,通过以太网接口传输至上位机。在以太网数据传输过程中,主要涉及TCP/IP 协议中的数据传输层、网络层和数据链路层。通过FPGA 编程实现数据的处理和传输以及UDP 协议中相关的协议。对于物理层则采用商用的以太网PHY芯片来实现,这样使得外部接口电路的配置相对简单,从而降低了系统的开发难度。文章参考了国内外有关的千兆以太网的设计经验[14],完成了基于UDP协议的千兆以太网的设计和实现,以满足目前大部分物联网数据采集系统的实际需求。
本系统中千兆以太网UDP 协议的内部构架方案如图2 所示。主要包含了UDP 模块(UDP 接收模块和UDP 发送模块)、MAC 层功能模块(MAC 层数据接收模块和MAC 层数据发送模块)、IP 层模块(IP 层发送模块和IP 层接收模块)、ARP 功能模块(ARP 发送模块和ARP 接收模块)、ICMP 功能模块和PHY 模块等。其中,UDP 模块主要实现UDP 的相关协议,具体包括数据的接收和发送。MAC 层模块实现以太网数据链路功能,管理数据输入输出接口(Management Data Input/Output, MDIO),并对PHY 模块的寄存器进行相应的配置,来对PHY 的功能进行管理。对于PHY 模块,则采用商业的以太网芯片来实现。
图2 UDP协议内部构架
MAC 层由MAC 层发送模块和MAC 层接收模块两部分构成。MAC 层发送模块按照标准以太网帧的格式组装MAC 帧头,然后再结合IP 发送层或ARP 发送层的数据形成一个完整的MAC 数据帧发送出去。MAC 层接收模块将接收到的数据按照以太网的标准帧格式逐字节进行解析,根据接收到的类型字节进行相应的判断并存储相应的有效信息。
2.2.1 MAC 层接收
在MAC 接收层接收到数据的有效标志信号为高电平时,对以太网帧进行逐字节统计。当接收到有效信号时,开始进行字节计数,当帧数据的有效标志位信号为低电平时则停止计数。具体的实现步骤采用如图3 所示的状态机来实现。首先,在IDLE 状态下判断接收到的数据有效信号是否为高电平,若为高电平,则进入REC_PREAMBER 前导码状态,接收以太网帧的前导码。之后状态机跳转到REC_MAC_HEAD 头部接收状态,此时将目的MAC 地址、源MAC 地址、以太网帧类型缓存起来,同时在此状态下判断接收到的前导码是否正确,如果错误则进入REC_ERROR 错误状态。否则进入REC_IDENTIFY状态,并在此状态判断接收到的帧类型是IP 协议类型还是ARP 协议类型。若接收到帧类型数据为0X0800 则为IP 协议类型;若为0X0806,则为ARP 类型。其次,状态机跳转到REC_DATA 接收数据状态,并将接收到的数据送到下游的IP 层模块或ARP 功能模块,与此同时将接到的数据进行CRC 处理,等待IP 层或ARP 层数据接收完毕,则状态机跳转到REC_CRC 状态,接收CRC 校验数据,将接收到的CRC 数据与在接收数据状态计算得到的CRC 数据进行对比。根据比对结果判断接收到的数据是否正确,正确则进入REC_END状态,错误则进入REC_ERROR状态。
图3 MAC层接收状态机
2.2.2 MAC 层发送
MAC 层发送模块的功能是先根据标准以太网数据帧的格式生成以太网帧头,然后再结合IP 层或ARP 层发送过来的数据形成一个完整的以太网帧发送出去。具体的状态机实现流程如图4 所示。一开始状态机处于SEND_START 状态,等待MAC 层发送准备信号mac_tx_ready。若接收的准备信号有效,则表明ARP 或IP 数据已经准备好了,可以进行数据发送。此时状态机跳转到发送前导码状态SEND_PREAMBER,前导码发送完毕之后,拉高数据发送请求信号,请求IP 或ARP 的数据,随后进入到数据发送状态SEND_DATA,等数据发送完毕后,进入发送SEND_CRC 状态。在发送数据的过程中,同时需要进行CRC校验。
ARP 模块主要包含ARP 请求模块和ARP 发送模块两部分。ARP 请求模块主要用于检测接收到的ARP 是请求包还是发送包。ARP 发送包是根据接收到的ARP 请求包的类型来生成相应的应答帧信号。
图4 MAC层发送状态机
2.3.1 ARP 接收模块
ARP 接收模块主要实现ARP 数据的接收,具体的状态流程图如图5 所示。一开始,系统处于IDLE状态下,当接收到MAC 层发送过来的ARP 请求信号后,状态跳转到ARP 接收状态,在该状态下,系统根据ARP 数据协议报提取出接收到的信号的源MAC地址、目的MAC 地址、源IP 地址和目的IP 地址,并判断检测接收到的操作码类型是ARP 请求信号还是ARP应答信号。如果是请求信号,则再判断接收到的目的IP地址和本机的IP地址是否匹配,如果匹配,则发出应答请求信号,否则忽略该帧信号。如果是应答信号,则再判断接收到的目的IP 地址和目的MAC 地址是否和本机一致,如果一致,则发出匹配一致信号,表明接收到对方发过来的地址信息,并将接收到的MAC地址和IP地址存入到系统缓存中。
图5 ARP接收状态流程图
2.3.2 ARP 发送模块
ARP 发送模块实现ARP 应答帧信号的发送功能。具体的工作流程图如图6 所示。系统一开始处于IDLE 状态,等待ARP 接收模块过来的发送请求信号或ARP 应答请求信号,之后系统进入请求或应答状态,并通知MAC 发送模块数据已经准备好了,然后等待MAC 数据请求信号,系统进入请求或数据发送状态,按照ARP 协议帧的格式生成ARP 应答信号,在发送数据时,若数据不足46 字节,则需要补全46字节发送。
图6 ARP发送数据流程图
IP 模块根据功能划分为接收模块和发送模块两个功能模块。接收模块按照如图7 所示的IP 协议报格式对接收到的数据进行解析。首先是解析协议报头信息,根据接收到的报头长度字段判断报头占据多少个字节,然后从中提取数据报所携带的一些关键信息;如IP 数据总长度、目的IP 地址、源IP 地址、IP 协议类型和报头校验和。根据接收到的IP 协议类型代码判断接收到的数据报是UDP 协议还是ICMP 协议,若协议类型代码为0X01,为ICMP 协议;若协议类型代码为0X11,为UDP 协议。接收IP 报头的同时,对接收到的IP 报头进行校验和求解,然后将接收到的校验和与求解的校验和进行比较,若不一致,则丢弃该数据报。否则继续接收数据,并且根据协议的类型与代码将接收到的数据发送到ICMP 模块或UDP模块。发送模块根据需要发送的数据类型(ICMP 或UDP)按照相应的IP 协议报的格式生成相应的IP 首部,形成一个完整的IP 数据报发送给MAC 层模块。
ICMP 模块的主要功能是检测主机和路由器之间的网络是否连通、主机能否到达指定地点等,是TCP/IP 协议簇中的一个子层协议,包含在IP 数据段中。本课题要实现的ICMP 模块首先是接收其他设备发送过来的ICMP 数据,然后判断接收的类型是否是请求包,若为请求包,先将数据存入到RAM 中,并计算校验和,判断校验和是否正确,若校验和正确,仅进入ICMP 发送状态,根据如图8 所示的ICMP数据报文格式生成相应的应答包。此时生成的应答包中,需要在MAC 层将请求包中的MAC 地址和IP地址互换,并且需要将ICMP 报文中的协议类型转变成应答类型。
图7 IP协议报格式
图8 ICMP报文格式
UDP 模块包含了发送和接收两个模块,主要以如图9 所示的UDP 协议报格式完成UDP 数据的接收和发送。
1)UDP 接收模块。完成UDP 数据有效性的检测和数据的接收两大功能。具体操作流程如下:
①校验和计算。将接收到的UDP 首部和UDP 数据转换成反码运算求和,若UDP 的数据总数为奇数,则在数据尾部填充0X00 构成偶数进行运算,最后将得到的求和结果再求反码即可得到UDP 的校验和。
②数据有效性判断。根据上面解析得到的数据内容,判断接收到的数据是否为UDP 协议、目的IP地址与本机IP 是否匹配、目的端口号是否是本机的端口号。最后再判断接收到的UDP 校验和与计算的UDP 校验和是否一致。若其中有一个不匹配,则判断该帧信号为无效帧,做丢弃处理。
③数据接收。根据第二步数据的有效性判断,若数据有效,去除接收到的数据中的IP 首部、UDP 首部,即可得到UDP 数据。
2)UDP 发送模块。完成UDP 首部校验和的计算、数据帧的组装和发送功能。首先,将需要发送的UDP 数据缓存到RAM 中,当数据容量存储到一定时再将数据读出。其次,将需要发送的UDP 首部和数据转换为反码求和,对求和结果再次转换为反码运算即可得到需要发送的UDP 报首部校验和。最后,将UDP 首部和数据按照如图9 所示的UDP 数据报格式生成UDP 数据帧发送到IP 模块。
图9 UDP协议报格式
系统软件在设计完之后,为了验证其逻辑功能的正确性,本文设计了如图10 所示的仿真结构,并采用Modelsim 仿真软件进行功能验证。系统仿真框图主要由以太网模块、数据发生器和数据接收器等组成。仿真中利用数据发生器生成需要发送的数据,将生成的数据通过以太网发送端口发送出去,然后再由以太网从接收端口回接数据,这样就能够对所设计系统中的各个模块进行完整的仿真。
图10 系统验证仿真结构
仿真平台搭建完成以后,对MAC 地址、IP 地址和端口号等信息进行设置。然后由数据发生器模块对需要发送的数据进行设置。最后启动仿真程序,对比数据发生器模块发送的数据和数据接收模块接收到的数据,若二者一致,则表明本文的设计方案合理且逻辑正确。仿真结果如图11 所示,从仿真结果可以看出,发送端的数据在接收端都能够完整地接收,所设计的系统构架在功能上是完全可行的。
功能仿真完成以后,可以借助相关的工具在实验室中的FPGA 板卡上进行性能测试和验证。首先,需要对FPGA 板卡和上位机的物理地址、IP 地址和端口号进行设置。然后,上位机采用相应的测试方法进行测试。第一步通过上位机进行PING 功能来测试网络是否连通,测试结果如图12(a)所示,从中可以看出网络已经连通;第二步采用网络助手进行网络结构的收发功能测试,测试结果如图12(b)所示,从测试结果可以看出,发送数据和接收数据完全保持一致,表明所设计的以太网收发模块功能正常。
图11 仿真测试结果
图12 PING 功能和UDP 收发模块功能验证结果
最后,可以通过网络抓包工具Wireshark 来观察通信数据结构,分析传输数据。还可以对测试数据的传输速率进行测试,确定所设计的系统是否满足要求。还可以通过任务管理器中的网络资源来对速度进行进一步的验证,测试结果如图13 所示。在0.087 917 s 的时间内接收到了10 000 个数据包,每个数据包的数据为1 000 个字节,所设计的千兆以太网的实时数据传输速率为10 000*1 000*8/0.087 917=909.95 Mbps。在任务管理器窗口的联网菜单中可以看到,网络使用率为94.2%,网络为千兆网,网速大约为950 Mbps,大于Wireshark 抓包计算最低速度。这是因为在任务管理器窗口计算网速的时候是将以太网数据帧的报头也放在数据部分一起计算,这样一来通过任务管理器的联网菜单计算得到网速与Wireshark 计算相吻合,而且传输速度非常稳定。
图13 实际速度测试结果
本课题以XILINX 的FPGA 硬件为平台,设计并实现了基于UDP 协议的千兆以太网环境监测系统数据传输构架。首先,详细介绍了UDP 协议千兆以太网的实现方式;其次,采用仿真软件对所设计的系统构架进行功能仿真;最后,在XILINX 的FPGA 硬件平台上进行实际性能测试。测试结果表明:笔者设计的基于UDP 协议的千兆以太网传输逻辑是正确的,传输速率最高可达到910 Mbps,能够满足大部分物联网数据采集系统的实际需求,具有良好的可维护性、移植性和实际的推广价值。