LoginSignup
12
11

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-11-30

はじめに

こんにちは、清水です。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

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11