From 8797010206f7998b0f69f0ca5a06d46c7ebd9665 Mon Sep 17 00:00:00 2001 From: kicer Date: Sat, 24 Jan 2026 15:25:08 +0800 Subject: [PATCH] add web server --- src/main.py | 2 +- src/rom/app.py | 117 ++++++++++++++++----------------------------- src/rom/nanoweb.py | 19 +++----- 3 files changed, 48 insertions(+), 90 deletions(-) diff --git a/src/main.py b/src/main.py index bf3d0fb..14e82a8 100644 --- a/src/main.py +++ b/src/main.py @@ -2,7 +2,7 @@ import machine, sys, time import rom.app try: - app.start() + rom.app.start() except Exception as e: print("Fatal error in main:") sys.print_exception(e) diff --git a/src/rom/app.py b/src/rom/app.py index ea05064..064bc98 100644 --- a/src/rom/app.py +++ b/src/rom/app.py @@ -5,91 +5,54 @@ import gc import sys import time +import json import machine -# 使用全局的WiFiManager实例 from wifi_manager import wifi_manager -print("Trying to connect to saved WiFi network...") -if wifi_manager.connect(): - # 连接成功 - ip = wifi_manager.get_ip() - print(f"WiFi connected successfully, IP address: {ip}") +def print_sysinfo(): + gc.collect() + print(f'Memory Free: {gc.mem_free()}') - # 在这里可以添加主应用程序代码 - # 例如:启动天气数据获取和显示 - print("Starting main application...") +def start(): + if not wifi_manager.connect(): + print("Failed to connect to WiFi, starting CaptivePortal for configuration") + from captive_portal import CaptivePortal + portal = CaptivePortal() + return portal.start() - # 示例:保持连接 - try: - while True: - # 检查连接状态 - if not wifi_manager.is_connected(): - print("WiFi connection lost") - break + # init web server + from rom.nanoweb import Nanoweb + naw = Nanoweb() + # website top directory + naw.STATIC_DIR = '/rom/www' - # 每3秒报告一次状态 - time.sleep(3) - gc.collect() - print(f"Running normally, IP: {ip}, Free memory: {gc.mem_free()} bytes") + # /ping: pong + @naw.route('/ping') + async def ping(request): + await request.write("HTTP/1.1 200 OK\r\n") + await request.write("Content-Type: text\r\n\r\n") + await request.write("pong") - except KeyboardInterrupt: - print("User interrupted") + # /status + @naw.route('/status') + async def ping(request): + await request.write("HTTP/1.1 200 OK\r\n") + await request.write("Content-Type: application/json\r\n\r\n") + await request.write(json.dumps({ + 'time':'{}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}'.format(*time.localtime()), + 'uptime': str(f'{time.ticks_ms()//1000} sec'), + 'memory': str(f'{gc.mem_free()//1000} KB'), + 'platform': str(sys.platform), + 'version': str(sys.version), + })) - finally: - wifi_manager.disconnect() - print("Application ended") + # create task + import uasyncio + loop = uasyncio.get_event_loop() + loop.create_task(naw.run()) -else: - # 连接失败,启动CaptivePortal进行WiFi配置 - print("Failed to connect to WiFi, starting CaptivePortal for configuration") - - from captive_portal import CaptivePortal - - # 启动CaptivePortal - portal = CaptivePortal() - - try: - if portal.start(): - # clear - del portal - sys.modules.pop("CaptivePortal", None) - sys.modules.pop("captive_dns", None) - sys.modules.pop("captive_http", None) - sys.modules.pop("server_base", None) - gc.collect() - # CaptivePortal成功配置并连接 - print("WiFi configured successfully and connected") - - # 在这里可以添加主应用程序代码 - print("Starting main application...") - - # 示例:保持连接 - try: - while True: - # 检查连接状态 - if not wifi_manager.is_connected(): - print("WiFi connection lost") - break - - # 每3秒报告一次状态 - time.sleep(3) - gc.collect() - print(f"Running normally, Free memory: {gc.mem_free()} bytes") - - except KeyboardInterrupt: - print("User interrupted") - - finally: - wifi_manager.disconnect() - print("Application ended") - else: - print("CaptivePortal failed to establish connection") - - except KeyboardInterrupt: - print("User interrupted") - - finally: - time.sleep(3) - machine.reset() + # run! + print_sysinfo() + loop.run_forever() diff --git a/src/rom/nanoweb.py b/src/rom/nanoweb.py index 7a626de..27eadb1 100644 --- a/src/rom/nanoweb.py +++ b/src/rom/nanoweb.py @@ -36,10 +36,10 @@ async def write(request, data): async def error(request, code, reason): await request.write("HTTP/1.1 %s %s\r\n\r\n" % (code, reason)) - await request.write("

%s

" % (reason)) + await request.write(str(reason)) -async def send_file(request, filename, segment=64, binary=False): +async def send_file(request, filename, segment=64, binary=True): try: with open(filename, 'rb' if binary else 'r') as f: while True: @@ -59,7 +59,7 @@ class Nanoweb: headers = {} routes = {} - assets_extensions = ('html', 'css', 'js') + assets_extensions = ('.html', '.css', '.js', '.jpg', '.png', '.gif') callback_request = None callback_error = staticmethod(error) @@ -166,18 +166,13 @@ class Nanoweb: else: # 3. Try to load index file if request.url in ('', '/'): - await send_file(request, self.INDEX_FILE) + await self.generate_output(request, self.INDEX_FILE) else: # 4. Current url have an assets extension ? for extension in self.assets_extensions: - if request.url.endswith('.' + extension): - await send_file( - request, - '%s%s' % ( - self.STATIC_DIR, - request.url, - ), - binary=True, + if request.url.endswith(extension): + await self.generate_output( + request, '%s%s' % (self.STATIC_DIR,request.url), ) break else: