Micropython ESP32 tcpserver 把玩【一】

文章目录

    • 测试TCP通信
    • 解决供电问题
    • Hello World !
    • 传输文本文件
    • ESP32新建txt文件:
    • ESP32运行的TCP_SERVER程序
    • 电脑上运行的TCP_CLIENT程序

测试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)

但是程序运行的时候发现有重启的现象,运行窗口有如下信息:
Micropython ESP32 tcpserver 把玩【一】_第1张图片

解决供电问题

因为USB供电不足造成
懒人的解决办法 使用魅族的快充头进行供电 使用ST-link的串口做电脑和ESP32的通信
ST-link的串口TXD RXD连接 ESP32的 RX0 TX0

Hello World !

使用USR-TCP232-Test软件做测试啦 具体设置见软件右边部分
ESP32的IP地址自己从路由器看

Micropython ESP32 tcpserver 把玩【一】_第2张图片
Micropython ESP32 tcpserver 把玩【一】_第3张图片

调试信息已经出现想要的内容φ(゜▽゜*)♪

('192.168.28.191', 52142) connected
b'hello world\r\n'

传输文本文件

ESP32作为服务器,内部存储名为test.txt文件,使用TCP方法传输到客户端

ESP32新建txt文件:

  1. 电脑上建立txt文件,并且编辑想要的内容
  2. 拖住想要发送的txt文件,鼠标指针移到uPyCraft软件的device文件栏【这个栏目的文件都是ESP32内部文件】
  3. 参见下图打印的调试信息 or 也可以看到device栏下出现了要传输的文件
  4. 完成Micropython ESP32 tcpserver 把玩【一】_第4张图片

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()

  1. 先运行ESP32的程序
  2. 然后在电脑上运行Client
  3. uPyCraft里面出现 new conn: (‘192.168.28.191’, 61270) 表示连接成功
  4. 在电脑上运行的Client窗口输入 get test.txt
  5. 最后 会得到在ESP32内部的test.txt文件

电脑上运行Client如下
Micropython ESP32 tcpserver 把玩【一】_第5张图片

ESP32运行过程中的调试信息如下
Micropython ESP32 tcpserver 把玩【一】_第6张图片

最后得到的test.txt文件
Micropython ESP32 tcpserver 把玩【一】_第7张图片

你可能感兴趣的:(ESP32,MicroPython)