Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
IEC 29341-19-10 详细定义了 PrintBasic 服务——这是所有 UPnP 打印机所必需的基础服务模板。与描述整体打印机设备的设备级标准不同,此服务级标准完全聚焦于服务接口本身:其操作、状态变量、事件模型和数据类型定义。PrintBasic 服务以简洁和可靠性为设计目标。它公开了一组最小但完整的操作,使任何 UPnP 控制点都能提交打印作业、监控进度并处理错误条件,而无需特定于打印机的驱动程序。
PrintBasic 服务定义了一组全面的状态变量,用于反映打印机及其作业的实时状况。关键变量包括 PrinterStatus(枚举型 UI4:0=空闲、1=打印中、2=暂停、3=错误、4=离线)、JobStatus(0=待处理、1=处理中、2=已完成、3=已取消、4=已中止)、JobId(UI4,自动递增)、JobName 和 ErrorDescription。所有关键状态变量都支持事件通知——变化会触发 GENA 通知给所有已订阅的控制点,实现无需轮询的实时 UI 更新。
| 状态变量 | 数据类型 | 事件通知 | 描述 |
|---|---|---|---|
| PrinterStatus | UI4 | 是 | 打印机的当前运行状态 |
| JobStatus | UI4 | 是 | 最近提交作业的状态 |
| JobId | UI4 | 是 | 当前或上一个作业的标识符 |
| JobName | string | 否 | 提交作业的友好名称 |
| ErrorDescription | string | 是 | PrinterStatus=3 时的详细错误说明 |
JobStatus 变量反映的是 JobId 所引用作业的状态,该 ID 始终是最近提交的作业。要独立跟踪多个作业,控制点必须自行维护 JobId 映射,并对每个作业调用 GetJobStatus,因为事件化状态变量仅覆盖当前作业。Print 操作接受 bin.base64 类型的 Document 参数和 string 类型的 MIMEType 参数。IEC 29341-19-10 规定 Document 必须在单个 SOAP 请求中包含完整的打印数据——服务层面不支持分块或流式传输模式。这直接影响内存管理:打印机必须在处理前缓冲整个解码后的文档。工程师应根据设备描述中声明的最大作业大小预分配固定缓冲区,并在服务层以明确的错误码拒绝超限文档,避免在发生内存压力之前进行处理。
GetPrinterStatus。如果打印机处于”错误”或”离线”状态,提交作业将失败并浪费带宽。提交前执行状态检查可减少网络流量并改善用户体验。bin.base64 编码会使二进制数据膨胀约 33%。对于 50 MB 的打印作业,SOAP 负载在添加 HTTP 标头前将达到约 67 MB。确保您的 SOAP 处理器具有足够的内存余量,并相应配置 Web 服务器的最大请求大小限制,以避免大作业被静默截断。实现 PrintBasic 服务时需关注并发模型。标准并未强制要求对并发 Print 调用进行线程安全保护,但生产级实现必须对作业队列进行序列化访问。在包含 JobId、JobName 和 JobStatus 的状态变量块周围使用互斥锁,以确保读写一致性。此外,CancelJob 操作必须处理取消请求到达与取消失效之间的竞态条件——稳健的实现会在取消信号发送前后分别检查作业完成状态。
Print 操作接受具有单一 MIME 类型的文档。对于混合内容作业,控制点必须将内容拆分为多个 Print 调用,或将多部分内容嵌入到 PDF 等单一容器格式中。JobName 状态变量及相关参数使用 UTF-8 编码。控制点应使用 UTF-8 编码作业名称,服务实现在存储和显示作业名称时必须正确处理多字节字符。