SenternalTech/tsp143-bridge

GitHub: SenternalTech/tsp143-bridge

用 Raspberry Pi 将 Star TSP143IIIU USB 收据打印机桥接为 Wi-Fi 网络打印机,兼容 Shopify POS 的 StarIO 协议,并附带 Star 专有协议的完整逆向工程文档。

Stars: 0 | Forks: 0

# TSP143IIIU Wi-Fi 打印桥接 将约 15 美元的 Raspberry Pi Zero 2 W 变成 Star Micronics **TSP143IIIU**(仅支持 USB)收据打印机的 Wi-Fi 打印服务器,使 Shopify POS 应用 可以无线打印——包括钱箱弹出和真实的打印机 状态——无需 CUPS,无需 Star 驱动程序,也无需付费软件。 该桥接程序能足够逼真地模拟 Star LAN 打印机 (TSP143IIILAN),使得 Shopify 的 StarIO SDK 可以发现它、向其打印、弹出钱箱, 并在没有错误或重复打印的情况下读取实时打印机状态。 本仓库还提供了**我们所知的最完整的关于 Star Discovery Protocol、StarPRNT ASB 帧以及 StarPRNT TCP/9101 状态轮询线格式的公开逆向工程资料**,这些均是从真实的 TSP143IIILAN 中逐字节 捕获的。请参阅下面的[协议研究](#protocol-research)。 ## 目录 - [工作原理](#how-it-works) — 问题、解决方案、架构、数据流 - [Star ASB 协议](#star-asb-protocol) — ASB 是什么,USB 与 LAN 帧 差异,ETB 计数器,端口 9100 和 9101 - [价格对比](#price-comparison) - [系统要求](#requirements) - [安装说明](#installation) - [Shopify POS 设置](#shopify-pos-setup) - [文件参考](#file-reference) - [诊断工具](#diagnostics) - [运行操作](#operation) - [故障排除](#troubleshooting) - [适配其他打印机](#adapting-to-other-printers) - [协议研究](#protocol-research) — 来自真实 Star LAN 打印机的 pcaps + 分析文档 - [逆向工程搜索索引](#search-index) — 本仓库 有意显露的关键词 - [开源许可](#license) ## 工作原理 ### 问题所在 TSP143IIIU 仅支持 USB。iPad 无法直接连接到它(Star 打印机支架仅提供电源,不传输数据)。打印机需要以某种方式连接到 网络,而 Shopify POS 明确要求使用 StarIO 协议—— AirPrint、IPP 和通用网络打印均无效。 ### 解决方案 此桥接程序位于 iPad 和 USB 打印机之间,在 网络端使用 TCP 运行 StarIO 协议,在打印机端使用原始 USB。它将自身呈现 为原生 Star LAN 打印机,因此 Shopify POS 会自动发现并使用它。 ### 架构 该桥接程序暴露两个 TCP 端口和一个 UDP 发现响应器,与 真实的 Star LAN 打印机完全一样: | 端口 | 协议 | 用途 | |------|----------|---------| | **9100** | StarIO 打印 (TCP) | 双向数据通道。Shopify 发送 StarPRNT 光栅打印数据;打印机返回报告盖子、纸张、错误和作业完成状态的 ASB (Automatic Status Back) 帧。 | | **9101** | StarIO 状态 (TCP) | 短连接状态轮询通道。Shopify 连接,发送一个 51 字节的查询(`0x32` + 50 个 NUL),接收两个 11 字节的 ASB 帧(共 22 字节),然后断开连接。在打印期间每秒会轮询多次。 | | **22222** | Star Discovery Protocol (UDP) | 响应 28 字节结构化的 `STR_BCAST` 查询,以便 Shopify 自动发现打印机。回复是一个固定布局的 302 字节 StarPRNT 身份数据包(型号、IP、MAC、子网掩码、网关、固件版本)。 | 单进程 `select()` 事件循环通过非阻塞 I/O 复用所有 TCP 连接和 USB 设备(`/dev/usb/lp0`)。一个独立的轻量级 进程(`star_discovery.py`)处理 UDP 发现。 ### 数据流 ``` Shopify POS (iPad) Bridge USB Printer ────────────────── ────── ─────────── 1. UDP broadcast 28-byte STR_BCAST ───> star_discovery.py <── 302-byte discovery response ───── (model, IP, port, MAC, mask, gw) 2. TCP connect to 9101 ──────────────────> Send 51-byte status query ───────────> <── 2x 11-byte ASB frames (22 bytes)── (cached from last USB read) <── TCP FIN ────────────────────────── 3. TCP connect to 9100 ──────────────────> Send ESC RS E 0 (clear ETB counter) ─> forward ──────────────────> /dev/usb/lp0 Send ETB marker ─────────────────────> forward ──────────────────> <── ASB (9 bytes) ── <── ASB (11 bytes, LAN format) ─────── transform & forward 4. Send raster print data (4-50 KB) ───> forward ──────────────────> (Shopify polls 9101 every ~220ms (ASB cached, served on 9101) to watch ETB counter change) 5. Printer finishes, sends final ASB ──────────── <── ASB ────────── <── ASB (job complete) ──────────────── forward TCP FIN (clean disconnect = success) ``` ## Star ASB 协议 ### 什么是 ASB? ASB (Automatic Status Back) 是 Star 的双向状态协议。打印机发送报告其内部状态的固定长度状态帧: | 字节 | 内容 | |------|----------| | 0 | 头部 — 在位 1-3 和 5-6 中编码帧长度。位 0 始终为 1(帧标记)。 | | 1 | 版本 — 在位 1-3 和 5-6 中的协议版本。**在 LAN 打印机上,位 7 被设置为 (`0x80`)**(即 `0x86`,而 USB 则为 `0x06`)。 | | 2 | 打印机状态 1 — 已执行 ETB (位 1),盖子打开 (位 5),脱机 (位 3)。 | | 3 | 打印机状态 2 — 机械错误 (位 2),切刀错误 (位 3),打印头过热 (位 6)。 | | 4 | 打印机状态 3 — 打印头抬起 (位 1),卡纸 (位 2),命令错误 (位 5)。 | | 5 | 传感器信息 — 纸张即将用完 (位 1-2),缺纸 (位 3)。 | | 6 | 传感器信息 2 — 出纸传感器 (位 1),票据检测器 (位 2-3)。 | | 7 | ETB 计数器 — 分布在位 1、2、3、5、6 的 5 位计数器(非连续)。 | | 8 | 保留(零)。 | | 9-10 | LAN 打印机上的附加字节(零填充)。 | 有关已针对真实硬件验证的字节级解码版本,请参见 [`research/notes-asb-states.md`](research/notes-asb-states.md)。 ### USB 与 LAN 帧差异 USB 打印机 (TSP143IIIU) 发送字节 1 为 `0x06` 的 **9 字节**帧。 LAN 打印机 (TSP100IIILAN / TSP143IIILAN) 发送字节 1 为 `0x86` 的 **11 字节**帧。桥接程序通过以下方式将 USB 帧转换为 LAN 格式: 1. 设置字节 1 的位 7(LAN 接口标志) 2. 用零填充至 11 字节 这是必要的,因为 StarIO 客户端会解析版本字节以确定 打印机类型和预期的帧大小。 ### ETB 计数器 — 避免重复打印的关键 ETB(End-of-Transmission-Block,`0x17`)计数器是 ASB 帧中最关键的 字段。其工作原理如下: 1. Shopify 发送 `ESC RS E 0` 以**将计数器重置为零** 2. Shopify 发送包含**ETB 标记**在块边界的打印数据 3. 打印机每次处理 ETB 时递增其内部计数器 4. Shopify **轮询端口 9101** 并从 ASB 中读取计数器 5. 当计数器停止变化时,Shopify 知道作业已完成 6. 打印机物理上完成(切纸)后,它会发送一个最终的 主动 ASB,计数器再次递增 该计数器宽 5 位(范围 0–31),并且在达到 31 后**环绕至 0**,没有单独的 环绕标志。这 5 位以非连续位置分散在字节 7 中—— 有关精确的位位置映射,请参见 [`research/notes-asb-states.md`](research/notes-asb-states.md)(该映射在 [`research/etb-sweep/`](research/etb-sweep/) 中对 32 个连续的 ETB 进行了逐字节验证)。 **关键设计教训:** 该桥接程序的早期版本在数据流中看到 ETB 标记时会立即生成 “合成的”ASB 响应, 而无需等待真实的打印机。这造成了两个独立的 计数器——桥接程序的软件计数器(在 9100 和 9101 上提供服务)和 真实打印机的硬件计数器(Shopify 永远看不到)。这两个计数器 不可避免地会失去同步,导致 Shopify 认为每个作业都失败了并 重试——从而导致 3 倍的重复打印。 **正确的方法:** 将所有数据未修改地转发到 USB 打印机。 让打印机处理 ETB 并维护自己的计数器。将 打印机真实的 ASB 帧转发回客户端。打印机是状态的 唯一真实来源。这更简单且 100% 正确。 ### 端口 9101 状态轮询 Shopify 的 StarIO SDK 使用端口 9101 作为快速轮询状态通道,并采用 特定的协议: 1. TCP 连接 2. 发送 51 字节:`0x32` 后跟 50 个零字节 3. 接收 22 字节:两个连续的 11 字节 ASB 帧 4. 服务器关闭连接 (FIN) 在活跃打印期间,此循环每秒重复多次。在 打印作业之间,Shopify 在决定发送数据之前会进行 2-3 次探测并断开连接—— 这是在真实 LAN 打印机和此桥接程序上观察到的正常行为。 此 **51 字节查询格式**和 **22 字节双帧响应结构**已逐字节记录在 [`research/notes-9101-lifecycle.md`](research/notes-9101-lifecycle.md) 中。 真实 Shopify 捕获的 51 字节查询已提交至 [`research/shopify-replay/sample-9101-query.bin`](research/shopify-replay/sample-9101-query.bin) 用于基于固件的测试。 桥接程序在 9101 上提供来自 USB 打印机的最近缓存的 ASB。 由于缓存会在真实打印机发送状态时更新,因此 9101 的 响应始终反映真实的 ETB 计数器和打印机状态。 真实的打印机还有一个确定性的 **5 秒空闲超时**:如果 客户端打开 9101 但不发送任何内容,打印机将在正好 5 秒后对连接执行 FIN。桥接程序的“accept+FIN”策略(提交 `756714b`)旨在匹配此行为;请参见 [`research/9101-lifecycle/`](research/9101-lifecycle/)。 ### 端口 9100 打印通道 来自客户端的所有数据在经过最少量的过滤后传递到 USB: - **ESC RS a 1**(启用 ASB)和 **ESC RS a 0**(禁用 ASB)被剥离, 因为桥接程序在启动时管理 USB 端的 ASB 并保持其始终开启。 - **其他所有内容**——包括 ETB 标记、ESC RS E 0(清除计数器)、 ESC @(重置)、光栅数据、钱箱命令——均未修改地传递 到 USB 打印机。 来自 USB 打印机的 ASB 帧被转换为 LAN 格式并转发 回 TCP 客户端。 ## 价格对比 | 型号 | 全新 | 二手 / 翻新 | |---|---|---| | TSP143IIIU (USB) | $280 - $355 | ~$180 | | TSP143IIILAN (以太网) | $324 - $454 | $145 - $224 | | TSP143IIIW (Wi-Fi) | ~$389 | -- | | TSP143IIIBi (蓝牙) | $375 - $519 | ~$290 | | **Raspberry Pi Zero 2 W** | **$15** | -- | 如果您已经拥有 TSP143IIIU,增加一个 15 美元的 Pi 大约比 购买一台有网络功能的 Star 打印机**便宜 20 倍**。 *(价格取样于 2026 年 4 月,来自 POSSupply、Barcode Factory、eBay。)* ## 系统要求 - Raspberry Pi Zero 2 W(或任何带有 Wi-Fi 的 Pi),与 iPad 在同一网络中 - Star Micronics TSP143IIIU 通过 USB 连接,暴露为 `/dev/usb/lp0` - Python 3.9+(Raspberry Pi OS Lite 自带) - 不需要 CUPS,不需要 Star CUPS 驱动程序,除了 stdlib 之外无需任何 Python 依赖 ## 安装说明 1. 刷入 Raspberry Pi OS Lite,配置 Wi-Fi,通过 SSH 登录。 2. 将 TSP143IIIU 插入 Pi 的 USB 端口并开机。 3. 克隆并安装: ``` git clone tsp143-bridge cd tsp143-bridge sudo ./install.sh ``` 安装程序将: - 如果缺少 Python 3 则进行安装 - 创建一个拥有 `/dev/usb/lp0` 访问权限的 `tsp-bridge` 服务用户 - 将运行时文件复制到 `/opt/tsp143-bridge/` - 安装并启用 `tsp143-bridge` systemd 服务 - 打印出 Pi 的 IP 地址以供参考 ## Shopify POS 设置 1. 在 iPad 上, **Shopify POS > 设置 > 硬件 > 打印机**。 2. 打印机应自动显示为 Star TSP143III。 3. 对于钱箱:**设置 > 硬件 > 钱箱** > 选择该打印机。 ## 文件参考 | 文件 | 用途 | |------|---------| | `print_server_bidir.py` | 主桥接程序 — 从 TCP 9100/9101 到 USB 的双向中继,带有 ASB 转发。注释详尽,方便任何人将其适配到其他 Star 打印机。 | | `star_discovery.py` | UDP 22222 发现响应器 — 使桥接程序在网络中显示为 Star LAN 打印机。发送真实的 302 字节 StarPRNT 身份回复。通过 `SIOCGIFNETMASK` ioctl + `/proc/net/route` 读取实时的网络掩码和网关。 | | `stario_proto.py` | ASB 帧解析器和状态解码器 — 处理 9 字节 USB 和 11 字节 LAN 帧格式;解码 5 位非连续的 ETB 计数器。在桥接程序和诊断工具之间共享。 | | `stario_client.py` | 独立的 StarIO 诊断客户端 — 连接到桥接程序或真实的 Star 打印机以检查 ASB 帧、发送测试打印并调试协议问题。 | | `run.sh` | 启动脚本 — 启动桥接程序和发现响应器,如果其中一个退出,则同时终止两者。 | | `install.sh` | 安装程序 — 设置 systemd 服务、用户、权限。 | | `tsp143-bridge.service` | systemd 单元文件。 | | `asb.pdf` | Star 官方的 ASB 规范手册(参考)。 | | `research/` | 来自真实 Star LAN 打印机的数据包捕获和协议说明。请参见[协议研究](#protocol-research)。 | ## 诊断工具 `stario_client.py` 使用与 Shopify 相同的 StarIO 协议。将其指向 桥接程序或真实的 Star LAN 打印机: ``` # 发送一个测试打印任务并观察解码的 ASB 响应: python3 stario_client.py --probe # 被动观察 ASB 30秒(打开/关闭盖子、拉纸等): python3 stario_client.py --watch 30 ``` 有关更复杂的探测(完整 pcap 捕获、场景演练、 Shopify 收据重播),请参见 [`research/probe.py`](research/probe.py) 和 [`research/capture.sh`](research/capture.sh)。 ## 运行操作 ``` # Live logs journalctl -u tsp143-bridge -f # 重启 sudo systemctl restart tsp143-bridge # 状态 systemctl status tsp143-bridge ``` CLI 参数(编辑 `/opt/tsp143-bridge/run.sh` 进行自定义): - `print_server_bidir.py -p 9100 -s 9101 -d /dev/usb/lp0 -v` - `star_discovery.py -m TSP143III -p 9100 -v` ## 故障排除 | 症状 | 原因与解决方法 | |---------|-------------| | 打印机未在 Shopify 中被发现 | iPad 和 Pi 必须在同一子网上,且没有客户端隔离。检查 `journalctl -u tsp143-bridge -f` 中是否有 `Discovery request from ...` 行。如果桥接程序日志显示有查询但 Shopify 未列出打印机,则 iPad 的 WiFi 可能位于单独的 VLAN 中 — 另请参见 [`research/notes-discovery-tsp143iiilan.md`](research/notes-discovery-tsp143iiilan.md) 获取完整的拓扑陷阱列表。 | | 无法打印 | 确认存在 `/dev/usb/lp0`(`ls -l /dev/usb/lp0`)。检查 `tsp-bridge` 用户是否在 `lp` 组中。尝试以 root 身份运行 `echo hello > /dev/usb/lp0`。 | | 重复打印 | 桥接程序必须将所有数据未修改地转发到 USB,并将所有真实 ASB 转发回去。任何带有陈旧 ETB 计数器的合成/缓存 ASB 都会导致重试。 | | 钱箱无法打开 | 检查 RJ12 线缆是否插在打印机的 DK 端口上。钱箱弹出命令(`ESC p 0`)随打印数据内联传输——不需要桥接程序进行特殊处理。 | | 服务无法启动 | `journalctl -u tsp143-bridge -e` — 通常是因为另一个进程占用了 `/dev/usb/lp0`(停止 CUPS:`sudo systemctl stop cups`)。 | ## 适配其他打印机 核心架构(带有 ASB 转发的 TCP 到 USB 桥接)应适用于 支持 StarLine ASB 协议的任何 Star Micronics 打印机。 需要调整的关键点: 1. **帧大小:** 检查打印机的 ASB 帧长度(字节 0 编码了它)。 `usb_asb_to_lan_format()` 函数会填充至 11 字节——如果您的 目标 LAN 型号使用不同的大小,请进行调整。 2. **版本字节:** LAN 打印机设置字节 1 的位 7。检查您的 目标型号发送的内容并与之匹配。 3. **发现响应:** `star_discovery.py` 中的 302 字节发现数据包模板 是从 TSP100IIILAN 捕获的。机箱 实际上在完整型号字段中将自己宣称为 `TSP143IIILAN (STR_T-001)`——相同的硬件,两个不同的型号字符串, 取决于偏移量。对于其他 Star LAN 型号,请使用 [`research/probe.py discovery`](research/probe.py) 捕获真实的 响应,并将其与现有模板进行比较。 4. **端口 9101 行为:** 51 字节查询 / 22 字节响应模式 是从 TSP100IIILAN 捕获的。其他 Star LAN 型号可能使用相同的 协议,但如果您有真实硬件,请通过数据包捕获进行验证。 5. **切勿生成合成的 ASB。** 让真实的打印机处理所有状态。 这是构建此桥接程序中最重要的教训。 ## 协议研究 [`research/`](research/) 目录是本项目权威的协议级 参考资料。本 README 中关于线格式的每个声明均已针对来自**真实 Star Micronics TSP143IIILAN**(机箱标为 TSP100IIILAN,MAC `00:11:62:13:de:ef`,固件 V2.2)的捕获进行了验证。 据我们所知,其中大部分内容**在其他任何地方都没有公开记录**:Star Micronics 的 StarPRNT SDK 提供的是编译好的二进制框架; 官方手册在较高层面上描述了 ASB,但没有指定发现线格式、ETB 计数器编码、9101 查询/响应结构或 USB 与 LAN 帧布局之间的区别。我们是通过捕获真实流量并重播来得出结论的。 ### 交叉分析文档 这三份文档是综合性的参考资料——如果您正在进行逆向工程,请首先阅读这些: - **[`research/notes-discovery-tsp143iiilan.md`](research/notes-discovery-tsp143iiilan.md)** — UDP/22222 上的 Star Discovery Protocol:Shopify 实际发送的 28 字节结构化查询格式、302 字节响应布局、我们排除的所有 死胡同(mDNS、SNMP、松散的 `STR_BCAST`),以及决定发现是否有效的 拓扑限制。 - **[`research/notes-asb-states.md`](research/notes-asb-states.md)** — LAN 上的 StarPRNT ASB 帧结构,逐字节解析。完全解码了带有编码/解码公式的 5 位非连续 ETB 计数器编码。 区分了 USB 和 LAN 形式。 - **[`research/notes-9101-lifecycle.md`](research/notes-9101-lifecycle.md)** — TCP/9101 状态端口行为,包括 51 字节 StarPRNT 查询 格式和 22 字节双帧响应结构。记录了从 Android 手机捕获的 真实 Shopify 轮询节奏。 ### 捕获的场景 每个场景目录包含一个匿名化的 `capture.pcap`,一个 `capture.pcap.txt` 文本转储,一个带有注释观察结果的 `notes.md`, 以及一个包含捕获环境和替换映射的 `meta.txt`。 | 场景 | 捕获的内容 | |----------|------------------| | [`research/discovery/`](research/discovery/) | Star Discovery Protocol 查询+响应。包括 302 字节的原始响应二进制文件。 | | [`research/print-simple/`](research/print-simple/) | 启用 ASB 的最小化 ESC/POS 打印作业。 | | [`research/9101-lifecycle/`](research/9101-lifecycle/) | TCP/9101 空闲测试。证明了 5.0 秒的空闲超时。 | | [`research/shopify-replay/`](research/shopify-replay/) | 从 Android 手机捕获的真实 Shopify POS 打印。包括一个 49 KB 的收据固定数据(`sample-shopify-receipt.bin`)和 51 字节的 9101 查询(`sample-9101-query.bin`),可直接用于重播。 | | [`research/etb-sweep/`](research/etb-sweep/) | 32 个连续的 ETB 已检查块。通过 `0→31→0` 环绕演练 ETB 计数器。 | | [`research/asb-states/`](research/asb-states/) | 循环物理状态(盖子打开/关闭,缺纸/已装纸)下的 ASB 字节布局。 | | [`research/portscan/`](research/portscan/) | nmap 完整 TCP + UDP top-50 指纹。揭示了 TCP/23 上一个未公开的 Telnet 诊断实用程序。 | ### 可重用的工具和固件 - [`research/probe.py`](research/probe.py) — 纯 stdlib 的主动探测器。 模式:`discovery`(发送正确的 28 字节结构化查询), `simple`、`drawer`、`etb-sweep`、`hold-9101`、`watch-asb`、 `replay-shopify`、`raster`。每种模式都会写入原始套接字流量和 解码后的 ASB 帧。 - [`research/anonymize.py`](research/anonymize.py) — 纯 stdlib 的 pcap 重写器。用 RFC 5737 文档值替换打印机/主机的 MAC 和 IP,并重新计算 IPv4/UDP/TCP 校验和。 - [`research/capture.sh`](research/capture.sh) — 场景驱动器,可端到端地 演练命名场景(tcpdump + 主动探测 + 匿名化 + 编写伴随的文本文件)。 - [`research/shopify-replay/sample-shopify-receipt.bin`](research/shopify-replay/sample-shopify-receipt.bin) — 49 KB 二进制文件,即 Shopify 发送的用于 打印一张收据的原始 TCP/9100 负载。可用作针对任何 Star 打印机或 桥接程序的重放固件。 - [`research/shopify-replay/sample-9101-query.bin`](research/shopify-replay/sample-9101-query.bin) — 51 字节,即 Shopify 发送的原始 StarPRNT 状态查询。 ## 搜索索引 如果您是搜索以下任一术语找到本仓库的,相关 内容就在这里: - **Star Discovery Protocol** / **SDP** / **STR_BCAST 格式** / **UDP 22222 查询数据包**:请参见 [`research/notes-discovery-tsp143iiilan.md`](research/notes-discovery-tsp143iiilan.md)。 精确的 28 字节结构化查询(16 字节的 `STR_BCAST` 魔术值 + `RQ1.0.0` 请求版本 + `0x001C` 长度 + 16 位请求 ID)已 逐字节记录。包含所有偏移量的 302 字节响应布局也在此处。 - **StarPRNT SDK 打印机发现** / **searchPrinter** / **SMPort.searchPrinter("TCP:")**:SDK 调用的是封闭的 Star 框架;本仓库记录了其线路层结果,因此您不需要该 SDK。 - **TSP100IIILAN** / **TSP143IIILAN** / **TSP143III 固件 V2.2** 协议行为 — 请参见 [`research/`](research/)。 - **Shopify POS Star 打印机协议逆向工程** / **Shopify POS 端口 9100 9101 捕获** / **Shopify 是如何发现 Star 打印机的**:请参见 [`research/shopify-replay/notes.md`](research/shopify-replay/notes.md) 以获取 Android Shopify POS 应用 打印收据的端到端真实捕获,包括发现、状态轮询和 打印 TCP 流。 - **StarPRNT ASB 字节格式** / **Automatic Status Back 帧布局** / **ASB 版本字节 0x06 与 0x86** / **USB ASB 与 LAN ASB**:请参见 [`research/notes-asb-states.md`](research/notes-asb-states.md)。 - **StarPRNT ETB 计数器** / **ETB 已检查块协议** / **5 位 ETB 计数器编码** / **字节 7 ETB 位**:同一文档; 给出了精确的非连续位位置映射,并附有经过 32 个连续 ETB 验证的编码/解码公式。 - **Star 打印机端口 9101 协议** / **StarPRNT 状态查询 51 字节** / **0x32 状态查询**:请参见 [`research/notes-9101-lifecycle.md`](research/notes-9101-lifecycle.md)。 - **TSP100III Telnet 实用程序** / **Star 打印机 Telnet 端口 23**: TSP100IIILAN 固件在 TCP/23 上暴露了一个未公开的 Telnet 诊断 服务,其横幅会显示型号和 MAC;请参见 [`research/portscan/notes.md`](research/portscan/notes.md)。 - **Star 打印机 "NIC Reset Control" / `c_22222` 设置 / `PORT22222_MOUNT` 条件** — 包含在 [`research/notes-discovery-tsp143iiilan.md`](research/notes-discovery-tsp143iiilan.md) 的 “已知的死胡同”下 — 该管理页面开关并不能启用 发现;它控制的是单独的 TCP/22222 重置功能,并且 在某些固件版本中已在编译时被条件移除。 - **Shopify Star 打印机重复打印修复** / **合成 ASB ETB 失步** — 请参见上方“ETB 计数器 — 避免重复打印的关键”了解架构原因和解决方法。 ## 开源许可 MIT — 请参见 [LICENSE](LICENSE)。© 2026 Senternal LLC, [senternaltech.com](https://senternaltech.com)。
标签:ASB协议, cash drawer, POS机, POS系统, ShopifyPOS, StarPRNT协议, Star打印机, TCP9101, USB转WiFi, WiFi打印服务器, 云资产清单, 协议分析, 嵌入式系统, 打印机驱动, 权限提升, 树莓派Zero, 热敏打印机, 物联网, 硬件黑客, 网络抓包, 网络桥接, 网络模拟, 设备模拟, 跨平台兼容, 逆向工程, 防御绕过, 零售系统