OpenIoTHub 网关的 TypeScript / Node.js 版本,是 gateway-go 的完整重写,与 Go 版本保持线协议兼容。
- JWT Token 登录 OpenIoTHub 服务器
- 首次运行自动获取 Token 并展示二维码供手机扫码绑定
- 多协议端口转发:TCP / TLS / UDP / WebSocket / WSS / SSH / 串口
- mDNS 服务发现与网关注册
- TCP 端口扫描
- 组播 UDP 监听转发
- 系统状态信息采集(CPU、内存、磁盘、网络)
- IPv6 P2P 直连
- HTTP 管理界面与二维码展示
- gRPC 管理服务(登录状态查询 / Token 登录)
- Docker 容器服务发现
- yamux 多路复用(与 Go 版本 wire-compatible)
- Node.js >= 18
- npm >= 8
- 串口功能需要系统编译工具链(
node-gyp)
cd gateway-js
npm installnpm run build编译产物在 dist/ 目录,proto 文件会自动复制到 dist/proto/。
# 默认启动(使用配置文件,首次运行自动创建并自动登录)
npm start
# 使用 Token 登录
npm start -- -t <your-gateway-token>
# 指定配置文件路径
npm start -- -c /path/to/gateway-go.yaml
# 初始化配置文件(不启动服务)
npm start -- init
# 开发模式(ts-node 直接运行,无需编译)
npm run devnpm run build
npm link
# 之后可以直接使用命令
gateway-js
gateway-js -t <your-gateway-token>
gateway-js init
gateway-js --helpUsage: gateway-js [options] [command]
OpenIoTHub Gateway - TypeScript/Node.js version
Options:
-V, --version 查看版本号
-c, --config <path> 配置文件路径(默认: ./gateway-go.yaml)
-t, --token <token> 使用 Gateway Token 直接登录服务器
-h, --help 查看帮助
Commands:
init|i 初始化配置文件
test|t 测试命令是否可用
默认配置文件名为 gateway-go.yaml(与 Go 版共用同一格式),首次运行时自动创建。
# 网关唯一标识,自动生成
gatewayuuid: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
# 日志配置
logconfig:
enablestdout: true # 是否输出到终端
logfilepath: "" # 日志文件路径(空则不写文件)
# HTTP 服务端口
http_service_port: 34323
# 已登录的 Token 列表(RunId -> JWT Token)
loginwithtokenmap: {}| 字段 | 类型 | 说明 |
|---|---|---|
gatewayuuid |
string | 网关 UUID,自动生成,长度不足 35 位时会重新生成 |
logconfig.enablestdout |
boolean | 是否将日志输出到终端 |
logconfig.logfilepath |
string | 日志文件路径,为空则不写文件 |
http_service_port |
number | HTTP 管理界面端口,默认 34323 |
loginwithtokenmap |
object | 已登录服务器的 Token 映射,键为 RunId,值为 JWT Token |
| 变量名 | 说明 |
|---|---|
GatewayLoginToken |
直接指定登录 Token(优先级高于配置文件) |
GatewayConfigFilePath |
指定配置文件路径 |
SNAP_USER_DATA |
Snap 应用数据目录(自动拼接配置文件路径) |
示例:
# 通过环境变量启动
GatewayLoginToken=eyJhbGci... node dist/main.js
# 指定配置文件
GatewayConfigFilePath=/etc/gateway/gateway-go.yaml node dist/main.jsdocker build -t gateway-js .# 基本运行(自动登录模式)
docker run -d \
--name gateway-js \
-p 34323:34323 \
-p 55443:55443 \
gateway-js
# 使用 Token 登录
docker run -d \
--name gateway-js \
-p 34323:34323 \
-p 55443:55443 \
gateway-js -t <your-gateway-token>
# 挂载配置文件持久化
docker run -d \
--name gateway-js \
-p 34323:34323 \
-p 55443:55443 \
-v /path/to/config:/app/gateway-go.yaml \
gateway-js
# 启用 Docker 容器服务发现(需要挂载 docker.sock)
docker run -d \
--name gateway-js \
-p 34323:34323 \
-p 55443:55443 \
-v /var/run/docker.sock:/var/run/docker.sock \
gateway-js| 端口 | 协议 | 说明 |
|---|---|---|
34323 |
HTTP | 管理界面与二维码展示 |
55443 |
gRPC | 网关管理服务(登录状态查询 / Token 登录) |
| 路径 | 方法 | 说明 |
|---|---|---|
/ |
GET | 管理首页(显示登录状态与 QR 码链接) |
/DisplayQrHandler |
GET | 返回二维码图片(PNG),供手机扫码绑定网关 |
服务定义见 src/proto/gateway.proto:
| 方法 | 说明 |
|---|---|
CheckGatewayLoginStatus |
查询网关登录状态 |
LoginServerByToken |
通过 Token 登录服务器 |
TypeScript 版与 Go 版使用完全相同的线上协议,可以互相替换:
| 协议层 | 说明 |
|---|---|
| yamux | 流多路复用,与 libp2p/go-yamux wire-compatible |
| msgio | 消息帧格式:4 字节大端长度前缀 + 载荷 |
| 消息格式 | 两帧组成:[len][type_string] + [len][json_body] |
| 类型标识 | Go 反射类型字符串,如 models.ConnectTCP |
gateway-js/
├── src/ # TypeScript 源码
│ ├── main.ts # CLI 入口
│ ├── config/ # 配置管理
│ ├── models/ # 协议消息定义
│ ├── utils/ # 工具层(yamux, msgio, io, qr, docker)
│ ├── services/ # 业务层(会话管理, HTTP 处理, 自动登录)
│ ├── netservice/ # 网络服务层(消息分发, 连接转发, 服务处理)
│ ├── tasks/ # 后台任务(IPv6 P2P)
│ ├── client/ # 客户端服务(HTTP, gRPC, mDNS)
│ ├── register/ # 本地服务注册
│ └── proto/ # gRPC Proto 文件
├── docs/ # 详细文档
│ ├── architecture.md # 架构说明
│ ├── go-js-diff.md # Go/JS 差异对照
│ ├── unimplemented-features.md # 未实现功能
│ └── optimization-suggestions.md # 优化建议
├── package.json
├── tsconfig.json
├── Dockerfile
└── gateway-go.yaml # 默认配置文件
详细架构说明见 docs/architecture.md。
gateway-js 支持以库的形式嵌入其他 Node.js 项目:
import { gatewayManager } from 'gateway-js/dist/services/gatewayManager';
import { run } from 'gateway-js/dist/client/lib';
// 添加服务器
await gatewayManager.addServer('your-jwt-token');
// 启动后台服务(HTTP, gRPC, IPv6 任务)
run();MIT