测试TCP通信
测试代码源自uPyCraft V1.1内置Examples
运行uPyCraft自带Examples tcpServer
#ESP32运行相关代码
import network
import socket
import time
SSID="dfrobotYanfa"
PASSWORD="hidfrobot"
port=10000
wlan=None
listenSocket=None
def connectWifi(ssid,passwd):
global wlan
wlan=network.WLAN(network.STA_IF) #create a wlan object
wlan.active(True) #Activate the network interface
wlan.disconnect() #Disconnect the last connected WiFi
wlan.connect(ssid,passwd) #connect wifi
while(wlan.ifconfig()[0]=='0.0.0.0'):
time.sleep(1)
return True
#Catch exceptions,stop program if interrupted accidentally in the 'try'
try:
connectWifi(SSID,PASSWORD)
ip=wlan.ifconfig()[0] #get ip addr
listenSocket = socket.socket() #create socket
listenSocket.bind((ip,port)) #bind ip and port
listenSocket.listen(1) #listen message
listenSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #Set the value of the given socket option
print ('tcp waiting...')
while True:
print("accepting.....")
conn,addr = listenSocket.accept() #Accept a connection,conn is a new socket object
print(addr,"connected")
while True:
data = conn.recv(1024) #Receive 1024 byte of data from the socket
if(len(data) == 0):
print("close socket")
conn.close() #if there is no data,close
break
print(data)
ret = conn.send(data) #send data
except:
if(listenSocket):
listenSocket.close()
wlan.disconnect()
wlan.active(False)
但是程序运行的时候发现有重启的现象,运行窗口有如下信息:
解决供电问题
因为USB供电不足造成
懒人的解决办法 使用魅族的快充头进行供电 使用ST-link的串口做电脑和ESP32的通信
ST-link的串口TXD RXD连接 ESP32的 RX0 TX0
Hello World !
使用USR-TCP232-Test软件做测试啦 具体设置见软件右边部分
ESP32的IP地址自己从路由器看
调试信息已经出现想要的内容φ(゜▽゜*)♪
('192.168.28.191', 52142) connected
b'hello world\r\n'
传输文本文件
ESP32作为服务器,内部存储名为test.txt文件,使用TCP方法传输到客户端
ESP32新建txt文件:
- 电脑上建立txt文件,并且编辑想要的内容
- 拖住想要发送的txt文件,鼠标指针移到uPyCraft软件的device文件栏【这个栏目的文件都是ESP32内部文件】
- 参见下图打印的调试信息 or 也可以看到device栏下出现了要传输的文件
- 完成
ESP32运行的TCP_SERVER程序
基于官方Examples修改而来
请注意修改开头部分的SSID 和 PASSWORD内容哦O(∩_∩)O
#ESP32运行server.py
import network
import socket
import time
SSID="224"
PASSWORD="nrf24l01"
port=10001
wlan=None
listenSocket=None
def connectWifi(ssid,passwd):
global wlan
wlan=network.WLAN(network.STA_IF) #create a wlan object
wlan.active(True) #Activate the network interface
wlan.disconnect() #Disconnect the last connected WiFi
wlan.connect(ssid,passwd) #connect wifi
while(wlan.ifconfig()[0]=='0.0.0.0'):
time.sleep(1)
return True
connectWifi(SSID,PASSWORD) #连接到wifi
ip=wlan.ifconfig()[0] #获取IP地址
server = socket.socket() #创建socket服务
server.bind((ip,port)) #绑定ip地址
server.listen(5) #监听信息
print ('tcp waiting...')
while True:
conn,addr = server.accept()
print("new conn:", addr)
while True:
print("等待新指令")
data = conn.recv(1024)
if not data:
print("客户端已端开")
break
cmd, filename = data.decode().split()
files = os.listdir()
if filename in files: #如果有这个文件
f = open(filename, "rb")
file_size = os.stat(filename)[6] #获取文件大小
conn.send(str(file_size).encode()) #发送文件大小
conn.recv(1024) #接收客户端确认
for line in f:
conn.send(line) #发送数据
print(cmd, filename)
f.close()
server.close()
电脑上运行的TCP_CLIENT程序
请注意修改下面程序中 client.connect((“192.168.28.205”,10001)) 的内容哦O(∩_∩)O
#电脑上运行Client.py
import socket
client = socket.socket()
client.connect(("192.168.28.205",10001))
while True:
cmd = input(">>>:").strip()
if len(cmd) == 0:
continue
if cmd.startswith("get"):
client.send(cmd.encode()) #客户端发送指令
receive_file_size = client.recv(1024)
print("server file size",receive_file_size.decode())
client.send("准备好接收文件了".encode()) #客户端发送确认
receive_size = 0
file_total_size = int(receive_file_size.decode())
filename = cmd.split()[1]
f = open(filename + ".new", "wb") #新文件,没有的话会创建
while receive_size < file_total_size:
data = client.recv(1024)
receive_size += len(data)
f.write(data) #写到文件
else:
print("file recv done")
print("receive_size:", receive_size)
print("total_file_size:", file_total_size)
f.close()
client.close()
- 先运行ESP32的程序
- 然后在电脑上运行Client
- uPyCraft里面出现 new conn: (‘192.168.28.191’, 61270) 表示连接成功
- 在电脑上运行的Client窗口输入 get test.txt
- 最后 会得到在ESP32内部的test.txt文件
电脑上运行Client如下
ESP32运行过程中的调试信息如下
最后得到的test.txt文件