2025年5月15日木曜日

Websocket server by python3 / RaspPicoW ledonoff-webserver

 https://engineers.safie.link/entry/wscat-introductionでlinuxのnodejsでhtttp-server

的にwscatをインストした android app の websocket testerでやりとりできた

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

https://tech-and-investment.com/raspberrypi-picow-5-webserver/ にあるまま

ledon?と?がついているのは https://docs.sunfounder.com/projects/pico-2w-kit/ja/latest/pyproject/iotproject/7-web_page.html に詳しい

import network
import socket
from time import sleep
from picozero import pico_temp_sensor, pico_led
import machine

ssid = 'NAME OF YOUR WIFI NETWORK'
password = 'YOUR SECRET PASSWORD'


def connect():
    #Connect to WLAN
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(ssid, password)
    while wlan.isconnected() == False:
        print('Waiting for connection...')
        sleep(1)
    ip = wlan.ifconfig()[0]
    print(f'Connected on {ip}')
    return ip

#
# WEBページを生成する関数です
#
def webpage(temperature, state):
    #Template HTML
    html = f"""
            <!DOCTYPE html>
            <html>
            <form action="./lighton">
            <input type="submit" value="Light on" />
            </form>
            <form action="./lightoff">
            <input type="submit" value="Light off" />
            </form>
            <p>LED is {state}</p>
            <p>Temperature is {temperature}</p>
            </body>
            </html>
            """
    return str(html)

#
# クライアント(ブラウザ)からの接続に対応する関数です
#
def serve(connection):
    #Start a web server
    state = 'OFF'
    pico_led.off()
    temperature = 0

    while True:
        client = connection.accept()[0]
        request = client.recv(1024)
        request = str(request)
        try:
            request = request.split()[ 1]
        except IndexError:
            pass

        if request == '/lighton?':
            pico_led.on()
            state = 'ON'

        elif request =='/lightoff?':
            pico_led.off()
            state = 'OFF'

        temperature = pico_temp_sensor.temp
        html = webpage(temperature, state)
        client.send(html)
        client.close()
 

def open_socket(ip):
    # Open a socket
    address = (ip, 80)
    connection = socket.socket()
    connection.bind(address)
    connection.listen(1)
    return connection

#
# メインの処理部分です
#
try:
    # Wi-Fiに接続し、IPアドレスを取得します
    ip = connect()

    # IPアドレスを使って、データをやり取りするソケットを作ります
    connection = open_socket(ip)

    # ソケットを使って、クライアント(ブラウザ)からの接続を待ちます
    # (内部で無限ループ)
    serve(connection)

#
# プログラムが中断された場合は、この処理に飛び、 
# デバイスをリセットします
#
except KeyboardInterrupt:
    machine.reset()
    

0 件のコメント:

コメントを投稿