sdev 0.6.2__tar.gz → 0.6.4__tar.gz
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.
- sdev-0.6.4/PKG-INFO +450 -0
- sdev-0.6.4/README.md +415 -0
- {sdev-0.6.2 → sdev-0.6.4}/pyproject.toml +1 -1
- sdev-0.6.4/sdev/__init__.py +9 -0
- sdev-0.6.4/sdev/api/demoboard.py +126 -0
- sdev-0.6.4/sdev/cli/__init__.py +796 -0
- sdev-0.6.4/sdev/cli/__main__.py +14 -0
- sdev-0.6.4/sdev/modules/__init__.py +18 -0
- sdev-0.6.4/sdev/modules/remote_core.py +714 -0
- {sdev-0.6.2/sdev/base → sdev-0.6.4/sdev/modules}/serial_core.py +40 -7
- sdev-0.6.4/sdev/modules/serial_runner.py +350 -0
- sdev-0.6.4/sdev.egg-info/PKG-INFO +450 -0
- {sdev-0.6.2 → sdev-0.6.4}/sdev.egg-info/SOURCES.txt +6 -11
- {sdev-0.6.2 → sdev-0.6.4}/setup.py +1 -1
- sdev-0.6.2/PKG-INFO +0 -140
- sdev-0.6.2/README.md +0 -105
- sdev-0.6.2/sdev/__init__.py +0 -17
- sdev-0.6.2/sdev/base/__init__.py +0 -22
- sdev-0.6.2/sdev/cli/__init__.py +0 -4
- sdev-0.6.2/sdev/cli/cli_wrapper.py +0 -1258
- sdev-0.6.2/sdev/models/__init__.py +0 -12
- sdev-0.6.2/sdev/models/demoboard.py +0 -260
- sdev-0.6.2/sdev/remote/__init__.py +0 -18
- sdev-0.6.2/sdev/remote/board_list.py +0 -232
- sdev-0.6.2/sdev/remote/client.py +0 -267
- sdev-0.6.2/sdev/remote/discovery.py +0 -458
- sdev-0.6.2/sdev/remote/server.py +0 -333
- sdev-0.6.2/sdev/util.py +0 -21
- sdev-0.6.2/sdev.egg-info/PKG-INFO +0 -140
- {sdev-0.6.2 → sdev-0.6.4}/LICENSE +0 -0
- {sdev-0.6.2 → sdev-0.6.4}/MANIFEST.in +0 -0
- {sdev-0.6.2 → sdev-0.6.4}/sdev.egg-info/dependency_links.txt +0 -0
- {sdev-0.6.2 → sdev-0.6.4}/sdev.egg-info/entry_points.txt +0 -0
- {sdev-0.6.2 → sdev-0.6.4}/sdev.egg-info/requires.txt +0 -0
- {sdev-0.6.2 → sdev-0.6.4}/sdev.egg-info/top_level.txt +0 -0
- {sdev-0.6.2 → sdev-0.6.4}/setup.cfg +0 -0
sdev-0.6.4/PKG-INFO
ADDED
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: sdev
|
|
3
|
+
Version: 0.6.4
|
|
4
|
+
Summary: 串口控制器工具包
|
|
5
|
+
Home-page: https://github.com/klrc/sdev
|
|
6
|
+
Author: klrc
|
|
7
|
+
Author-email: klrc <144069824@qq.com>
|
|
8
|
+
License: MIT
|
|
9
|
+
Project-URL: Homepage, https://github.com/klrc/sdev
|
|
10
|
+
Project-URL: Repository, https://github.com/klrc/sdev
|
|
11
|
+
Project-URL: Bug Tracker, https://github.com/klrc/sdev/issues
|
|
12
|
+
Keywords: serial,controller,hardware,embedded
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.7
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
23
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
24
|
+
Classifier: Topic :: System :: Hardware
|
|
25
|
+
Requires-Python: >=3.7
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Requires-Dist: pyserial>=3.5
|
|
29
|
+
Requires-Dist: loguru>=0.6.0
|
|
30
|
+
Requires-Dist: zeroconf>=0.39.0
|
|
31
|
+
Dynamic: author
|
|
32
|
+
Dynamic: home-page
|
|
33
|
+
Dynamic: license-file
|
|
34
|
+
Dynamic: requires-python
|
|
35
|
+
|
|
36
|
+
# SDEV:串口设备统一入口
|
|
37
|
+
|
|
38
|
+
本文件是 SDEV 的 **设计规范与实现说明**,只描述目标行为与核心内部架构,不关心历史实现细节。
|
|
39
|
+
|
|
40
|
+
本文先描述 **命令行形式**,后续再补充 Python 接口。
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 命令行总览
|
|
45
|
+
|
|
46
|
+
安装后提供一个统一命令:`sdev`。
|
|
47
|
+
|
|
48
|
+
当前仅设计三类基础功能:
|
|
49
|
+
|
|
50
|
+
- **`sdev list`**:发现并列出可用串口设备
|
|
51
|
+
- **`sdev run`**:在指定(或默认)设备上执行命令
|
|
52
|
+
- **`sdev server`**:启动本机服务以共享本地串口
|
|
53
|
+
|
|
54
|
+
另外提供少量辅助配置命令:
|
|
55
|
+
|
|
56
|
+
- **`sdev set default ...`**:配置默认设备
|
|
57
|
+
- **`sdev show default`**:打印当前 default 配置
|
|
58
|
+
- **`sdev reset default`**:清空默认设备配置
|
|
59
|
+
- **`sdev reset all`**:清空全部缓存与状态
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## sdev list:设备发现与筛选
|
|
64
|
+
|
|
65
|
+
`list` 子命令用于从「本机出发」列出所有可访问的串口设备(本地 + 远程)。
|
|
66
|
+
|
|
67
|
+
基础用法:
|
|
68
|
+
|
|
69
|
+
- **`sdev list`**
|
|
70
|
+
- 不带任何参数。
|
|
71
|
+
- 列出所有从本机出发可用的串口设备(包含本地与远程)。
|
|
72
|
+
|
|
73
|
+
- **`sdev list local`**
|
|
74
|
+
- 仅列出所有 **本地** 的串口设备。
|
|
75
|
+
|
|
76
|
+
- **`sdev list remote`**
|
|
77
|
+
- 仅列出所有 **远程** 的串口设备。
|
|
78
|
+
|
|
79
|
+
筛选用法(按属性过滤):
|
|
80
|
+
|
|
81
|
+
- **`sdev list type=xc01`**
|
|
82
|
+
- 列出所有类型为 `xc01` 的设备。
|
|
83
|
+
|
|
84
|
+
- **`sdev list host=192.168.1.100`**
|
|
85
|
+
- 列出所有位于 `192.168.1.100` 这台主机上的串口设备。
|
|
86
|
+
|
|
87
|
+
- **组合筛选**
|
|
88
|
+
- 参数可以组合使用,例如:
|
|
89
|
+
- `sdev list type=xc01 host=192.168.1.100`
|
|
90
|
+
- 表示在 `192.168.1.100` 这台主机上,筛选出类型为 `xc01` 的所有设备。
|
|
91
|
+
|
|
92
|
+
- **`sdev list -f`(快速模式)**
|
|
93
|
+
- 用法示例:`sdev list -f`、`sdev list -f type=xc01` 等。
|
|
94
|
+
- 扫描时只要找到 **任意一个** 符合条件的设备就 **立即返回**,不等待其余扫描完成。
|
|
95
|
+
- 为保持稳定性,扫描仍在后台继续直到完成,但 **不产生任何输出**,也不阻塞当前程序退出。
|
|
96
|
+
- 一般与筛选条件配合使用,用于脚本中快速拿到一个可用设备。
|
|
97
|
+
|
|
98
|
+
### sdev list 的详细输出格式
|
|
99
|
+
|
|
100
|
+
**扫描过程(扫描完成后会移除,最终只保留表格):**
|
|
101
|
+
|
|
102
|
+
- 首行:`[main] scanning N local port(s) and discovering remote hosts...`
|
|
103
|
+
- 之后每个端口/主机对应一行,由独立线程输出,**无先后顺序**:
|
|
104
|
+
- 格式:`[<host>] check alive: <port> ...`,例如:
|
|
105
|
+
- `[localhost] check alive: /dev/ttyUSB0 ...`
|
|
106
|
+
- `[192.168.1.100] check alive: /dev/ttyUSB1 ...`
|
|
107
|
+
- 行尾为 **spinning 动画**,完成后变为 **✔**;若超时则显示 **timeout**。
|
|
108
|
+
- 设备因 **串口被 lock** 或无响应导致超时,均视为 **timeout**。
|
|
109
|
+
- 结束行:`[main] all scanning finished.`
|
|
110
|
+
|
|
111
|
+
**最终表格(仅保留可用设备):**
|
|
112
|
+
|
|
113
|
+
表头与列:
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
HOST PORT DEVICE ID DEVICE TYPE LAST UPDATE
|
|
117
|
+
---------------------------------------------------------------------------
|
|
118
|
+
localhost /dev/ttyUSB0 8ef212 unknown 2026-03-05 11:19:39
|
|
119
|
+
192.168.1.101 /dev/ttyUSB0 2f9c9e xc01 2026-03-05 11:19:40
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
- **HOST**:主机标识,本地为 `localhost`。
|
|
123
|
+
- **PORT**:串口路径(如 `/dev/ttyUSB0`)。
|
|
124
|
+
- **DEVICE ID**:基于 host + port 计算的本地 hash,供 `sdev run`、`sdev set default` 等使用。
|
|
125
|
+
- **DEVICE TYPE**:由板端 `cat /proc/device-tree/model 2>/dev/null; echo` 获取,为空则显示 `unknown`。
|
|
126
|
+
- **LAST UPDATE**:该条记录最后更新时间。
|
|
127
|
+
|
|
128
|
+
**缓存更新:**
|
|
129
|
+
|
|
130
|
+
- 每次 `sdev list` 执行完毕后,会 **更新本地 list 缓存文件**。
|
|
131
|
+
- 后续任何需要指定 `<device id>` 的操作(如 `sdev run`、`sdev set default`),都通过该缓存文件解析出对应的 host 与 port。
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## sdev run:在设备上执行命令
|
|
136
|
+
|
|
137
|
+
`run` 子命令用于对某个串口设备发送命令,并根据提示符或超时规则判断结束。
|
|
138
|
+
|
|
139
|
+
基础用法:
|
|
140
|
+
|
|
141
|
+
- **`sdev run <device id> <command>`**
|
|
142
|
+
- 向指定设备发送 `<command>`。
|
|
143
|
+
- 执行后会等待:
|
|
144
|
+
- 下一个 **prompt 标记**,或
|
|
145
|
+
- 内部的 **响应超时**(一段时间没有任何输出)。
|
|
146
|
+
|
|
147
|
+
高级参数:
|
|
148
|
+
|
|
149
|
+
- **`-p <prompt flag>`**
|
|
150
|
+
- 用法:`sdev run <device id> -p <prompt flag> <command>`
|
|
151
|
+
- 手动指定结束标记 `<prompt flag>`,即看到该标记后认为命令完成。
|
|
152
|
+
|
|
153
|
+
- **`-t <timeout>`**
|
|
154
|
+
- 指定本次命令的 **整体超时时间**。
|
|
155
|
+
- 从发送命令开始计时,即使还未触发内部响应超时,整体超时到了也会结束。
|
|
156
|
+
- 一旦整体超时触发,客户端不再等待 prompt,直接断开。
|
|
157
|
+
|
|
158
|
+
- **`-w` / `--wait-forever`**
|
|
159
|
+
- 取消内部的「响应超时」逻辑。
|
|
160
|
+
- 表示在没有整体 timeout 的前提下,可以一直等待输出,直到用户手动中断或连接断开。
|
|
161
|
+
|
|
162
|
+
默认设备与 `device id`:
|
|
163
|
+
|
|
164
|
+
- `sdev run` 正常情况下需要显式指定 `<device id>`。
|
|
165
|
+
- 配置默认设备后,可以省略 `<device id>`(见后文 `sdev set default`)。
|
|
166
|
+
|
|
167
|
+
### sdev run 的详细输出格式
|
|
168
|
+
|
|
169
|
+
**示例(已配置默认设备时):**
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
$ sdev run 'cat /proc/meminfo'
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
- **命令引号**:建议用 **单引号** 包裹命令,避免 shell 对 `$`、`!` 等做展开;若命令内需要变量展开则用双引号。
|
|
176
|
+
|
|
177
|
+
**输出结构:**
|
|
178
|
+
|
|
179
|
+
1. **回显用户输入(黄色)**
|
|
180
|
+
- 一行以 `>` 开头,直接打印用户输入的命令,例如:`> cat /proc/meminfo`
|
|
181
|
+
|
|
182
|
+
2. **串口输出(灰色 + 绿色)**
|
|
183
|
+
- 真实串口输出内容以 **灰色** 显示。
|
|
184
|
+
- 匹配到的 **last prompt**(用于判断命令结束的那一行提示符)以 **绿色** 显示。
|
|
185
|
+
|
|
186
|
+
3. **超时结束标记(红色)**
|
|
187
|
+
- 若因超时结束(未等到 prompt),会自动换行并打印红色 **`<sdev timeout>`** 作为结束标记。
|
|
188
|
+
|
|
189
|
+
### sdev run 的上层运行原理
|
|
190
|
+
|
|
191
|
+
**执行流程概要:**
|
|
192
|
+
|
|
193
|
+
1. **入口**:sdev CLI 调用 `SerialRunner.run()`,传入命令、prompt、超时等参数。
|
|
194
|
+
2. **清空并写入**:先清空 **SerialCore** 的缓存,再向 core 内写入本次要发送的命令。
|
|
195
|
+
3. **scan 输出**:写入后立即开始 **scan**,从 core 持续读取串口输出并按要求输出到终端。
|
|
196
|
+
4. **scan 的两个顺序目标**:
|
|
197
|
+
- 先匹配 **输入命令的回显**(如 `> cat /proc/meminfo` 所对应的回显);
|
|
198
|
+
- 再匹配 **结束符**(prompt 标记)。
|
|
199
|
+
- 对「回显」和「结束符」的等待都受 **响应超时** 约束;使用 **`-w`** 可取消响应超时,改为永久等待(直到整体超时或用户中断)。
|
|
200
|
+
5. **整体超时**:存在于 run 操作的 **最外层**,从函数开始执行时计时;在 **内部每次迭代** 中检查计时器,若已整体超时则立即退出,不再等待 prompt。
|
|
201
|
+
|
|
202
|
+
**角色与接口:**
|
|
203
|
+
|
|
204
|
+
- **SerialCore**:底层串口读写与缓冲;可被清空、写入命令、被上层读取 scan 数据。
|
|
205
|
+
- **SerialRunner**:接口类,封装一次 run 的流程,与 SerialCore 和 sdev CLI 交互。提供方法:
|
|
206
|
+
- `run()`:执行单次命令(清空 core → 写命令 → scan 至结束符或超时);
|
|
207
|
+
- `check_alive()`:存活检测;
|
|
208
|
+
- `check_model_type()`:探测板型(如 xc01),供 list 等使用;
|
|
209
|
+
- `send_interrupt()`:发送中断。
|
|
210
|
+
- **sdev CLI**:解析命令行参数,解析 device id → host/port,构造 SerialRunner(或子类实例),调用 `run()` 并处理输出与退出码。
|
|
211
|
+
|
|
212
|
+
**设备类型与子类:**
|
|
213
|
+
|
|
214
|
+
- 根据 `check_model_type()` 的结果,可映射到不同的 **设备子类**;这些子类均 **继承 SerialRunner**,用于不同板型的差异化行为(后续与现有代码结构的差异另述)。
|
|
215
|
+
|
|
216
|
+
**三者顺序交互(Mermaid):**
|
|
217
|
+
|
|
218
|
+
```mermaid
|
|
219
|
+
sequenceDiagram
|
|
220
|
+
participant CLI as sdev CLI
|
|
221
|
+
participant Runner as SerialRunner
|
|
222
|
+
participant Core as SerialCore
|
|
223
|
+
|
|
224
|
+
CLI->>Runner: run(cmd, prompt, timeouts)
|
|
225
|
+
Runner->>Core: 清空缓存
|
|
226
|
+
Runner->>Core: 写入命令
|
|
227
|
+
Runner->>Core: 开始读取 (scan)
|
|
228
|
+
|
|
229
|
+
loop 每次迭代
|
|
230
|
+
Core-->>Runner: 输出数据
|
|
231
|
+
Runner->>Runner: 检查回显/结束符、响应超时、整体超时
|
|
232
|
+
Runner->>CLI: 输出到终端(或结束)
|
|
233
|
+
alt 命中结束符或整体超时
|
|
234
|
+
Runner->>CLI: 结束 run
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## sdev server:本地串口共享服务
|
|
242
|
+
|
|
243
|
+
`server` 子命令用于在本机启动一个服务进程,使其他主机可以通过网络访问本机串口。
|
|
244
|
+
|
|
245
|
+
基础用法:
|
|
246
|
+
|
|
247
|
+
- **`sdev server start`**
|
|
248
|
+
- 启动本地 sdev 服务,用于共享本机串口设备。
|
|
249
|
+
|
|
250
|
+
- **`sdev server stop`**
|
|
251
|
+
- 停止当前运行的 sdev 服务。
|
|
252
|
+
|
|
253
|
+
- **`sdev server restart`**
|
|
254
|
+
- 重启 sdev 服务(等价于 `stop` 后 `start`)。
|
|
255
|
+
|
|
256
|
+
- **`sdev server status`**
|
|
257
|
+
- 查询当前 sdev 服务的运行状态。
|
|
258
|
+
|
|
259
|
+
具体网络协议、端口和认证策略的实现细节不在本文展开。
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 默认设备与缓存管理
|
|
264
|
+
|
|
265
|
+
### 设置与清空默认设备
|
|
266
|
+
|
|
267
|
+
默认设备用于在日常使用中省去频繁输入 `<device id>` 的步骤。
|
|
268
|
+
|
|
269
|
+
- **`sdev set default <device id>`**
|
|
270
|
+
- 将某个 `<device id>` 配置为默认设备。
|
|
271
|
+
- `<device id>` 来源于 `sdev list` 的缓存记录。
|
|
272
|
+
|
|
273
|
+
- **`sdev set <host> <serial device>`**
|
|
274
|
+
- 另一种等价写法。
|
|
275
|
+
- 内部会把 `<host> + <serial device>` 组合记录下来。
|
|
276
|
+
- `<device id>` 本质上只是一个基于 `host + device` 计算得到的 **本地 hash 标识**,方便人类记忆与脚本使用。
|
|
277
|
+
|
|
278
|
+
- **`sdev reset default`**
|
|
279
|
+
- 清空当前所有「默认设备」配置。
|
|
280
|
+
|
|
281
|
+
- **`sdev show default`**
|
|
282
|
+
- 打印当前的 default 配置(即当前默认设备对应的 host、port 等信息);未配置时给出相应提示。
|
|
283
|
+
|
|
284
|
+
行为约定:
|
|
285
|
+
|
|
286
|
+
- 配置默认设备之后:
|
|
287
|
+
- 可以使用 **`sdev run <command>`**(不带 `<device id>`),自动落到默认设备上。
|
|
288
|
+
- 未配置默认设备时:
|
|
289
|
+
- **必须**显式指定 `<device id>`,否则命令视为非法或直接报错。
|
|
290
|
+
|
|
291
|
+
### 全量重置:清空所有缓存
|
|
292
|
+
|
|
293
|
+
- **`sdev reset all`**
|
|
294
|
+
- 关闭当前已开启的 sdev server(如果存在)。
|
|
295
|
+
- 清空所有与 sdev 相关的 **缓存目录与配置记录**:
|
|
296
|
+
- 包括设备列表缓存
|
|
297
|
+
- 默认设备配置
|
|
298
|
+
- 其他与 sdev 运行状态相关的本地缓存
|
|
299
|
+
|
|
300
|
+
`reset all` 的目标是把环境恢复到「从未使用过 sdev」的干净状态,方便重新部署或排查问题。
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## 内部架构与代码布局
|
|
305
|
+
|
|
306
|
+
本节描述当前 SDEV 的内部分层架构与代码布局;旧实现保存在 `sdev.deprecated` 下,仅供查阅,不再直接引用。
|
|
307
|
+
|
|
308
|
+
### 分层结构概览
|
|
309
|
+
|
|
310
|
+
- **模块层(Modules)**:`sdev/modules/`
|
|
311
|
+
- 提供可复用的基础组件,例如:
|
|
312
|
+
- `serial_core.py`:底层串口读写与缓冲(`SerialCore`)。
|
|
313
|
+
- `serial_runner.py`:运行控制与协议抽象(`SerialRunner` 及其子类)。
|
|
314
|
+
- **命令行层(CLI)**:`sdev/cli/`
|
|
315
|
+
- 提供 `sdev list` / `sdev run` / `sdev server` 等命令行功能。
|
|
316
|
+
- 通过 `SerialRunner` 间接使用 `SerialCore`,不直接操作底层串口。
|
|
317
|
+
- **Python 接口层(API)**:`sdev/api/`
|
|
318
|
+
- 提供 Python 脚本可直接导入的接口(如 `Demoboard`),与 CLI 并列存在,都是基于 `SerialRunner` 的上层产物。
|
|
319
|
+
|
|
320
|
+
### SerialCore:串口核心组件
|
|
321
|
+
|
|
322
|
+
- 位置:`sdev/modules/serial_core.py`
|
|
323
|
+
- 职责:
|
|
324
|
+
- 封装底层串口打开/关闭、读写与缓冲逻辑。
|
|
325
|
+
- 提供「清空缓存」「写入一条命令」「按流式接口 scan 输出」等基础能力。
|
|
326
|
+
- 说明:
|
|
327
|
+
- **所有上层代码(CLI / Python API)都通过 SerialRunner 间接访问 SerialCore**。
|
|
328
|
+
|
|
329
|
+
### SerialRunner:统一的串口运行抽象
|
|
330
|
+
|
|
331
|
+
- 位置:`sdev/modules/serial_runner.py`
|
|
332
|
+
- 形式:接口类(或抽象基类),构造时接收一个 `SerialCore` 实例。
|
|
333
|
+
- 核心方法(接口约定):
|
|
334
|
+
- `run(...)`:执行一次完整命令(清空 core → 写命令 → scan 至结束符或超时),供 `sdev run` 与 Python API 调用。
|
|
335
|
+
- `check_alive(...)`:存活检测,用于 `sdev list` 等场景。
|
|
336
|
+
- `check_model_type(...)`:探测板型(如 `xc01`),供设备类型判断与路由使用。
|
|
337
|
+
- `send_interrupt(...)`:向串口发送中断。
|
|
338
|
+
- 设备适配:
|
|
339
|
+
- 不同类型的设备(由 `check_model_type()` 结果判定)映射到不同的 `SerialRunner` 子类,这些子类负责处理各自板型的特殊行为。
|
|
340
|
+
|
|
341
|
+
### Python 接口:Demoboard 及其所在目录
|
|
342
|
+
|
|
343
|
+
- 目录命名:选择 **`sdev/api/`** 表达「对外的 Python API」,与命令行 `sdev/cli/` 区分。
|
|
344
|
+
- 主文件:`sdev/api/demoboard.py`
|
|
345
|
+
- 主类:`Demoboard(SerialRunner)`(或组合一个内部的 SerialRunner 实例)
|
|
346
|
+
- 职责:
|
|
347
|
+
- 向外暴露一个简单易用的 Python 接口,用于在脚本中执行命令、检查设备状态等。
|
|
348
|
+
- 内部通过 `SerialRunner` 与 `SerialCore` 协作,不直接操作串口。
|
|
349
|
+
- 与 CLI 的关系:
|
|
350
|
+
- `Demoboard` 与 sdev CLI 属于 **并列** 的上层入口:
|
|
351
|
+
- CLI 面向命令行用户;
|
|
352
|
+
- `Demoboard` 面向 Python 调用者。
|
|
353
|
+
- 二者共享同一套底层模块(SerialCore / SerialRunner),以避免重复实现。
|
|
354
|
+
|
|
355
|
+
### 远程共享服务整体设计(server + client)
|
|
356
|
+
|
|
357
|
+
目标:在不改动上层调用方式的前提下,使「本地串口」可以通过网络被其它机器复用。对 `SerialRunner` / CLI / Python API 来说,本地 core 与远程 core 使用 **同一套接口**。
|
|
358
|
+
|
|
359
|
+
#### 文件与职责
|
|
360
|
+
|
|
361
|
+
- **位置**:`sdev/modules/remote_core.py`。
|
|
362
|
+
- **内容集中在一个文件中维护**:
|
|
363
|
+
- 服务端逻辑(server):监听端口、接收请求、转发到本地 `SerialCore` 执行。
|
|
364
|
+
- 客户端逻辑(client):向远端 server 发起请求,并在本机暴露一个「看起来像 SerialCore 的对象」。
|
|
365
|
+
- 工具函数:`transform_core_as_client(...)`,构造远程版 core。
|
|
366
|
+
|
|
367
|
+
#### transform_core_as_client(...) 的角色
|
|
368
|
+
|
|
369
|
+
- 函数签名(当前实现):
|
|
370
|
+
- `transform_core_as_client(host, service_port, serial_port, baudrate=115200) -> SerialCoreLike`
|
|
371
|
+
- 作用:
|
|
372
|
+
- 以远端 `host:service_port` 和远端串口 `serial_port` 为参数,返回一个 **实现了与 `SerialCore` 相同接口** 的「客户端 core」:
|
|
373
|
+
- 上层仍然把它当作 SerialCore 使用(清空缓存、写入命令、scan 输出等)。
|
|
374
|
+
- 内部实际通过网络协议与远端 server 交互,而非直接访问本地串口。
|
|
375
|
+
- 设计要点:
|
|
376
|
+
- **不改变上层代码结构**:`SerialRunner` 只依赖 `SerialCore` 接口,无需区分本地/远程。
|
|
377
|
+
|
|
378
|
+
#### server 与 client 的协作方式(概念)
|
|
379
|
+
|
|
380
|
+
- **server 端**(运行在“拥有真实串口”的机器上):
|
|
381
|
+
- 使用本地的 `SerialCore` 管理实际串口。
|
|
382
|
+
- 监听一个 TCP 端口(或其他传输),接受来自 client 的请求:
|
|
383
|
+
- 例如「写命令」「读取输出」「检查 alive」「探测 model type」等。
|
|
384
|
+
- 面向网络暴露的是「类似 SerialCore 的 RPC 接口」,不关心更上层的 `SerialRunner` 细节。
|
|
385
|
+
|
|
386
|
+
- **client 端**(运行在“远程调用者”的机器上):
|
|
387
|
+
- 调用 `transform_core_as_client(...)`,获得一个网络版 core。
|
|
388
|
+
- 上层 `SerialRunner` / CLI / Python API 完全按使用本地 core 的方式调用它。
|
|
389
|
+
- 所有实际 I/O 通过网络转发到 server,再由 server 调用真实的本地 `SerialCore`。
|
|
390
|
+
|
|
391
|
+
#### 与现有命令的关系
|
|
392
|
+
|
|
393
|
+
- `sdev server start/stop/restart/status`:
|
|
394
|
+
- CLI 层通过调用 `remote_core` 中的 server 入口函数来管理服务生命周期。
|
|
395
|
+
- `sdev list` / `sdev run`:
|
|
396
|
+
- 从调用方视角,只关心「设备的 host / port / device id」。
|
|
397
|
+
- 当目标是远程设备时,内部通过 `transform_core_as_client(...)` 构造对应的网络 core,再交给 `SerialRunner` 运行。
|
|
398
|
+
|
|
399
|
+
#### 主机发现与远程协议概要
|
|
400
|
+
|
|
401
|
+
- **主机发现(discover)**:
|
|
402
|
+
- 优先使用环境变量 `SDEV_REMOTE_HOSTS="host[:port],..."` 显式指定远程主机列表。
|
|
403
|
+
- 若未指定,则通过 UDP 广播向 `DISCOVERY_UDP_PORT=7001` 发送固定报文 `SDEV_DISCOVERY`,server 回复 `{"magic":"sdev-remote-v1","port":7000}`。
|
|
404
|
+
- 同时通过 zeroconf(mDNS) 浏览 `_sdev._tcp.local.` 服务(可用 `SDEV_DISABLE_ZEROCONF=1` 关闭),综合两者结果,去重并排除本机 IP,得到最终远程 host 列表。
|
|
405
|
+
- **远程协议概要**(对上层透明):
|
|
406
|
+
- 连接建立时,client 发送一行 JSON:`{"port":"<serial_port>","baudrate":115200}`,server 成功后回复 `{"ok":true}`。
|
|
407
|
+
- 会话期间,client 发送 `{"cmd":"send"|"scan"|"clear"|"disconnect", ...}`,server 将其映射为对本地 `SerialCore` 的调用,并以 `{"line":"..."}` / `{"scan_done":true}` 等形式回传结果。
|
|
408
|
+
|
|
409
|
+
**Mermaid:远程 run 流程(概览)**
|
|
410
|
+
|
|
411
|
+
```mermaid
|
|
412
|
+
sequenceDiagram
|
|
413
|
+
participant CLI as sdev CLI (远端)
|
|
414
|
+
participant Runner as SerialRunner
|
|
415
|
+
participant RCore as RemoteSerialCore
|
|
416
|
+
participant Server as RemoteServer
|
|
417
|
+
participant Core as SerialCore(本地)
|
|
418
|
+
|
|
419
|
+
CLI->>Runner: run(cmd, prompt, timeouts)
|
|
420
|
+
Runner->>RCore: connect()
|
|
421
|
+
RCore->>Server: TCP connect host:port
|
|
422
|
+
RCore->>Server: {"port": "/dev/ttyUSB0","baudrate":115200}
|
|
423
|
+
Server->>Core: connect()
|
|
424
|
+
Server-->>RCore: {"ok":true}
|
|
425
|
+
|
|
426
|
+
Runner->>RCore: send(cmd)
|
|
427
|
+
RCore->>Server: {"cmd":"send","data":cmd}
|
|
428
|
+
Server->>Core: send(cmd)
|
|
429
|
+
|
|
430
|
+
Runner->>RCore: scan(end_flag=prompt)
|
|
431
|
+
RCore->>Server: {"cmd":"scan", ...}
|
|
432
|
+
loop 串口输出
|
|
433
|
+
Core-->>Server: 行输出
|
|
434
|
+
Server-->>RCore: {"line": "..."}
|
|
435
|
+
RCore-->>Runner: 行输出
|
|
436
|
+
Runner->>CLI: 按颜色规则输出到终端
|
|
437
|
+
end
|
|
438
|
+
Server-->>RCore: {"scan_done":true}
|
|
439
|
+
RCore-->>Runner: 结束 scan
|
|
440
|
+
Runner-->>CLI: 结束 run
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### 旧代码
|
|
444
|
+
|
|
445
|
+
- 现有旧实现已移动到 `sdev.deprecated/`,仅用于查阅历史行为与细节。
|
|
446
|
+
- 新实现不再从 `sdev.deprecated` 中导入或复用代码。
|
|
447
|
+
|
|
448
|
+
---
|
|
449
|
+
|
|
450
|
+
<!-- 原开发顺序草案已废弃,这里留空以便后续需要时单独撰写开发者指南。 -->
|