0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于ESP32+MicroPython实现联网并进行UDP通信

CHANBAEK 来源:FunIO 作者:好好学习哇 2023-06-13 17:05 次阅读
    1. 官方文档
    1. 创建一个 STA 的基本流程
    1. 测试 udp 通信

使用 esp32 开发程序,非常重要的功能就是使用 wifi,下面我们就讲一下 esp32 连接 wifi 的方法。

在我们能接触的 WiFi 网络中,Wi-Fi设备通常处于以下两种角色中的一种:

  • 提供无线接入的设备,称之为 Access Point(AP) 无线接入点,家里常见的路由器就是结合 WiFi 和网络路由功能的 AP,AP 和 AP 可以相互连接。
  • 连接到 AP 的设备,称之为 Station(STA) 无线终端,像手机电脑等需要联网的设备都处于 STA 模式,这个模式不允许其他设备接入。

说明:

一个设备可能既支持 AP 又支持 STA,但是一般设备同一时间,WiF 模块只能启用其中的一种模式,像手机既能连接外面的 WiFi,又能自己开热点让别的设备连接,但是每当开启热点,WiFi 就会自动关闭,这是因为手机在同一时间只能支持 AP 和 STA 一种。

1. 官方文档

官方文档对 esp32 实现wifi 功能的文档链接 ^[1]^ ,如下:

图片

实现 WiFi 连接功能,需要使用到network模块:

不管是 STA 还是 AP 都是基于 network 的 WLAN,针对 LAN 我们以后再讲。

STA 的实现方法

import network

wlan = network.WLAN(network.STA_IF) # create station interface
wlan.active(True)       # activate the interface
wlan.scan()             # scan for access points
wlan.isconnected()      # check if the station is connected to an AP
wlan.connect('ssid', 'key') # connect to an AP
wlan.config('mac')      # get the interface's MAC address
wlan.ifconfig()         # get the interface's IP/netmask/gw/DNS addresses

ssid:就是需要链接的 WiFi 的名称。

key:就是需要链接的 WiFi 的密码。

说明:

现在的路由器都有 2.4g5G 两个频段的信号,但是 esp32 只支持 2.4G 的信号。

官网提供了一个创建 STA 的 demo:

def do_connect():
    import network
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect('ssid', 'key')
        while not wlan.isconnected():
            pass
    print('network config:', wlan.ifconfig())

AP 的实现方法

import network

ap = network.WLAN(network.AP_IF) # create access-point interface
ap.config(ssid='ESP-AP') # set the SSID of the access point
ap.config(max_clients=10) # set how many clients can connect to the network
ap.active(True)         # activate the interface

AP 功能用于让其他设备连接 esp32,这个功能不常用,我们以后会在补充里面介绍。

2. 创建一个 STA 的基本流程

esp32 不管是 UDP 还是 TCP 通信,都需要两个模块的支持。

network:用于连接 WiFi,获取 wifi 分配的 ip 等。

socket:用于设备之间的通信,当连接网络后,下一步就是建立和其他设备的通信。

下面我们创建一个 WiFi 类,实现 STA 连接:

import network
import time

class Wifi():
    """
    只实现了STA模式的WiFi链接封装
    """


    def __init__(self):
        self.wlan = network.WLAN(network.STA_IF)



    """
    复位WiFi模块
    """
    def Init_wifi(self):
        if  self.wlan.isconnected():
            self.wlan.active(False)
            print("wifi disconnect,please Reset Configuration ")

    """
    获取WiFi状态
    """
    def status(self):
        return self.wlan.status()


    """
    获取WiFi配置
    """
    def get_wifi_config(self):
        if self.wlan.isconnected():
            return self.wlan.ifconfig()


    """
    扫描WiFi列表
    """
    def wifi_scan(self):
        if wifi.status() != network.STAT_CONNECTING:
            self.wlan.active(True) # 开启WiFi
        return self.wlan.scan()


    """
    连接WiFi
    """
    def connet_wifi(self, ssid, password):
        count = 10 # 10秒内未连接到网络,则连接超时
        self.wlan.active(True) # 开启WiFi
        if not self.wlan.isconnected():
            self.wlan.connect(ssid,password)
            while not self.wlan.isconnected():
                print('connecting to network...')
                time.sleep(1)
                count -= 1
                if count == 0: # 连接超时
                    self.wlan.active(False) # 关闭WiFi
                    print("Connecting  Timeout,Please check the account password!")
                    break
        if self.wlan.isconnected():
            # 连接成功,则打印被分配的ip等信息
            print("ip:" ,self.wlan.ifconfig()[0])
            print("subnet:" ,self.wlan.ifconfig()[1])
            print("gateway:" ,self.wlan.ifconfig()[2])
            print("dns:" ,self.wlan.ifconfig()[3])
            return True
        else:
            # 未成功连接,则返回False
            return False


if __name__ == "__main__":
    wifi = Wifi() # 创建WiFi对象
    wifi_list = wifi.wifi_scan() # 扫描WiFi列表
    print(wifi_list)

    link_wifi = wifi.connet_wifi('K3', 'zhao0312') # 连接WiFi
    if(link_wifi == True):
        print("connet wifi is ok")

在调用 wlan.connect()之后,设备将在默认情况下永远重试连接,即使身份验证失败或范围内没有 AP,因此我们不需要重复 connect,只需要执行一次,自己设置一个等待超时就可以了。当然若不想这样也可以通过调 wlan.config(reconnects=n)来更改,其中 n 是所需的重新连接尝试次数(0 表示不会重试,-1 将恢复尝试永远重新连接的默认行为)。

wlan.isconnected()可以判断当前是否连接成功,当然也可以使用 wlan.status()将返回网络状态,调用 wlan.connect()之后,网络将处于 network.STAT_CONNECTING 表示正在连接状态,直到连接成功或接口被禁用状态才会改变。

一旦网络建立,我们可以通过 socket 模块像往常写 python 程序一样创建和使用 TCP/UDP 套接字,使用 urequests 模块可以方便的实现 HTTP 请求。

3. 测试 udp 通信

提示:

使用 micropython 开发 esp32,要求开发者要有 python 基础。

首先将电脑安装一个网络调试助手软件,这里推荐使用 NetAssist.exe。下载地址:下载链接 ^[2]^ ;

然后找一个能保证 PC 和 ESP32 都能正常连接的路由器,把电脑连接上路由器,然后在电脑的 cmd 控制台输入 ipconfig,看一下路由器分配的 ip 地址,如下:

图片

这个 ip 地址将会在后面使用到。打开电脑上下载一个网络助手等待备用。

将上面连接 wifi 的程序封装成 wifi.py,然后创建一个 test_socket.py 文件,这时 esp 内目录如下:

图片

然后将下面内容添加到 test_socket.py 文件中,内容如下:

from wifi import Wifi

from socket import *
import time

# 我电脑的ip
server_addr = "192.168.2.103"
# 随便选一个端口,建议端口范围2000~65535
server_port = 5000



def creation_udp_client():
    # 1. 创建udp套接字
    udp_socket = socket(AF_INET, SOCK_DGRAM)
    # 2. 准备服务器收方的地址
    dest_addr = (server_addr, server_port)

    # 3. 从键盘获取数据
    send_data = "hello world"
    # 4. 发送数据到指定的电脑上
    udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
    # 5. 关闭套接字
    udp_socket.close()


if __name__ == "__main__":
    wifi = Wifi() # 创建WiFi对象
    link_wifi = wifi.connet_wifi('K3', 'zhao0312') # 连接WiFi
    if(link_wifi == True):
        print("connet wifi is ok")
        while True:
            creation_udp_client()
            time.sleep(5)

点击 ide 上面的运行按钮,如下:

图片

然后打开网络助手:

选择 ip 和端口号与 test_socket.py 文件设置的一致,就会收到由 esp32 发过来的消息,如下:

图片

到此实验完成,若需要让程序开机运行,则只需要将 test_socket.py 内容 copy 到 boot.py 文件中即可。

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

    关注

    18

    文章

    5706

    浏览量

    134405
  • WIFI
    +关注

    关注

    81

    文章

    5162

    浏览量

    199444
  • UDP
    UDP
    +关注

    关注

    0

    文章

    311

    浏览量

    33621
  • ESP32
    +关注

    关注

    13

    文章

    896

    浏览量

    15815
  • Micropython
    +关注

    关注

    0

    文章

    68

    浏览量

    4582
收藏 人收藏

    评论

    相关推荐

    使用ESP32实现蓝牙通信

    上次给大家分享了如何使用ESP32实现UDP通信,今天跟大家聊聊如何使用ESP32实现蓝牙
    发表于 11-21 09:31 1.3w次阅读

    【FireBeetle 2 ESP32-S3开发板测评】MicroPython开发体验

    【FireBeetle 2 ESP32-S3开发板测评】MicroPython开发体验
    的头像 发表于 07-23 09:02 1236次阅读
    【FireBeetle 2 <b class='flag-5'>ESP32</b>-S3开发板测评】<b class='flag-5'>MicroPython</b>开发体验

    ESP32+micropython开源项目挑战之--像素灯

    ESP32
    YS YYDS
    发布于 :2023年07月02日 17:48:46

    如何在ESP32上使用MicroPython

    ESP32的原有程序,擦除成功后下载MicroPython固件,并使用简单的“Hello World(你好,世界)”程序进行测试。安装esptool打开命令行,输入`pip install esptool此操作将在系统上安装es
    发表于 01-11 07:58

    如何利用ESP32和Ubuntu搭建UDP通信系统?

    如何利用ESP32和Ubuntu搭建UDP通信系统?
    发表于 01-20 06:09

    为什么使用MicroPython开发ESP32

    为什么使用MicroPython开发ESP32
    发表于 02-22 08:08

    ESP32有官方实现CAN的通信micropython包吗?

    CAN通信在汽车领域大量使用,尤其是日益增长的车联网需求,ESP32实现CAN通信micropyt
    发表于 03-03 08:22

    求助,ESP32有官方实现CAN的通信micropython包么?

    CAN通信在汽车领域大量使用,尤其是日益增长的车联网需求,ESP32实现CAN通信micropyt
    发表于 03-07 06:05

    视频教程-micropython基础入门(esp32/esp8266单片机开发)-物联网技术

    micropython基础入门(esp32/esp8266单片机开发) 10...
    发表于 11-13 15:36 55次下载
    视频教程-<b class='flag-5'>micropython</b>基础入门(<b class='flag-5'>esp32</b>/<b class='flag-5'>esp</b>8266单片机开发)-物<b class='flag-5'>联网</b>技术

    ESP32刷入MicroPython以及连接WiFi

    一、ESP32刷入MicroPython1.ESP32驱动2.下载MicroPython3.刷入micropython4.进入ESP32二、
    发表于 12-04 19:51 28次下载
    <b class='flag-5'>ESP32</b>刷入<b class='flag-5'>MicroPython</b>以及连接WiFi

    使用MicroPython开发ESP32(01):快速入门

    文章目录为什么使用MicroPython开发ESP32快速入门开发板准备开发工具选择固件下载与烧录我的总结为什么使用MicroPython开发ESP32ESP32是非常热门的一款物
    发表于 12-29 18:49 22次下载
    使用<b class='flag-5'>MicroPython</b>开发<b class='flag-5'>ESP32</b>(01):快速入门

    如何在ESP32/ESP8266上使用MicroPython

    在本教程中,我们将了解 MicroPython,它与 Python 有何不同,以及如何在 ESP32/ESP8266 上开始使用 MicroPython。此外,我们将看到一个 LED
    发表于 08-19 15:09 1.2w次阅读
    如何在<b class='flag-5'>ESP32</b>/<b class='flag-5'>ESP</b>8266上使用<b class='flag-5'>MicroPython</b>

    使用ESP32实现UDP通信的方法

    前面给大家分享了ESP32使用miropython编程环境搭建,今天给大家分享如何使用ESP32实现UDP通信
    的头像 发表于 11-14 10:21 4769次阅读

    ESP32+MicroPython开发环境的搭建

    ESP32 一般有两种开发方式,c 语言开发和 python 开发。
    的头像 发表于 06-13 17:00 5897次阅读
    <b class='flag-5'>ESP32+MicroPython</b>开发环境的搭建

    ESP32ESP32通过Internet进行通信

    电子发烧友网站提供《ESP32ESP32通过Internet进行通信.zip》资料免费下载
    发表于 06-15 09:58 2次下载
    <b class='flag-5'>ESP32</b>到<b class='flag-5'>ESP32</b>通过Internet<b class='flag-5'>进行</b><b class='flag-5'>通信</b>