https://wisteriahill.sakura.ne.jp/CMS/WordPress/2023/05/01/pi-pico-w-build-web-server-application/ でSTAモードで成功
https://takacity.blog.fc2.com/blog-entry-546.html でシンプルAP成功
https://note.com/nagisa_hoshimori/n/nd621ae39fc55 led on off server as AP
上記が一番参考になった!
https://xn--dx-eb4al8h6e.tech/2023/10/20/wifi%E3%81%A7raspberry-pi-pico-w%E3%82%92%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%AB%E3%81%97%E3%81%A6%E6%8E%A5%E7%B6%9A%E3%81%97%E6%A9%9F%E5%99%A8%E3%82%92/onsitu 別解だが。。。
https://tanep.work/tanech/2024/02/25/post-256/ 非同期ライブラリ仕様。。。
以下のコードが完成品といえる 関数で切り分けておりわかりやすい
import usocket as socket
import network
import gc
# DEFINE
SSID:str = 'PICO_PICO_HAMMER' # 任意のアクセスポイント名を指定可能
PASSWORD:str = 'qwertyuiop' # 任意のパスワードを指定可能
def make_access_point(wifi_ssid:str, wifi_password:str):
"""アクセスポイントを作成し、access_pointを返す関数"""
access_point = network.WLAN(network.AP_IF) # AP:Access Pointとして使う
access_point.config(essid=wifi_ssid, password=wifi_password) # APの設定を反映する
access_point.ifconfig(('192.168.4.1', '255.255.255.0', '192.168.4.1', '192.168.4.1')) # 各種IPアドレスを指定する(固定)192.168.4.1
access_point.active(True) # アクセスポイントとして検知されるようになる
# 接続が成功した場合、(IPアドレス、ネットマスク、ゲートウェイ、DNS)を表示
print("Please connection access_point by other device...")
print("IP Address:{}\nNet Mask:{}\nGateway:{}\nDNS:{}".format(*access_point.ifconfig()))
return access_point
class MyHomepageServer():
def __init__(self):
# socketの構成、設定
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind(('', 80)) # bind
self.socket.listen(5) # listen
def _make_html_text(self, show_message:str):
""" レスポンスとして返すテキスト(html形式)を返す関数 """
html = ('''<html>
<head>
<meta charset="utf-8">
<title>Raspberry Pi pico server</title>
</head>
<body>
<h1>Message : {}</h1>
<a href="/led/on">Turn On LED</a></br>
<a href="/led/off">Turn Off LED</a>
</body>
</html>'''.format(show_message))
return html
def receive_waiting(self):
"""
受信(accept)
str型に変換し、テキストによって処理を分岐
1. b'GET /led/on'の指示が記載されている
-> LEDを点灯し、messageに「LED is ON!」を埋め込み、htmlを送信(send)
2. b'GET /led/off\r\n'の指示が記載されている
-> LEDを消灯し、messageに「LED is Off」を埋め込み、htmlを送信(send)
3. b'GET /favicon.ico HTTP/1.1\r\n'の指示が記載されている
-> LEDを消灯し、messageに「GET favicon.ico」を埋め込み、htmlを送信(send)
3. 上記(1,2,3)以外
-> messageに「Please click any.」の文字列を埋め込み、htmlを送信(send)
たまに'GET /favicon.ico HTTP/1.1\r\n'の指示がacceptされる。。。意味不明!
多分3はいらん あるとled onしてもすぐ消える!
"""
tmp_connection, addr = self.socket.accept()
# 指示待ち状態に(指示あるまでココで一時停止状態となる)
print(f'Got a connection from {addr}')
# アクセスして来た相手のAddressを表示
received_text = tmp_connection.recv(1024)
# 受け取った内容を変数に格納(binary)
print(f'=== Content ===\n{received_text}')
# 受け取った内容を表示(GET等)
if b"GET /led/on" in received_text:
led.value(1) # 出力をHIGHにする(LEDが点灯)
send_text = self._make_html_text("LED is ON!")
elif b"GET /led/off" in received_text:
led.value(0) # 出力をlowにする(LEDが消灯)
send_text = self._make_html_text("LED is Off")
//elif b"GET /favicon.ico" in received_text: ないほうがいいようだ
// led.value(0) # 出力をlowにする(LEDが消灯)
// send_text = self._make_html_text("GET favicon.ico")
else:
send_text = self._make_html_text("Please click .")
tmp_connection.send(send_text) # 応答(response)を、接続相手に返す
tmp_connection.close() # connectionを閉じる
return None
# ココからmain文
gc.collect() # garbage collection(ゴミ掃除)
led = machine.Pin("LED", machine.Pin.OUT) # LED点灯用のPINを設定
ap = make_access_point(SSID, PASSWORD) # 関数にまとめてある
server = MyHomepageServer() # クラスを定義
while True:
server.receive_waiting() # こちらも関数にまとめてある
https://www.geekpage.jp/web/access-log/favicon.php によれば頼まんのにfavico.ico
をとりにいくブラウザがあるようだ