2

我正在编写一个需要使用 Boca 热敏打印机打印的 iOS 应用程序。他们使用专有语言 (FGL) 以 ASCII 字符串形式使用命令来布局内容。我已经使用可免费下载的 AirPrint 激活工具为 Boca 打印机启用了 AirPrint。

我的问题是,使用UIPrintInteractionController,我所能做的就是发送已经格式化的文本(BOCA 将无法识别 FGL 命令,像普通文本一样打印它们)或者NSData需要一个 PDF 标题(我的数据没有没有,所以我不能这样打印)。

有没有办法绕过这个框架并将原始 ASCII 数据发送到打印机?我应该使用NSStreams 并以低级别的方式管理打印作业吗?

在那种情况下,有没有办法在网络上获取打印机的地址,以便我可以建立到它的套接字连接?

4

4 回答 4

4

听起来好像您需要一个 3rd Party 库或自己编写一个

但我不确定网络打印机功能的内部结构,但我是你我会问自己:

  • 打印机是否将其 IP 地址广播到网络?
  • 如果不是,它提供了哪些功能使其能够被其他设备自我发现?
  • 打印机是否响应来自想要连接的设备的特定广播消息?
  • 它是否仅依赖于 UDP 或 TCP 数据包?

如果您可以与他们的客户服务取得联系,如果网络上没有记录这些信息,您可能会获得这些信息。

对不起,我不能给你一个直接的答案,但希望这些问题能帮助你找到答案

于 2012-05-15T04:52:57.817 回答
2

大多数打印机都有某种自检功能,可以打印有关打印机的一些信息,包括它的 IP 地址。看看它是否在在线手册中提到它。这通常类似于在打开它的同时按住 Feed 按钮。获得 IP 地址后,打开与它的连接并发送数据应该相当简单。

于 2012-05-15T04:41:16.860 回答
1

OP 很可能已经完成了这项工作,但是本着 StackOverflow 的精神,在这个利基问题上......

如果您知道打印机的 IP 地址(您可以使用打印机上的一个按钮通过测试打印找到此地址),您可以通过端口 9100 上的 TCP 套接字发送 FGL 命令。我在此使用过 FastSocket通过以太网连接的 BOCA 热敏票据打印机。

假设包含 FGL 命令的文本文件Tickets/test.txt在您的应用程序包中,实现此目的的代码(在 Swift 中)是:

let client:FastSocket = FastSocket(host: PRINTER_IP_ADDRESS, andPort: "9100")
client.connect()

let ticketPath:String! = NSBundle.mainBundle().pathForResource("test", ofType: "txt", inDirectory: "Tickets")
let count:Int = client.sendFile(ticketPath)

// Do some error checking here

client.close()

等效的 Objective-C 代码应该很容易计算出来。

由于 FastSocket 同步执行上述命令,请确保在后台线程中运行上述代码以防止 UI 冻结。

于 2015-01-10T12:05:34.240 回答
0

您可以尝试外部附件框架将数据发送到您的打印机。它用于连接外部外围设备。可能这就是您正在寻找的。

于 2012-05-14T22:39:58.180 回答