基于 Rust + axum 的嵌入式设备控制 Web 前后端,当前内置 WiFi 与以太网配置能力,适用于 Luckfox Lyra Ultra W、RK 系列等 Linux 设备。
device_cfg 不是单纯的 WiFi 配网页,而是面向嵌入式设备控制面的轻量控制台:
- 单一二进制交付,适合设备侧部署
- 前端静态资源内嵌,无需额外文件系统依赖
- 后端通过 HTTP API 暴露设备控制能力
- 当前提供 WiFi 与以太网控制,后续可扩展设备概览、诊断工具、日志能力
- WiFi 扫描
- WiFi 连接与断开
- 当前网络状态查询
- eth0 Link、启用状态、IP、网关、DNS 与收发统计实时状态
- eth0 DHCP/静态地址配置并重启网络服务
- CAN 接口与系统时间实时状态
- 使用
ntpd手动同步板卡时间 - 从 GitHub Release 自更新
- 跨域调用支持
armv7与aarch64交叉编译
前端已迁移到 frontend/,使用 Vite + Svelte + TypeScript,并通过 Flowbite Svelte、Tailwind CSS、Lucide 图标和 ansi_up 处理通用 UI 与日志渲染。Node/npm 只在开发机或 CI 构建时使用,目标设备运行时仍然只需要 device_cfg 单个二进制。
npm --prefix frontend ci
npm --prefix frontend run buildRust 构建会嵌入 frontend/dist。如果该目录不存在,cargo build 会提示先构建前端。
npm --prefix frontend run build
PORT=3000 cargo run访问 http://localhost:3000。
如需前端热更新开发,可先运行后端:
PORT=3000 cargo run再运行前端开发服务器:
npm --prefix frontend run devVite 会把 /api 代理到 http://127.0.0.1:3000。
npm --prefix frontend run build
cargo build --release --target aarch64-unknown-linux-gnu
ls -lh target/aarch64-unknown-linux-gnu/release/device_cfg如需 armv7:
cargo build --release --target armv7-unknown-linux-gnueabihf
ls -lh target/armv7-unknown-linux-gnueabihf/release/device_cfgscp target/aarch64-unknown-linux-gnu/release/device_cfg root@<board-ip>:/usr/bin/
ssh root@<board-ip> "sudo env WPA_CTRL_DIR=/run/wpa_supplicant WIFI_IFACE=wlan1 PORT=3000 /usr/bin/device_cfg"访问 http://<board-ip>:3000。
PORT:服务端口,默认80WPA_CTRL_DIR:wpa_supplicant控制目录,默认/var/run/wpa_supplicantWIFI_IFACE:无线网卡接口名,默认wlan0ETHERNET_IFACE:以太网接口名,默认eth0ETHERNET_CONFIG_PATH:以太网配置文件路径,默认/etc/network/interfaces.d/eth0NETWORK_RESTART_BIN:应用网口配置后调用的网络服务脚本,默认/etc/init.d/S40networkUPDATE_REPO_OWNER:更新仓库 owner,默认xin5683UPDATE_REPO_NAME:更新仓库名,默认device_cfgUPDATE_TARGET:更新包目标平台,默认当前编译 targetUPDATE_MIRRORS:GitHub 镜像站列表,多个地址用英文逗号分隔DAEMON_INSTALL_DIR:UDP 网关安装目录,默认/opt/device_cfg/udp_gwDAEMON_TARGET:UDP 网关 release 目标平台,默认当前编译 targetDAEMON_ARGS:启动 UDP 网关时附加的命令行参数,按空格分隔DAEMON_MIRRORS:UDP 网关下载使用的 GitHub 镜像站列表,默认同UPDATE_MIRRORSDAEMON_LOG_MAX_LINES:UDP 网关日志文件最大保留行数,默认2000CAN_IFACE:诊断状态读取的 CAN 接口名,默认can0NTP_SERVER:互联网时间源与手动同步使用的 NTP 服务器,默认pool.ntp.orgNTPD_BIN:手动同步调用的ntpd可执行文件,默认ntpd
UDP 网关安装后会在安装目录保存版本信息,默认路径为:
/opt/device_cfg/udp_gw/udp_gw_builder.version.json
默认镜像顺序:
https://gh-proxy.org
https://gh.monlor.com
https://ghproxy.monkeyray.net
https://ghfast.top
https://cors.isteed.cc
https://cdn.crashmc.com
https://gh.jasonzeng.dev
扫描周边 WiFi。
读取当前连接状态。
请求体示例:
{
"ssid": "MyWiFi",
"password": "mypassword"
}开放网络可省略 password。
断开当前 WiFi。
读取以太网接口启用状态、Link 状态、IPv4、网关、DNS、MAC 与收发统计。
读取 /etc/network/interfaces.d/eth0 的 DHCP/静态地址配置。
请求体示例:
{
"mode": "static",
"address": "192.168.1.100",
"netmask": "255.255.255.0",
"gateway": "192.168.1.1",
"dns_nameservers": ["8.8.8.8", "114.114.114.114"]
}静态地址只要求 address 和 netmask;gateway 和 dns_nameservers 可为空,留空时不会写入对应配置行。
DHCP 配置可传:
{
"mode": "dhcp",
"dns_nameservers": []
}接口会写入以太网配置文件,并执行 /etc/init.d/S40network restart。
检查 GitHub Release 是否存在新版本。接口会返回当前版本、最新版本、目标平台、匹配到的 release asset 和按顺序尝试的镜像 URL。
下载并替换当前运行的 device_cfg 二进制。更新包需要是 release asset,命名和当前 workflow 保持一致:
device_cfg-aarch64-unknown-linux-musl.tar.gz
device_cfg-armv7-unknown-linux-musleabihf.tar.gz
压缩包内的二进制文件名需要是 device_cfg-<target>。更新完成后需要重启服务让新版本生效。
WebSocket 推送 CAN 接口状态、RX/TX packets、eth0 Link/IP 状态、板卡时间、互联网时间和互联网连接状态,用于首页状态区实时展示。
通过 ntpd -q -p <NTP_SERVER> 手动同步板卡时间。
当前代码按“设备能力 / Web 接口 / 启动装配”分层:
device_cfg/
├── Cargo.toml
├── .cargo/
│ └── config.toml
├── src/
│ ├── main.rs
│ ├── app.rs # 应用启动、配置、路由装配
│ ├── device/
│ │ ├── mod.rs
│ │ ├── ethernet.rs # 设备以太网状态与配置服务
│ │ ├── update.rs # GitHub Release 自更新服务
│ │ └── wifi.rs # 设备 WiFi 控制服务
│ ├── web/
│ │ ├── mod.rs
│ │ ├── api.rs # HTTP API
│ │ └── assets.rs # 嵌入并输出 frontend/dist
└── frontend/
├── src/
│ ├── api/ # TypeScript API 类型与客户端
│ ├── components/ # 通用业务组件
│ └── tabs/ # WiFi、更新、UDP 网关页签
└── dist/ # Vite 构建产物,由 Rust 嵌入
这套结构适合继续扩展:
device/:增加设备信息、LED、GPIO、系统状态等能力web/api.rs:增加对应控制接口frontend/src/tabs/:扩展前端页签和控制页面
目标设备需具备:
wpa_supplicantwpa_cliipudhcpc或等价 DHCP 客户端
- 检查天线与接口名是否正确
- 确认
wpa_supplicant已运行 - 手工验证
wpa_cli scan与wpa_cli scan_results
- 检查密码是否正确
- 查看
wpa_cli status - 查看
wpa_cli list_networks
MIT