WiFiアクセスポイントとWebサーバを立ち上げる (ESP32 MicroPython)


はじめに

こんにちは、清水です。ESP32 MicroPython で、WiFiアクセスポイントとWebサーバを同時に立ち上げてみました。簡単で良いです。
ESP32上のWiFiアクセスポイントにクライアントが接続すると、IPアドレスを発番して提供します。
ESP32上で次の2つは同時に実行可能でした。

  • WiFiアクセスポイントの立ち上げ
  • 既存のWiFiアクセスポイントへの接続

WiFiアクセスポイントはパラメータを外部からセットする手段として使えそうです。

プログラム

このプログラムは、ESP32ボード上のLEDの点滅間隔を、Webブラウザから制御します。

点滅間隔(秒)の指示方法

http://192.168.5.1/?LED=0.1
http://192.168.5.1/?LED=0.9

Webブラウザの表示画面

ESP32 LED Delay (Sec) : 0.1

プログラム説明

  • WiFiアクセスポイントを立ち上げます wiFiAccessPoint(essid,pwd,ip,mask,gw,dns)
  • LEDをLedDelaySecで点滅するスレッドを起動します ledLoop()
  • HTTPポート(80)でクライアントの接続を待機します
  • 受信メッセージから、LED点滅間隔を取得して保存します LedDelaySec
  • ブラウザに応答メッセージを返します
main.py
# WiFiAccessPoint, WebServer, Flashing LED on ESP32 MicroPython

ESSID = 'ESP2' 
PASSWORD = '123456789'
IP = '192.168.5.1'
LED_PIN = 2

import network, machine, time, _thread, socket, re

def wiFiAccessPoint(essid,pwd,ip,mask,gw,dns):
    ap = network.WLAN(network.AP_IF)
    ap.config(essid=essid, authmode=3, password=pwd)
    ap.ifconfig((ip,mask,gw,dns))
    print("(ip,netmask,gw,dns)=" + str(ap.ifconfig()))
    ap.active(True)
    return ap

def wiFiConnect(essid,pwd):
    nic = network.WLAN(network.STA_IF)
    nic.active(True)
    nic.connect(essid, pwd)
    while not nic.isconnected(): pass      
    print("(ip,netmask,gw,dns)=" + str(nic.ifconfig()))
    return nic       

def ledLoop():
    led = machine.Pin(LED_PIN, machine.Pin.OUT)
    while True:
        led.value(not led.value())
        time.sleep(LedDelaySec)

wiFiAccessPoint(ESSID,PASSWORD,IP,'255.255.255.0',IP,'8.8.8.8')
#wiFiAccessPoint('ESP99',PASSWORD,IP,'255.255.255.0',IP,'8.8.8.8')
#wiFiConnect('essidXXX','pwdXXX')
LedDelaySec = 1.0 
_thread.start_new_thread(ledLoop, ())

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80)) # host,port
s.listen(5) # backlog

while True:
    conn, addr = s.accept()
    request = str(conn.recv(1024)).lower()
    print("request : "+  request)
    m = re.search(r'led=(\d*\.\d*)', request)
    if m != None : 
        LedDelaySec = float(m.group(1))
        response = 'ESP32 LED Delay (Sec) : ' + str(LedDelaySec)
        conn.send(response)
    conn.close()

受信メッセージ例

request : b'get /?led=0.1 http/1.1\r\nhost: 192.168.5.1\r\nconnection: keep-alive\r\ncache-control: max-age=0\r\nupgrade-insecure-requests: 1\r\nuser-agent: mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/76.0.3809.100 safari/537.36\r\naccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\naccept-encoding: gzip, deflate\r\naccept-language: ja,en-us;q=0.9,en;q=0.8\r\n\r\n'

その他

スマフォからWebサーバにアクセスできない場合

スマフォからWiFiアクセスポイントに接続してIPアドレス取得後、Webサーバにアクセスできない場合は、スマフォの「モバイルネットワーク」をOFFにして、インターネット接続を遮断するとうまくいくようです。

クライアントのコネクション

ap.isconnected() で、クライアントからのWiFiコネクションの有無を判定できます。

WiFiアクセスポイントパラメータ

プログラム中の「ap.config(essid=essid, authmode=3, password=pwd)」
にて、つぎのパラメータを設定できます。

authmode:
0 – open
1 – WEP
2 – WPA-PSK
3 – WPA2-PSK
4 – WPA/WPA2-PSK

hidden:
0 – visible
1 – hidden

1台のESPで複数WiFiアクセスポイントの同時起動はできないようです。

参考URL

ESP32 用クイックリファレンス
https://micropython-docs-ja.readthedocs.io/ja/latest/esp32/quickref.html

ESP32でMicroPythonを試す!簡単ですぐできました!
https://kokensha.xyz/electronics/try-micropython-on-esp32/#Wifi

【ESP32】MicroPythonでwebサーバー建てて遊ぶ
https://dfram.hatenablog.jp/entry/2017/11/12/150357

class WLAN – control built-in WiFi interfaces
https://docs.micropython.org/en/latest/library/network.WLAN.html