ITPub博客

首页 > 嵌入式/内核开发 > 嵌入式/内核开发 > 《ESP32-S3使用指南—MicroPython版 V1.0》第三十四章 TCPServer实验

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

原创 嵌入式/内核开发 作者:正点原子 时间:2024-11-25 09:18:09 0 删除 编辑

第三十四章 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的片上资源,因此并没有相应的连接原理图。


        34.3 软件设计


       34.3.1 程序流程图

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


图34.3.1.1 程序流程图


       34.3.2 程序解析

       本书籍的代码都在main.py脚本下编写的,读者可在光盘资料下找到对应的源码。TCPServer实验main.py源码如下:

import socket
import network
import time
 
 
SSID = "xxx"          # wifi名称
PASSWORD = "xxx"      # wifi密码
wlan = None
pos = 0
 
"""
 * @brief       连接网络
 * @param       无
 * @retval      无
"""
def connect():
    
    global wlan
    wlan = network.WLAN(network.STA_IF)
    wlan.active(False)
    wlan.active(True)
    
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect(SSID, PASSWORD)
        while not wlan.isconnected():
            pass
    print('network config: ', wlan.ifconfig())
 
"""
 * @brief       模拟goto
 * @param       label:标签
 * @retval      无
"""
def goto(label):
 
    global pos
    pos = label
 
"""
 * @brief       程序入口
 * @param       无
 * @retval      无
"""  
if __name__ == '__main__':
    
    # 连接网络
    connect()
    
    while True:
        
        while pos == 0:
            # 获取本地IP
            ip = wlan.ifconfig()[0]
            print('network config:', ip)
            """
            创建socket 对象,socket.socket(ip 类型,协议):
            socket.AFINET是ipv4;socket.AFINET6是ipv6
            socket.SOCK_STREAM表示tcp;SOCK_DGRAM表示UDP
            """
            server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            # 设置端口复用
            server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
            # 绑定本地IP以及端口
            server_socket.bind(('',8080)) # 前面空,绑定服务器的任意一个网卡
            # 监听,参数是同时连接的客户端数量
            server_socket.listen(128)
            # 阻塞等待客户端连接
            # 返回一个元组  (新socket, (客户端IP,端口) )
            try:
                new_socket, client_ip_port = server_socket.accept()
            except:
                new_socket.close()
                server_socket.close()
                print('关闭字节套......')
                goto(0)
                break
            
            print('连接建立成功......')
            # 发送信息
            new_socket.send("**********************************\r\n")
            new_socket.send(f'正点原子 ESP32-S3 开发板 TCPServer\r\n'
.encode('utf-8'))
            new_socket.send("**********************************\r\n")
            
            while True:
                try:
                    # 每次接收4096字节
                    data = new_socket.recv(4096)
                except :
                    new_socket.close()
                    server_socket.close()
                    break
                # 如果收到空消息关闭连接
                if (len(data) == 0):
                
                    new_socket.close()
                    server_socket.close()
                    break
                
                # 回显操作
                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 网络调试助手配置与收发


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70040860/viewspace-3051053/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2024-08-30

  • 博文量
    588
  • 访问量
    764178