🤖Have you ever tried Chat.M5Stack.com before asking??😎
    M5Stack Community
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    M5Stack LAN BASE trying to be a web server with Micropython

    Scheduled Pinned Locked Moved Micropython
    1 Posts 1 Posters 2.0k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • T Offline
      Treadbrook
      last edited by

      I hope someone has achieved this and can point me in the right direction.

      I have an M5 with the W5500 LAN base and am trying to have it run just a simple web form to turn a couple of ports on or off. The code below works fine if I use WiFi, but just hangs at the 'conn, addr = s.accept()' command when I used the wired LAN connection. I am getting an IP address and I can ping it, but when I try and browse to it I get a 'connection refused' error.

      Help!

      Here is the code:

      from m5stack import *
      from m5ui import *
      from uiflow import *
      import module
      import network
      import socket

      lcd.clear()

      lan = module.get(module.LANBASE)
      eth0Ip = lan.get_if_config()[0]
      label1 = M5TextBox(10, 10, "Eth0 ip :" + str(eth0Ip), lcd.FONT_Ubuntu, 0xfff500, rotate=0)
      #lan.tcp_udp_config(eth0Ip, 80, 1, 1)
      #label2 = M5TextBox(10, 25, "UDP configured", lcd.FONT_Ubuntu, 0xfff500, rotate=0)

      Setup GPIO

      pin1 = machine.Pin(5, machine.Pin.OUT)
      pin2 = machine.Pin(2, machine.Pin.OUT)

      def generate_html():
      # Generate HTML based on GPIO states
      state1 = "Power is open - Click to close" if pin1.value() else "Power is closed - click to open"
      state2 = "Reset is open - Click to close" if pin2.value() else "Reset is closed - click to open"

      html = """<!DOCTYPE html>
      <html>
      <head> <title>Remote Reset and Power Control</title> </head>
      <body> <h1>Remote Reset and Power Control</h1>
        <button onclick="toggleGPIO(1)">{state1}</button><br>
        <button onclick="toggleGPIO(2)">{state2}</button><br>
        <script>
        function toggleGPIO(gpio) {{
          var xhr = new XMLHttpRequest();
          xhr.onreadystatechange = function() {{
            if (this.readyState == 4 && this.status == 200) {{
              window.location.reload(); // Reload the page
            }}
          }};
          xhr.open('GET', '/toggle?gpio=' + gpio, true);
          xhr.send();
        }}
        </script>
      </body>
      </html>
      """
      return html
      

      HTTP response

      def http_response(status, content_type, body):
      return 'HTTP/1.1 {} OK\r\nContent-Type: {}\r\n\r\n{}'.format(status, content_type, body)

      Handle HTTP requests

      def handle_http_request(conn):
      request = conn.recv(1024)
      request = str(request)
      #print('Content = %s' % request)
      gpio = request.find('/toggle?gpio=')
      if gpio == 6:
      gpio_number = int(request[19])
      if gpio_number == 1:
      pin1.value(not pin1.value())
      elif gpio_number == 2:
      pin2.value(not pin2.value())

      response = generate_html()
      conn.sendall(http_response(200, "text/html", response))
      conn.close()
      

      Main loop

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

      #s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # This was something that ChatGPT suggested - made no difference
      s = socket.socket()
      s.bind(addr)
      s.listen(1)

      label2 = M5TextBox(10, 40, "Listening on :" + str(addr), lcd.FONT_Ubuntu, 0xfff500, rotate=0)

      while True:
      try:
      label2 = M5TextBox(10,90, "Working...", lcd.FONT_Ubuntu, 0xfff500, rotate=0)
      conn, addr = s.accept()
      label2 = M5TextBox(10, 70, "Connection from :" + str(addr), lcd.FONT_Ubuntu, 0xfff500, rotate=0)
      handle_http_request(conn)
      except OSError as e:
      conn.close()
      label2 = M5TextBox(10, 70, "Connection closed :" + str(addr), lcd.FONT_Ubuntu, 0xfff500, rotate=0)

      END

      1 Reply Last reply Reply Quote 0

      Hello! It looks like you're interested in this conversation, but you don't have an account yet.

      Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

      With your input, this post could be even better 💗

      Register Login
      • First post
        Last post