SwiftUI环境下以太网热敏收据打印机的发现与连接方案咨询
Gprinter热敏打印机以太网网络打印实现方案
问题背景
购买了Gprinter热敏收据打印机,SDK文档有限且版本老旧。当前通过打印机自带WiFi连接可实现打印,但App会因此断网,无法向Firebase上传文件。需要将打印机通过以太网设置为网络打印机,实现App同时打印和联网。现有WiFi打印的Swift代码如下,需指导打印机发现与连接方法:
var address : String var port : Int var task : URLSessionStreamTask! var command = Printer() init(host:String,port:Int) { print("init") self.address = host self.port = port setupConnection() } func setupConnection() { print("setup") let session = URLSession(configuration: .default) task = session.streamTask(withHostName: address, port: port) self.task.resume() } func send(data:NSData){ self.task.write(data as Data, timeout: 5.0) { error in if error == nil { print("Data Sent") } else { print("Noe") } } } func sendCommand(_ data: Data){ send(data: data as NSData) }
打印机发现与连接实现方法
一、打印机发现(Bonjour/MDNS)
Gprinter网络打印机通常支持Bonjour服务,可通过MDNS协议扫描局域网内的设备:
- 导入
Network框架,使用NWBrowser进行MDNS服务扫描 - 打印机的服务类型一般为
_printer._tcp.或Gprinter自定义的服务类型(如_gprinter._tcp.) - 扫描到设备后,获取其IP地址和端口号
示例代码:
import Network class PrinterScanner { private var browser: NWBrowser? func startScanning() { let parameters = NWParameters.tcp let serviceType = "_printer._tcp." // 可替换为Gprinter专属服务类型 browser = NWBrowser(for: .bonjour(type: serviceType, domain: nil), using: parameters) browser?.stateUpdateHandler = { state in switch state { case .ready: print("扫描器已就绪") case .failed(let error): print("扫描失败:\(error.localizedDescription)") default: break } } browser?.browseResultsChangedHandler = { results, changes in for result in results { guard let endpoint = result.endpoint as? NWHostEndpoint else { continue } print("发现打印机:\(endpoint.hostname):\(endpoint.port)") // 这里可将地址保存供连接使用 } } browser?.start(queue: .global()) } func stopScanning() { browser?.cancel() } }
二、以太网打印机连接与打印
原WiFi打印代码核心是通过URLSessionStreamTask建立TCP连接,以太网模式下无需修改核心发送逻辑,只需将目标地址改为打印机的以太网IP:
- 先通过路由器管理页面查看打印机的静态IP(建议给打印机设置静态IP,避免地址变动)
- 初始化
Printer类时传入以太网IP和对应端口(Gprinter默认打印端口一般为9100) - 原代码的
setupConnection和sendCommand逻辑可直接复用,仅需确保App当前连接的是局域网WiFi或蜂窝网络,而非打印机自带WiFi
优化后的Printer类(简化NSData冗余):
import Foundation class Printer { private let address: String private let port: Int private var task: URLSessionStreamTask? private let session = URLSession(configuration: .default) init(host: String, port: Int) { self.address = host self.port = port setupConnection() } private func setupConnection() { task = session.streamTask(withHostName: address, port: port) task?.resume() } func sendCommand(_ data: Data) { task?.write(data, timeout: 5.0) { error in if let error = error { print("发送失败:\(error.localizedDescription)") // 可在此处尝试重连 self.setupConnection() } else { print("数据发送成功") } } } func disconnect() { task?.cancel() task = nil } }
三、注意事项
- 确保打印机已通过以太网连接到与App同一局域网
- 路由器需开启MDNS服务,否则Bonjour扫描可能失败
- 若无法通过Bonjour发现,可直接使用路由器分配的静态IP连接
- 测试时可先用
ping命令验证App设备与打印机的网络连通性
内容的提问来源于stack exchange,提问作者Liangn1an
相关产品推荐
相关产品推荐

