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


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78212/b1b6c1e2-8237-4e66-27ee-6d1fb89dba48.png" width=50%>


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

* 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
- ブラウザに応答メッセージを返します

###

```python: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