You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 先通过路由器管理页面查看打印机的静态IP(建议给打印机设置静态IP,避免地址变动)
  2. 初始化Printer类时传入以太网IP和对应端口(Gprinter默认打印端口一般为9100)
  3. 原代码的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:29:09