2024年12月18日水曜日

ラズピコWでアクセスポイントなど

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
をとりにいくブラウザがあるようだ
  

0 件のコメント:

コメントを投稿