2025年5月4日日曜日

simple/async webserver on raspicow(randomnerd)

 # Import necessary modules

import network

import socket

import time

import random

from machine import Pin


# Create an LED object on pin 'LED'

led = Pin('LED', Pin.OUT)


# Wi-Fi credentials

ssid = 'Buffalo-2G-8340'

password = '636nsa535ds3v'


# HTML template for the webpage

def webpage(random_value, state):

    html = f"""

        <!DOCTYPE html>

        <html>

        <head>

            <title>Pico Web Server</title>

            <meta name="viewport" content="width=device-width, initial-scale=1">

        </head>

        <body>

            <h1>Raspberry Pi Pico Web Server</h1>

            <h2>Led Control</h2>

            <form action="./lighton">

                <input type="submit" value="Light on" />

            </form>

            <br>

            <form action="./lightoff">

                <input type="submit" value="Light off" />

            </form>

            <p>LED state: {state}</p>

            <h2>Fetch New Value</h2>

            <form action="./value">

                <input type="submit" value="Fetch value" />

            </form>

            <p>Fetched value: {random_value}</p>

        </body>

        </html>

        """

    return str(html)


# Connect to WLAN

wlan = network.WLAN(network.STA_IF)

wlan.active(True)

wlan.connect(ssid, password)


# Wait for Wi-Fi connection

connection_timeout = 10

while connection_timeout > 0:

    if wlan.status() >= 3:

        break

    connection_timeout -= 1

    print('Waiting for Wi-Fi connection...')

    time.sleep(1)


# Check if connection is successful

if wlan.status() != 3:

    raise RuntimeError('Failed to establish a network connection')

else:

    print('Connection successful!')

    network_info = wlan.ifconfig()

    print('IP address:', network_info[0])


# Set up socket and start listening

addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

s.bind(addr)

s.listen()


print('Listening on', addr)


# Initialize variables

state = "OFF"

random_value = 0


# Main loop to listen for connections

while True:

    try:

        conn, addr = s.accept()

        print('Got a connection from', addr)

        

        # Receive and parse the request

        request = conn.recv(1024)

        request = str(request)

        print('Request content = %s' % request)


        try:

            request = request.split()[1]

            print('Request:', request)

        except IndexError:

            pass

        

        # Process the request and update variables

        if request == '/lighton?':

            print("LED on")

            led.value(1)

            state = "ON"

        elif request == '/lightoff?':

            led.value(0)

            state = 'OFF'

        elif request == '/value?':

            random_value = random.randint(0, 20)


        # Generate HTML response

        response = webpage(random_value, state)  


        # Send the HTTP response and close the connection

        conn.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')

        conn.send(response)

        conn.close()


    except OSError as e:

        conn.close()

        print('Connection closed')

-------------------------------------------------------------------

asyncioはビルトインだった!

0 件のコメント:

コメントを投稿