??随着云计算的推广和普及,越来越多的网络设备和服务需要连接到网络,这意味着需要更多的IP地址和其他网络配置信息。DHCP服务器可以动态地分配IP地址和其他配置信息,简化了网络配置管理,提高了网络设备的可用性和效率。
??W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。本教程将介绍W5100S/W5500以太网HTTP Server应用的基本原理、使用步骤、应用实例以及注意事项,帮助读者更好地掌握这一技术。
??HTTP,全称为超文本传输协议(Hypertext Transfer Protocol),是一种应用最为广泛的网络传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议,所有的WWW文件都必须遵守这个标准。它是一个基于TCP/IP通信协议来传递数据(HTML文件,图片文件,查询结果等)。
HTTP Server的原理步骤可以归纳为以下几点:
??HTTP Server的优点包括:
??HTTP Server的应用场景非常广泛,以下是一些主要的场景:
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 |
相较于软件协议栈,WIZnet的硬件协议栈以太网芯片有以下优点:
??程序的运行框图如下所示:
软件
硬件
??我们直接打开http_server.py文件。
第一步:可以看到在w5x00_init()函数中,进行了SPI的初始化。以及将SPI相关引脚和复位引脚注册到库中,后续则是激活网络,并使用DHCP配置网络地址信息,当DHCP失败时,则配置静态网络地址信息。当未配置成功时,会打印出网络地址相关寄存器的信息,可以帮助我们更好的排查问题。
第二步:设置socket号,绑定服务器ip和端口号。
第三步:监听,等待客户端连接。
第四步:设置网页界面,对客户端的请求做出解析,以此来控制灯的开关。同时窗口打印出灯的状态和客户端的IP信息
''' HTTP Server example.
date: 2023-11-27
'''
from usocket import socket
from machine import Pin,SPI
import time, network
''' LED init
'''
led = Pin(25, Pin.OUT)
''' static netinfo
'''
ip = '192.168.1.11'
sn = '255.255.255.0'
gw = '192.168.1.1'
dns= '8.8.8.8'
netinfo=(ip, sn, gw, dns)
localip = ''
localport = 8000
listen_info = (localip, localport)
def w5x00_init():
global localip
''' spi0 init
baudrate: 2000000
mosi pin: gpio19
miso pin: gpio16
sck pin: gpio18
cs pin: gpio17
rst pin: gpio20
'''
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)
# use dhcp, if fail use static netinfo
try:
nic.ifconfig('dhcp')
except:
nic.ifconfig(netinfo)
localip = nic.ifconfig()[0]
print('ip :', nic.ifconfig()[0])
print('sn :', nic.ifconfig()[1])
print('gw :', nic.ifconfig()[2])
print('dns:', nic.ifconfig()[3])
while not nic.isconnected():
time.sleep(1)
# print(nic.regs())
print('no link')
uart.write('no link\r\n')
''' web page info
'''
def web_page():
if led.value()==1:
led_state="ON"
else:
led_state="OFF"
html = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Raspberry Pi Pico Web server - WIZnet W5100S</title>
</head>
<body>
<div align="center">
<H1>Raspberry Pi Pico Web server & WIZnet Ethernet HAT</H1>
<h2>Control LED</h2>
PICO LED state: <strong>""" + led_state + """</strong>
<p><a href="/?led=on"><button class="button">ON</button></a><br>
</p>
<p><a href="/?led=off"><button class="button button2">OFF</button></a><br>
</p>
</div>
</body>
</html>
"""
return html
def main():
global localip
w5x00_init()
s = socket()
s.bind((localip, 80))
s.listen(5)
while True:
conn, addr = s.accept()
print('Connect from %s' % str(addr))
request = conn.recv(1024)
request = str(request)
#print('Content = %s' % request)
led_on = request.find('/?led=on')
led_off = request.find('/?led=off')
if led_on == 6:
print("LED ON")
led.value(1)
if led_off == 6:
print("LED OFF")
led.value(0)
response = web_page()
conn.send('HTTP/1.1 200 OK\n')
conn.send('Connection: close\n')
conn.send('Content-Type: text/html\n')
conn.send('Content-Length: %s\n\n' % len(response))
conn.send(response)
conn.close()
if __name__ == "__main__":
main()
第一步:打开thonny选择环境为Raspberry Pi Pico将程序复制到Thonny中,然后点击运行。
第二步:打开浏览器输入服务器ip,进入到网页。
第三步:选择灯的状态进行控制。点击浏览器界面控制灯的状态之后Thonny上的窗口会打印灯的状态和客户端ip。
注意:因为MicroPython的print函数是启用了stdout缓冲的,所以有时候并不会第一时间打印出内容。
想了解更多,评论留言哦!