1 前言
??在這個(gè)智能硬件和物聯(lián)網(wǎng)時(shí)代,MicroPython和樹莓派PICO正以其獨(dú)特的優(yōu)勢(shì)引領(lǐng)著嵌入式開發(fā)的新潮流。MicroPython作為一種精簡優(yōu)化的Python 3語言,為微控制器和嵌入式設(shè)備提供了高效開發(fā)和簡易調(diào)試的
??當(dāng)我們結(jié)合WIZnet W5100S/W5500網(wǎng)絡(luò)模塊,MicroPython和樹莓派PICO的開發(fā)潛力被進(jìn)一步放大。這兩款模塊都內(nèi)置了TCP/IP協(xié)議棧,使得在嵌入式設(shè)備上實(shí)現(xiàn)網(wǎng)絡(luò)連接變得更加容易。無論是進(jìn)行數(shù)據(jù)傳輸、遠(yuǎn)程控制,還是構(gòu)建物聯(lián)網(wǎng)應(yīng)用,它們都提供了強(qiáng)大的支持。
??本章我們將以WIZnet W5100S為例,以MicroPython的開發(fā)方式進(jìn)行TCP_Client解析示例
2 相關(guān)網(wǎng)絡(luò)信息
2 .1 簡介
?
??TCP_Client是一種網(wǎng)絡(luò)協(xié)議的客戶端,通常用于在設(shè)備或應(yīng)用程序之間建立可靠的數(shù)據(jù)連接。它通過TCP/IP協(xié)議與遠(yuǎn)程服務(wù)器建立連接,并發(fā)送請(qǐng)求信息。服務(wù)器接收到請(qǐng)求信息后,在相應(yīng)的端口上提供服務(wù)并返回響應(yīng)。TCP_Client將響應(yīng)信息解析后,可以進(jìn)行相應(yīng)的處理。
??TCP_Client通常用于設(shè)備與服務(wù)器之間的數(shù)據(jù)交互,是最常用的聯(lián)網(wǎng)通信方式之一。它具有連接和斷開的概念,從而保證數(shù)據(jù)的可靠交換。
2.2 TCP_Client工作步驟
在三次握手過程中:
- 第一次握手:客戶端發(fā)送帶有SYN標(biāo)志的TCP報(bào)文到服務(wù)器,等待服務(wù)器的確認(rèn)。
- 第二次握手:服務(wù)器收到SYN報(bào)文后,會(huì)向客戶端發(fā)送帶有SYN和ACK標(biāo)志的TCP報(bào)文,同時(shí)為自己初始化一個(gè)序列號(hào),確認(rèn)號(hào)設(shè)置為收到客戶端SYN報(bào)文的序號(hào)加1,等待客戶端的確認(rèn)。
- 第三次握手:客戶端收到服務(wù)器發(fā)送的帶有SYN和ACK標(biāo)志的報(bào)文后,向服務(wù)器發(fā)送帶有ACK標(biāo)志的TCP報(bào)文,確認(rèn)號(hào)設(shè)置為收到服務(wù)器SYN報(bào)文的序號(hào)加1,自己的序列號(hào)設(shè)置為收到服務(wù)器SYN報(bào)文的序號(hào)加1,進(jìn)入ESTABLISHED狀態(tài),完成三次握手。
- 連接成功可進(jìn)行數(shù)據(jù)交互。
在四次揮手過程中:
- 第一次揮手:客戶端發(fā)送一個(gè)FIN報(bào)文給服務(wù)器,關(guān)閉客戶端到服務(wù)器的數(shù)據(jù)傳送。
- 第二次揮手:服務(wù)器收到FIN報(bào)文后,向客戶端發(fā)送帶有ACK標(biāo)志的TCP報(bào)文,確認(rèn)號(hào)設(shè)置為收到客戶端FIN報(bào)文的序號(hào)加1。
- 第三次揮手:服務(wù)器發(fā)送帶有FIN標(biāo)志的TCP報(bào)文給客戶端,關(guān)閉服務(wù)器到客戶端的數(shù)據(jù)傳送。
- 第四次揮手:客戶端收到服務(wù)器發(fā)送的帶有FIN標(biāo)志的報(bào)文后,向服務(wù)器發(fā)送帶有ACK標(biāo)志的TCP報(bào)文,確認(rèn)號(hào)設(shè)置為收到服務(wù)器FIN報(bào)文的序號(hào)加1。
2.3 TCP Client的優(yōu)點(diǎn)
TCP Client的優(yōu)點(diǎn)主要包括:
- 可靠的連接:TCP協(xié)議是一種可靠的傳輸協(xié)議,它能夠保證數(shù)據(jù)在傳輸過程中的完整性和可靠性,避免了數(shù)據(jù)丟失或重復(fù)的問題。
- 順序性:TCP Client的數(shù)據(jù)傳輸是按照發(fā)送的順序進(jìn)行接收的,保證了數(shù)據(jù)傳輸?shù)捻樞蛐浴?/li>
- 流量控制:TCP協(xié)議具有流量控制機(jī)制,能夠避免發(fā)送方與接收方之間的數(shù)據(jù)傳輸速率不匹配的問題。
- 擁塞控制:TCP協(xié)議具有擁塞控制機(jī)制,能夠在網(wǎng)絡(luò)擁塞時(shí)自動(dòng)減慢發(fā)送速率,保證了網(wǎng)絡(luò)通信的穩(wěn)定性和可靠性。
- 安全性:TCP協(xié)議是一種加密的協(xié)議,能夠保證數(shù)據(jù)傳輸?shù)陌踩?,避免了?shù)據(jù)被竊取或篡改的問題。
- 廣泛的應(yīng)用:TCP協(xié)議是一種通用的網(wǎng)絡(luò)協(xié)議,可以在多種操作系統(tǒng)和平臺(tái)上應(yīng)用,具有很好的兼容性和可移植性。
2.4 應(yīng)用場(chǎng)景
??TCP Client的應(yīng)用場(chǎng)景非常廣泛,以下是一些主要的場(chǎng)景:
- 網(wǎng)絡(luò)通信:TCP Client被廣泛應(yīng)用于各種網(wǎng)絡(luò)通信中,包括但不限于遠(yuǎn)程登錄、文件傳輸、電子郵件等。
- 數(shù)據(jù)庫連接:TCP Client常用于與數(shù)據(jù)庫服務(wù)器建立連接,實(shí)現(xiàn)數(shù)據(jù)的傳輸和交互。
- 云服務(wù):許多云服務(wù),如Amazon的AWS和Google的GCP,都使用TCP Client進(jìn)行數(shù)據(jù)交互和遠(yuǎn)程管理。
- 實(shí)時(shí)交易系統(tǒng):在實(shí)時(shí)交易系統(tǒng)中,TCP Client可以提供穩(wěn)定、可靠的數(shù)據(jù)傳輸,確保交易的順利進(jìn)行。
- 游戲開發(fā):在多人在線游戲中,TCP Client可以幫助實(shí)現(xiàn)實(shí)時(shí)的游戲狀態(tài)同步和數(shù)據(jù)交互。
- 遠(yuǎn)程控制:通過TCP Client,用戶可以遠(yuǎn)程連接到其他計(jì)算機(jī)并進(jìn)行控制。
3 WIZnet以太網(wǎng)芯片
WIZnet 主流硬件協(xié)議棧以太網(wǎng)芯片參數(shù)對(duì)比
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數(shù)據(jù)總線接口,網(wǎng)絡(luò)傳輸速度會(huì)優(yōu)于W5500。
- W6100 支持IPv6,與W5100S 硬件兼容,若已使用W5100S的用戶需要支持IPv6,可以Pin to Pin兼容。
- W5500 擁有比 W5100S更多的 Socket數(shù)量以及發(fā)送與接收緩存。
相較于軟件協(xié)議棧,WIZnet的硬件協(xié)議棧以太網(wǎng)芯片有以下優(yōu)點(diǎn):
- 硬件TCP/IP協(xié)議棧:WIZnet的硬件協(xié)議棧芯片提供了一種硬件實(shí)現(xiàn)的TCP/IP協(xié)議棧,這種硬件實(shí)現(xiàn)的協(xié)議棧比軟件實(shí)現(xiàn)的協(xié)議棧具有更好的性能和穩(wěn)定性。
- 不需要額外的嵌入式系統(tǒng)軟件棧和內(nèi)存資源:由于所有的以太網(wǎng)傳輸和接收操作都由獨(dú)立的以太網(wǎng)控制器處理,因此不需要額外的嵌入式系統(tǒng)軟件棧和內(nèi)存資源。
- 抵抗網(wǎng)絡(luò)環(huán)境變化和DDoS攻擊:與易受網(wǎng)絡(luò)環(huán)境變化和DDoS攻擊影響的軟件TCP/IP協(xié)議棧相比,硬件協(xié)議棧芯片能夠提供更穩(wěn)定的以太網(wǎng)性能。
- 適用于低規(guī)格的嵌入式系統(tǒng):即使在低規(guī)格的嵌入式系統(tǒng)中,使用WIZnet的硬件協(xié)議棧芯片也可以比使用軟件TCP/IP協(xié)議棧的高規(guī)格系統(tǒng)顯示出更高效的互聯(lián)網(wǎng)應(yīng)用操作性能。
4 TCP_Client網(wǎng)絡(luò)設(shè)置示例概述以及使用
4.1 流程圖
??程序的運(yùn)行框圖如下所示:
在這里插入圖片描述
4.2 準(zhǔn)備工作核心
軟件
- Thonny
- WIZnet UartTool
- SocketTester
硬件
- W5100SIO模塊 + RP2040 樹莓派Pico開發(fā)板 或者 WIZnet W5100S-EVB-Pico開發(fā)板
- Micro USB 接口的數(shù)據(jù)線
- TTL 轉(zhuǎn) USB
- 網(wǎng)線
4.3 連接方式
-
通過數(shù)據(jù)線連接PC的USB口(主要用于燒錄程序,也可以虛擬出串口使用)
-
通過TTL串口轉(zhuǎn)USB,連接UART0 的默認(rèn)引腳:
- RP2040 GPIO0(UART0 TX) <----> USB_TTL_RX
- RP2040 GPIO1(UART0 RX) <----> USB_TTL_TX
-
使用模塊連接RP2040 進(jìn)行接線時(shí)
- RP2040 GPIO16 <----> W5100S MISO
- RP2040 GPIO17 <----> W5100S CS
- RP2040 GPIO18 <----> W5100S SCK
- RP2040 GPIO19 <----> W5100S MOSI
- RP2040 GPIO20 <----> W5100S RST
-
通過PC和設(shè)備都通過網(wǎng)線連接路由器LAN口
4.4 主要代碼概述
??我們直接打開TCP_Client.py文件。
第一步:可以看到在w5x00_init()函數(shù)中,進(jìn)行了SPI和串口的初始化。以及將SPI相關(guān)引腳和復(fù)位引腳注冊(cè)到庫中,后續(xù)則是激活網(wǎng)絡(luò),并使用DHCP配置網(wǎng)絡(luò)地址信息,當(dāng)DHCP失敗時(shí),則配置靜態(tài)網(wǎng)絡(luò)地址信息。當(dāng)未配置成功時(shí),會(huì)打印出網(wǎng)絡(luò)地址相關(guān)寄存器的信息,可以幫助我們更好的排查問題。
第二步:然后是進(jìn)行連接遠(yuǎn)程服務(wù)器的操作,連接上服務(wù)器時(shí),可進(jìn)行數(shù)據(jù)的收發(fā)測(cè)試。
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 燒錄驗(yàn)證
要測(cè)試以太網(wǎng)示例,必須將開發(fā)環(huán)境配置為使用Raspberry Pi Pico。
- 所需的開發(fā)環(huán)境
- Thonny
- 如果你必須編譯MicroPython,則必須使用Linux或Unix環(huán)境。
將代碼復(fù)制到Thonny之后,選擇運(yùn)行環(huán)境為Raspberry Pi Pico,然后點(diǎn)擊運(yùn)行即可。打開SocketTester選擇服務(wù)器開啟監(jiān)聽等待客戶端連接,有客戶端連接之后發(fā)送消息可以獲取到回傳,打開WIZnet UartTool 打開串口,可以看到客戶端發(fā)送的消息,則表示可以測(cè)試成功。
5 注意事項(xiàng)
- 如果采用的是WIZnet的W5500來實(shí)現(xiàn)本章的示例,則只需燒錄W5500的固件并運(yùn)行示例程序即可。
6 相關(guān)鏈接
WIZnet官網(wǎng)
本章例程鏈接文章來源:http://www.zghlxwxcb.cn/news/detail-830490.html
想了解更多,評(píng)論留言哦!文章來源地址http://www.zghlxwxcb.cn/news/detail-830490.html
到了這里,關(guān)于四、W5100S/W5500+RP2040之MicroPython開發(fā)<TCP Client示例>的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!