0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于ESP32+MicroPython實(shí)現(xiàn)聯(lián)網(wǎng)并進(jìn)行UDP通信

CHANBAEK ? 來(lái)源:FunIO ? 作者:好好學(xué)習(xí)哇 ? 2023-06-13 17:05 ? 次閱讀
    1. 官方文檔
    1. 創(chuàng)建一個(gè) STA 的基本流程
    1. 測(cè)試 udp 通信

使用 esp32 開(kāi)發(fā)程序,非常重要的功能就是使用 wifi,下面我們就講一下 esp32 連接 wifi 的方法。

在我們能接觸的 WiFi 網(wǎng)絡(luò)中,Wi-Fi設(shè)備通常處于以下兩種角色中的一種:

  • 提供無(wú)線接入的設(shè)備,稱之為 Access Point(AP) 無(wú)線接入點(diǎn),家里常見(jiàn)的路由器就是結(jié)合 WiFi 和網(wǎng)絡(luò)路由功能的 AP,AP 和 AP 可以相互連接。
  • 連接到 AP 的設(shè)備,稱之為 Station(STA) 無(wú)線終端,像手機(jī)、電腦等需要聯(lián)網(wǎng)的設(shè)備都處于 STA 模式,這個(gè)模式不允許其他設(shè)備接入。

說(shuō)明:

一個(gè)設(shè)備可能既支持 AP 又支持 STA,但是一般設(shè)備同一時(shí)間,WiF 模塊只能啟用其中的一種模式,像手機(jī)既能連接外面的 WiFi,又能自己開(kāi)熱點(diǎn)讓別的設(shè)備連接,但是每當(dāng)開(kāi)啟熱點(diǎn),WiFi 就會(huì)自動(dòng)關(guān)閉,這是因?yàn)槭謾C(jī)在同一時(shí)間只能支持 AP 和 STA 一種。

1. 官方文檔

官方文檔對(duì) esp32 實(shí)現(xiàn)wifi 功能的文檔鏈接 ^[1]^ ,如下:

圖片

實(shí)現(xiàn) WiFi 連接功能,需要使用到network模塊:

不管是 STA 還是 AP 都是基于 network 的 WLAN,針對(duì) LAN 我們以后再講。

STA 的實(shí)現(xiàn)方法

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 的密碼。

說(shuō)明:

現(xiàn)在的路由器都有 2.4g5G 兩個(gè)頻段的信號(hào),但是 esp32 只支持 2.4G 的信號(hào)。

官網(wǎng)提供了一個(gè)創(chuàng)建 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 的實(shí)現(xiàn)方法

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 功能用于讓其他設(shè)備連接 esp32,這個(gè)功能不常用,我們以后會(huì)在補(bǔ)充里面介紹。

2. 創(chuàng)建一個(gè) STA 的基本流程

esp32 不管是 UDP 還是 TCP 通信,都需要兩個(gè)模塊的支持。

network:用于連接 WiFi,獲取 wifi 分配的 ip 等。

socket:用于設(shè)備之間的通信,當(dāng)連接網(wǎng)絡(luò)后,下一步就是建立和其他設(shè)備的通信。

下面我們創(chuàng)建一個(gè) WiFi 類,實(shí)現(xiàn) STA 連接:

import network
import time

class Wifi():
    """
    只實(shí)現(xiàn)了STA模式的WiFi鏈接封裝
    """


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



    """
    復(fù)位WiFi模塊
    """
    def Init_wifi(self):
        if  self.wlan.isconnected():
            self.wlan.active(False)
            print("wifi disconnect,please Reset Configuration ")

    """
    獲取WiFi狀態(tài)
    """
    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) # 開(kāi)啟WiFi
        return self.wlan.scan()


    """
    連接WiFi
    """
    def connet_wifi(self, ssid, password):
        count = 10 # 10秒內(nèi)未連接到網(wǎng)絡(luò),則連接超時(shí)
        self.wlan.active(True) # 開(kāi)啟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: # 連接超時(shí)
                    self.wlan.active(False) # 關(guān)閉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() # 創(chuàng)建WiFi對(duì)象
    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")

在調(diào)用 wlan.connect()之后,設(shè)備將在默認(rèn)情況下永遠(yuǎn)重試連接,即使身份驗(yàn)證失敗或范圍內(nèi)沒(méi)有 AP,因此我們不需要重復(fù) connect,只需要執(zhí)行一次,自己設(shè)置一個(gè)等待超時(shí)就可以了。當(dāng)然若不想這樣也可以通過(guò)調(diào) wlan.config(reconnects=n)來(lái)更改,其中 n 是所需的重新連接嘗試次數(shù)(0 表示不會(huì)重試,-1 將恢復(fù)嘗試永遠(yuǎn)重新連接的默認(rèn)行為)。

wlan.isconnected()可以判斷當(dāng)前是否連接成功,當(dāng)然也可以使用 wlan.status()將返回網(wǎng)絡(luò)狀態(tài),調(diào)用 wlan.connect()之后,網(wǎng)絡(luò)將處于 network.STAT_CONNECTING 表示正在連接狀態(tài),直到連接成功或接口被禁用狀態(tài)才會(huì)改變。

一旦網(wǎng)絡(luò)建立,我們可以通過(guò) socket 模塊像往常寫 python 程序一樣創(chuàng)建和使用 TCP/UDP 套接字,使用 urequests 模塊可以方便的實(shí)現(xiàn) HTTP 請(qǐng)求。

3. 測(cè)試 udp 通信

提示:

使用 micropython 開(kāi)發(fā) esp32,要求開(kāi)發(fā)者要有 python 基礎(chǔ)。

首先將電腦安裝一個(gè)網(wǎng)絡(luò)調(diào)試助手軟件,這里推薦使用 NetAssist.exe。下載地址:下載鏈接 ^[2]^ ;

然后找一個(gè)能保證 PC 和 ESP32 都能正常連接的路由器,把電腦連接上路由器,然后在電腦的 cmd 控制臺(tái)輸入 ipconfig,看一下路由器分配的 ip 地址,如下:

圖片

這個(gè) ip 地址將會(huì)在后面使用到。打開(kāi)電腦上下載一個(gè)網(wǎng)絡(luò)助手等待備用。

將上面連接 wifi 的程序封裝成 wifi.py,然后創(chuàng)建一個(gè) test_socket.py 文件,這時(shí) esp 內(nèi)目錄如下:

圖片

然后將下面內(nèi)容添加到 test_socket.py 文件中,內(nèi)容如下:

from wifi import Wifi

from socket import *
import time

# 我電腦的ip
server_addr = "192.168.2.103"
# 隨便選一個(gè)端口,建議端口范圍2000~65535
server_port = 5000



def creation_udp_client():
    # 1. 創(chuàng)建udp套接字
    udp_socket = socket(AF_INET, SOCK_DGRAM)
    # 2. 準(zhǔn)備服務(wù)器收方的地址
    dest_addr = (server_addr, server_port)

    # 3. 從鍵盤獲取數(shù)據(jù)
    send_data = "hello world"
    # 4. 發(fā)送數(shù)據(jù)到指定的電腦上
    udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
    # 5. 關(guān)閉套接字
    udp_socket.close()


if __name__ == "__main__":
    wifi = Wifi() # 創(chuàng)建WiFi對(duì)象
    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)

點(diǎn)擊 ide 上面的運(yùn)行按鈕,如下:

圖片

然后打開(kāi)網(wǎng)絡(luò)助手:

選擇 ip 和端口號(hào)與 test_socket.py 文件設(shè)置的一致,就會(huì)收到由 esp32 發(fā)過(guò)來(lái)的消息,如下:

圖片

到此實(shí)驗(yàn)完成,若需要讓程序開(kāi)機(jī)運(yùn)行,則只需要將 test_socket.py 內(nèi)容 copy 到 boot.py 文件中即可。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    6032

    瀏覽量

    135995
  • WIFI
    +關(guān)注

    關(guān)注

    81

    文章

    5297

    瀏覽量

    203741
  • UDP
    UDP
    +關(guān)注

    關(guān)注

    0

    文章

    325

    瀏覽量

    33941
  • ESP32
    +關(guān)注

    關(guān)注

    18

    文章

    971

    瀏覽量

    17276
  • Micropython
    +關(guān)注

    關(guān)注

    0

    文章

    68

    瀏覽量

    4740
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用ESP32實(shí)現(xiàn)藍(lán)牙通信

    上次給大家分享了如何使用ESP32實(shí)現(xiàn)UDP通信,今天跟大家聊聊如何使用ESP32實(shí)現(xiàn)藍(lán)牙
    發(fā)表于 11-21 09:31 ?1.6w次閱讀

    【FireBeetle 2 ESP32-S3開(kāi)發(fā)板測(cè)評(píng)】MicroPython開(kāi)發(fā)體驗(yàn)

    【FireBeetle 2 ESP32-S3開(kāi)發(fā)板測(cè)評(píng)】MicroPython開(kāi)發(fā)體驗(yàn)
    的頭像 發(fā)表于 07-23 09:02 ?1819次閱讀
    【FireBeetle 2 <b class='flag-5'>ESP32</b>-S3開(kāi)發(fā)板測(cè)評(píng)】<b class='flag-5'>MicroPython</b>開(kāi)發(fā)體驗(yàn)

    如何在ESP32上使用MicroPython

    ESP32的原有程序,擦除成功后下載MicroPython固件,并使用簡(jiǎn)單的“Hello World(你好,世界)”程序進(jìn)行測(cè)試。安裝esptool打開(kāi)命令行,輸入`pip install esptool此操作將在系統(tǒng)上安裝es
    發(fā)表于 01-11 07:58

    ESP32有官方實(shí)現(xiàn)CAN的通信micropython包嗎?

    CAN通信在汽車領(lǐng)域大量使用,尤其是日益增長(zhǎng)的車聯(lián)網(wǎng)需求,ESP32實(shí)現(xiàn)CAN通信micropyt
    發(fā)表于 03-03 08:22

    求助,ESP32有官方實(shí)現(xiàn)CAN的通信micropython包么?

    CAN通信在汽車領(lǐng)域大量使用,尤其是日益增長(zhǎng)的車聯(lián)網(wǎng)需求,ESP32實(shí)現(xiàn)CAN通信micropyt
    發(fā)表于 03-07 06:05

    視頻教程-micropython基礎(chǔ)入門(esp32/esp8266單片機(jī)開(kāi)發(fā))-物聯(lián)網(wǎng)技術(shù)

    micropython基礎(chǔ)入門(esp32/esp8266單片機(jī)開(kāi)發(fā)) 10...
    發(fā)表于 11-13 15:36 ?55次下載
    視頻教程-<b class='flag-5'>micropython</b>基礎(chǔ)入門(<b class='flag-5'>esp32</b>/<b class='flag-5'>esp</b>8266單片機(jī)開(kāi)發(fā))-物<b class='flag-5'>聯(lián)網(wǎng)</b>技術(shù)

    ESP32 SDIO 使用教程

    ESP32 SDIO 使用教程本文旨在說(shuō)明如何使用標(biāo)準(zhǔn)的 ESP32-WROOM-32D 開(kāi)發(fā)板進(jìn)行 SDIO 的通信。本文檔適用于所有需要與 ES
    發(fā)表于 11-23 17:51 ?233次下載
    <b class='flag-5'>ESP32</b> SDIO 使用教程

    ESP32刷入MicroPython以及連接WiFi

    一、ESP32刷入MicroPython1.ESP32驅(qū)動(dòng)2.下載MicroPython3.刷入micropython4.進(jìn)入ESP32二、
    發(fā)表于 12-04 19:51 ?28次下載
    <b class='flag-5'>ESP32</b>刷入<b class='flag-5'>MicroPython</b>以及連接WiFi

    使用MicroPython開(kāi)發(fā)ESP32(01):快速入門

    文章目錄為什么使用MicroPython開(kāi)發(fā)ESP32快速入門開(kāi)發(fā)板準(zhǔn)備開(kāi)發(fā)工具選擇固件下載與燒錄我的總結(jié)為什么使用MicroPython開(kāi)發(fā)ESP32ESP32是非常熱門的一款物
    發(fā)表于 12-29 18:49 ?22次下載
    使用<b class='flag-5'>MicroPython</b>開(kāi)發(fā)<b class='flag-5'>ESP32</b>(01):快速入門

    如何在ESP32/ESP8266上使用MicroPython

    在本教程中,我們將了解 MicroPython,它與 Python 有何不同,以及如何在 ESP32/ESP8266 上開(kāi)始使用 MicroPython。此外,我們將看到一個(gè) LED
    發(fā)表于 08-19 15:09 ?1.4w次閱讀
    如何在<b class='flag-5'>ESP32</b>/<b class='flag-5'>ESP</b>8266上使用<b class='flag-5'>MicroPython</b>

    使用ESP32實(shí)現(xiàn)UDP通信的方法

    前面給大家分享了ESP32使用miropython編程環(huán)境搭建,今天給大家分享如何使用ESP32實(shí)現(xiàn)UDP通信
    的頭像 發(fā)表于 11-14 10:21 ?6395次閱讀

    ESP32+MicroPython開(kāi)發(fā)環(huán)境的搭建

    ESP32 一般有兩種開(kāi)發(fā)方式,c 語(yǔ)言開(kāi)發(fā)和 python 開(kāi)發(fā)。
    的頭像 發(fā)表于 06-13 17:00 ?8964次閱讀
    <b class='flag-5'>ESP32+MicroPython</b>開(kāi)發(fā)環(huán)境的搭建

    ESP32ESP32通過(guò)Internet進(jìn)行通信

    電子發(fā)燒友網(wǎng)站提供《ESP32ESP32通過(guò)Internet進(jìn)行通信.zip》資料免費(fèi)下載
    發(fā)表于 06-15 09:58 ?4次下載
    <b class='flag-5'>ESP32</b>到<b class='flag-5'>ESP32</b>通過(guò)Internet<b class='flag-5'>進(jìn)行</b><b class='flag-5'>通信</b>

    構(gòu)建ESP32 MicroPython Wifi的機(jī)器人汽車

    電子發(fā)燒友網(wǎng)站提供《構(gòu)建ESP32 MicroPython Wifi的機(jī)器人汽車.zip》資料免費(fèi)下載
    發(fā)表于 07-12 09:12 ?7次下載
    構(gòu)建<b class='flag-5'>ESP32</b> <b class='flag-5'>MicroPython</b> Wifi的機(jī)器人汽車