Breadboard
docs
05 · The radios

Wi-Fi, BLE & smart-home radios

The unmodified Espressif stacks run against a virtual ether: Wi-Fi with a sandbox internet behind it, Bluetooth LE, and 802.15.4 for Zigbee and Thread. Sniff all of it.

Bringing Wi-Fi up

At any ESP32 REPL (or in a Code-tab script):

import network
w = network.WLAN()
w.active(True)          # real RF calibration runs here
w.scan()                # finds the bench's virtual networks
w.connect('BreadboardNet')
w.ifconfig()            # ('192.168.4.2', ...) after the DHCP lease

The bench's ether has three networks: BreadboardNet (channel 1), Workshop-2G (6), and ESP-Lab (11). Joining a WPA2-protected network performs the genuine 4-way handshake (the WPA2 example adds a protected SecureNet to its bench). All four ESP32s speak the same stack, the C6 as a Wi-Fi 6 station.

The sandbox internet

Behind the access point sits a deterministic, fully offline mock of the internet, built into the emulated network core. Its DNS resolver answers for any hostname, and the gateway at 192.168.4.1 dispatches plain HTTP to mock services by path or Host header: /weather (a weather report as JSON), /time (the virtual clock, also answering for any worldtimeapi host), /stocks (mock exchange quotes that tick every 5 seconds of sim time), /api (a cloud dashboard that accepts POST telemetry), /echo, and GET /1000 for a deterministic 1000-byte transfer probe. The internet-connected examples (weather station, stock ticker, TFT dashboard) run entirely against it: reproducible, signed-out, offline.

The packet sniffer

Toggle 📡 Sniffer in the header for a Wireshark-style view of every frame the emulated radios put on the air, whatever the wire: 802.11 (probe requests during a scan, auth/assoc, EAPOL messages 1–4 during a WPA2 join, DHCP, ARP, TCP, ESP-NOW), 802.15.4 (Thread MLE, Zigbee joins and ZCL commands), and BLE link-layer PDUs. Click a row for the raw frame breakdown. Watching a connect conversation frame by frame is the best networking lesson the bench offers. Pro accounts can export a capture as a pcap file and open it in real Wireshark.

Two boards, one ether

Put two ESP32s on a bench and they share the radio medium with unique MACs. ESP-NOW frames fly directly between them (watch the glowing packets cross the canvas), and with both joined to the same network, two real IP stacks talk end-to-end: the bundled two-board example runs an HTTP server on one board and a client on the other, every hop a real frame.

Bluetooth LE

The ESP32-C6 ships a live BLE controller driven by MicroPython's ordinary bluetooth module: gap_advertise, gap_scan, gap_connect, GATT service registration and discovery, pairing, and bonding all run over the shared air. The three BLE examples walk the whole arc with two C6 boards: scan, connect & discover; pair & encrypt; and bond, disconnect & reconnect from the stored key with no second pairing exchange. The C6 Inspector's BLE tab shows the device address, advertising/scanning/connected state, and a padlock once the link encrypts.

Zigbee & Thread (802.15.4)

The C6's 802.15.4 radio runs the real smart-home stacks as compiled Arduino firmware: Zigbee coordinators form networks that bulbs, plugs, and sensors join, bind to, and drive with genuine ZCL commands; OpenThread nodes commit an operational dataset, elect a leader, and attach children over MAC-secured MLE, with the full OpenThread CLI live on the serial tab. The smart-home examples mix DevKits (their sketches sit in the Code tab, rebuildable with Compile & upload) with sealed products: the smart bulb hides a real emulated C6 running esp-zigbee firmware, exactly like the SoC inside a store-bought bulb. The C6 Inspector's 802.15.4 tab shows channel, PAN ID, and the short address the network assigned.

Real internet (Pro)

Every board's sockets live in the sandbox by default: signed-out, free, and shared benches never touch the real network. A signed-in Pro account can flip a board's Wi-Fi inspector from 🧪 Sandbox to 🌐 Real internet. Consent is per project and off by default, and a project opened from someone else's share link asks you again before enabling (the consent is yours, not the author's). The firmware's bytes are captured at the virtual gateway and relayed through the secure egress service: TLS is added at the edge, the destination must be on the curated allowlist (echo and IoT services like httpbin.org and io.adafruit.com, plus api.open-meteo.com, worldtimeapi.org, api.github.com and friends), and every request is quota'd (500 a day, 5,000 a month) and audited. Missing a site? Request it from the same panel: an admin reviews every hostname, and approved sites become reachable for all Pro benches.

A board's radio state lives in the Inspector when it's selected: MAC, channel, SSID, IP, and handshake progress for Wi-Fi. The C6 gets a tab per radio (Wi-Fi, BLE, 802.15.4), each with a live activity dot.