|
Download README.md from HelloSun/dosmqtt: direct link, hf CLI and curl.
- Browser
- Download file 3.25 kB
-
https://huggingface.co/spaces/HelloSun/dosmqtt/resolve/main/README.md
- Command line
-
hf download hf://spaces/HelloSun/dosmqtt/README.md
-
curl -L -o README.md https://huggingface.co/spaces/HelloSun/dosmqtt/resolve/main/README.md
3.25 kB
| title: DOS MQTT LAB | |
| emoji: 🖥️ | |
| colorFrom: green | |
| colorTo: blue | |
| sdk: static | |
| pinned: false | |
| # DOS MQTT LAB — DOS programs that really go online | |
| Two **FreeDOS** machines run in the page (v86 x86 emulator). Each has an emulated **NE2000** network card. Inside DOS: | |
| 1. the Crynwr **NE2000 packet driver** is loaded, | |
| 2. mTCP's **DHCP.EXE** obtains an address (192.168.86.100), | |
| 3. **A.EXE** (listener) and **B.EXE** (sender) are real DOS programs, built with Open Watcom against the mTCP TCP/IP stack. They do their own DNS lookup, TCP handshake and speak **MQTT 3.1.1**. | |
| | Program | Behaviour | | |
| |---|---| | |
| | `A.EXE` | Connects, subscribes to the shared topic, and prints each received message. One second later it prints an `echo` line. | | |
| | `B.EXE` | Run once: connects, publishes `Hello from DOS B at HH:MM:SS` (DOS clock), disconnects, exits. | | |
| The page types `A` into machine A once and types `B` into machine B every 5 seconds (DOS has no scheduler). Both DOS screens and an observation log show whether A received what B sent. | |
| ## How the packets reach a public broker | |
| Browsers cannot open raw TCP sockets, and Hugging Face static Spaces have no server. v86 terminates the guest's TCP streams; `bridge.js` plays a tiny in-page WISP server that relays every stream the guest opens on **port 1883** to a public broker's **MQTT-over-WebSocket (WSS)** endpoint. MQTT is identical on both transports, so the bytes DOS writes are exactly what the broker receives. DNS goes through DNS-over-HTTPS (Cloudflare) via v86. | |
| So the DOS side is genuine TCP/IP; only the last hop (browser → broker) is a WebSocket. | |
| ## Things to know | |
| - **Default broker** is `wss://broker.emqx.io:8084/mqtt`. Public brokers vary: in our tests `broker.hivemq.com` often took ~10 s to answer a CONNECT (or never did), while EMQX and `test.mosquitto.org` answered every time. Pick another from the list if one misbehaves. | |
| - **"Background" A** is a separate DOS machine, because DOS itself is single-tasking. | |
| - The DOS clock is **UTC**. | |
| - Both machines are on isolated virtual networks, so they can both use 192.168.86.100. | |
| - If a B run has not finished when the next 5-second tick arrives, that tick is skipped and logged. | |
| - Copy the topic to another tab or device to see messages travel between separate browsers. | |
| - The page needs a modern browser (WebAssembly, `DecompressionStream`). | |
| ## Sources and licenses | |
| See `LICENSE`, `NOTICE.md` and `src/` (DOS program sources, build scripts, boot-disk scripts). GPL-3.0-or-later. | |
| ## DOS × Gradio (`gradio.html`) | |
| `G.EXE` is a third DOS program: it sends a question to a public **Gradio Space** (default `tencent/Hy3`) with plain HTTP through the same emulated NE2000/mTCP stack, reads the streamed answer and prints it. The page forwards the plain HTTP as HTTPS, but only to `*.hf.space` paths starting with `/gradio_api/`, and checks that the answer shown on the DOS screen equals the one Gradio returned. Use English (DOS shows ASCII). Open `gradio.html`. | |
| ## Developer package | |
| `dev/dosmqtt-dev.zip` holds the sources, build scripts, tests and the developer handover (`dev/HANDOFF.md`). It also contains the mTCP source archive that A.EXE / B.EXE are linked against. Rebuild everything with `tools/build_all.sh`. | |