文章目录
1. 前言
在这个智能硬件和物联网时代,MicroPython和树莓派PICO正以其独特的优势引领着嵌入式开发的新潮流。MicroPython作为一种精简优化的Python 3语言,为微控制器和嵌入式设备提供了高效开发和简易调试的
当我们结合WIZnet W5100S/W5500网络模块,MicroPython和树莓派PICO的开发潜力被进一步放大。这两款模块都内置了TCP/IP协议栈,使得在嵌入式设备上实现网络连接变得更加容易。无论是进行数据传输、远程控制,还是构建物联网应用,它们都提供了强大的支持。
本章我们将以WIZnet W5100S为例,以MicroPython的开发方式进行HTTP Client模式下的GET和POST请求示例。
2. 相关网络信息
2.1 简介
HTTP协议是一种超文本传输协议,它规定了客户端与服务器之间的通信规则,用于在网络中传输数据。HTTP协议基于TCP/IP协议族进行通信,是一种应用层协议。
HTTP Client即HTTP协议的客户端模式。
2.2 原理
在HTTP的客户端模式下,常用的有GET和POST两种请求方式。它们的区别如下:
- 数据传输方式:GET方法将参数包含在URL中,而POST方法则通过请求体传递参数。
- 数据可见性:GET方法的参数在URL中对所有人都是可见的,而POST方法的数据不会显示在URL中。
- 数据长度:GET方法的参数长度有限制,而POST方法对数据长度没有限制。
- 数据类型:GET方法只接受ASCII字符,而POST方法没有限制,也允许二进制数据。
- 安全性:POST方法比GET方法更安全,因为参数不会被保存在浏览器历史或Web服务器日志中。
- 缓存:GET请求会被浏览器主动缓存,而POST请求不会,除非手动设置。
- 历史记录:GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- 书签:GET产生的URL地址可以被收藏为书签,而POST不可以。
它们请求数据的工作原理如下:
2.3 请求方法
此外,还有以下这些请求方法
- HEAD:类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头。
- PUT:从客户端向服务器传送的数据取代指定的文档的内容。
- DELETE:请求服务器删除指定的页面。
- CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS:允许客户端查看服务器的性能。
- TRACE:回显服务器收到的请求,主要用于测试或诊断。
- PATCH:是对PUT方法的补充,用来对已知资源进行局部更新。
2.4 应用
在物联网(IoT)领域,HTTP协议的客户端模式有许多应用。
- 设备控制:物联网设备,如智能家居设备(灯泡、恒温器等),可以通过HTTP客户端模式接收来自服务器的命令,以改变设备状态。
- 数据上传:物联网设备,如传感器,可以使用HTTP POST方法将收集的数据发送到服务器。这些数据可以包括温度读数、湿度读数、运动检测数据等。
- 设备更新:物联网设备可以使用HTTP GET方法从服务器下载更新。这可以包括固件更新、配置更新等。
- 状态同步:物联网设备可以定期使用HTTP GET或POST方法将其状态发送到服务器,以便进行远程监控或故障排查。
- 服务集成:物联网设备可以使用HTTP客户端模式与各种在线服务进行集成。例如,一个智能恒温器可以使用HTTP GET方法获取天气预报数据,以更有效地调整室内温度。
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. HTTP Client通信示例讲解以及使用
4.1 程序流程图
4.2 测试准备
软件:
- Thonny
硬件:
- W5100S IO模块 + RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板
- Micro USB 接口的数据线
- 网线
4.3 连接方式
- 通过数据线连接PC的USB口
- 当使用W5100S/W5500 IO模块连接RP2040时
- RP2040 GPIO 16 <----> W5100S/W5500 MISO
- RP2040 GPIO 17 <----> W5100S/W5500 CS
- RP2040 GPIO 18 <----> W5100S/W5500 SCK
- RP2040 GPIO 19 <----> W5100S/W5500 MOSI
- RP2040 GPIO 20 <----> W5100S/W5500 RST
- 通过网线直接连接PC网口(或:PC和设备都通过网线连接交换机或路由器LAN口)
4.4 相关代码
我们直接打开http_client.py文件。
第一步:可以看到在w5x00_init()函数中,进行了SPI的初始化。以及将spi相关引脚和复位引脚注册到库中,后续则是激活网络,并使用DHCP配置网络地址信息,当DHCP失败时,则配置静态网络地址信息。当未配置成功时,会打印出网络地址相关寄存器的信息,可以帮助我们更好的排查问题。
第二步:在request()函数中,进行GET和POST请求测试。
''' HTTP Client example.
date: 2023-11-27
'''
from usocket import socket
from machine import Pin,SPI,UART
import time, network
import urequests
''' 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)
geturl = "http://httpbin.org/get"
posturl = "http://httpbin.org/post"
def w5x00_init():
global localip
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 request():
print("GET Request test")
r = urequests.get(geturl+"?WIZnet=W5100S_W5500")
print("Request response code:",r.status_code)
print("Request response args:",r.json()["args"])
r= urequests.post(posturl ,json={"WIZnet":"W5100S_W5500"})
if not r:
print('spreadsheet: no response received')
print("\r\nPOST Request test")
print("Request response code:",r.status_code)
print("Request response data:",r.json()["data"])
def main():
w5x00_init()
request()
if __name__ == "__main__":
main()
4.5 烧录验证
要测试以太网示例,必须将开发环境配置为使用Raspberry Pi Pico。
- 所需的开发环境
- 如果你必须编译MicroPython,则必须使用Linux或Unix环境。
第一步:选择环境为Raspberry Pi Pico,将urequests.py库文件保存到树莓派中。
第二步:将程序复制到Thonny中,然后点击运行,可以看到分别打印出了GET请求和POST请求的响应码和提交的数据内容。
注意:因为MicroPython的print函数是启用了stdout缓冲的,所以有时候并不会第一时间打印出内容。
5. 注意事项
- 如果采用的是WIZnet的W5500来实现本章的示例,则只需烧录W5500的固件并运行示例程序即可。
6. 相关链接
想了解更多,评论留言哦!