四、W5100S/W5500+RP2040之MicroPython开发<TCP Client示例>

文章目录

  • 1 前言
  • 2 相关网络信息
    • 2 .1 简介
    • 2.2 TCP_Client工作步骤
    • 2.3 TCP Client的优点
    • 2.4 应用场景
  • 3 WIZnet以太网芯片
  • 4 TCP_Client网络设置示例概述以及使用
    • 4.1 流程图
    • 4.2 准备工作核心
    • 4.3 连接方式
    • 4.4 主要代码概述
    • 4.5 烧录验证
  • 5 注意事项
  • 6 相关链接

1 前言

  在这个智能硬件和物联网时代,MicroPython和树莓派PICO正以其独特的优势引领着嵌入式开发的新潮流。MicroPython作为一种精简优化的Python 3语言,为微控制器和嵌入式设备提供了高效开发和简易调试的

  当我们结合WIZnet W5100S/W5500网络模块,MicroPython和树莓派PICO的开发潜力被进一步放大。这两款模块都内置了TCP/IP协议栈,使得在嵌入式设备上实现网络连接变得更加容易。无论是进行数据传输、远程控制,还是构建物联网应用,它们都提供了强大的支持。

  本章我们将以WIZnet W5100S为例,以MicroPython的开发方式进行TCP_Client解析示例

2 相关网络信息

2 .1 简介

在这里插入图片描述

  TCP_Client是一种网络协议的客户端,通常用于在设备或应用程序之间建立可靠的数据连接。它通过TCP/IP协议与远程服务器建立连接,并发送请求信息。服务器接收到请求信息后,在相应的端口上提供服务并返回响应。TCP_Client将响应信息解析后,可以进行相应的处理。

  TCP_Client通常用于设备与服务器之间的数据交互,是最常用的联网通信方式之一。它具有连接和断开的概念,从而保证数据的可靠交换。

2.2 TCP_Client工作步骤

在这里插入图片描述

在三次握手过程中:

  1. 第一次握手:客户端发送带有SYN标志的TCP报文到服务器,等待服务器的确认。
  2. 第二次握手:服务器收到SYN报文后,会向客户端发送带有SYN和ACK标志的TCP报文,同时为自己初始化一个序列号,确认号设置为收到客户端SYN报文的序号加1,等待客户端的确认。
  3. 第三次握手:客户端收到服务器发送的带有SYN和ACK标志的报文后,向服务器发送带有ACK标志的TCP报文,确认号设置为收到服务器SYN报文的序号加1,自己的序列号设置为收到服务器SYN报文的序号加1,进入ESTABLISHED状态,完成三次握手。
  4. 连接成功可进行数据交互。

在四次挥手过程中:

  1. 第一次挥手:客户端发送一个FIN报文给服务器,关闭客户端到服务器的数据传送。
  2. 第二次挥手:服务器收到FIN报文后,向客户端发送带有ACK标志的TCP报文,确认号设置为收到客户端FIN报文的序号加1。
  3. 第三次挥手:服务器发送带有FIN标志的TCP报文给客户端,关闭服务器到客户端的数据传送。
  4. 第四次挥手:客户端收到服务器发送的带有FIN标志的报文后,向服务器发送带有ACK标志的TCP报文,确认号设置为收到服务器FIN报文的序号加1。

2.3 TCP Client的优点

TCP Client的优点主要包括:

  1. 可靠的连接:TCP协议是一种可靠的传输协议,它能够保证数据在传输过程中的完整性和可靠性,避免了数据丢失或重复的问题。
  2. 顺序性:TCP Client的数据传输是按照发送的顺序进行接收的,保证了数据传输的顺序性。
  3. 流量控制:TCP协议具有流量控制机制,能够避免发送方与接收方之间的数据传输速率不匹配的问题。
  4. 拥塞控制:TCP协议具有拥塞控制机制,能够在网络拥塞时自动减慢发送速率,保证了网络通信的稳定性和可靠性。
  5. 安全性:TCP协议是一种加密的协议,能够保证数据传输的安全性,避免了数据被窃取或篡改的问题。
  6. 广泛的应用:TCP协议是一种通用的网络协议,可以在多种操作系统和平台上应用,具有很好的兼容性和可移植性。

2.4 应用场景

  TCP Client的应用场景非常广泛,以下是一些主要的场景:

  1. 网络通信:TCP Client被广泛应用于各种网络通信中,包括但不限于远程登录、文件传输、电子邮件等。
  2. 数据库连接:TCP Client常用于与数据库服务器建立连接,实现数据的传输和交互。
  3. 云服务:许多云服务,如Amazon的AWS和Google的GCP,都使用TCP Client进行数据交互和远程管理。
  4. 实时交易系统:在实时交易系统中,TCP Client可以提供稳定、可靠的数据传输,确保交易的顺利进行。
  5. 游戏开发:在多人在线游戏中,TCP Client可以帮助实现实时的游戏状态同步和数据交互。
  6. 远程控制:通过TCP Client,用户可以远程连接到其他计算机并进行控制。

3 WIZnet以太网芯片

WIZnet 主流硬件协议栈以太网芯片参数对比

ModelEmbedded CoreHost I/FTX/RX BufferHW SocketNetwork Performance
W5100STCP/IPv4, MAC & PHY8bit BUS, SPI16KB4Max.25Mbps
W6100TCP/IPv4/IPv6, MAC & PHY8bit BUS, Fast SPI32KB8Max.25Mbps
W5500TCP/IPv4, MAC & PHYFast SPI32KB8Max.15Mbps
  1. W5100S/W6100 支持 8bit数据总线接口,网络传输速度会优于W5500。
  2. W6100 支持IPv6,与W5100S 硬件兼容,若已使用W5100S的用户需要支持IPv6,可以Pin to Pin兼容。
  3. W5500 拥有比 W5100S更多的 Socket数量以及发送与接收缓存。

相较于软件协议栈,WIZnet的硬件协议栈以太网芯片有以下优点

  1. 硬件TCP/IP协议栈:WIZnet的硬件协议栈芯片提供了一种硬件实现的TCP/IP协议栈,这种硬件实现的协议栈比软件实现的协议栈具有更好的性能和稳定性。
  2. 不需要额外的嵌入式系统软件栈和内存资源:由于所有的以太网传输和接收操作都由独立的以太网控制器处理,因此不需要额外的嵌入式系统软件栈和内存资源。
  3. 抵抗网络环境变化和DDoS攻击:与易受网络环境变化和DDoS攻击影响的软件TCP/IP协议栈相比,硬件协议栈芯片能够提供更稳定的以太网性能。
  4. 适用于低规格的嵌入式系统:即使在低规格的嵌入式系统中,使用WIZnet的硬件协议栈芯片也可以比使用软件TCP/IP协议栈的高规格系统显示出更高效的互联网应用操作性能。

在这里插入图片描述

4 TCP_Client网络设置示例概述以及使用

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_Client.py文件。

第一步:可以看到在w5x00_init()函数中,进行了SPI和串口的初始化。以及将SPI相关引脚和复位引脚注册到库中,后续则是激活网络,并使用DHCP配置网络地址信息,当DHCP失败时,则配置静态网络地址信息。当未配置成功时,会打印出网络地址相关寄存器的信息,可以帮助我们更好的排查问题。

第二步:然后是进行连接远程服务器的操作,连接上服务器时,可进行数据的收发测试。

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)

destip = '192.168.1.18'
destport = 8000
conn_info = (destip, destport)

''' 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 client example.\r\n')
    
def w5x00_init():
    
    ''' 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)
        
    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 client_loop():
    global conn_flag
    s = socket()
    while(True):
        if(conn_flag== False):
            try:
                s.connect(conn_info) # Destination IP Address
                conn_flag=True
                print("Loopback client Connect!")
                uart.write('Loopback client connect!\r\n')
            except:
                uart.write('connect error\r\n')
                conn_flag=False
        if(conn_flag):
            try:
                data = s.recv(2048)
                data = data.decode('utf-8')
        
                if data != 'NULL' :
                    uart.write('recv from {0}:[{1}]: {2}\r\n'.format(conn_info[0],conn_info[1],data))
                    s.send(data)
            except:
                uart.write('disconnect')
                conn_flag=False
            
def main():
    w5x00_init()
    client_loop()
if __name__ == "__main__":
    main()



4.5 烧录验证

在这里插入图片描述

要测试以太网示例,必须将开发环境配置为使用Raspberry Pi Pico。

  • 所需的开发环境
    • Thonny
  • 如果你必须编译MicroPython,则必须使用Linux或Unix环境。

将代码复制到Thonny之后,选择运行环境为Raspberry Pi Pico,然后点击运行即可。打开SocketTester选择服务器开启监听等待客户端连接,有客户端连接之后发送消息可以获取到回传,打开WIZnet UartTool 打开串口,可以看到客户端发送的消息,则表示可以测试成功。

5 注意事项

  • 如果采用的是WIZnet的W5500来实现本章的示例,则只需烧录W5500的固件并运行示例程序即可。

6 相关链接

WIZnet官网

本章例程链接

想了解更多,评论留言哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/258356.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【扩散模型】6、Classifier-Free Diffusion Guidance | 无需显示分类器指导也能获得很好的生成效果

论文&#xff1a;Classifier-Free Diffusion Guidance 代码&#xff1a;暂无 出处&#xff1a;NIPS 2021 workshop&#xff08;短版本论文&#xff09; 一、背景 在此之前&#xff0c;classifier guidance &#xff08;diffusion model beats GAN&#xff09;模型使用类别引…

C++的设计模式总结

通过指针指向一个多态对象来表达灵活性

MongoDB的覆盖索引查询

本文主要介绍MongoDB的覆盖索引查询。 目录 MongoDB的覆盖索引查询使用ensureIndex()创建索引使用createIndex()创建索引覆盖索引查询 MongoDB的覆盖索引查询 使用ensureIndex()创建索引 db.collection.ensureIndex()用于在集合中创建索引。索引是一种数据结构&#xff0c;用…

Github 2023-12-20 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-20统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目5非开发语言项目2Rust项目1Solidity项目1TypeScript项目1C项目1 Manticore Search: 开源快速数据库…

读取spring boot项目resource目录下的文件

背景 项目开发过程中&#xff0c;有一些情况下将配置文件放在resource下能简化代码实现和部署时的打包步骤。例如&#xff1a; 项目中使用的数据库升级脚本、初始化脚本。将文件放到resource下&#xff0c;打包在jar包中&#xff0c;不能直接通过File路径读取。下面介绍两种读…

linux搭建gitlab

gitlab的介绍 区别于github&#xff0c;github是面向互联网基于git实现的代码托管平台&#xff0c;gitlab是基于Ruby语言实现的git管理平台软件&#xff0c;一般用于公司内部代码仓库。 gitlab组成 Nginx 静态Web服务器Gitlab-workhorse 轻量级的反向代理服务器Gitlab-shell 用…

5分钟上手浏览器插件测试——Eolink Apikit

Eolink Apikit 研发管理和自动化测试产品中&#xff0c;提供了多种发起 API 测试的方式&#xff1a; 服务器测试&#xff1a;通过 Eolink Apikit 官方远程服务器发送请求&#xff0c;不需要安装任何插件&#xff0c;但是无法访问本地服务器(localhost)、内网、局域网。插件测试…

小程序使用web-view无法打开该H5页面不支持打开的解决方法

我在正式上线版小程序使用 web-view 组件测试时提示&#xff1a;“无法打开该页面&#xff0c;不支持打开 https://xxxxxx&#xff0c;请在“小程序右上角更多->反馈与投诉”中和开发者反馈。” 奇怪的是&#xff0c;“真机调试”、“开发模式”都可以使用 web-view 组件访…

net6使用StackExchangeRedis实现分布式缓存

上一篇讲解了Redis的搭建及ServiceStack.Redis 与 StackExchange.Reids 的区别https://blog.csdn.net/qq_39569480/article/details/105249607 这篇文章遗我们来说下使用Microsoft.Extensions.Caching.StackExchangeRedis来对redis进行操作及帮助类。 首先在windows上安装red…

【一】FPGA实现SPI协议之SPI协议介绍

【一】FPGA实现SPI协议之SPI协议介绍 一、spi协议解析 spi协议有4根线&#xff0c;主机输出从机输入MOSI、主机输入从机输出MISO、时钟信号SCLK、片选信号SS\CS 。 一般用于主机和从机之间通信。由主机发起读请求和写请求&#xff0c;主机的权限是主动的&#xff0c;从机是被…

STM32——串口通信应用篇

一、引言 STM32微控制器是一款功能强大的嵌入式系统芯片&#xff0c;广泛应用于各种领域。其中&#xff0c;串口通信是其重要功能之一&#xff0c;可用于与外部设备进行数据交换和控制。本文将介绍STM32串口通信的基本原理、应用场景以及实现方法。 二、STM32串口通信基本原理 …

Ubuntu 虚拟机环境,编译AOSP源码

环境 : VMware虚拟机 Ubuntu 20.04.3 LTS 搭建配置开发环境 sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl…

【大数据存储与处理】实验一 HBase 的基本操作

一、实验目的&#xff1a; 1. 掌握 Hbase 创建数据库表及删除数据库表 2. 掌握 Hbase 对数据库表数据的增、删、改、查。 二、实验内容&#xff1a; 1、题目 0&#xff1a;进入 hbase shell 2、题目 1&#xff1a;Hbase 创建数据库表 创建数据库表的命令&#xff1a;create 表…

CW32单片机在智能马桶的应用介绍

智能科技的迅速发展使得我们的日常生活变得更加便捷和舒适。智能马桶作为其中一种智能家居产品&#xff0c;通过单片机接受和处理来自传感器的数据&#xff0c;然后通过控制模块对智能马桶的各项功能进行控制&#xff0c;实现对智能马桶的全面控制和调节。本文将介绍CW32单片机…

【SSM】MyBatis

MyBatis 文章目录 MyBatis1. 简介2. 使用流程3. 基本使用3.1 配置文件3.2 SQL语句传参3.2 数据输入3.2.1 单个简单类型参数3.2.2 多个简单类型数据3.2.3 实体类类型参数3.2.4 Map类型参数 3.3 数据输出3.3.1 resultType指定输出类型3.3.2 返回实体类对象注意点3.3.3 返回主键值…

【PostgreSQL内核学习(十八)—— 存储管理(存储管理的体系结构)】

存储管理 概述存储管理器的体系结构存储管理器的主要任务读写元组过程 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用原则&#xff0c;并在适用的情况下注明引用来源。 本文主要参考…

基于C语言的坦克大战游戏开发

基于C语言的坦克大战游戏开发 在这篇文章中,我们将介绍如何使用C语言编写一个基本的坦克大战游戏。我们将使用C语言的基本语法和数据结构来实现游戏的逻辑和功能。 一、游戏概述 坦克大战是一款经典的射击游戏,玩家需要控制坦克在战场上移动、射击敌人并摧毁它们。游戏中…

MongoDB的查询分析explain和hint

本文主要介绍MongoDB的查询分析explain和hint。 目录 MongoDB的查询分析explainhint MongoDB的查询分析 在MongoDB中&#xff0c;"explain"和"hint"是两个用于查询优化和分析的关键指令。 explain 在MongoDB中&#xff0c;explain()是一个用于查询分析的…

【Java】学习指南总结(少走弯路必看!)

开篇 作为初学者&#xff0c;接触Java可能会觉得有些复杂。本文旨在帮助大家轻松入门Java&#xff0c;避免走弯路。 基础理解 刚开始接触Java时&#xff0c;首要任务是理解Java的基本构成。这包括Java的基础语法、应用范围、以及Java的核心组成部分&#xff1a;JVM&#xf…

CentOs7.x安装部署SeaTunnelWeb遇到的坑

CentOs7.x安装部署SeaTunnelWeb遇到的坑 文章目录 1. 环境2. SeaTunnel安装部署2.1下载安装包2.2 设置环境变量2.3 安装连接器插件2.4 拷贝jar包到lib下2.5 启动命令2.6 执行官方client提交任务demo 3. SeaTunnel-Web安装部署3.1 下载安装包3.2 初始化数据库脚本或修改配置appl…