接入方式 · MQTT 直连

MQTT 直连:打印数据不出您的服务器

设备作为 MQTT Client 直连您自建或第三方 Broker,跳过商为云。打印内容、订单与金额全程留在您自己的服务器上,适用于金融 / 医疗 / 政务等对数据自主有硬要求的场景。

TLS 8883 一键启用 任务 id 幂等防重打 状态与结果全量回传
Why Direct

为什么把打印链路接进自己的服务器

数据不出域

打印任务由您的服务器直接下发到设备,订单、金额、收件人信息不经过商为云,满足数据本地化与等保合规要求。

按设备 SN 独立凭证

每台设备以自身 SN 作为 ClientID 与鉴权身份,配合 Broker ACL 限定可读写的主题,单台凭证泄露不波及整批设备。

与现有 IoT 平台同构

已在使用阿里云 IoT 或腾讯云 IoT Hub 的团队,按三元组接入即可,无需新建一套消息通道,设备直接并入既有设备管理体系。

Broker

支持接入的 MQTT 服务器

阿里云、腾讯云按厂商标准协议接入,端口、TLS 与签名算法沿用厂商规定,无需单独配置传输层参数;TLS 开关与 CA 配置仅适用于自建 / 第三方 MQTT。

服务器类型明文端口TLS 端口连接参数来源
自建 / 第三方 MQTT18838883Username / Password / ClientID 均由客户自行设定(仅此类需单独配置 TLS)
阿里云 IoT厂商默认厂商 TLS 端口ProductKey + DeviceName + DeviceSecret(三元组)
腾讯云 IoT Hub厂商默认厂商 TLS 端口ProductId + DeviceName + DeviceSecret(三元组)
电信云及其他按服务商规范请联系商务确认
适用范围:热敏打印机、标签打印机、打印云盒。是否支持 MQTT 直连以具体机型规格书为准,可联系商务或技术支持确认目标机型。
Connection

连接参数与固定约定

以下为协议层的固定约定,不建议在对接时自行调整;标注「配置写入」的参数由 PC 端配置工具经 USB 写入设备,无需设备联网。

协议版本
默认按 MQTT 3.1.1 连接。MQTT 5.0 部分机型支持,需固件与配置工具同时支持并显式选择;两种版本下业务报文、状态码与幂等规则完全一致。
ClientID
取设备 SN,全 Broker 内不得重复。字符限定 [A-Za-z0-9_-],长度 1–30。同一 ClientID 二次上线会互相踢线,请勿重复写号。
QoS
下发与上报均使用 QoS 1,不支持 QoS 2。QoS 1 的语义是「会话存在期间至少送达一次」,不等于离线必达。
Retain
必须为 0。打印任务禁止使用 Retain,否则设备每次订阅(含重连后重新订阅)都会重打历史小票。
Payload
UTF-8 JSON。单条建议 ≤ 32 KB;图片 PNG ≤ 60 KB、BMP ≤ 6 KB;二维码内容 ≤ 512 字节。超出缓冲区上报 code = 207。
Keep Alive
建议 ≤ 300 s(推荐 60 s),且应小于链路 NAT / 防火墙的空闲连接超时(企业网络常见 300–900 s)。设备空闲时自动发送 PINGREQ 保活。
Clean Session
默认清除离线消息(sen = 0);需要补打漏单时改为保留离线消息(sen = 1),并确保 Broker 侧按 ClientID 持久化会话与 QoS 1 队列。
上行 / 下行主题
各一条,QoS 1,不支持通配符订阅(+ / #)。两者必须不同且不得互为前缀 —— 若配成同一主题,设备会把自己发出的上报报文当指令解析。具体主题字符串随 Broker 与设备配置而定,不属公开规范内容,可向商务索取。
串行下发:请对同一台设备串行发布任务(建议收到上一条确认或间隔一小段时间后再发下一条,单设备 ≤ 1 条/秒)。MQTT 3.1.1 只在同一方向、同一会话内维护顺序,多线程并发发布会导致出票顺序错乱。
Firewall

出网白名单:设备侧最先要过的一关

设备只做出站连接,不开放任何入站端口,因此无需公网 IP、无需在防火墙上做端口映射。请在设备的出口策略上按实际使用的功能放行以下目标。

协议 / 端口用途说明
TCP 1883 / 8883MQTT / MQTTS 长连接到 Broker 的连接,按实际配置端口放行(启用 TLS 时为 8883)。是全程持续占用的长连接。
TCP 80 / 443内容下载 / 在线更新使用 URL 方式下发打印内容,或固件与语音包在线更新时才需要。URL 必须使用 https。
最常见的现场现象:同一台设备、同一个 Broker,1883 明文能连上,改成 8883 加密就连不上,报 cert verify failed —— 多数是设备本地时间未同步,而不是证书本身有问题。设备没有掉电保持的实时时钟,上电后需先完成校时;若网络出口策略不允许设备访问互联网的校时服务,TLS 证书有效期校验就会失败。此时设备尚未连上 Broker,Broker 侧不会留下任何连接记录,排查方向在设备侧网络的出口策略。
Security

TLS 与传输安全

明文模式下账号密码与打印内容均以明文过网,不满足多数客户的合规要求。对外部署建议默认使用 MQTTS 8883 交付。

启用方式
在配置工具中将 tls 置为 1,或将端口设为 8883 / 443,或以 mqtts:// / ssl:// / tls:// 开头填写主机,任一满足即走加密连接。
证书下发
启用 TLS 不等于必须下发 CA。设备内置公共根证书库(覆盖 Let's Encrypt、DigiCert、GlobalSign、GoDaddy、Google Trust Services、Amazon Trust Services 等),公共 CA 签发的证书开机即连,无需任何证书操作。
私有 CA
Broker 使用自签或企业内部 CA 时需下发该 CA。该写入能力 仅部分机型支持,仅接受 PEM 格式、单张、≤ 4 KB;不支持写入的机型需将 Broker 证书改为公共 CA 签发。
内置证书库与自定义 CA 互斥:一旦写入自定义 CA,内置公共根证书库即停止生效,设备只信任写入的那一张。之后若 Broker 换回公共 CA 签发的证书将握手失败,需清空已写入的 CA 才能恢复。排查握手失败时,请先确认设备里有没有写入过 CA。

服务端证书要求

TLS 版本≥ TLS 1.2,不支持 SSL 3.0 / TLS 1.0 / 1.1
公钥算法RSA ≤ 2048 位,或 ECDSA P-256
签名算法SHA-256 及以上
主机名校验证书 CN 或 SAN 必须匹配设备填写的地址(用于 SNI 与主机名校验)
IP 直连地址填 IP 时,证书必须带 SAN:IP,仅有 CN 会校验失败
有效期建议 ≤ 2 年,建议到期前 30 天启动轮换
吊销检查不支持 CRL / OCSP,风险通过更换 CA + 重新写号处理
请在设备侧保持证书校验:放弃主机名校验会使链路退化为可被中间人攻击,等同于明文。设备侧不提供跳过校验的绕过模式。
Boundaries

协议能力边界

以下能力当前版本不支持,或仅在部分机型上支持。请在方案设计与选型阶段据此评估,避免把不支持的能力写进技术方案。

能力支持说明
MQTT over WebSocket✘仅支持 TCP 之上的 MQTT / MQTTS
QoS 2✘最高 QoS 1
Retain 消息✘协议不使用 Retain,打印任务禁止使用
通配符订阅✘单条精确主题,不支持 + / #
共享订阅 / 桥接✘设备是其下行主题的单一订阅者
分段下载 / 断点续传✘打印内容一次下发完整
双向 TLS(mTLS)✘当前不提供设备证书写入通道,如需请走定制
PSK / TLS-SRP✘—
DER / PFX 证书✘仅接受 PEM
CRL / OCSP 吊销检查✘依赖更换 CA
MQTT 5.0部分3.1.1 为全机型基线;5.0 仅部分机型支持,需以机型规格书为准
写入自定义 CA部分仅部分机型支持,需以机型规格书为准
Payload

下发报文与打印能力

下行报文为 UTF-8 JSON,QoS 1,Retain 0。通过 type 指定排版方式,通过 contents 承载内容。

type含义contents 形态
1ESC/POS 指令string(Base64 编码的 ESC 指令)
2CPCLstring
3TSPLstring
4XML 排版string。基础 XML 兼容主流云打印平台;矢量多语言 XML 限 M 后缀机型,支持多语种与 RTL 排版
5JSON 排版Array(票据)/ Object(标签)
6PNG 图片string:图片 URL 或 Base64 内容
99设备配置管理Object(音量、重启、默认打印语言等)
100支付结果通知用于驱动支付到账播报,具体实现请联系商务确认

下发字段

id必填。任务 ID,0–4294967295,服务端需确保不重复,设备上报结果时原样回带
type必填。排版类型,取值见上表
contents必填。打印内容,结构随 type 变化
pWidth纸宽 mm:58(默认)/ 80 / 110
pCopy打印份数,默认 1
pType纸类型:1 连续纸 / 2 标签纸 / 3 黑标纸 / 4 穿孔纸 / 8 连续纸(标签指令打小票)。标签打印必传
vType / vMessage语音播报类型与文本,用于订单到账播报
gateway仅 WiFi + 网口版打印云盒:转发到本机 USB 打印机或指定局域网网络打印机
expire / force任务有效期与强制补打开关 规划中

上报字段

devicename必填。设备 SN,与 ClientID 一致
id打印结果上报时必填;纯状态上报不带此字段
code状态码,见下方「任务结果与状态码」。状态类与结果类上报必带,扫码 / 按键事件不带
imei / iccid仅 4G 机型,随上线报文上报一次
scan_content扫码机型上传的条码 / 二维码内容
keyevent按键事件,仅带按键机型上报 规划中
大内容建议走 URL:长内容可改用 https 链接下发,由设备下载后打印(下载失败上报 206)。URL 必须使用 https,明文 http 会旁路整套 MQTTS 的安全投入。
Status Codes

任务结果与状态码

2xx · 任务结果

上报必带 id,表示某一笔任务的最终结果或执行状态,走任务状态机。

1xx · 打印机状态

上报不带 id,只说明这台打印机当前的硬件状态,不改变任何任务状态。

0 · 成功

跨两类的特殊码:带 id 时为「该任务打印成功」,不带 id 时为「打印机从异常恢复」。

当前版本已支持

0成功:带 id 为任务打印完成;不带 id 为打印机恢复正常
100未知错误 / 通信异常,需现场排查网络
101缺纸:通知商户装纸,恢复后上报 0
102开盖:同上
103打印机过热:等待降温,勿连续重发
107设备离线:仅由 Broker 代发的遗嘱消息产生,设备不会主动上报
109打印机未连接 / 连接失败:云盒未检测到打印机,不代表云盒离线
201–208参数与内容类错误:缺字段、type 无效、下载错误、内容超缓冲区、格式错误等
209重复任务:同一 id 已打印过,属正常防重,服务端据此确认幂等

后续版本规划 规划中

210受阻,已排队等待(非终态、不代表异常)。任务已受理但暂时无法出票,等待设备恢复后自动补打并上报终态
211设备忙,队列已满(非终态)。任务未被接收,退避后重发
212任务过期被丢弃(终态)。自受理起超过 expire 秒仍未执行
213硬件故障,打印放弃(终态)。缺纸 / 开盖等待超时,或出现不可恢复故障
未升级的设备不会上报这些码,服务端请按超时分支处理:超时后用同一 id 重发(最多 3 次),仍无回执则标记为未知状态转人工,不要盲目换 id 重发。
不要拿 109 判断设备在线状态。109 表示「打印机没接上」,云盒本身仍在线、仍在正常收发消息。判断设备自身是否离线,请依据 Keep Alive 超时或遗嘱消息(code = 107),三者不可混用。
协议保持向后兼容:当前版本已支持设备在线状态、打印结果回执与错误码;后续版本将增强任务级状态(排队 / 过期 / 硬件故障细分)、任务有效期与按键事件,随固件升级分批可用,不影响既有接入代码。
Reliability

不重复出票的几条规则

幂等防重打
同一设备在上电周期内对同一个 id 只打印一次,重复下发会上报 code = 209。这是防止网络重发导致重复出票的首要防线。
重发必须沿用原 id
超时未收到结果、或收到「队列已满」需要重发时,必须沿用原来的 id。换新 id 会绕过设备侧防重,直接导致重复出票。可以换新 id 的场景仅限一种:收到终态失败后确需补单,此时按一笔新业务重新生成内容。
QoS 1 ≠ 离线必达
QoS 1 的语义是「会话存在期间至少送达一次」。设备离线期间下发的任务,Broker 不会替你保存;只有开启会话持久化并按 ClientID 保留队列后,离线消息才会在重连后补发。
结果确认
服务端应以设备上报的「带 id 且 code = 0」作为打印成功的最终确认,建议为每个任务维护状态字段,不要仅凭「有没有收到 0」判断成败。MQTT 5.0 下的原因码不反映打印结果,业务成败一律以 JSON 中的 code 为准。
断线感知
设备掉线可由 Broker 代发的遗嘱消息感知(code = 107),但存在最长约 Keep Alive × 1.5 的判定延迟,属事后确认而非实时告警。建议同时保留「超时未收到任何上报」作为兜底判离线手段。
Getting Started

从零到出第一张票

1

准备 Broker

自建或选择阿里云 / 腾讯云 IoT,创建对应设备并取得连接参数与三元组。

2

写入设备参数

用 PC 端配置工具经 USB 写入服务器地址、端口、鉴权信息与主题。

3

对接协议

按协议实现任务下发与状态上报,订阅与发布主题 QoS 均为 1。

4

联调验收

确认首次出票、结果回执与缺纸 / 开盖等状态上报,完成验收。

FAQ

技术常见问题

可以对接阿里云 IoT 或腾讯云 IoT Hub 吗?
可以。阿里云 IoT 按 ProductKey + DeviceName + DeviceSecret 三元组接入,腾讯云 IoT Hub 按 ProductId + DeviceName + DeviceSecret 接入,端口、TLS 与签名算法沿用厂商标准协议,无需单独配置传输层参数。协议以设备 SN 作为 ClientID 与 DeviceName。
启用 TLS 需要上传 CA 证书吗?
通常不需要。设备内置公共根证书库,Broker 使用公共 CA 签发的证书时,开启 TLS 即可连接。仅当 Broker 使用自签或私有 CA 时才需下发该 CA,且该写入能力仅部分机型支持;不支持写入的机型需将 Broker 证书改为公共 CA 签发。注意写入自定义 CA 后内置证书库会停用,两者互斥。
为什么 1883 明文能连上,换成 8883 加密就失败?
多数是设备本地时间未同步导致,而不是证书本身有问题。设备没有掉电保持的实时时钟,上电后需先完成校时,TLS 证书有效期校验依赖正确时间;若网络出口策略不允许设备访问互联网的校时服务,握手就会失败。这类失败在 Broker 侧不会留下任何连接记录,排查方向在设备侧的出口策略。
支持 QoS 2、Retain 消息或 WebSocket 吗?
均不支持。协议最高 QoS 1;不使用 Retain,打印任务禁止 Retain,否则设备每次订阅都会重打历史小票;仅支持 TCP 之上的 MQTT / MQTTS,不支持 WebSocket;同时不提供双向 TLS(mTLS)、PSK、DER / PFX 证书与 CRL / OCSP 吊销检查。
设备离线期间下发的订单会补发吗?
取决于配置。默认清除离线消息,设备离线期间 Broker 不会保存任务;若开启会话持久化(sen = 1)且 Broker 按 ClientID 保存队列,任务会在设备以同一 ClientID 重连后补发。无论哪种配置,服务端都应实现超时重发,离线队列只是「更早送到」的优化,不是可靠性的兜底手段。
怎么确认打印真的打出来了?
以设备上报的任务结果报文为准:携带任务 id 且 code = 0,表示该任务打印完成。服务端应以该报文作为最终确认并关闭任务;超时未确认时用同一 id 重发,不要换新 id,否则会绕过设备侧防重导致重复出票。

评估 MQTT 直连方案?

把您的 Broker 类型、网络出口策略与目标机型告诉我们,可一并核对协议能力与机型支持范围,并附上联调支持。