ESP32+micropython+作为WiFi热点与PC通信+TCP/IP接收并返回数据

ESP32+作为WiFi热点+接收并返回数据

ESP32代码

#  ESP32 作为AP
#  作为服务器 接收数据 并echo

#  ESP32 作为AP  即wifi热点
import network
import utime
 
# 配置ESP32为AP模式
ssid = 'ESP32_AP'
password = '12345678'
authmode = 4  # WPA2-PSK
 
# 创建WLAN对象
wlan = network.WLAN(network.STA_IF)  # 默认情况下,STA_IF接口已创建,但我们将其禁用
wlan.active(False)  # 禁用STA接口
 
ap_if = network.WLAN(network.AP_IF)  # 创建AP接口
ap_if.active(True)
ap_if.config(essid=ssid, password=password, authmode=authmode)
 
print('AP mode started with SSID:', ssid)
print('Password:', password)
 
# 使用socket库,编写tcp/ip程序,作为服务器 
import socket


def handle_request(client_socket):
    """
    处理对方发送过来的数据
    然后回送相对应的数据
    关闭连接时,return退出
    """
    while True:
        try:
            # 接收数据,设置超时以避免阻塞
            client_socket.settimeout(5)  # 5秒超时
            # 5.1 接收数据
            recv_content = client_socket.recv(1024)
            
            # 5.2 检查是否收到了空字节串(表示连接已关闭)
            if not recv_content:
                print('Client disconnected without sending data.')
                client_socket.close()
                return
            
            # 5.3 解码数据
            decoded_content = recv_content.decode("utf-8")
            print('Received data:', decoded_content)
            # ...(处理数据的代码)
            
            
            
            #5.4 发送数据
            response = "$echo*"
            client_socket.send(response.encode("utf-8"))
        except OSError as e:
            # 捕获OSError异常,这通常是由于网络问题导致的
            print('Error receiving data:', e)
            # 关闭客户端连接
            client_socket.close()
            print('Client connection close.')
            return 
            #continue
        #except UnicodeDecodeError as e:
            # 尽管使用了errors="ignore",但理论上仍然可以捕获这个异常(尽管不太可能)
        #    print('Error decoding data:', e)

        finally:
            print('Client connection recv-send once.')
    

def socket_loop():
    # 1. 创建套接字
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 为了保证在tcp先断开的情况下,下一次依然能够使用指定的端口,需要设置
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    
    # 2. 绑定本地信息
    server_socket.bind(("192.168.4.1", 8081)) # 绑定到所有接口上的8081端口
    print("server_ip "+'192.168.4.1'+"port "+"8081")
    
    # 3. 变成监听套接字
    server_socket.listen(5)  # 开始监听连接
    print('Server started, waiting for connections...')
     
    while True:
        # 4. 等待客户端的链接
        client_socket, client_addr = server_socket.accept()
        print('Client connected from:', client_addr)
        # 5. 客户端的链接处理
        handle_request(client_socket)
    
    # 6. 关闭套接字
    tcp_server_socket.close() 
# 无限循环,持续检查连接的客户端
while True:
    # 获取已连接的客户端列表
    socket_loop()
    utime.sleep(1)  # 延时1秒

PC机上的调试软件: NetAssist5.0.8

 

posted @ 2024-12-04 19:19  辛河  阅读(71)  评论(0编辑  收藏  举报