66 lines
2.6 KiB
Python
66 lines
2.6 KiB
Python
"""Tiny threaded static server for the through-wall WiFi-CSI sensing demo.
|
|
|
|
Adapted from examples/three.js/server/serve-demo.py. Serves the
|
|
`examples/through-wall/` page so a browser can fetch index.html, then the
|
|
page connects directly to the LIVE sensing-server WebSocket at
|
|
ws://localhost:8765/ws/sensing (NOT proxied through here).
|
|
|
|
Why a threaded server (not `python -m http.server`)?
|
|
The stdlib SimpleHTTPServer is single-threaded; a browser opens several
|
|
parallel connections (HTML + the three.js CDN tags fetch in parallel),
|
|
the first eats the worker, the rest can stall. ThreadingHTTPServer fixes it.
|
|
|
|
IMPORTANT: this serves on port 8080 — port 8765 is taken by the
|
|
sensing-server's WebSocket. They are two different processes.
|
|
|
|
Usage:
|
|
# 1) start the REAL sensing-server (separate terminal):
|
|
# cd v2
|
|
# cargo build -p wifi-densepose-sensing-server
|
|
# ./target/debug/sensing-server.exe --ws-port 8765 --udp-port 5005
|
|
# 2) start this static server:
|
|
python examples/through-wall/serve.py
|
|
# 3) open:
|
|
# http://localhost:8080/examples/through-wall/index.html
|
|
|
|
Override the WS endpoint with a query param, e.g.:
|
|
http://localhost:8080/examples/through-wall/index.html?ws=ws://192.168.1.20:8765/ws/sensing
|
|
"""
|
|
from http.server import ThreadingHTTPServer, SimpleHTTPRequestHandler
|
|
import os
|
|
import sys
|
|
|
|
PORT = int(os.environ.get("PORT", 8080))
|
|
|
|
# Serve from the repo root regardless of where this script is launched.
|
|
# This file lives at examples/through-wall/serve.py — two levels deep.
|
|
os.chdir(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
|
|
|
|
|
|
class NoCacheHandler(SimpleHTTPRequestHandler):
|
|
def end_headers(self):
|
|
# Aggressive no-cache so the browser ALWAYS fetches the latest
|
|
# index.html after edits, even on a soft refresh.
|
|
self.send_header("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0")
|
|
self.send_header("Pragma", "no-cache")
|
|
self.send_header("Expires", "0")
|
|
super().end_headers()
|
|
|
|
def log_message(self, fmt, *args): # quieter logs
|
|
sys.stderr.write("[serve] " + (fmt % args) + "\n")
|
|
|
|
|
|
PAGE = "examples/through-wall/index.html"
|
|
|
|
with ThreadingHTTPServer(("127.0.0.1", PORT), NoCacheHandler) as srv:
|
|
print(f"serving {os.getcwd()} on http://127.0.0.1:{PORT}/")
|
|
print(f" open http://localhost:{PORT}/{PAGE}")
|
|
print("")
|
|
print(" The page connects to the LIVE sensing-server at")
|
|
print(" ws://localhost:8765/ws/sensing (start it first — see README.md).")
|
|
print(" Override with ?ws=ws://HOST:PORT/ws/sensing")
|
|
try:
|
|
srv.serve_forever()
|
|
except KeyboardInterrupt:
|
|
sys.exit(0)
|