搜索
bottom↓
回复: 0

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

[复制链接]

出0入234汤圆

发表于 3 小时前 | 显示全部楼层 |阅读模式
2.jpg
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
1.png
3.png

第三十二章 UDP实验


       在本章中,我们将使用network和socket第三方模块来实现网络连接。network库用于实现WiFi连接,而socket库则用于实现基于lwIP协议栈的网络协议连接。在本章实验中,我们将使用ESP32-S3开发板连接远程网络,并在此基础上实现UDP连接。在本实验中,我们将实现一个简单的UDP连接,通过网络调试助手发送数据,并将接收到的数据原原本本地返回。
       32.1 network与socket库的简介
       32.2 硬件设计
       32.3 软件设计
       32.4 下载验证

       32.1 network与socket库的简介

       32.1.1 network与socket库
       MicroPython 的 network 和 socket 库都是用于实现网络连接的工具,它们具有一些共同的特点和不同的功能。
       network 库是 MicroPython 的第三方库之一,它提供了 WiFi 和网络连接的功能。通过使用 network 库,我们可以连接到无线网络,获取网络状态,发送和接收数据等。在 MicroPython 的系统中,network 库通常用于实现设备的网络连接和通信功能。
       socket,一个在网络世界中广泛使用的术语,它是我们程序与网络协议之间沟通的桥梁。想象一下,如果没有这座桥梁,我们的程序就需要直接与复杂的网络协议打交道,这无疑会增加程序设计的难度和复杂性。幸运的是,socket为我们提供了一个优雅而简洁的解决方案。在众多的网络协议中,如TCP、UDP、IP、ICMP等,每一种都有其特定的通信规则和格式。而socket,则像是为这些协议量身定制的一套适配器,让我们的程序可以无需关心底层的协议细节,就能轻松地进行网络通信。每一个网络通信的端点,都有一个socket对象,它们就像是网络通信的“门牌号”,让我们的程序知道应该将数据发送到哪个地址,同时也让网络知道应该将哪些数据发送到我们的程序。
       在Python中,我们有一个名为socket的模块,它提供了一套简单易用的接口,让我们可以在程序中创建和使用Socket对象。通过这个模块,我们可以轻松地实现客户机和服务器的通信。socket的背后,其实隐藏了一套复杂的系统。它不仅仅是一组接口,更是一种设计模式,一种门面模式。它将底层的TCP/IP协议族的复杂性隐藏起来,只暴露出一组简单的接口供我们使用。这样,我们无需深入理解网络协议的细节,只需要按照socket的接口规范进行编程,就能写出符合TCP/UDP标准的程序。下图是socket建立连接流程,如下所示。

第三十二章 UDP实验1106.png
图32.1.1.1 socket建立连接流程

       上图中,socket建立连接需要六个步骤。首先,调用socket方法创建socket对象,接着,调用bind方法绑定地址到socket对象,然后,调用listen方法监听地址端口并且调用accept方法阻塞接收连接请求,当连接成功后,利用write方法和read方法处理通信数据,最后,如果接收到关闭请求时,就调用close方法关闭socket对象。
       network 库和 socket 库的主要区别在于它们的应用场景和功能。network 库主要用于实现设备的 WiFi 和网络连接功能,而 socket 库则主要用于实现网络协议的连接和数据传输功能。因此,在实现具体的网络连接功能时,需要根据具体的需求和硬件平台来选择合适的库进行使用。

       32.1.2 network与socket库的构造与方法

       一、network库构造方法
       WLAN 网络接口的构造对象方法如下:
  1. class network.WLAN(interface_id)
  2. 使用示例:wlan = network.WLAN(network.STA_IF)
复制代码
       该构造函数的参数描述,如下表所示。

1.png
表32.1.2.1 network.WLAN构造方法参数描述

       返回值:WLAN 网络接口对象。

       二、network库的方法

       ①:激活或停用网络接口。
       其方法原型如下:
  1. wlan.active([is_active])
复制代码
       该函数的参数描述,如下表所示。

2.png
表32.1.2.2 wlan.active方法参数描述

       返回值:无。

       ②:连接网络。
       其方法原型如下:
  1. wlan.connect(ssid=None, password=None)
复制代码
       该函数的参数描述,如下表所示。

3.png
表32.1.2.3 wlan.connect方法参数描述

       返回值:true:连接成功;fail:连接失败。

       ③:关闭网络。
       其方法原型如下:
  1. wlan.disconnect()
复制代码
       返回值:无。

       ④:获取或者设置网络参数。
       其方法原型如下:
  1. WLAN.ifconfig([(ip, subnet, gateway, dns)])
复制代码
       该方法的参数描述,如下表所示。

4.png
表32.1.2.4 wlan.ifconfig方法参数描述

       返回值:若此函数为无参数传入,则返回连接网络的信息,反次,为设置网络参数。
       以上是network库常用的方法,还有其他方法可参考MicroPython的在线文档。

       三、socket库构造方法
       创建套接字的构造对象方法如下:
  1. class socket.socket(af=AF_INET, type=SOCK_STREAM ,proto=IPPROTO_TCP, /)
  2. 使用示例:socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
复制代码
       该构造函数的参数描述,如下表所示。

5.png
表32.1.2.5 socket.socket构造方法参数描述

       返回值:套接字对象。

       四、socket库的方法

       ①:关闭套接字接口。
       其方法原型如下:
  1. socket.close()
复制代码
       返回值:无。

       ②:套接字绑定到地址。
       其方法原型如下:
  1. socket.bind(address)
复制代码
       该方法的参数描述,如下表所示。

6.png
表32.1.2.6 socket.bind方法参数描述

       返回值:无。

       ③:监听连接,用作于TCPServer连接。
       其方法原型如下:
  1. socket.listen([backlog])
复制代码
       该方法的参数描述,如下表所示。

7.png
表32.1.2.7 socket.listen方法参数描述

       返回值:conn:新的套接字对象,用来收发消息;address:连接到服务器的客户端地址。

       ④:接受连接,用作于TCPServer连接。注:在此之前,需监听连接。
       其函数原型如下:
  1. socket.accept()
复制代码
       返回值:无。

       ⑤:连接远程IP地址
       其函数原型如下:
  1. socket.connect(address)
复制代码
       该函数的参数描述,如下表所示。

8.png
表32.1.2.8 socket.connect函数参数描述

       返回值:无。

       ⑥:发送数据,返回发送的字节数。
       其函数原型如下:
  1. socket.send(bytes)
复制代码
       该函数的参数描述,如下表所示。

9.png
表32.1.2.9 socket.send函数参数描述

       返回值:无。

       ⑦:接收数据,返回值是一个字节对象。
       其函数原型如下:
  1. socket.recv(bufsize)
复制代码
       该函数的参数描述,如下表所示。

10.png
表32.1.2.10 socket.recv函数参数描述

       返回值:无。

       ⑧:UDP发送数据,一般用作于UDP连接。
       其函数原型如下:
  1. socket.sendto(bytes, address)
复制代码
       该函数的参数描述,如下表所示。

11.png
表32.1.2.11 socket.sendto函数参数描述

       返回值:无。
       以上方法列出了本书中常用的套接字方法,对于剩余的套接字方法,请参考MicroPython最新的在线文档。

       32.2 硬件设计

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

       2. 硬件资源

       1)ESP32-S3内部WiFi

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

       32.3 软件设计

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

第三十二章 UDP实验4101.png
图32.3.1.1 程序流程图

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


  4. SSID = "xxx"                    # wifi名称
  5. PASSWORD = "xxx"                # wifi密码
  6. Server_IP = '192.168.101.33'    # 原程IP地址
  7. wlan = None

  8. """
  9. * @brief       连接网络
  10. * @param       无
  11. * @retval      无
  12. """
  13. def connect():
  14.    
  15.     global wlan
  16.     # 创建站点接口
  17.     wlan = network.WLAN(network.STA_IF)
  18.     wlan.active(False)
  19.     # 启用站点接口
  20.     wlan.active(True)
  21.    
  22.     # 判断是否连接
  23.     if not wlan.isconnected():
  24.         print('connecting to network...')
  25.         # 连接WiFi
  26.         wlan.connect(SSID, PASSWORD)
  27.         while not wlan.isconnected():
  28.             pass
  29.     # 输出网络信息
  30.     print('network config: ', wlan.ifconfig())

  31. """
  32. * @brief       程序入口
  33. * @param       无
  34. * @retval      无
  35. """  
  36. if __name__ == '__main__':
  37.    
  38.     # 连接网络
  39.     connect()
  40.    
  41.     while True:
  42.         # 获取本地IP
  43.         ip = wlan.ifconfig()[0]
  44.         print('network config:', ip)
  45.         """
  46.         创建socket 对象,socket.socket(ip 类型,协议):
  47.         socket.AFINET是ipv4;socket.AFINET6是ipv6
  48.         socket.SOCK_STREAM表示tcp;SOCK_DGRAM表示UDP
  49.         """
  50.         udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  51.         # ServerIP+ServerPort
  52.         addr = socket.getaddrinfo('192.168.101.33', 8080)[0][-1]
  53.         print(addr)
  54.         # 发送信息
  55.         udp_socket.sendto("**********************************\r\n",addr)
  56.         udp_socket.sendto(f'正点原子 ESP32-S3 开发板 UDP Test\r\n'.
  57. encode('utf-8'),addr)
  58.         udp_socket.sendto("**********************************\r\n",addr)
  59.         
  60.         while True:
  61.             try:
  62.                 # 每次接收4096字节
  63.                 data = udp_socket.recv(4096)
  64.             except :
  65.                 udp_socket.close()
  66.                 break
  67.             # 回显操作
  68.             udp_socket.sendto(data,addr)
复制代码
       在上述代码中,作者首先配置了WiFi的账号和密码,并构建了ESP32-S3与网络通道。接着,设置了服务器的远程IP地址,以便将数据发送到指定的地址。随后,作者定义了一个网络连接函数,该函数使用network第三方库的方法来实现网络连接。一旦连接建立,作者配置了连接协议。在本实验中,使用的是UDP连接,因此配置了套接字为UDP连接。接着,作者发送实验信息至服务器。最后,不断接收服务器发送的数值,并将数据原原本本地发送回服务器。

       32.4 下载验证
       程序下载到开发板后,需要打开网络调试助手,并在网络调试助手中配置协议为UDP。在配置过程中,需要输入本机的IP地址,即当前电脑的IP地址,以及端口号8080。另外,还需要配置目标主机信息的IP地址和端口号(即ESP32-S3设备的IP地址和端口号)。完成上述配置后,点击“连接”按钮以连接设备。一旦连接成功,可以在网络调试助手的发送框中填写需要发送的数据,并按下“发送按钮”以发送数据。此时,网络调试助手会接收到刚刚发送的数据。

第三十二章 UDP实验6362.png
图32.4.1 网络调试助手配置与收发

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

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

本版积分规则

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

GMT+8, 2024-8-29 21:14

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

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