本文档用于在允许 HTTP 的情况下,用最少步骤验证本仓库 tunnel-server(隧道中心)+ tunnel-client(隧道客户端) 的 WebSocket 隧道与 /device 反代是否端到端可用。
- 已准备好 tunnel-server 与 tunnel-client 可执行文件(从 README 如何编译 编译,或从 Release 下载)
- 以下示例假设可执行文件在当前目录;若从源码运行,可使用
go run ./cmd/tunnel-server/go run ./cmd/tunnel-client
用 Python 启动一个静态文件服务即可:
python3 -m http.server 8080保持该终端窗口运行。
LISTEN_ADDR=:8081 \
DEVICE_TOKENS="RTK001=dev-token" \
./tunnel-server说明:
LISTEN_ADDR:服务监听地址DEVICE_TOKENS:设备鉴权静态映射,格式:device_id=token,device_id2=token2
SERVER_WS="ws://127.0.0.1:8081/tunnel/device" \
DEVICE_ID=RTK001 \
TOKEN=dev-token \
TARGET_BASE="http://127.0.0.1:8080" \
./tunnel-client说明:
SERVER_WS:中心服务器的 WS 地址(HTTP 下用ws://)TARGET_BASE:设备本地 HTTP 服务的 base URL(隧道转发目标)
浏览器打开:
http://127.0.0.1:8081/device/RTK001/
或用 curl:
curl -i "http://127.0.0.1:8081/device/RTK001/"你应当看到来自步骤 1 的 http.server 的响应内容(目录列表/文件内容)。
如果你想让同一局域网的其它设备访问,把上面 URL 中的 127.0.0.1 换成运行隧道中心(tunnel-server)那台机器的 内网 IP:
http://<LAN_IP>:8081/device/RTK001/
示例:
http://192.168.1.10:8081/device/RTK001/
注意:
- 需要确保防火墙/安全组放行
8081端口 tunnel-client与“设备本地服务”在同一台机器时,TARGET_BASE仍然保持http://127.0.0.1:8080
- 说明该
device_id没有在线的 WS 连接 - 检查
tunnel-client是否已连接成功,以及DEVICE_ID是否与访问路径一致(如都是RTK001)
- 检查
DEVICE_TOKENS中是否配置了该device_id,且TOKEN是否匹配
- 设备端没能在超时时间内返回响应
- 检查
TARGET_BASE是否可访问、8080服务是否在运行
- 相对路径会发到
http://服务器/api/...,不会带/device/{device_id}/,隧道路由匹配不到。 - 推荐在前端根据
window.location.pathname动态拼出/device/{device_id}前缀,例如:
function getBasePrefix(): string {
if (typeof window === 'undefined') return '';
const parts = window.location.pathname.split('/').filter(Boolean);
// /device/{device_id}/...
if (parts.length >= 2 && parts[0] === 'device') {
return `/device/${parts[1]}`;
}
return '';
}
export function getApiBase(): string {
return `${getBasePrefix()}/api`;
}- 然后把前端 API 客户端的
baseURL配置为getApiBase(),例如axios.create({ baseURL: getApiBase() })。