搜索
bottom↓
回复: 0
打印 上一主题 下一主题

《ESP32-S3使用指南—MicroPython版 V1.0》第三十四章 TCPServer实验

[复制链接]

出0入234汤圆

跳转到指定楼层
1

1)实验平台:正点原子ESP32S3开发板
2)购买链接:https://detail.tmall.com/item.htm?id=768499342659
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-347618-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子手把手教你学ESP32S3快速入门视频教程:https://www.bilibili.com/video/BV1sH4y1W7Tc
6)正点原子FPGA交流群:132780729



第三十四章 TCPServer实验


       在本章中,作者将实现一个简单的TCPServer连接,通过网络调试助手发送数据,并将接收到的数据原原本本地返回。
       34.1 network与socket库的简介
       34.2 硬件设计
       34.3 软件设计
       34.4 下载验证

       34.1 network与socket库的简介
       在第三十二章中,作者简要介绍了network与socket第三方源代码库,并详细阐述了这两个源代码库在MicroPython环境中的调用方法和参数传递说明。

       34.2 硬件设计

       1. 例程功能
       本章实验功能简介:当TCPServer连接成功后,网络调试助手作为客户端,开发板作为服务器,客户端发送数据至开发板时,开发板将数据原原本本的发送至网络调试助手。

       2. 硬件资源

       1)ESP32-S3内部WiFi

       3. 原理图
       本章实验使用的WiFi为ESP32-S3的片上资源,因此并没有相应的连接原理图。

       33.3 软件设计

       34.3.1 程序流程图
       程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图。

图34.3.1.1 程序流程图

       34.3.2 程序解析
       本书籍的代码都在main.py脚本下编写的,读者可在光盘资料下找到对应的源码。TCPServer实验main.py源码如下:
  1. import socket
  2. import network
  3. import time


  4. SSID = "xxx"          # wifi名称
  5. PASSWORD = "xxx"      # wifi密码
  6. wlan = None
  7. pos = 0

  8. """
  9. * @brief       连接网络
  10. * @param       无
  11. * @retval      无
  12. """
  13. def connect():
  14.    
  15.     global wlan
  16.     wlan = network.WLAN(network.STA_IF)
  17.     wlan.active(False)
  18.     wlan.active(True)
  19.    
  20.     if not wlan.isconnected():
  21.         print('connecting to network...')
  22.         wlan.connect(SSID, PASSWORD)
  23.         while not wlan.isconnected():
  24.             pass
  25.     print('network config: ', wlan.ifconfig())

  26. """
  27. * @brief       模拟goto
  28. * @param       label:标签
  29. * @retval      无
  30. """
  31. def goto(label):

  32.     global pos
  33.     pos = label

  34. """
  35. * @brief       程序入口
  36. * @param       无
  37. * @retval      无
  38. """  
  39. if __name__ == '__main__':
  40.    
  41.     # 连接网络
  42.     connect()
  43.    
  44.     while True:
  45.         
  46.         while pos == 0:
  47.             # 获取本地IP
  48.             ip = wlan.ifconfig()[0]
  49.             print('network config:', ip)
  50.             """
  51.             创建socket 对象,socket.socket(ip 类型,协议):
  52.             socket.AFINET是ipv4;socket.AFINET6是ipv6
  53.             socket.SOCK_STREAM表示tcp;SOCK_DGRAM表示UDP
  54.             """
  55.             server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  56.             # 设置端口复用
  57.             server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
  58.             # 绑定本地IP以及端口
  59.             server_socket.bind(('',8080)) # 前面空,绑定服务器的任意一个网卡
  60.             # 监听,参数是同时连接的客户端数量
  61.             server_socket.listen(128)
  62.             # 阻塞等待客户端连接
  63.             # 返回一个元组  (新socket, (客户端IP,端口) )
  64.             try:
  65.                 new_socket, client_ip_port = server_socket.accept()
  66.             except:
  67.                 new_socket.close()
  68.                 server_socket.close()
  69.                 print('关闭字节套......')
  70.                 goto(0)
  71.                 break
  72.             
  73.             print('连接建立成功......')
  74.             # 发送信息
  75.             new_socket.send("**********************************\r\n")
  76.             new_socket.send(f'正点原子 ESP32-S3 开发板 TCPServer\r\n'
  77. .encode('utf-8'))
  78.             new_socket.send("**********************************\r\n")
  79.             
  80.             while True:
  81.                 try:
  82.                     # 每次接收4096字节
  83.                     data = new_socket.recv(4096)
  84.                 except :
  85.                     new_socket.close()
  86.                     server_socket.close()
  87.                     break
  88.                 # 如果收到空消息关闭连接
  89.                 if (len(data) == 0):
  90.                
  91.                     new_socket.close()
  92.                     server_socket.close()
  93.                     break
  94.                
  95.                 # 回显操作
  96.                 new_socket.send(data)
复制代码
       在上述代码中,作者首先配置了WiFi的账号和密码,并构建了ESP32-S3与网络通道。随后,作者定义了一个网络连接函数,该函数使用network第三方库的方法来实现网络连接。一旦连接建立,作者配置了连接协议,还定义了模拟C语言的goto语句,为了重连做准备。在本实验中,使用的是TCP连接,因此配置了套接字为TCP连接。接着,作者调用server_socket.bind、server_socket.listen绑定IP地址和监听客户端,还调用server_socket.accept函数判断是否有客户端发送连接请求,如果连接成功,则发送实验信息至服务器,反次,关闭套接字并重新创建TCP套接字。最后,不断接收服务器发送的数值,并将数据原原本本地发送回服务器。
       温馨提示:当客户端关闭连接时,系统会接收到连接关闭的消息,即上述源码的len大小为0时,程序执行关闭套接字和跳出第二个while,最后系统不断监听客户端连接,直到客户端重新连接。

       34.4 下载验证
       程序下载到开发板后,需要打开网络调试助手,并在网络调试助手中配置协议为TCPClient。在配置过程中,需要输入ESP32-S3的IP地址以及端口号8080。完成上述配置后,点击“连接”按钮以连接设备。一旦连接成功,可以在网络调试助手的发送框中填写需要发送的数据,并按下“发送按钮”以发送数据。此时,网络调试助手会接收到刚刚发送的数据。

图34.4.1 网络调试助手配置与收发

阿莫论坛20周年了!感谢大家的支持与爱护!!

该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-30 13:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表