文章目录
1 前言
在这个智能硬件和物联网时代,MicroPython和树莓派PICO正以其独特的优势引领着嵌入式开发的新潮流。MicroPython作为一种精简优化的Python 3语言,为微控制器和嵌入式设备提供了高效开发和简易调试的
当我们结合WIZnet W5100S/W5500网络模块,MicroPython和树莓派PICO的开发潜力被进一步放大。这两款模块都内置了TCP/IP协议栈,使得在嵌入式设备上实现网络连接变得更加容易。无论是进行数据传输、远程控制,还是构建物联网应用,它们都提供了强大的支持。
本章我们将以WIZnet W5100S为例,以MicroPython的开发方式进行TCP_Server解析示例
2 相关网络信息
2 .1 简介
TCP Server是使用TCP协议进行通信的服务器端程序。TCP是一种面向连接的、可靠的、基于字节流的传输协议,用于在计算机网络上传输数据。TCP Server在计算机网络中扮演重要角色,它监听客户端的连接请求,并与客户端建立可靠的连接,实现数据的传输。在TCP Server中,服务器程序需要指定监听的端口号,并使用TCP协议与客户端建立连接。一旦有客户端连接进来,服务器程序就会为每个客户端建立一个单独的连接,并通过数据流对象(NetworkStream)与客户端进行数据交互。
2.2 TCP Server工作步骤
一般的TCP服务器的创建步骤:
- 创建套接字(socket)。
- 将套接字绑定到指定的IP地址和端口号。
- 开始监听来自客户端的连接请求。
- 当有客户端请求连接时,接受连接请求,并创建一个新的套接字(通常被称为子套接字)来处理与该客户端的通信。
- 通过子套接字与客户端进行数据交换。
- 在完成数据交换后,关闭子套接字,并继续监听其他客户端的连接请求。
2.3 TCP Server的优点
TCP Server的优点主要包括:
- 面向连接的传输:TCP是一种面向连接的协议,它在进行数据传输前需要先建立连接。这种连接可以保证数据传输的可靠性和顺序性。
- 可靠的数据传输:TCP提供了可靠的数据传输服务,它通过确认机制、重传机制等手段保证数据在传输过程中不会丢失或重复。
- 全双工方式传输:TCP支持全双工方式传输,即数据可以在两个方向上同时传输,提高了传输效率。
- 字节流方式:TCP以字节流的方式进行数据传输,这种方式可以更好地处理大量数据,并且可以控制数据的流量。
- 紧急数据传送功能:TCP提供了紧急数据传送功能,可以在紧急情况下优先传送数据。
2.4 应用场景
TCP Server的应用场景非常广泛,以下是一些主要的场景:
- 电子商务平台:TCP Server可以用于电子商务平台的后端服务,处理用户的订单、支付等操作,保证交易的安全性和可靠性。
- 在线游戏:TCP Server可以用于在线游戏的服务器端,处理游戏玩家的连接、数据交换等操作,提供稳定、高效的游戏体验。
- 即时通讯:TCP Server可以用于即时通讯系统的服务器端,处理用户的登录、消息发送和接收等操作,保证通讯的稳定性和可靠性。
- 远程监控:TCP Server可以用于远程监控系统的服务器端,接收和处理监控数据,提供实时的监控画面和报警信息。
- 文件传输:TCP Server可以用于文件传输系统的服务器端,处理文件的上传和下载等操作,保证文件传输的完整性和可靠性。
- 网络视频会议:TCP Server可以用于网络视频会议系统的服务器端,处理音视频数据的传输和处理等操作,提供稳定、流畅的会议体验。
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数量以及发送与接收缓存。
4 TCP Server网络设置示例概述以及使用
4.1 流程图
程序的运行框图如下所示:
4.2 准备工作核心
软件
- Thonny
- WIZnet UartTool
- SocketTester
硬件
- W5100SIO模块 + RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板
- Micro USB 接口的数据线
- TTL 转 USB
- 网线
4.3 连接方式
-
通过数据线连接PC的USB口(主要用于烧录程序,也可以虚拟出串口使用)
-
通过TTL串口转USB,连接UART0 的默认引脚:
- RP2040 GPIO0(UART0 TX) <----> USB_TTL_RX
- RP2040 GPIO1(UART0 RX) <----> USB_TTL_TX
-
使用模块连接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 主要代码概述
我们直接打开TCP_Server.py文件。
第一步:可以看到在w5x00_init()函数中,进行了SPI的初始化。以及将spi相关引脚和复位引脚注册到库中,后续则是激活网络,并使用DHCP配置网络地址信息,当DHCP失败时,则配置静态网络地址信息。当未配置成功时,会打印出网络地址相关寄存器的信息,可以帮助我们更好的排查问题。
第二步:然后是进行客户端监听的操作,当有客户端连接时,进行数据的收发测试。
''' TCP Server example.
date: 2023-11-23
'''
from usocket import socket
from machine import Pin,SPI,UART
import time, network
''' 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)
''' uart0 init
baudrate: 115200
tx pin : gpio0
rx pin : gpio1
'''
uart = UART(0, 115200, tx=Pin(0), rx=Pin(1))
uart.init(115200, bits=8, parity=None, stop=1)
uart.write('WIZnet chip tcp server example.\r\n')
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])
uart.write('ip :{0}\r\n'.format(nic.ifconfig()[0]))
uart.write('sn :{0}\r\n'.format(nic.ifconfig()[1]))
uart.write('gw :{0}\r\n'.format(nic.ifconfig()[2]))
uart.write('dns:{0}\r\n'.format(nic.ifconfig()[3]))
while not nic.isconnected():
time.sleep(1)
# print(nic.regs())
print('no link')
uart.write('no link\r\n')
conn_flag = False
def server_loop():
global localip
global conn_flag
while True:
if(conn_flag == False):
uart.write('socket open\r\n')
s = socket()
s.bind(listen_info) # Source IP Address and Port
s.listen(5) # max conncet counts
conn_flag = True
print("TEST server Loop")
uart.write('TCP Server:{0} ,listen port:{1}\r\n'.format(localip, listen_info[1]))
conn, addr = s.accept()
print('Connect from %s' % str(addr))
uart.write('Connect from {0}:{1}\r\n'.format(addr[0], addr[1]))
else:
try:
data = conn.recv(2048)
data = data.decode('utf-8')
data+='\r\n'
uart.write(data)
if data != 'NULL':
conn.send(data)
except:
uart.write('disconnect')
conn_flag = False
def main():
w5x00_init()
server_loop()
if __name__ == "__main__":
main()
4.5 烧录验证
要测试以太网示例,必须将开发环境配置为使用Raspberry Pi Pico。
- 所需的开发环境
- 如果你必须编译MicroPython,则必须使用Linux或Unix环境。
将代码复制到Thonny之后,选择运行环境为Raspberry Pi Pico,然后点击运行即可。打开SocketTester选择客户端连接服务器后发送消息可以获取到回传,打开WIZnet UartTool 打开串口,可以看到客户端发送的消息,则表示可以测试成功。
5 注意事项
- 如果采用的是WIZnet的W5500来实现本章的示例,则只需烧录W5500的固件并运行示例程序即可。
6 相关链接
想了解更多,评论留言哦!