使用ESP32实现UDP通信的方法

描述

大家好,我是ST。

      前面给大家分享了ESP32使用miropython编程环境搭建,今天给大家分享如何使用ESP32实现UDP通信。

ESP32

一、前言

ESP32本身自带WIFI模块,可以连接网络。本文主要是用ESP32连接手机热点,利用UDP协议将ESP32作为服务端,电脑利用网络助手软件作为客户端与ESP32通信,从而通过无线通信去控制ESP32上的LED灯的亮灭。

二、连接网络

Mriopython官方文档给出了一些方法和完整的案例,我们先来看看。

下面是官方给出的方法,根据这些方法可以自由处理连接网络的步骤,或者获取需要的信息。

ESP32

下面是官方给出的一个连接网络的完整案例

ESP32

解释:wlan.connect(‘ssid’,’key’)中的ssid是需要连接WIFI的名字,key是需要连接WIFI的密码

以下是我连接我手机WIFI热点的函数代码

 

def do_connect():
    wlan=network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('连接网络...')
        #连接WIFI
        wlan.connect('11', '1234567a')
        while not wlan.isconnected():
            pass
    print("联网成功!")
    print('network config:',wlan.ifconfig())

 

运行程序后,串口打印出ESP32的IP地址,有了这个地址,后面UDP客户端就可以往这个IP地址上发送消息了。

ESP32

三、在ESP32端创建UDP服务端对象

本次实验UDP服务端在ESP32上创建,UDP客户端用电脑端的网络助手上位机上创建。

代码如下:

 

def start_udp():
    #创建udp套接字
    udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    #绑定一个固定的端口号,0.0.0.0表示绑定所有IP
    udp_socket.bind(("0.0.0.0",7788))
    return udp_socket

 

解释:udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)中的socket.AF_INET表示用于Internet进程间通信,socket.SOCK_DGRAM表示用UDP协议。如果要用TCP协议则选择socket.STREAM。7788为端口号,用户可自行分配可用的端口号。

四、处理收到的数据

程序代码如下:

 

def main():
    do_connect()
    udp_socket=start_udp()
    led=machine.Pin(22,machine.Pin.OUT)
    while True:
        #接收数据并拆包
        recv_data,sender_info=udp_socket.recvfrom(1024)
        #打印收到的数据
        print("{}发送{}".format(sender_info,recv_data))
        #取出接收到的数据
        recv_data_str=recv_data.decode("utf-8")
        if recv_data_str=='led_off':
            led.value(1)
        elif recv_data_str=='led_on':
            led.value(0)

 

解释:当客户端发送“led_off”时,熄灭ESP32上的LED灯,当客户端发送“led_on”时,点亮ESP32上的LED灯。

五、整体程序代码

代码如下:

 

import socket
import time
import network
import machine


def do_connect():
    wlan=network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('连接网络...')
        #连接WIFI
        wlan.connect('11', '1234567a')
        while not wlan.isconnected():
            pass
    print("联网成功!")
    print('network config:',wlan.ifconfig())


def start_udp():
    #创建udp套接字
    udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    #绑定一个固定的端口号
    udp_socket.bind(("0.0.0.0",7788))
    return udp_socket


def main():
    do_connect()
    udp_socket=start_udp()
    led=machine.Pin(22,machine.Pin.OUT)
    while True:
        #接收数据并拆包
        recv_data,sender_info=udp_socket.recvfrom(1024)
        #打印收到的数据
        print("{}发送{}".format(sender_info,recv_data))
        #取出接收到的数据
        recv_data_str=recv_data.decode("utf-8")
        if recv_data_str=='led_off':
            led.value(1)
        elif recv_data_str=='led_on':
            led.value(0)




if __name__ == "__main__":
    main()

 

运行程序,用电脑上的网络助手创建UDP客户端发送消息,ESP32串口打印如下

ESP32

当发送led_off时,ESP32上的LED灯熄灭,当发送led_on时,ESP32上的LED灯点亮。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分