@thejrsoft/subway-protocol 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ACK_MESSAGES_IMPLEMENTATION_SUMMARY.md +128 -0
- package/ACK_MESSAGE_DESIGN.md +457 -0
- package/CHANGELOG.md +58 -0
- package/COMMAND_VALIDATION_RULES.md +178 -0
- package/DOCUMENTATION_REORGANIZATION_SUMMARY.md +81 -0
- package/DOCUMENTATION_STRUCTURE.md +106 -0
- package/GATEWAY_MIGRATION_GUIDE.md +130 -0
- package/GATEWAY_PROTOCOL_COMPARISON.md +216 -0
- package/INTEGRATION_GUIDE.md +190 -0
- package/OPTIONAL_FIELDS_WITHOUT_DEFAULTS.md +97 -0
- package/PROTOCOL_UTILS_USAGE.md +278 -0
- package/README.md +237 -0
- package/TYPE_FIXES_SUMMARY.md +210 -0
- package/UPDATE_ENUM_VALUES.md +139 -0
- package/dist/asyncapi-sync.d.ts +47 -0
- package/dist/asyncapi-sync.d.ts.map +1 -0
- package/dist/asyncapi-sync.js +85 -0
- package/dist/asyncapi-sync.js.map +1 -0
- package/dist/command-factory.d.ts +62 -0
- package/dist/command-factory.d.ts.map +1 -0
- package/dist/command-factory.js +137 -0
- package/dist/command-factory.js.map +1 -0
- package/dist/command-types.d.ts +27 -0
- package/dist/command-types.d.ts.map +1 -0
- package/dist/command-types.js +31 -0
- package/dist/command-types.js.map +1 -0
- package/dist/index.d.ts +403 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +413 -0
- package/dist/index.js.map +1 -0
- package/dist/message-validator.d.ts +102 -0
- package/dist/message-validator.d.ts.map +1 -0
- package/dist/message-validator.js +640 -0
- package/dist/message-validator.js.map +1 -0
- package/dist/protocol-utils.d.ts +108 -0
- package/dist/protocol-utils.d.ts.map +1 -0
- package/dist/protocol-utils.js +293 -0
- package/dist/protocol-utils.js.map +1 -0
- package/docs/01-protocol/README.md +45 -0
- package/docs/01-protocol/design-rationale.md +198 -0
- package/docs/01-protocol/message-types.md +669 -0
- package/docs/01-protocol/specification.md +1466 -0
- package/docs/02-commands/README.md +56 -0
- package/docs/02-commands/batch-command.md +435 -0
- package/docs/02-commands/complex-command.md +537 -0
- package/docs/02-commands/simple-command.md +332 -0
- package/docs/02-commands/typed-commands.md +362 -0
- package/docs/03-architecture/README.md +66 -0
- package/docs/03-architecture/device-protocol.md +430 -0
- package/docs/03-architecture/edge-proxy.md +727 -0
- package/docs/03-architecture/routing-flow.md +893 -0
- package/docs/04-integration/README.md +144 -0
- package/docs/04-integration/backend-guide.md +551 -0
- package/docs/04-integration/edge-guide.md +684 -0
- package/docs/04-integration/gateway-guide.md +180 -0
- package/docs/04-integration/migration-guide.md +226 -0
- package/docs/05-examples/README.md +141 -0
- package/docs/05-examples/progress-update-examples.md +757 -0
- package/docs/06-reference/README.md +67 -0
- package/docs/06-reference/api.md +572 -0
- package/docs/06-reference/faq.md +302 -0
- package/docs/06-reference/glossary.md +232 -0
- package/examples/backend-upgrade.ts +279 -0
- package/examples/edge-multi-device.ts +513 -0
- package/examples/gateway-upgrade.ts +150 -0
- package/examples/protocol-implementation.ts +715 -0
- package/package.json +48 -0
- package/scripts/validate-asyncapi.ts +78 -0
- package/src/__tests__/protocol.test.ts +297 -0
- package/src/asyncapi-sync.ts +84 -0
- package/src/command-factory.ts +183 -0
- package/src/command-types.ts +72 -0
- package/src/edge-proxy.ts +494 -0
- package/src/gateway-extensions.ts +278 -0
- package/src/index.ts +792 -0
- package/src/message-validator.ts +726 -0
- package/src/protocol-utils.ts +355 -0
- package/tsconfig.json +24 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
# 常见问题解答(FAQ)
|
|
2
|
+
|
|
3
|
+
## 协议相关
|
|
4
|
+
|
|
5
|
+
### Q: 为什么选择 WebSocket 而不是 HTTP?
|
|
6
|
+
|
|
7
|
+
A: WebSocket 提供了实时双向通信能力,非常适合我们的场景:
|
|
8
|
+
- **实时性**:设备状态变化需要立即通知
|
|
9
|
+
- **双向通信**:设备既要接收命令,也要主动上报状态
|
|
10
|
+
- **低延迟**:避免 HTTP 轮询的开销
|
|
11
|
+
- **持久连接**:减少连接建立的开销
|
|
12
|
+
|
|
13
|
+
### Q: 协议版本如何管理?
|
|
14
|
+
|
|
15
|
+
A: 当前协议版本为 1.0,升级策略:
|
|
16
|
+
- 所有消息包含 `version` 字段
|
|
17
|
+
- 向后兼容:新版本支持旧版本消息
|
|
18
|
+
- 版本协商:注册时确定使用的协议版本
|
|
19
|
+
- 平滑升级:支持新旧版本并存
|
|
20
|
+
|
|
21
|
+
### Q: 消息大小有限制吗?
|
|
22
|
+
|
|
23
|
+
A: 建议限制:
|
|
24
|
+
- 单个消息不超过 1MB
|
|
25
|
+
- 大文件通过 URL 下载,而非消息体
|
|
26
|
+
- 批量数据分页传输
|
|
27
|
+
- 支持消息压缩(gzip)
|
|
28
|
+
|
|
29
|
+
### Q: 如何保证消息的可靠性?
|
|
30
|
+
|
|
31
|
+
A: 多层保障机制:
|
|
32
|
+
- WebSocket 基于 TCP,保证顺序和完整性
|
|
33
|
+
- 心跳机制检测连接状态
|
|
34
|
+
- 请求-响应模式确认执行结果
|
|
35
|
+
- 支持重试和超时处理
|
|
36
|
+
- 关键操作支持回调确认
|
|
37
|
+
|
|
38
|
+
## 集成问题
|
|
39
|
+
|
|
40
|
+
### Q: 如何处理网络断开重连?
|
|
41
|
+
|
|
42
|
+
A: 推荐的重连策略:
|
|
43
|
+
```javascript
|
|
44
|
+
class ReconnectingWebSocket {
|
|
45
|
+
constructor(url) {
|
|
46
|
+
this.url = url;
|
|
47
|
+
this.reconnectInterval = 1000;
|
|
48
|
+
this.maxReconnectInterval = 30000;
|
|
49
|
+
this.reconnectDecay = 1.5;
|
|
50
|
+
this.reconnectAttempts = 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
connect() {
|
|
54
|
+
this.ws = new WebSocket(this.url);
|
|
55
|
+
|
|
56
|
+
this.ws.onclose = () => {
|
|
57
|
+
this.reconnect();
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
this.ws.onopen = () => {
|
|
61
|
+
this.reconnectAttempts = 0;
|
|
62
|
+
this.register(); // 重新注册
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
reconnect() {
|
|
67
|
+
const timeout = Math.min(
|
|
68
|
+
this.reconnectInterval * Math.pow(this.reconnectDecay, this.reconnectAttempts),
|
|
69
|
+
this.maxReconnectInterval
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
setTimeout(() => {
|
|
73
|
+
this.reconnectAttempts++;
|
|
74
|
+
this.connect();
|
|
75
|
+
}, timeout);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Q: Edge 设备注册的正确流程是什么?
|
|
81
|
+
|
|
82
|
+
A: Edge 和设备的注册流程:
|
|
83
|
+
|
|
84
|
+
1. **Edge 先注册自己**
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"type": "REGISTER",
|
|
88
|
+
"clientId": "edge-001",
|
|
89
|
+
"clientType": "EDGE"
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
2. **Edge 为每个设备注册**
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"type": "REGISTER",
|
|
97
|
+
"clientId": "td-01",
|
|
98
|
+
"clientType": "DEVICE",
|
|
99
|
+
"edgeInfo": {
|
|
100
|
+
"edgeId": "edge-001"
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Q: 如何实现批量命令的进度跟踪?
|
|
106
|
+
|
|
107
|
+
A: 使用 progress_update 消息:
|
|
108
|
+
```javascript
|
|
109
|
+
// 批量执行示例
|
|
110
|
+
async function executeBatchCommand(devices, command) {
|
|
111
|
+
const total = devices.length;
|
|
112
|
+
let completed = 0;
|
|
113
|
+
|
|
114
|
+
for (const device of devices) {
|
|
115
|
+
try {
|
|
116
|
+
const result = await executeOnDevice(device, command);
|
|
117
|
+
completed++;
|
|
118
|
+
|
|
119
|
+
// 发送进度更新
|
|
120
|
+
await sendProgressUpdate({
|
|
121
|
+
requestRef: command.requestRef,
|
|
122
|
+
status: 'IN_PROGRESS',
|
|
123
|
+
progress: Math.round((completed / total) * 100),
|
|
124
|
+
phase: 'executing',
|
|
125
|
+
command: {
|
|
126
|
+
deviceId: device.id,
|
|
127
|
+
result: result
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
} catch (error) {
|
|
131
|
+
// 处理错误但继续执行
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// 发送最终响应
|
|
136
|
+
return {
|
|
137
|
+
type: 'COMMAND_RESPONSE',
|
|
138
|
+
status: 'COMPLETED',
|
|
139
|
+
summary: { total, completed }
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Q: 心跳机制的最佳实践?
|
|
145
|
+
|
|
146
|
+
A: 推荐配置:
|
|
147
|
+
- 发送间隔:30秒
|
|
148
|
+
- 超时时间:90秒(3个心跳周期)
|
|
149
|
+
- 包含序列号用于匹配
|
|
150
|
+
- 利用心跳确认携带服务器状态
|
|
151
|
+
|
|
152
|
+
```javascript
|
|
153
|
+
class HeartbeatManager {
|
|
154
|
+
constructor(websocket, clientId) {
|
|
155
|
+
this.ws = websocket;
|
|
156
|
+
this.clientId = clientId;
|
|
157
|
+
this.sequence = 0;
|
|
158
|
+
this.interval = 30000; // 30秒
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
start() {
|
|
162
|
+
this.timer = setInterval(() => {
|
|
163
|
+
this.send();
|
|
164
|
+
}, this.interval);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
send() {
|
|
168
|
+
this.ws.send(JSON.stringify({
|
|
169
|
+
type: 'HEARTBEAT',
|
|
170
|
+
clientId: this.clientId,
|
|
171
|
+
sequence: ++this.sequence,
|
|
172
|
+
clientTime: new Date().toISOString(),
|
|
173
|
+
timestamp: new Date().toISOString(),
|
|
174
|
+
version: '1.0'
|
|
175
|
+
}));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
stop() {
|
|
179
|
+
clearInterval(this.timer);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## 性能优化
|
|
185
|
+
|
|
186
|
+
### Q: 如何优化大量设备的消息推送?
|
|
187
|
+
|
|
188
|
+
A: 性能优化策略:
|
|
189
|
+
1. **消息聚合**:相同的命令合并发送
|
|
190
|
+
2. **批量处理**:使用 BATCH 命令类型
|
|
191
|
+
3. **优先级队列**:重要消息优先处理
|
|
192
|
+
4. **限流控制**:避免消息风暴
|
|
193
|
+
5. **Edge 缓存**:利用 Edge 节点缓存
|
|
194
|
+
|
|
195
|
+
### Q: Gateway 的负载均衡如何实现?
|
|
196
|
+
|
|
197
|
+
A: 多种负载均衡策略:
|
|
198
|
+
- **连接数均衡**:新连接分配到连接数最少的 Gateway
|
|
199
|
+
- **消息量均衡**:根据消息吞吐量分配
|
|
200
|
+
- **地理位置**:就近接入原则
|
|
201
|
+
- **设备类型**:特定设备类型分配到特定 Gateway
|
|
202
|
+
|
|
203
|
+
### Q: 如何处理消息积压?
|
|
204
|
+
|
|
205
|
+
A: 消息积压处理:
|
|
206
|
+
1. **监控队列长度**:设置阈值告警
|
|
207
|
+
2. **优先级处理**:优先处理高优先级消息
|
|
208
|
+
3. **过期丢弃**:超时消息直接丢弃
|
|
209
|
+
4. **反压控制**:通知发送方降速
|
|
210
|
+
5. **水平扩展**:增加处理节点
|
|
211
|
+
|
|
212
|
+
## 故障排查
|
|
213
|
+
|
|
214
|
+
### Q: 设备无法连接到 Gateway?
|
|
215
|
+
|
|
216
|
+
A: 排查步骤:
|
|
217
|
+
1. **网络连通性**:ping Gateway 地址
|
|
218
|
+
2. **端口开放**:telnet Gateway 18081端口
|
|
219
|
+
3. **防火墙规则**:检查防火墙设置
|
|
220
|
+
4. **证书问题**:如果使用 WSS,检查证书
|
|
221
|
+
5. **日志分析**:查看 Gateway 和设备日志
|
|
222
|
+
|
|
223
|
+
### Q: 命令执行超时如何处理?
|
|
224
|
+
|
|
225
|
+
A: 超时处理机制:
|
|
226
|
+
```javascript
|
|
227
|
+
async function executeCommandWithTimeout(command, timeout = 30000) {
|
|
228
|
+
return Promise.race([
|
|
229
|
+
executeCommand(command),
|
|
230
|
+
new Promise((_, reject) =>
|
|
231
|
+
setTimeout(() => reject(new Error('Command timeout')), timeout)
|
|
232
|
+
)
|
|
233
|
+
]);
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Q: 如何调试协议消息?
|
|
238
|
+
|
|
239
|
+
A: 调试工具和方法:
|
|
240
|
+
1. **浏览器开发工具**:查看 WebSocket 消息
|
|
241
|
+
2. **Wireshark**:网络层抓包分析
|
|
242
|
+
3. **日志记录**:记录所有收发消息
|
|
243
|
+
4. **Mock Server**:模拟 Gateway 进行测试
|
|
244
|
+
|
|
245
|
+
```javascript
|
|
246
|
+
// 消息日志中间件
|
|
247
|
+
function messageLogger(direction) {
|
|
248
|
+
return (message) => {
|
|
249
|
+
console.log(`[${new Date().toISOString()}] ${direction}:`,
|
|
250
|
+
JSON.stringify(message, null, 2));
|
|
251
|
+
return message;
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## 安全相关
|
|
257
|
+
|
|
258
|
+
### Q: 如何保证通信安全?
|
|
259
|
+
|
|
260
|
+
A: 安全措施:
|
|
261
|
+
1. **使用 WSS**:WebSocket over TLS
|
|
262
|
+
2. **Token 认证**:注册时验证身份
|
|
263
|
+
3. **消息签名**:关键命令签名验证
|
|
264
|
+
4. **访问控制**:基于客户端类型的权限控制
|
|
265
|
+
5. **审计日志**:记录所有操作
|
|
266
|
+
|
|
267
|
+
### Q: 如何防止恶意连接?
|
|
268
|
+
|
|
269
|
+
A: 防护措施:
|
|
270
|
+
- **连接限流**:限制单 IP 连接数
|
|
271
|
+
- **认证超时**:未认证连接自动断开
|
|
272
|
+
- **黑名单**:恶意 IP 自动封禁
|
|
273
|
+
- **异常检测**:异常行为模式识别
|
|
274
|
+
|
|
275
|
+
## 扩展性
|
|
276
|
+
|
|
277
|
+
### Q: 如何添加新的命令类型?
|
|
278
|
+
|
|
279
|
+
A: 扩展步骤:
|
|
280
|
+
1. 在 C# 模型项目中定义命令
|
|
281
|
+
2. 生成 TypeScript 类型定义
|
|
282
|
+
3. 实现命令处理逻辑
|
|
283
|
+
4. 更新文档
|
|
284
|
+
5. 版本兼容性测试
|
|
285
|
+
|
|
286
|
+
### Q: 如何支持新的设备类型?
|
|
287
|
+
|
|
288
|
+
A: 新设备接入:
|
|
289
|
+
1. 定义设备类型和能力
|
|
290
|
+
2. 实现设备通信适配器
|
|
291
|
+
3. 注册设备命令映射
|
|
292
|
+
4. 测试各种命令场景
|
|
293
|
+
5. 更新设备管理文档
|
|
294
|
+
|
|
295
|
+
### Q: 协议如何支持未来扩展?
|
|
296
|
+
|
|
297
|
+
A: 扩展性设计:
|
|
298
|
+
- **版本字段**:支持协议演进
|
|
299
|
+
- **通用字段**:metadata、context 等扩展字段
|
|
300
|
+
- **自定义命令**:GenericCommand 支持任意命令
|
|
301
|
+
- **插件机制**:Gateway 和 Edge 支持插件
|
|
302
|
+
- **向后兼容**:新版本兼容旧版本消息
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# 术语表
|
|
2
|
+
|
|
3
|
+
本文档解释 JRSoft Subway 项目中使用的专业术语和概念。
|
|
4
|
+
|
|
5
|
+
## 系统组件
|
|
6
|
+
|
|
7
|
+
### Gateway(网关)
|
|
8
|
+
中心路由节点,负责:
|
|
9
|
+
- 管理所有客户端连接(Backend、Edge)
|
|
10
|
+
- 消息路由和转发
|
|
11
|
+
- 连接状态管理
|
|
12
|
+
- 负载均衡
|
|
13
|
+
- 协议转换
|
|
14
|
+
|
|
15
|
+
### Edge(边缘节点)
|
|
16
|
+
设备代理节点,作为本地网关:
|
|
17
|
+
- 管理本地设备连接
|
|
18
|
+
- 设备状态缓存
|
|
19
|
+
- 命令转发和聚合
|
|
20
|
+
- 离线缓存能力
|
|
21
|
+
- 批量操作优化
|
|
22
|
+
|
|
23
|
+
### Device(设备)
|
|
24
|
+
物理终端设备:
|
|
25
|
+
- 地铁隧道中的显示屏
|
|
26
|
+
- LED 光柱控制器
|
|
27
|
+
- 同步器设备
|
|
28
|
+
- 传感器设备
|
|
29
|
+
- 媒体播放器
|
|
30
|
+
|
|
31
|
+
### Backend(后端)
|
|
32
|
+
业务服务系统:
|
|
33
|
+
- Web API 服务
|
|
34
|
+
- 管理控制台
|
|
35
|
+
- 调度系统
|
|
36
|
+
- 监控服务
|
|
37
|
+
- 数据分析服务
|
|
38
|
+
|
|
39
|
+
## 协议概念
|
|
40
|
+
|
|
41
|
+
### WebSocket
|
|
42
|
+
全双工通信协议:
|
|
43
|
+
- 基于 TCP 的持久连接
|
|
44
|
+
- 支持实时双向通信
|
|
45
|
+
- 低延迟、高效率
|
|
46
|
+
- 心跳保活机制
|
|
47
|
+
|
|
48
|
+
### Message(消息)
|
|
49
|
+
协议通信的基本单位:
|
|
50
|
+
- JSON 格式
|
|
51
|
+
- 包含类型、时间戳、版本
|
|
52
|
+
- 支持请求-响应模式
|
|
53
|
+
- 支持单向通知
|
|
54
|
+
|
|
55
|
+
### Command(命令)
|
|
56
|
+
控制指令:
|
|
57
|
+
- Simple - 简单命令,一次请求一次响应
|
|
58
|
+
- Batch - 批量命令,针对多个设备
|
|
59
|
+
- Complex - 复杂命令,支持多次响应
|
|
60
|
+
|
|
61
|
+
### Progress Update(进度更新)
|
|
62
|
+
长时间操作的状态报告:
|
|
63
|
+
- 实时进度百分比
|
|
64
|
+
- 阶段性结果
|
|
65
|
+
- 结构化日志
|
|
66
|
+
- 错误和警告信息
|
|
67
|
+
|
|
68
|
+
## 业务概念
|
|
69
|
+
|
|
70
|
+
### Program(节目/程序)
|
|
71
|
+
在设备上运行的内容:
|
|
72
|
+
- 广告视频
|
|
73
|
+
- 图片轮播
|
|
74
|
+
- 文字滚动
|
|
75
|
+
- 动态效果
|
|
76
|
+
|
|
77
|
+
### Client ID(客户端标识)
|
|
78
|
+
唯一标识符格式:
|
|
79
|
+
- Device: `td-01`(隧道设备编号)
|
|
80
|
+
- Edge: `edge-001`(边缘节点编号)
|
|
81
|
+
- Backend: `backend-api`(后端服务名)
|
|
82
|
+
- targetClientId: 直接使用设备ID,如 `td-01`(Gateway 自动路由)
|
|
83
|
+
|
|
84
|
+
### Request Reference(请求引用)
|
|
85
|
+
命令追踪标识:
|
|
86
|
+
- 唯一标识一次命令请求
|
|
87
|
+
- 用于关联请求和响应
|
|
88
|
+
- 支持异步回调
|
|
89
|
+
- 便于日志追踪
|
|
90
|
+
|
|
91
|
+
### Session(会话)
|
|
92
|
+
客户端连接生命周期:
|
|
93
|
+
- 注册时创建
|
|
94
|
+
- 心跳维持
|
|
95
|
+
- 注销时销毁
|
|
96
|
+
- 包含认证信息
|
|
97
|
+
|
|
98
|
+
## 技术概念
|
|
99
|
+
|
|
100
|
+
### Heartbeat(心跳)
|
|
101
|
+
连接保活机制:
|
|
102
|
+
- 默认 30 秒发送一次
|
|
103
|
+
- 90 秒超时断开
|
|
104
|
+
- 包含序列号
|
|
105
|
+
- 可携带状态信息
|
|
106
|
+
|
|
107
|
+
### Callback(回调)
|
|
108
|
+
异步通知机制:
|
|
109
|
+
- HTTP POST 请求
|
|
110
|
+
- 命令完成后触发
|
|
111
|
+
- 包含完整响应数据
|
|
112
|
+
- 支持重试机制
|
|
113
|
+
|
|
114
|
+
### Priority(优先级)
|
|
115
|
+
消息处理优先级:
|
|
116
|
+
- CRITICAL - 关键,立即处理
|
|
117
|
+
- HIGH - 高优先级
|
|
118
|
+
- NORMAL - 普通优先级
|
|
119
|
+
- LOW - 低优先级,空闲时处理
|
|
120
|
+
|
|
121
|
+
### Timeout(超时)
|
|
122
|
+
操作时限控制:
|
|
123
|
+
- 命令执行超时
|
|
124
|
+
- 连接超时
|
|
125
|
+
- 心跳超时
|
|
126
|
+
- 可配置和扩展
|
|
127
|
+
|
|
128
|
+
## 状态定义
|
|
129
|
+
|
|
130
|
+
### Connection State(连接状态)
|
|
131
|
+
- CONNECTING - 连接中
|
|
132
|
+
- CONNECTED - 已连接
|
|
133
|
+
- REGISTERED - 已注册
|
|
134
|
+
- DISCONNECTING - 断开中
|
|
135
|
+
- DISCONNECTED - 已断开
|
|
136
|
+
|
|
137
|
+
### Command Status(命令状态)
|
|
138
|
+
- PENDING - 待执行
|
|
139
|
+
- IN_PROGRESS - 执行中
|
|
140
|
+
- COMPLETED - 已完成
|
|
141
|
+
- FAILED - 失败
|
|
142
|
+
- TIMEOUT - 超时
|
|
143
|
+
- CANCELLED - 已取消
|
|
144
|
+
|
|
145
|
+
### Device Status(设备状态)
|
|
146
|
+
- ONLINE - 在线
|
|
147
|
+
- OFFLINE - 离线
|
|
148
|
+
- BUSY - 忙碌
|
|
149
|
+
- ERROR - 错误
|
|
150
|
+
- MAINTENANCE - 维护中
|
|
151
|
+
|
|
152
|
+
## 数据格式
|
|
153
|
+
|
|
154
|
+
### ISO 8601
|
|
155
|
+
国际标准时间格式:
|
|
156
|
+
- 示例: `2024-01-20T10:00:00Z`
|
|
157
|
+
- 包含时区信息
|
|
158
|
+
- 精确到秒或毫秒
|
|
159
|
+
- UTC 时间推荐
|
|
160
|
+
|
|
161
|
+
### Snowflake ID
|
|
162
|
+
分布式唯一ID:
|
|
163
|
+
- 64 位整数
|
|
164
|
+
- 时间戳 + 机器ID + 序列号
|
|
165
|
+
- 保证全局唯一
|
|
166
|
+
- 有序可排序
|
|
167
|
+
|
|
168
|
+
### Range Expression(范围表达式)
|
|
169
|
+
批量设备选择语法:
|
|
170
|
+
- `1-10` - 1到10号设备
|
|
171
|
+
- `1,3,5` - 1、3、5号设备
|
|
172
|
+
- `1-10,20-30` - 组合范围
|
|
173
|
+
- `0` - 所有设备
|
|
174
|
+
|
|
175
|
+
## 性能指标
|
|
176
|
+
|
|
177
|
+
### Latency(延迟)
|
|
178
|
+
消息传输时间:
|
|
179
|
+
- 网络延迟
|
|
180
|
+
- 处理延迟
|
|
181
|
+
- 往返时间(RTT)
|
|
182
|
+
- 通常 <100ms
|
|
183
|
+
|
|
184
|
+
### Throughput(吞吐量)
|
|
185
|
+
处理能力:
|
|
186
|
+
- 消息/秒(MPS)
|
|
187
|
+
- 并发连接数
|
|
188
|
+
- 带宽利用率
|
|
189
|
+
- 峰值处理能力
|
|
190
|
+
|
|
191
|
+
### Scalability(可扩展性)
|
|
192
|
+
系统扩展能力:
|
|
193
|
+
- 水平扩展(增加节点)
|
|
194
|
+
- 垂直扩展(增强单机)
|
|
195
|
+
- 负载均衡
|
|
196
|
+
- 分布式架构
|
|
197
|
+
|
|
198
|
+
## 安全概念
|
|
199
|
+
|
|
200
|
+
### Authentication(认证)
|
|
201
|
+
身份验证:
|
|
202
|
+
- Token 认证
|
|
203
|
+
- 证书认证
|
|
204
|
+
- API Key
|
|
205
|
+
- 会话管理
|
|
206
|
+
|
|
207
|
+
### Authorization(授权)
|
|
208
|
+
权限控制:
|
|
209
|
+
- 基于角色(RBAC)
|
|
210
|
+
- 基于资源
|
|
211
|
+
- 操作权限
|
|
212
|
+
- 访问控制列表(ACL)
|
|
213
|
+
|
|
214
|
+
### Encryption(加密)
|
|
215
|
+
数据保护:
|
|
216
|
+
- TLS/SSL 传输加密
|
|
217
|
+
- 消息签名
|
|
218
|
+
- 敏感数据加密
|
|
219
|
+
- 密钥管理
|
|
220
|
+
|
|
221
|
+
## 常见缩写
|
|
222
|
+
|
|
223
|
+
- **WS** - WebSocket
|
|
224
|
+
- **API** - Application Programming Interface
|
|
225
|
+
- **JSON** - JavaScript Object Notation
|
|
226
|
+
- **UTC** - Coordinated Universal Time
|
|
227
|
+
- **RTT** - Round Trip Time
|
|
228
|
+
- **ACK** - Acknowledgment
|
|
229
|
+
- **ID** - Identifier
|
|
230
|
+
- **URL** - Uniform Resource Locator
|
|
231
|
+
- **HTTP** - Hypertext Transfer Protocol
|
|
232
|
+
- **TCP** - Transmission Control Protocol
|