ESP8266 HTTP socket micropython

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Oltronix
Inlägg: 490
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

ESP8266 HTTP socket micropython

Inlägg av Oltronix »

Varför funger inte detta? Det har gjort det tidiagre men förmodligen annan version på Firefox. Sidan med sina knappar blinkar till sedan kommer följande text:
The connection was reset

The connection to the server was reset while the page was loading.
The site could be temporarily unavailable or too busy. Try again in a few moments.
If you are unable to load any pages, check your computer’s network connection.
If your computer or network is protected by a firewall or proxy, make sure that Firefox is permitted to access the web
Chrome vägrar pga http och inte https. Safari likadant som Firefox. Kan ana att det är någon ny säkerhetsgrej på nätet som jag inte fattar. Har kört både från LAN och WAN med samma resultat.

Kod: Markera allt

# Simple HTTP Server Example
# Control an LED and read a Button using a web browser
#Updated for ESP8266

import time
import network
import socket
from machine import Pin

led = Pin(2, Pin.OUT)
ledState = 'LED State Unknown'

button = Pin(0, Pin.IN, Pin.PULL_UP)

ssid = 'xxxxx'
password = 'yyyyyy'

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)

html = """<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="data:,">
<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}
.buttonGreen { background-color: #4CAF50; border: 2px solid #000000;; color: white; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer; }
.buttonRed { background-color: #D11D53; border: 2px solid #000000;; color: white; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer; }
text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}
</style></head>
<body><center><h1>Control Panel</h1></center><br><br>
<form><center>
<center> <button class="buttonGreen" name="led" value="on" type="submit">LED ON</button>
<br><br>
<center> <button class="buttonRed" name="led" value="off" type="submit">LED OFF</button>
</form>
<br><br>
<br><br>
<p>%s</p>
</body> </html>
"""

# Wait for connect or fail
max_wait = 10
while max_wait > 0:
    if wlan.status() < 0 or wlan.status() >= 1:
        break
    max_wait -= 1
    print('waiting for connection...')
    time.sleep(1)
    
# Handle connection error
if wlan.status() != 1:
    raise RuntimeError('network connection failed')
else:
    print('Connected')
    status = wlan.ifconfig()
    print( 'ip = ' + status[0] )
    
    
# Open socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
print('listening on', addr)

# Listen for connections, serve client
while True:
    try:       
        cl, addr = s.accept()
        print('client connected from', addr)
        request = cl.recv(1024)
        print("request:")
        print(request)
        request = str(request)
        led_on = request.find('led=on')
        led_off = request.find('led=off')
        
        print( 'led on = ' + str(led_on))
        print( 'led off = ' + str(led_off))
        
        if led_on == 8:
            print("led on")
            led.value(0)
        if led_off == 8:
            print("led off")
            led.value(1)
        
        ledState = "LED is OFF" if led.value() == 1 else "LED is ON" # a compact if-else statement
       
        if button.value() == 1: # button not pressed
            print("button NOT pressed")
            buttonState = "Button is NOT pressed"
        else:
            print("button pressed")
            buttonState = "Button is pressed"
        
        # Create and send response
        stateis = ledState + " and " + buttonState
        response = html % stateis
        cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
        cl.send(response)
        cl.close()
        
    except OSError as e:
        cl.close()
        print('connection closed')
         
Dock funger denna kod ok

Kod: Markera allt

#5.3. Simple HTTP server
import machine
pins = [machine.Pin(i, machine.Pin.IN) for i in (0, 2, 4, 5, 12, 13, 14, 15)]
print(pins)
print(pins[2], pins[2].value())
html = """<!DOCTYPE html>
<html>
    <head> <title>ESP8266 Pins</title> </head>
    <body> <h1>ESP8266 Pins</h1>
        <table border="1"> <tr><th>Pin</th><th>Value</th></tr> %s </table>
    </body>
</html>
"""

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

s = socket.socket()
s.bind(addr)
s.listen(1)

print('listening on', addr)

while True:
    cl, addr = s.accept()
    print('client connected from', addr)
    cl_file = cl.makefile('rwb', 0)
    while True:
        line = cl_file.readline()
        if not line or line == b'\r\n':
            break
    rows = ['<tr><td>%s</td><td>%d</td></tr>' % (str(p), p.value()) for p in pins]
#    print('rows:',rows)
    response = html % '\n'.join(rows)
#    print('resp:',response)
    cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
    cl.send(response)
    cl.close()
Användarvisningsbild
rvl
Inlägg: 6993
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: ESP8266 HTTP socket micropython

Inlägg av rvl »

Du har inte loggat debugutskrifterna eller sett på dem i terminal kopplad til ESPen?
Användarvisningsbild
Oltronix
Inlägg: 490
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: ESP8266 HTTP socket micropython

Inlägg av Oltronix »

Kod: Markera allt

Entering REPL. Use Control-X to exit.
>
MicroPython v1.13 on 2020-09-11; ESP module with ESP8266
Type "help()" for more information.
>>> 
>>> import HTTP_server2
Connected
ip = 192.168.1.175
listening on ('0.0.0.0', 80)
client connected from ('192.168.1.1', 42746)
request:
b'GET / HTTP/1.1\r\nHost: 90.x.y.z\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:141.0) Gecko/20100101 Firefox/141.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nPriority: u=0, i\r\n\r\n'
led on = -1
led off = -1
button NOT pressed
client connected from ('91.224.92.17', 46478)
request:
b'GET / HTTP/1.1\r\nHost: 90.x.y.z:80\r\n\r\n'
led on = -1
led off = -1
button NOT pressed
client connected from ('45.135.194.136', 44814)
request:
b'GET / HTTP/1.1\r\nHost: 90.x.y.z:80\r\n\r\n'
led on = -1
led off = -1
button NOT pressed
client connected from ('192.168.1.1', 41228)
request:
b'GET / HTTP/1.1\r\nHost: 90.x.y.z\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:141.0) Gecko/20100101 Firefox/141.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nPriority: u=0, i\r\n\r\n'
led on = -1
led off = -1
button NOT pressed
client connected from ('192.168.1.105', 33460)
request:
b'GET / HTTP/1.1\r\nHost: 192.168.1.175\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:141.0) Gecko/20100101 Firefox/141.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nPriority: u=0, i\r\n\r\n'
led on = -1
led off = -1
button NOT pressed
Intressant 45.135.194.136 och 91.224.92.17 kommer inte från mig
Användarvisningsbild
Oltronix
Inlägg: 490
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: ESP8266 HTTP socket micropython

Inlägg av Oltronix »

Wireshark listning. Osäker hur jag skall tolka detta. Det är mycket data.
Wireshark 2025-08-20 19-36-53.png
Data från det första röda meddelandet. Jag kan inte tolka vad som är fel.192.168.1.175 är IP hos ESPn
  • Frame 10: 60 bytes on wire (480 bits), 60 bytes captured (480 bits) on interface eno1, id 0
    Interface id: 0 (eno1)
    Interface name: eno1
    Encapsulation type: Ethernet (1)
    Arrival Time: Aug 20, 2025 19:35:23.896068024 CEST
    [Time shift for this packet: 0.000000000 seconds]
    Epoch Time: 1755711323.896068024 seconds
    [Time delta from previous captured frame: 0.001042227 seconds]
    [Time delta from previous displayed frame: 0.001042227 seconds]
    [Time since reference or first frame: 0.067354073 seconds]
    Frame Number: 10
    Frame Length: 60 bytes (480 bits)
    Capture Length: 60 bytes (480 bits)
    [Frame is marked: False]
    [Frame is ignored: False]
    [Protocols in frame: eth:ethertype:ip:tcp]
    [Coloring Rule Name: TCP RST]
    [Coloring Rule String: tcp.flags.reset eq 1]
    Ethernet II, Src: Espressi_dc:34:7b (e8:db:84:dc:34:7b), Dst: HewlettP_db:05:f5 (f0:92:1c:db:05:f5)
    Destination: HewlettP_db:05:f5 (f0:92:1c:db:05:f5)
    Address: HewlettP_db:05:f5 (f0:92:1c:db:05:f5)
    .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
    .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Source: Espressi_dc:34:7b (e8:db:84:dc:34:7b)
    Address: Espressi_dc:34:7b (e8:db:84:dc:34:7b)
    .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
    .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Type: IPv4 (0x0800)
    Trailer: 00005b08a2b4
    [Expert Info (Note/Protocol): Didn't find padding of zeros, and an undecoded trailer exists. There may be padding of non-zeros.]
    [Didn't find padding of zeros, and an undecoded trailer exists. There may be padding of non-zeros.]
    [Severity level: Note]
    [Group: Protocol]
    Internet Protocol Version 4, Src: 192.168.1.175, Dst: 192.168.1.105
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
    0000 00.. = Differentiated Services Codepoint: Default (0)
    .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
    Total Length: 40
    Identification: 0x0198 (408)
    Flags: 0x00
    0... .... = Reserved bit: Not set
    .0.. .... = Don't fragment: Not set
    ..0. .... = More fragments: Not set
    ...0 0000 0000 0000 = Fragment Offset: 0
    Time to Live: 255
    Protocol: TCP (6)
    Header Checksum: 0x35cf [validation disabled]
    [Header checksum status: Unverified]
    Source Address: 192.168.1.175
    Destination Address: 192.168.1.105
    Transmission Control Protocol, Src Port: 80, Dst Port: 60834, Seq: 1073, Ack: 342, Len: 0
    Source Port: 80
    Destination Port: 60834
    [Stream index: 0]
    [Conversation completeness: Complete, WITH_DATA (47)]
    [TCP Segment Len: 0]
    Sequence Number: 1073 (relative sequence number)
    Sequence Number (raw): 8759
    [Next Sequence Number: 1073 (relative sequence number)]
    Acknowledgment Number: 342 (relative ack number)
    Acknowledgment number (raw): 3095074388
    0101 .... = Header Length: 20 bytes (5)
    Flags: 0x014 (RST, ACK)
    000. .... .... = Reserved: Not set
    ...0 .... .... = Nonce: Not set
    .... 0... .... = Congestion Window Reduced (CWR): Not set
    .... .0.. .... = ECN-Echo: Not set
    .... ..0. .... = Urgent: Not set
    .... ...1 .... = Acknowledgment: Set
    .... .... 0... = Push: Not set
    .... .... .1.. = Reset: Set
    [Expert Info (Warning/Sequence): Connection reset (RST)]
    [Connection reset (RST)]
    [Severity level: Warning]
    [Group: Sequence]
    .... .... ..0. = Syn: Not set
    .... .... ...0 = Fin: Not set
    [TCP Flags: ·······A·R··]
    Window: 2144
    [Calculated window size: 2144]
    [Window size scaling factor: -2 (no window scaling used)]
    Checksum: 0x440e [unverified]
    [Checksum Status: Unverified]
    Urgent Pointer: 0
    [Timestamps]
    [Time since first frame in this TCP stream: 0.067354073 seconds]
    [Time since previous frame in this TCP stream: 0.001042227 seconds]
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Oltronix
Inlägg: 490
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: ESP8266 HTTP socket micropython

Inlägg av Oltronix »

Jag rensade bort allt som fanns i<head></head> då fick jag det hela snurra. Tyvärr vet jag fortfarande inte var felet var. Det återstår att leta efter. Men skönt att jag nu kan styra min vattenpump via nätet

Kod: Markera allt

html = """<!DOCTYPE html>
<html>
<head></head>
<body><center><h1>Control Panel</h1></center><br><br>
<form><center>
<center> <button class="buttonGreen" name="led" value="on" type="submit">LED ON</button>
<br><br>
<center> <button class="buttonRed" name="led" value="off" type="submit">LED OFF</button>
</form>
<br><br>
<br><br>
<p>%s</p>
</body> </html>
"""
EDIT:
Det verkar som storleken på variabeln "html" är kritisk. Är den för stor så ballar websidan ut. Den är orginal 1089 byte stor. Är den 989 byte så är det ok
EDIT2
1021 gränsen att det skall fungera. 1021 är ganska nära 1024. En slump? Vad är det inte Firefox mfl inte gillar med att en sräng är för lång?
Användarvisningsbild
Oltronix
Inlägg: 490
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: ESP8266 HTTP socket micropython

Inlägg av Oltronix »

Jag vet att jag pratat med mig själv de senaste inläggen, men hade jag inte haft forument att bolla mot hade jag troligtvis inte kommit vidare med en lösning. Tack för att jag fick prata :D

EDIT:
Tja löst och löst. Jag har tre pumpar och behöver fler knappar. Försökte dela upp varibeln "html" i två olika variabler med olika sendanrop ( cl.send(response)). Det blev inte ett dugg bättre. Kan förståss förenkla websidan så det rymms i 1021 tecken, men det känns inte riktigt rätt.
Skriv svar