二、W5100S/W5500+RP2040之MicroPython开发<DHCP示例>
文章目录
1 前言
??在这个智能硬件和物联网时代,MicroPython和树莓派PICO正以其独特的优势引领着嵌入式开发的新潮流。MicroPython作为一种精简优化的Python 3语言,为微控制器和嵌入式设备提供了高效开发和简易调试的
??当我们结合WIZnet W5100S/W5500网络模块,MicroPython和树莓派PICO的开发潜力被进一步放大。这两款模块都内置了TCP/IP协议栈,使得在嵌入式设备上实现网络连接变得更加容易。无论是进行数据传输、远程控制,还是构建物联网应用,它们都提供了强大的支持。
? 本章我们将以WIZnet W5100S为例,以MicroPython的开发方式进行DHCP解析示例
2 相关网络信息
2 .1 简介
?
??DHCP(Dynamic Host Configuration Protocol)是动态主机配置协议,它是一种针对于IP地址进行动态管理和分配的技术。在DHCP中,主要包括三种角色:DHCP服务器、DHCP客户端和DHCP中继。
??DHCP服务器负责从地址池中选择IP地址分配到DHCP客户端,还可以为DHCP客户端提供其它网络参数,好比默认网关地址,DNS服务器或者WINS服务器地址等。DHCP客户端可以理解为请求IP地址的设备,如IP电话、手机、PC等。很多时候,DHCP服务器并不与DHCP客户端在同一网段,因此就需要一个代理,也就是这里的中继。
2.2 DHCP工作原理
DHCP基于UDP工作,其通信链路上的步骤如下:
- DHCP客户端将广播发送DHCP发现报文(DHCP DISCOVER)事务ID和DHCP客户端的MAC地址,封装该报文的IP数据报的源IP地址为0.0.0.0,这是因为主机目前还未分配到IP地址,因此使用该地址代替,目的IP地址为广播地址255.255.255.255,之所以广播发送,是因为主机现在并不知道网络中有哪几个DHCP服务器。
- DHCP客户端在通信链路上发起DHCP请求包,请求包主要是告诉DHCP服务器,它希望使用上一步提供的网络设置,之后DHCP服务器向DHCP客户端发送确认包,表示允许DHCP客户端使用第二步发送的网络设置。至此,DHCP的网络设置结束,然后通信链路上的主机之间就可以进行TCP/IP通信了。
- 当不需要IP地址时,客户端可以发送DHCP解除包(DHCPRELEASE)进行解除。另外,DHCP的设置中通常会有一个租期时间的设定,DHCP客户端在这个时限内可以发送DHCP请求包通知想要延长这个期限。
2.3 DHCP的优点
??DHCP的优点主要包括:
- 自动配置:DHCP能够自动为客户端分配IP地址、子网掩码、默认网关等网络配置,大大减少了手动配置的工作量和错误率。
- 节约IP地址资源:DHCP能够动态地分配IP地址,使得IP地址的利用率更高,避免了IP地址资源的浪费。
- 提高网络安全性:DHCP可以限制客户端只能从特定的服务器获取IP地址,避免了未经授权的访问和攻击,提高了网络安全性。
- 支持多种操作系统:DHCP可以在多种操作系统上实现和应用,具有很好的兼容性和可移植性。
- 方便客户端的配置:DHCP客户端只需要将DHCP服务器的IP地址设置为默认网关,就可以自动获取IP地址和其他网络配置,无需手动配置。
- 降低维护成本:使用DHCP可以减少管理员的工作量,降低维护成本。
- 提高效率:使用DHCP可以减少由于手动配置而可能出现的错误,极大地提高了工作效率。
- 便于管理:当网络使用的IP地址段改变时,只需修改DHCP服务器的IP地址池即可,而不必逐台修改网络内的所有计算机地址。
2.4 应用场景
??DHCP的应用场景如下:
- 移动办公:当用户在局域网内移动时,例如从办公室到会议室,或者从一台设备切换到另一台设备,DHCP能够自动为其分配新的IP地址,使用户无需手动更改配置。
- 服务器部署:在服务器部署中,DHCP可以自动为服务器分配IP地址,降低了手动配置的复杂性和错误率。
- 网络设备配置:DHCP可以用于网络设备的配置,如路由器、交换机等,无需手动输入IP地址,简化了设备配置过程。
- 虚拟化环境:在虚拟化环境中,DHCP能够为虚拟机动态分配IP地址,提高了虚拟化环境的灵活性和效率。
- 物联网设备:对于数量众多的物联网设备,DHCP能够自动为每个设备分配IP地址,方便了设备的集中管理和监控。
3 WIZnet以太网芯片
WIZnet 主流硬件协议栈以太网芯片参数对比
Model | Embedded Core | Host I/F | TX/RX Buffer | HW Socket | Network Performance |
---|---|---|---|---|---|
W5100S | TCP/IPv4, MAC & PHY | 8bit BUS, SPI | 16KB | 4 | Max.25Mbps |
W6100 | TCP/IPv4/IPv6, MAC & PHY | 8bit BUS, Fast SPI | 32KB | 8 | Max.25Mbps |
W5500 | TCP/IPv4, MAC & PHY | Fast SPI | 32KB | 8 | Max 15Mbps |
- W5100S/W6100 支持 8bit数据总线接口,网络传输速度会优于W5500。
- W6100 支持IPV6,与W5100S 硬件兼容,若已使用W5100S的用户需要支持IPv6,可以Pin to Pin兼容。
- W5500 拥有比 W5100S更多的 Socket数量以及发送与接收缓存。
相较于软件协议栈,WIZnet的硬件协议栈以太网芯片有以下优点:
- 硬件TCP/IP协议栈:WIZnet的硬件协议栈芯片提供了一种硬件实现的TCP/IP协议栈,这种硬件实现的协议栈比软件实现的协议栈具有更好的性能和稳定性。
- 不需要额外的嵌入式系统软件栈和内存资源:由于所有的以太网传输和接收操作都由独立的以太网控制器处理,因此不需要额外的嵌入式系统软件栈和内存资源。
- 抵抗网络环境变化和DDoS攻击:与易受网络环境变化和DDoS攻击影响的软件TCP/IP协议栈相比,硬件协议栈芯片能够提供更稳定的以太网性能。
- 适用于低规格的嵌入式系统:即使在低规格的嵌入式系统中,使用WIZnet的硬件协议栈芯片也可以比使用软件TCP/IP协议栈的高规格系统显示出更高效的互联网应用操作性能。
4 DHCP网络设置示例概述以及使用
4.1 流程图
??程序的运行框图如下所示:
4.2 准备工作核心
软件
- Thonny
硬件
- W5100SIO模块 + RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板
- Micro USB 接口的数据线
- 网线
4.3 连接方式
- 通过数据线连接PC的USB口(主要用于烧录程序,也可以虚拟出串口使用)
- 使用模块连接RP2040 进行接线时
- RP2040 GPIO16 <----> W5100S MISO
- RP2040 GPIO17 <----> W5100S CS
- RP2040 GPIO18 <----> W5100S SCK
- RP2040 GPIO19 <----> W5100S MOSI
- RP2040 GPIO20 <----> W5100S RST
- 通过PC和设备都通过网线连接路由器LAN口
4.4 主要代码概述
??我们直接打开dhcp.py文件。
??可以看到在w5x00_init()函数中,进行了SPI的初始化。以及将spi相关引脚和复位引脚注册到库中,后续则是激活网络,并使用DHCP配置网络地址信息,当DHCP失败时,则配置静态网络地址信息。当未配置成功时,会打印出网络地址相关寄存器的信息,可以帮助我们更好的排查问题。
from usocket import socket
from machine import Pin,SPI
import time,network
def w5x00_init():
spi=SPI(0,2_000_000, mosi=Pin(19),miso=Pin(16),sck=Pin(18))
nic = network.WIZNET5K(spi,Pin(17),Pin(20))
nic.active(True)
try:
#DHCP
print("\r\nConfiguring DHCP")
nic.ifconfig('dhcp')
except:
#None DHCP
print("\r\nDHCP fails, use static configuration")
nic.ifconfig(('192.168.1.20','255.255.255.0','192.168.1.1','8.8.8.8'))#Set static network address information
#Print network address information
print("IP :",nic.ifconfig()[0])
print("Subnet Mask:",nic.ifconfig()[1])
print("Gateway :",nic.ifconfig()[2])
print("DNS :",nic.ifconfig()[3],"\r\n")
#If there is no network connection, the register address information is printed
while not nic.isconnected():
time.sleep(1)
print(nic.regs())
def main():
w5x00_init()
if __name__ == "__main__":
main()
4.5 结果演示
要测试以太网示例,必须将开发环境配置为使用Raspberry Pi Pico。
- 所需的开发环境
- 如果你必须编译MicroPython,则必须使用Linux或Unix环境。
将代码复制到Thonny之后,选择运行环境为Raspberry Pi Pico,然后点击运行即可。
5 注意事项
- 如果采用的是WIZnet的W5500来实现本章的示例,则只需烧录W5500的固件并运行示例程序即可。
6 相关链接
想了解更多,评论留言哦!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!