云打印设备作为 MQTT Client,支持接入以下类型的服务器:
| 服务器类型 | 明文端口 | TLS 端口 | 连接参数来源 |
|---|---|---|---|
| 自建 / 第三方 MQTT | 1883 | 8883 | Username / Password / ClientID 由客户自行设定(仅此类需配置 TLS 开关与 CA) |
| 阿里云 IoT | 厂商默认 | 厂商 TLS 端口 | ProductKey + DeviceName + DeviceSecret(三元组) |
| 腾讯云 IoT Hub | 厂商默认 | 厂商 TLS 端口 | ProductId + DeviceName + DeviceSecret(三元组) |
| 电信云及其他 | 按服务商规范 | 请联系商务确认 | |
适用设备:热敏打印机、标签打印机、打印云盒。如有定制需求(共享订阅、桥接、主题重写等 Broker 特性),请联系商务人员评估。
使用 PC 端《云打印设备 MQTT 配置工具》,通过 USB 数据线连接设备写入参数,无需设备联网:
| 参数 | 约定 |
|---|---|
| 协议版本 | 默认按 MQTT 3.1.1 连接,为全机型基线。MQTT 5.0 仅部分机型支持,需固件与配置工具同时支持并在写入参数时显式选择。两种版本下业务报文、状态码与幂等规则完全一致,详见第 8 步。 |
| ClientID | 取设备 SN。全 Broker 内必须唯一;字符限定 [A-Za-z0-9_-],长度 1–30,不得为空。同一个 ClientID 二次上线会互相踢线,请勿重复写号。 |
| Keep Alive | 建议 ≤ 300 s(推荐 60 s),且应小于链路 NAT / 防火墙的空闲连接超时(企业网络常见 300–900 s)。设备空闲时会自动发送 PINGREQ 保活,4G 网络尤其依赖此机制。 |
| QoS | 下发与上报均使用 QoS 1,不支持 QoS 2。QoS 1 的语义是「会话存在期间至少送达一次」,不等于离线必达,见第 6 步。 |
| Retain | 必须为 0。服务端请勿向设备 Retain 打印任务,否则设备每次订阅(含重连后重新订阅)都会重打历史小票。补救:向同一主题发布一条空 payload 的 Retain 消息即可清除已保留的消息。 |
| Payload | UTF-8 JSON(无 BOM),键名大小写敏感。单条建议 ≤ 32 KB;图片 PNG ≤ 60 KB、BMP ≤ 6 KB;二维码内容 ≤ 512 字节。 |
| 离线消息 (sen) | 默认清除离线消息(sen = 0,适合外卖 / 收银等实时场景);需要补打漏单时改为保留离线消息(sen = 1),此时 Broker 必须按 ClientID 持久化会话与 QoS 1 队列。注意:sen = 1 依赖 Broker 侧不清除会话,若会话过期时间过短或该 ClientID 在别处重复登录,离线消息仍会丢失——选型为「必须补单」的业务请在应用层保留重发能力。 |
mqtts://:
① 配置开关 tls = 1;② 端口为 8883 或 443;③ 主机以 mqtts:// / ssl:// / tls:// 开头(scheme 会被自动剥离)。其余情况走明文 mqtt://。
协议约定两类主题,QoS 均为 1:
| 方向 | 用途 | QoS |
|---|---|---|
| 订阅主题(下行) | 接收打印任务、语音播报消息、命令消息 | 1 |
| 发布主题(上行) | 上报设备状态、打印结果、扫码与按键内容 | 1 |
type 字段 → 上报 code = 208)。这是现场高频错误。
device/{SN}/down(下行)与 device/{SN}/up(上行),例如 device/SWP20260730001/down。/{ProductKey}/{DeviceName}/{SUB} 拼接;腾讯云以控制台为准。+ / #),设备每次仅订阅一条下行主题。+、# 与空字符;不建议包含中文与空格(不同 Broker / 客户端库对转义的处理不一致)。设备上报数据中的 devicename 为设备 SN(机器码),与应用侧三元组的 DeviceName 或 ClientID 保持一致。
MQTT 服务器推送到云打印设备的消息为 UTF-8 编码的 JSON,QoS 1,Retain 0:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | uint32 | 是 | 打印任务 id,范围 0-4294967295。服务端须确保不重复;设备具备防重打能力——同一 id 在不断电情况下只打印一次,重复推送会上报状态 209。注意 id 回绕:自增到上限归零、或使用秒级时间戳时,可能与设备侧防重缓存中的旧 id 撞上 |
type | int | 是 | 数据类型 / 打印语言,取值见下表 |
contents | String / Array / Object | 是 | 打印内容,结构随 type 变化。优先于 message |
message | string | 否 | 预留的 HTTP 下载型打印内容 URL,与 contents 二选一 |
pWidth | int | 否 | 打印纸张宽度(mm):58(默认)/ 80 / 110 |
pCopy | int | 否 | 打印份数,默认 1 |
pType | int | 否 | 纸类型(默认 1):1 连续纸|2 标签纸|3 黑标纸|4 穿孔纸|8 连续纸(标签指令打印小票)。纸类型为标签时必传 |
vType | int | 否 | 播报类型:-1 无播报|0 定制语音|1 固定音「你有新的订单」|10000 指定语音链接下载播报 |
vMessage | string | 否 | vType = 0 时为 TTS 文本内容(UTF-8);vType = 10000 时为音频下载 URL |
vMode | int | 否 | 0 按队列顺序播报(默认)|1 立即播报|2 立即播报并清空待播报队列 |
gateway | string | 否 | 仅 WiFi + 网口版打印云盒:usb 表示转发到本机 USB 打印机;填入 IP(如 192.168.2.11)表示转发到指定局域网网络打印机 |
expire 规划中 | uint32 | 否 | 任务有效期,单位「秒」的相对值,自设备受理时刻起算;超过仍未执行则上报 code = 212 并丢弃。缺省 1800;填 0 表示永不过期 |
force 规划中 | uint8 | 否 | 强制打印:1 = 跳过设备侧防重,允许同一 id 再次打印;缺省 0。仅用于服务端主动发起的补打 / 重印,常规下发不要带此字段 |
| type | 含义 | contents 形态 |
|---|---|---|
| 1 | ESC/POS 指令 | string(Base64 编码的 ESC 指令) |
| 2 | CPCL | string |
| 3 | TSPL | string |
| 4 | XML 排版 | string。基础 XML 兼容主流云打印平台;矢量多语言 XML(限 M 后缀机型)支持全球语种与 RTL 排版 |
| 5 | JSON 排版 | Array(票据)/ Object(标签) |
| 6 | PNG 图片 | string:图片 URL 或 Base64 内容 |
| 99 | 设备配置管理 | Object,见第 7 步 |
| 100 | 支付结果通知 | string / Object / Array。用于驱动支付到账播报,具体实现请联系商务确认 |
打印排版语言(XML 标签、JSON 票据元素、JSON 标签元素)的完整定义见官网开发文档中心与打印排版设计。
message 字段或 contents 中的 https 链接下发,由设备下载后打印。URL 必须使用 https——明文 http 会旁路整套 MQTTS 的安全投入。
设备上报的数据以 UTF-8 JSON 组装,QoS 1,Retain 0。
设备每次 MQTT 连接成功后统一上报一条上线报文,携带当前打印机状态:状态正常时报 code = 0,存在异常时报对应的打印机状态码。该报文不带 id,属打印机状态类上报,不进入任务状态机。
上报时机:每次 MQTT 连接成功后上报一次(含首次联网、掉线重连、设备重启)。服务端以收到本报文作为上线信号,而不是「收到任意首条上报」——请勿把扫码 / 按键等事件类上报当作上线信号。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
devicename | string | 是 | 云打印设备 SN(机器码),与 ClientID / DeviceName 一致 |
id | uint32 | 条件 | 打印结果上报时必填;纯状态上报不带本字段(这是区分任务结果与打印机状态的关键) |
code | int | 条件 | 状态码,见下表。状态类与结果类上报必带;事件类上报(扫码、按键)不带 |
imei / iccid | string | 否 | 仅 4G 机型,随上线报文上报 |
scan_content | string | 否 | 扫码机型上传的条码 / 二维码内容 |
keyevent 规划中 | int | 否 | 按键事件:1 = 按键按下。仅带按键机型上报 |
上报报文没有显式的类型字段,服务端请自上而下、命中即停地判定:
keyevent → 按键事件(设备事件,不进任务状态机)scan_content → 扫码事件(设备事件,不进任务状态机)code 且带 id → 任务结果(走任务状态机)code 不带 id → 打印机状态(只更新打印机状态)imei / iccid → 4G 机型上线信息(不进状态机)注:4G 机型的上线报文同时带 code 与 imei / iccid,应按第 4 条(打印机状态)处理。第 5 条仅用于兼容不含 code 的存量上线报文。
码段规则——按「是否携带任务 id」划分:2xx 为任务结果,上报必带 id;1xx 为打印机状态,上报不带 id,只说明这台打印机当前的硬件状态,不改变任何任务状态;0 为成功,是唯一跨两类的特殊码(带 id 时表示该任务打印成功,不带 id 时表示打印机从异常恢复正常)。
| code | 含义 | 处理建议 |
|---|---|---|
| 0 | 成功 | 终态。任务打印完成,关闭任务 |
| 201 | 缺少 id | 补齐 id |
| 202 | 缺少 type | 补齐 type |
| 203 | type 无效 | 取值仅限 1 / 2 / 3 / 4 / 5 / 6 / 99 / 100 |
| 204 | 缺少 contents / message | 二者必须存在一个 |
| 205 | message 无效 | 例如 URL 不是标准 http(s) 链接 |
| 206 | 下载错误 | 连续下载失败(重试 6 次);建议为下载类任务设置 ≥ 60 s 超时 |
| 207 | 任务长度超出缓冲区 | 缩小 Payload(建议 ≤ 32 KB)或改用 URL 方式 |
| 208 | 内容格式错误 | contents 结构与 type 不匹配 |
| 209 | 重复任务 | 同 id 已打印过;属正常防重,服务端据此确认幂等 |
| 210 规划中 | 受阻,已排队等待 | 非终态。任务已受理但无法立即出票(缺纸 / 开盖 / 过热,或前方仍有未出票任务)。停止重推,等待设备恢复后自动补打并上报终态;可提示商户「请装纸」。不代表异常,不应据此告警 |
| 211 规划中 | 设备忙,队列已满 | 非终态。本地队列已满,任务未被接收。退避 15 / 30 / 60 s 后用同一 id 重发 |
| 212 规划中 | 任务过期被丢弃 | 终态。自受理起超过 expire 秒(缺省 1800)仍未执行。不要重发;如需补单,重新生成内容并用新 id |
| 213 规划中 | 硬件故障,打印放弃 | 终态。缺纸 / 开盖等待超过 30 分钟,或出现不可恢复故障。不要重发,转告警或人工处理 |
两个超时的优先级:213 优先于 212。设备侧硬件等待上限为 1800 s,会先于 expire 触发;因此在缺纸 / 开盖这类最常见的受阻场景里,先到达终态的是 213。201–209 为已落地固件的既有错误码,编号保持不变;新增的任务执行状态码自 210 起顺序分配。
| code | 含义 | 处理建议 |
|---|---|---|
| 100 | 未知错误 / 通信异常 | 重试;连续出现需现场排查网络 |
| 101 | 打印机缺纸 | 通知商户装纸;恢复后设备上报 0(不带 id) |
| 102 | 打印机开盖 | 同上 |
| 103 | 打印机过热 | 等待降温,勿连续重发 |
| 107 | 设备离线(遗嘱消息专用) | 仅由 Broker 代发的遗嘱消息产生,表示设备已与 Broker 断开。设备不会主动上报此码;收到主动上报的 107 请忽略并记录日志 |
| 109 | 打印机未连接 / 连接失败(打印云盒类机型) | 云盒未检测到打印机(打印机未接入、未上电,或数据线未插好)。请检查打印机供电与数据线连接;恢复接入后设备上报 0(不带 id) |
| 规则 | 说明 |
|---|---|
| 幂等防重打 | 同一 SN 下,设备在上电周期内对同一个 id 只打印一次,重复下发将上报 code = 209。这是防止网络重发导致重复出票的首要防线 |
| 防重会失效 | 设备重启 / 断电后防重记录会清空,同一 id 可能再次打印。请勿把设备侧防重当作业务去重的唯一手段 |
| 结果确认 | 服务端应以设备上报的「带 id 且 code = 0」作为打印成功的最终确认。MQTT 5.0 下的原因码不反映打印结果,业务成败一律以 JSON 中的 code 为准 |
| 重发沿用原 id | 超时未确认、或收到 211 需要重发时,必须沿用原来的 id——换新 id 会绕过设备侧防重,直接导致重复出票 |
| 可换新 id 的情形(仅一种) | 收到终态失败(212 / 213)后确实需要补打,此时应重新生成内容并使用新 id,按一笔新业务处理 |
| QoS 1 ≠ 离线必达 | QoS 1 保证的是「会话存在期间至少送达一次」。设备离线期间下发的任务,Broker 不会替你保存;只有同时满足 sen = 1 且 Broker 已开启会话持久化,离线消息才会在设备以同一 ClientID 重连后补发。因此无论 sen 取何值,服务端都必须实现超时重发——离线队列只是「更早送到」的优化,不是可靠性的保证 |
| 断线感知 | 设备掉线可由 Broker 代发的遗嘱消息感知(code = 107),但存在最长约 Keep Alive × 1.5 的判定延迟,属事后确认而非实时告警。建议同时保留「Keep Alive × 1.5 内未收到任何上报」作为兜底判离线手段 |
| 状态 | 进入条件 | 应当做 | 不应当做 |
|---|---|---|---|
| PENDING | 已下发 | 起算等待超时(建议 30 s);等待回执 | 并发下发多条抢占队列 |
| WAITING | 收到 210 | 停止重推;提示商户「请装纸 / 请合盖」;按 expire 设兜底超时 | 换 id 重发(会重复出票) |
| RETRY | 超时 / 收到 211 | 指数退避(15 / 30 / 60 s)后用同一 id重发,最多 3 次 | 立即无限重试、换新 id |
| DONE | 收到 0 | 归档;可清除该 id 的异常提示 | — |
| FAILED | 212 / 213 | 归档并告警;确需补打则重新生成内容 + 新 id | 用原 id 重发 |
| UNKNOWN | 3 次重发仍无回执 | 标记未知并转人工;不要再自动重发 | 换新 id 盲发(可能重复出票) |
code = 0。因此服务端对「已下发但长时间无回执」的任务,请按超时处理,不要因为没收到受理回执就判定失败。
云打印设备支持通过云端远程设置音量、重启打印机、设置默认指令模式等:
| 命令 | contents 结构 | 说明 |
|---|---|---|
volume | {"cmd":"volume","value":1} | 音量设置:0 静音|1 低音量|2 中音量|3 大音量 |
reboot | {"cmd":"reboot"} | 系统重启 |
label_cmd | {"cmd":"label_cmd","print":"tspl"} | 默认标签指令(针对图片或 JSON 打印):tspl(默认)/ cpcl / zpl |
print_cmd | {"cmd":"print_cmd","cmd":"tspl"} | 设置打印机默认语言:tspl / cpcl / esc |
cycle_broadcast 规划中 | {"cmd":"cycle_broadcast","tts_list":["文本1","文本2"],"interval":30,"loop_count":0} | 仅语音机型:空闲时循环广播。tts_list 最多 10 条;loop_count = 0 表示持续播放。需确认固件支持 |
带扫码功能的产品还可上报扫码内容(设备事件,不带 code):
带按键的机型按下按键时上报按键事件 规划中。该事件属设备事件,不是任务结果,因此不带 code;最小上报间隔 1 秒,长按不连发;设备未连接 Broker 时按键不上报(不缓存、不补发)。
| 项目 | 说明 |
|---|---|
| 启用方式 | 自建 / 第三方 MQTT 场景,将配置中的 tls 置为 1,连接 URI 为 mqtts://{Url}:{Port},推荐端口 8883。云平台(阿里云 / 腾讯云)由厂商标准协议决定,无此开关 |
| 建议强制启用 | 明文模式下账号密码与打印内容(订单、金额、收件人信息)均以明文经过网络,不满足多数客户的合规要求 |
| 认证模式 | 单向 TLS + 账号密码(当前标准做法)。双向 TLS(mTLS / 设备证书)、PSK 预共享密钥当前不支持,如需请走定制 |
| 证书下发 | 启用 TLS 不等于必须下发 CA。设备内置公共根证书库(覆盖 Let's Encrypt、DigiCert、GlobalSign、GoDaddy、Google Trust Services、Amazon Trust Services 等),公共 CA 签发的证书开机即连,无需任何证书操作。仅当 Broker 使用自签 / 私有 CA 时才需下发该 CA——该写入能力仅部分机型支持,仅接受 PEM 格式、单张、≤ 4 KB |
| 项目 | 要求 |
|---|---|
| TLS 版本 | ≥ TLS 1.2,不支持 SSL 3.0 / TLS 1.0 / TLS 1.1 |
| 公钥算法 | RSA ≤ 2048 位,或 ECDSA P-256 |
| 签名算法 | SHA-256 及以上 |
| 主机名校验 | 证书 CN 或 SAN 必须匹配设备填写的地址(设备以此做 SNI 与主机名校验) |
| IP 直连 | 若地址填的是 IP,服务器证书必须带 SAN:IP,仅有 CN 会校验失败 |
| 有效期 | 建议 ≤ 2 年;建议到期前 30 天启动轮换,到期后设备将无法连接 |
| 吊销检查 | 不支持 CRL / OCSP,泄漏风险请通过更换 CA + 重新写号处理 |
设备只做出站连接,不开放任何入站端口,因此无需公网 IP、无需在防火墙上做端口映射。请在设备的出口策略上放行:
| 协议 / 端口 | 用途 | 说明 |
|---|---|---|
| TCP 1883 / 8883 | MQTT / MQTTS 长连接 | 到 Broker 的连接,按实际配置端口放行(启用 TLS 时为 8883)。是全程持续占用的长连接 |
| TCP 80 / 443 | 内容下载 / 在线更新 | 使用 URL 方式下发打印内容,或固件与语音包在线更新时才需要。URL 必须使用 https |
cert verify failed —— 多数是设备本地时间未同步,而不是证书本身有问题。设备没有掉电保持的实时时钟,上电后需先完成校时;若网络出口策略不允许设备访问互联网的校时服务,TLS 证书有效期校验就会失败。此时设备尚未连上 Broker,Broker 侧不会留下任何连接记录,排查方向在设备侧网络的出口策略,而不是 Broker。
| 现象 | 可能原因与处理 |
|---|---|
| TLS 握手失败 / cert verify failed | ① 设备时间未同步 → 放行校时出口;② 下发的 CA 与签发服务器证书的 CA 不一致 → 重新导出正确的根 / 中间 CA;③ 地址与证书 CN/SAN 不匹配 → 用域名连接并确保 SAN 包含该域名 |
| IP 直连握手失败 | 证书缺少 SAN:IP → 改用域名,或重新签发带 subjectAltName=IP:… 的证书 |
| CA 无法写入 / 工具拒绝 | ① 传了 DER / PFX → 转 PEM;② 文件 > 4 KB → 换 RSA-2048 根;③ 传的是服务器证书而非 CA → 导出签发者证书 |
| 换回公共证书后反而连不上 | 设备内残留自定义 CA,内置公共根证书库已被停用 → 用配置工具执行「清除 CA」动作后重连 |
| 设备频繁上下线 | ClientID 重复 → 检查写号清单,SN 必须唯一且 ≤ 30 字符 |
| 连接被立即断开 / 无 CONNACK | 查 Broker 日志中的 CONNACK 返回码:4 = 用户名或密码错误、5 = 未授权、2 = ClientID 被拒。这些错误仅存在于 Broker 侧,设备不会通过 MQTT 上报 |
| 设备在线、上报正常,但收不到任何下发 | ① Broker ACL 拒绝该 ClientID 订阅下行主题(SUBACK 0x80);② 服务端发布到的主题与写入设备的订阅主题不一致(区分大小写)→ 逐字符核对两个主题字符串 |
| 周期性掉线(间隔规律) | Keep Alive 大于链路 NAT / 防火墙空闲超时,连接被中间设备回收 → 将 Keep Alive 调至 60 s 或低于出口 NAT 超时 |
| 设备连不上且换设备表现不一致 | 该机型不支持写入自定义 CA,写入未生效,设备仍只用内置库校验,私有 CA 必然失败 → 改用公共 CA 签发的证书 |
商为可协助: