OpenIoTHub 网关的 Dart 实现,与 gateway-go 功能对齐、线协议兼容。
gateway_dart 是一个 NAT 穿透网关,在局域网内持续运行,通过 JWT Token 连接 OpenIoTHub 服务器,接收远程访问请求并将流量转发到本地服务。
| 功能 | 状态 | 说明 |
|---|---|---|
| TCP 转发 | ✅ | net.DialTimeout 30s |
| TLS/STCP 转发 | ✅ | SecureSocket.connect |
| UDP 转发 | ✅ | RawDatagramSocket |
| WebSocket 转发 | ✅ | WebSocket.connect |
| WSS 转发 | ✅ | 复用 WS (wss:// 自动 TLS) |
| SSH 转发 | TCP 转发模式(无 PTY) | |
| yamux 多路复用 | ✅ | 兼容 go-yamux |
| msgio 消息协议 | ✅ | 4 字节大端长度前缀 |
| 子会话 (NewSubSession) | ✅ | yamux over yamux |
| 服务器会话管理 | ✅ | 20s 心跳,自动重连 |
| 工作连接 | ✅ | RequestNewWorkConn |
| 端口扫描 | ✅ | 并发 TCP 扫描 |
| 系统状态 | ✅ | OS/CPU/内存/网络接口 |
| mDNS 发现 | ✅ | multicast_dns 库 |
| mDNS 注册 | ✅ | HTTP + 网关服务 |
| 组播 UDP | ✅ | RawDatagramSocket |
| IPv6 直连 | ✅ | 服务端/客户端任务 |
| IPv6 地址交换 | ✅ | 公网 IPv6 检测 |
| Ping/Pong | ✅ | 心跳保活 |
| 连通性检测 | ✅ | TCP/UDP/TLS |
| HTTP 管理界面 | ✅ | shelf + 二维码 |
| gRPC 管理服务 | ✅ | 端口 55443 |
| 自动登录 | ✅ | API 生成 JWT |
| QR 码生成 | ✅ | 终端 ASCII + BMP |
| 配置文件 | ✅ | gateway-go.yaml |
| DeleteGatewayJwt | ✅ | 删除 token 并断开 |
| CLI 命令 | ✅ | init/test/config/token |
| 库模式 | ✅ | 可嵌入其他应用 |
| 功能 | 状态 | 说明 |
|---|---|---|
| SSH 终端 | 纯 Dart 无 PTY 支持,降级为 TCP 转发 | |
| 串口连接 | ❌ | 纯 Dart 不支持,需 FFI |
| TAP/TUN 虚拟网卡 | ❌ | 纯 Dart 不支持,需 FFI |
| P2P/KCP 打洞 | ✅ | 纯 Dart KCP + FEC 头兼容,无 RS 纠删 |
| Docker 容器发现 | ❌ | 需要 Docker API 客户端 |
- Dart SDK >= 3.0.0
cd gateway_dart
dart pub get
dart compile exe bin/gateway_dart.dart -o gateway_dart
dart run bin/gateway_dart.dart
# 使用 token 登录
./gateway_dart -t <your-jwt-token>
# 使用配置文件
./gateway_dart -c /path/to/gateway-go.yaml
# 初始化配置文件
./gateway_dart init
# 查看版本
./gateway_dart -v
import 'package:gateway_dart/gateway_dart.dart';
void main() async {
// 方式 1:使用 token 登录
await startWithToken('your-jwt-token');
run();
// 方式 2:使用配置文件
configFilePath = '/path/to/gateway-go.yaml';
await startWithConfigFile();
run();
}
| 变量 | 说明 |
|---|---|
GatewayConfigFilePath |
配置文件路径 |
GatewayLoginToken |
JWT 登录 Token |
SNAP_USER_DATA |
Snap 应用数据目录 |
配置文件格式与 gateway-go 完全兼容:
gatewayuuid: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
logconfig:
enablestdout: true
logfilepath: ""
http_service_port: 34323
loginwithtokenmap:
<run-id>: <jwt-token>
| 服务 | 端口 | 说明 |
|---|---|---|
| HTTP | 34323 | 管理界面 + 二维码 |
| gRPC | 55443 | GatewayLoginManager |
┌─────────────────────────────────────────────────────────┐
│ gateway_dart │
└─────────────────────────────────────────────────────────┘
│
┌──────────────────────┼──────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌──────────────┐ ┌──────────────────┐
│ OpenIoTHub │ │ Gateway │ │ Local Services │
│ Server(TCP) │◄──│ Manager │ │ HTTP :34323 │
│ via yamux │ │ Sessions │ │ gRPC :55443 │
└─────────────┘ └──────────────┘ └──────────────────┘
│ │
│ Streams │ HandleStream
▼ ▼
┌─────────────────────────────────────────────────────────┐
│ HandleStream (消息分发) │
├────────┬────────┬────────┬────────┬─────────────────────┤
│ TCP │ WS/WSS │ SSH │ Ping │ NewService │
│ STCP │ │ │ Pong │ mDNS/scan/status... │
│ UDP │ │ │ │ │
└────────┴────────┴────────┴────────┴─────────────────────┘
gateway_dart 与 gateway-go 使用完全相同的线协议:
- 消息格式: msgio(4 字节大端长度 + 载荷),两帧:
[len][type]+[len][json_body] - 多路复用: yamux,与
libp2p/go-yamuxwire-compatible - 配置文件:
gateway-go.yaml,各实现共用
与 gateway-go 项目相同。