Go SDK
Go SDK 适用于 Go 语言开发,支持跨平台应用开发,可用于服务端、桌面应用等场景。
Go SDK 使用 Go Modules 管理依赖。
go get psdk| 模块 | 说明 |
|---|---|
psdk/frame/device/bluetooth | 蓝牙设备管理 |
psdk/frame/device/adapter | 设备适配器 |
psdk/fruits/cpcl | CPCL 指令 |
psdk/fruits/esc | ESC 指令 |
psdk/fruits/tspl | TSPL 指令 |
psdk/fruits/pos | POS 指令 |
1. 导入依赖
Section titled “1. 导入依赖”package main
import ( "psdk/frame/device/bluetooth/manager" "psdk/frame/device/bluetooth/types" "psdk/fruits/cpcl")2. 初始化蓝牙管理器
Section titled “2. 初始化蓝牙管理器”// 创建蓝牙管理器btManager := manager.NewBluetoothManager()
// 启动蓝牙适配器err := btManager.Enable()if err != nil { log.Fatal("启动蓝牙失败:", err)}3. 搜索设备
Section titled “3. 搜索设备”// 开始搜索设备devices, err := btManager.StartDiscovery()if err != nil { log.Fatal("搜索设备失败:", err)}
// 列出发现的设备for _, device := range devices { log.Printf("发现设备: %s - %s", device.Name(), device.Address())}4. 连接设备
Section titled “4. 连接设备”// 连接到指定设备connectedDevice, err := btManager.Connect(devices[0])if err != nil { log.Fatal("连接失败:", err)}
log.Printf("已连接到: %s", connectedDevice.DeviceName())5. 断开连接
Section titled “5. 断开连接”err = btManager.Disconnect()if err != nil { log.Printf("断开连接失败: %v", err)}CPCL 指令使用
Section titled “CPCL 指令使用”CPCL 指令用于便携式标签打印机。详细指令说明请参考 CPCL 指令文档。
import ( "psdk/fruits/cpcl" cpclArgs "psdk/fruits/cpcl/args" cpclTypes "psdk/fruits/cpcl/types")
// 创建 CPCL 实例cpclPrinter := cpcl.NewGenericCPCL(connectedDevice)
// 打印标签_, err := cpclPrinter. Page(cpclArgs.NewPage(576, 400, 1)). Text(cpclArgs.NewText(50, 50, cpclTypes.TSS24, 0, "商品标签")). Bar(cpclArgs.NewBarcode(50, 150, cpclTypes.CODE128, 50, 1, "1234567890")). Print(cpclArgs.NewPrint()). Write()
if err != nil { log.Printf("打印失败: %v", err)}完整标签示例
Section titled “完整标签示例”cpclPrinter := cpcl.NewGenericCPCL(connectedDevice)
// 设置页面page := cpclArgs.NewPage(576, 400, 1)
// 标题文字(加粗)titleText := cpclArgs.NewText(50, 30, cpclTypes.TSS24_MAX1, 0, "商品标签")
// 商品信息nameText := cpclArgs.NewText(30, 90, cpclTypes.TSS24, 0, "名称: 有机苹果")specText := cpclArgs.NewText(30, 130, cpclTypes.TSS24, 0, "规格: 500g/袋")priceText := cpclArgs.NewText(30, 170, cpclTypes.TSS24, 0, "价格: ¥25.90")
// 分隔线line := cpclArgs.NewLine(30, 70, 546, 70, 2)
// 一维条码barcode := cpclArgs.NewBarcode(80, 220, cpclTypes.CODE128, 50, 1, "6901234567890")
// 二维码qrcode := cpclArgs.NewQRCode(400, 90, cpclTypes.CorrectLevelM, 5, "https://example.com")
// 边框box := cpclArgs.NewBox(20, 20, 556, 380, 2)
// 打印指令print := cpclArgs.NewPrint()
// 执行打印_, err := cpclPrinter. Page(page). Bold(true). Text(titleText). Bold(false). Line(line). Text(nameText). Text(specText). Text(priceText). Bar(barcode). QRCode(qrcode). Box(box). Print(print). Write()
if err != nil { log.Printf("打印失败: %v", err)}// 居中对齐cpclPrinter.CenterAlign()cpclPrinter.Text(cpclArgs.NewText(0, 50, cpclTypes.TSS24, 0, "居中文本"))
// 左对齐cpclPrinter.LeftAlign()cpclPrinter.Text(cpclArgs.NewText(30, 100, cpclTypes.TSS24, 0, "左对齐文本"))
// 右对齐cpclPrinter.RightAlign()cpclPrinter.Text(cpclArgs.NewText(0, 150, cpclTypes.TSS24, 0, "右对齐文本"))| 字体常量 | 点阵大小 | 说明 |
|---|---|---|
cpclTypes.TSS16 | 16 | 16点阵 |
cpclTypes.TSS20 | 20 | 20点阵 |
cpclTypes.TSS24 | 24 | 24点阵(推荐) |
cpclTypes.TSS28 | 28 | 28点阵 |
cpclTypes.TSS32 | 32 | 32点阵 |
cpclTypes.TSS24_MAX1 | 48 | 24点阵2倍放大 |
| 类型常量 | 说明 |
|---|---|
cpclTypes.CODE128 | Code 128(推荐) |
cpclTypes.CODE39 | Code 39 |
cpclTypes.CODE93 | Code 93 |
cpclTypes.EAN8 | EAN-8 |
cpclTypes.EAN13 | EAN-13 |
cpclTypes.UPCA | UPC-A |
cpclTypes.UPCE | UPC-E |
// 查询打印机状态cpclPrinter.Status()reporter, _ := cpclPrinter.Write()
// 查询 SN 号cpclPrinter.SN()reporter, _ = cpclPrinter.Write()
// 查询电量cpclPrinter.BatteryVolume()reporter, _ = cpclPrinter.Write()ESC 指令使用
Section titled “ESC 指令使用”ESC 指令广泛用于热敏小票打印机。详细指令说明请参考 ESC 指令文档。
import ( "psdk/fruits/esc" escArgs "psdk/fruits/esc/args")
// 创建 ESC 实例escPrinter := esc.NewGenericESC(connectedDevice)
// 打印小票_, err := escPrinter. Wakeup(). Enable(). Image(escArgs.NewImage(imageData, escArgs.ModeNormal, false)). Position(). StopJob(). Write()
if err != nil { log.Printf("打印失败: %v", err)}完整打印流程
Section titled “完整打印流程”推荐的打印顺序:
- 唤醒打印机
- 使能打印机
- 打印图片
- 打印定位(连续纸不需要)
- 结束打印任务
escPrinter := esc.NewGenericESC(connectedDevice)
// 1. 唤醒打印机escPrinter.Wakeup()
// 2. 使能打印机escPrinter.Enable()
// 3. 打印图片image := escArgs.NewImage(imageData, escArgs.ModeNormal, false)escPrinter.Image(image)
// 4. 打印定位(标签纸需要)escPrinter.Position()
// 5. 结束打印任务escPrinter.StopJob()
// 执行写入reporter, err := escPrinter.Write()if err != nil { log.Printf("打印失败: %v", err)} else { log.Printf("打印成功,写入 %d 字节", reporter.BytesWritten)}// 设置打印浓度(0-2)escPrinter.Thickness(1)
// 设置关机时间(分钟)escPrinter.SetShutdownTime(10)
// 设置纸张类型paperType := escArgs.NewPaperType(escArgs.PaperTypeContinuous)escPrinter.PaperType(paperType)// 查询打印机信息escPrinter.Info()reporter, _ := escPrinter.Write()
// 查询打印机状态escPrinter.State()reporter, _ = escPrinter.Write()
// 查询电量escPrinter.BatteryVolume()reporter, _ = escPrinter.Write()
// 查询 MAC 地址escPrinter.Mac()reporter, _ = escPrinter.Write()TSPL 指令使用
Section titled “TSPL 指令使用”TSPL 指令用于标签条码打印机。详细指令说明请参考 TSPL 指令文档。
import ( "psdk/fruits/tspl" tsplArgs "psdk/fruits/tspl/args" tsplTypes "psdk/fruits/tspl/types")
// 创建 TSPL 实例tsplPrinter := tspl.NewGenericTSPL(connectedDevice)
// 打印标签_, err := tsplPrinter. Page(tsplArgs.NewPage(60, 40)). Gap(true). Direction(tsplArgs.NewDirection(tsplTypes.DirectionUp, false)). Cls(). Text(tsplArgs.NewText(50, 50, tsplTypes.TSS24, 0, 1, 1, "标签内容")). Print(1). Write()
if err != nil { log.Printf("打印失败: %v", err)}完整标签示例
Section titled “完整标签示例”tsplPrinter := tspl.NewGenericTSPL(connectedDevice)
// 页面设置page := tsplArgs.NewPage(60, 40)direction := tsplArgs.NewDirection(tsplTypes.DirectionUp, false)
// 标题title := tsplArgs.NewText(180, 30, tsplTypes.TSS24, 0, 2, 2, "商品标签")
// 商品信息name := tsplArgs.NewText(30, 100, tsplTypes.TSS24, 0, 1, 1, "品名: 有机苹果")spec := tsplArgs.NewText(30, 140, tsplTypes.TSS24, 0, 1, 1, "规格: 500g/袋")price := tsplArgs.NewText(30, 180, tsplTypes.TSS24, 0, 1, 1, "价格: ¥25.90")
// 分隔线bar := tsplArgs.NewBar(30, 80, 420, 2)
// 一维条码barcode := tsplArgs.NewBarcode(100, 220, tsplTypes.CODE128, 60, 1, 0, 2, 4, "6901234567890")
// 二维码qrcode := tsplArgs.NewQRCode(380, 90, tsplTypes.CorrectLevelM, 4, 0, "https://example.com")
// 边框box := tsplArgs.NewBox(20, 20, 460, 310, 2)
// 执行打印_, err := tsplPrinter. Page(page). Gap(true). Direction(direction). Density(8). Speed(4). Cls(). Text(title). Bar(bar). Text(name). Text(spec). Text(price). Barcode(barcode). QRCode(qrcode). Box(box). Print(1). Write()
if err != nil { log.Printf("打印失败: %v", err)}// 设置页面尺寸(mm)page := tsplArgs.NewPage(60, 40)tsplPrinter.Page(page)
// 设置缝隙纸tsplPrinter.Gap(true)
// 设置黑标纸tsplPrinter.Bline()
// 设置连续纸tsplPrinter.Continuous()
// 设置打印方向direction := tsplArgs.NewDirection(tsplTypes.DirectionUp, false)tsplPrinter.Direction(direction)
// 设置浓度(0-15)tsplPrinter.Density(8)
// 设置速度(1-6)tsplPrinter.Speed(4)
// 清除缓冲区tsplPrinter.Cls()// 填充矩形bar := tsplArgs.NewBar(50, 100, 200, 2)tsplPrinter.Bar(bar)
// 空心矩形box := tsplArgs.NewBox(50, 50, 300, 200, 2)tsplPrinter.Box(box)
// 画线line := tsplArgs.NewLine(50, 50, 300, 200, 2)tsplPrinter.Line(line)
// 画圆circle := tsplArgs.NewCircle(200, 200, 100, 2)tsplPrinter.Circle(circle)reporter, err := cpclPrinter.Write()if err != nil { log.Printf("打印失败: %v", err) return}
if !reporter.Success { log.Printf("写入失败,已写入 %d 字节", reporter.BytesWritten) return}
log.Printf("打印成功,写入 %d 字节", reporter.BytesWritten)设备状态监听
Section titled “设备状态监听”// 读取打印机返回数据data, err := connectedDevice.Read()if err != nil { log.Printf("读取失败: %v", err)} else { log.Printf("打印机返回: %x", data) // 解析状态数据}打印商品标签
Section titled “打印商品标签”package main
import ( "log" "psdk/frame/device/bluetooth/manager" "psdk/fruits/cpcl" cpclArgs "psdk/fruits/cpcl/args" cpclTypes "psdk/fruits/cpcl/types")
func main() { // 初始化蓝牙 btManager := manager.NewBluetoothManager() if err := btManager.Enable(); err != nil { log.Fatal("启动蓝牙失败:", err) }
// 搜索设备 devices, err := btManager.StartDiscovery() if err != nil { log.Fatal("搜索设备失败:", err) }
// 连接第一个设备 connectedDevice, err := btManager.Connect(devices[0]) if err != nil { log.Fatal("连接失败:", err) }
// 创建打印机实例 printer := cpcl.NewGenericCPCL(connectedDevice)
// 打印标签 _, err = printer. Page(cpclArgs.NewPage(576, 400, 1)). CenterAlign(). Bold(true). Text(cpclArgs.NewText(0, 30, cpclTypes.TSS24_MAX1, 0, "商品标签")). Bold(false). LeftAlign(). Line(cpclArgs.NewLine(30, 70, 546, 70, 2)). Text(cpclArgs.NewText(30, 90, cpclTypes.TSS24, 0, "名称: 有机苹果")). Text(cpclArgs.NewText(30, 130, cpclTypes.TSS24, 0, "规格: 500g/袋")). Text(cpclArgs.NewText(30, 170, cpclTypes.TSS24, 0, "价格: ¥25.90")). Bar(cpclArgs.NewBarcode(80, 220, cpclTypes.CODE128, 50, 1, "6901234567890")). QRCode(cpclArgs.NewQRCode(400, 90, cpclTypes.CorrectLevelM, 5, "https://example.com")). Box(cpclArgs.NewBox(20, 20, 556, 380, 2)). Print(cpclArgs.NewPrint()). Write()
if err != nil { log.Fatal("打印失败:", err) }
log.Println("打印成功")
// 断开连接 btManager.Disconnect()}// 打印多张标签for i := 0; i < 10; i++ { printer. Page(cpclArgs.NewPage(576, 400, 1)). Text(cpclArgs.NewText(50, 50, cpclTypes.TSS24, 0, fmt.Sprintf("标签 #%d", i+1))). Print(cpclArgs.NewPrint()). Write()
// 短暂延迟避免打印机缓冲区溢出 time.Sleep(100 * time.Millisecond)}// 构建指令但不立即发送printer. Page(cpclArgs.NewPage(576, 400, 1)). Text(cpclArgs.NewText(50, 50, cpclTypes.TSS24, 0, "文本1")). Text(cpclArgs.NewText(50, 100, cpclTypes.TSS24, 0, "文本2")). Print(cpclArgs.NewPrint())
// 一次性发送所有指令reporter, err := printer.Write()完整示例请参考: