Skip to content

Latest commit

 

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Device Config

基于 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 自更新
  • 跨域调用支持
  • armv7aarch64 交叉编译

快速开始

构建前端

前端已迁移到 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 build

Rust 构建会嵌入 frontend/dist。如果该目录不存在,cargo build 会提示先构建前端。

本地运行

npm --prefix frontend run build
PORT=3000 cargo run

访问 http://localhost:3000

如需前端热更新开发,可先运行后端:

PORT=3000 cargo run

再运行前端开发服务器:

npm --prefix frontend run dev

Vite 会把 /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_cfg

部署到设备

scp 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:服务端口,默认 80
  • WPA_CTRL_DIRwpa_supplicant 控制目录,默认 /var/run/wpa_supplicant
  • WIFI_IFACE:无线网卡接口名,默认 wlan0
  • ETHERNET_IFACE:以太网接口名,默认 eth0
  • ETHERNET_CONFIG_PATH:以太网配置文件路径,默认 /etc/network/interfaces.d/eth0
  • NETWORK_RESTART_BIN:应用网口配置后调用的网络服务脚本,默认 /etc/init.d/S40network
  • UPDATE_REPO_OWNER:更新仓库 owner,默认 xin5683
  • UPDATE_REPO_NAME:更新仓库名,默认 device_cfg
  • UPDATE_TARGET:更新包目标平台,默认当前编译 target
  • UPDATE_MIRRORS:GitHub 镜像站列表,多个地址用英文逗号分隔
  • DAEMON_INSTALL_DIR:UDP 网关安装目录,默认 /opt/device_cfg/udp_gw
  • DAEMON_TARGET:UDP 网关 release 目标平台,默认当前编译 target
  • DAEMON_ARGS:启动 UDP 网关时附加的命令行参数,按空格分隔
  • DAEMON_MIRRORS:UDP 网关下载使用的 GitHub 镜像站列表,默认同 UPDATE_MIRRORS
  • DAEMON_LOG_MAX_LINES:UDP 网关日志文件最大保留行数,默认 2000
  • CAN_IFACE:诊断状态读取的 CAN 接口名,默认 can0
  • NTP_SERVER:互联网时间源与手动同步使用的 NTP 服务器,默认 pool.ntp.org
  • NTPD_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

API

GET /api/scan

扫描周边 WiFi。

GET /api/status

读取当前连接状态。

POST /api/connect

请求体示例:

{
  "ssid": "MyWiFi",
  "password": "mypassword"
}

开放网络可省略 password

POST /api/disconnect

断开当前 WiFi。

GET /api/ethernet/status

读取以太网接口启用状态、Link 状态、IPv4、网关、DNS、MAC 与收发统计。

GET /api/ethernet/config

读取 /etc/network/interfaces.d/eth0 的 DHCP/静态地址配置。

POST /api/ethernet/config

请求体示例:

{
  "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"]
}

静态地址只要求 addressnetmaskgatewaydns_nameservers 可为空,留空时不会写入对应配置行。

DHCP 配置可传:

{
  "mode": "dhcp",
  "dns_nameservers": []
}

接口会写入以太网配置文件,并执行 /etc/init.d/S40network restart

GET /api/update/check

检查 GitHub Release 是否存在新版本。接口会返回当前版本、最新版本、目标平台、匹配到的 release asset 和按顺序尝试的镜像 URL。

POST /api/update/apply

下载并替换当前运行的 device_cfg 二进制。更新包需要是 release asset,命名和当前 workflow 保持一致:

device_cfg-aarch64-unknown-linux-musl.tar.gz
device_cfg-armv7-unknown-linux-musleabihf.tar.gz

压缩包内的二进制文件名需要是 device_cfg-<target>。更新完成后需要重启服务让新版本生效。

GET /api/diagnostic/status/ws

WebSocket 推送 CAN 接口状态、RX/TX packets、eth0 Link/IP 状态、板卡时间、互联网时间和互联网连接状态,用于首页状态区实时展示。

POST /api/diagnostic/time/sync

通过 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_supplicant
  • wpa_cli
  • ip
  • udhcpc 或等价 DHCP 客户端

故障排查

扫描为空

  • 检查天线与接口名是否正确
  • 确认 wpa_supplicant 已运行
  • 手工验证 wpa_cli scanwpa_cli scan_results

连接失败

  • 检查密码是否正确
  • 查看 wpa_cli status
  • 查看 wpa_cli list_networks

许可证

MIT

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages