跳转到内容

Go SDK

Go SDK 适用于 Go 语言开发,支持跨平台应用开发,可用于服务端、桌面应用等场景。

Go SDK 使用 Go Modules 管理依赖。

Terminal window
go get psdk
模块说明
psdk/frame/device/bluetooth蓝牙设备管理
psdk/frame/device/adapter设备适配器
psdk/fruits/cpclCPCL 指令
psdk/fruits/escESC 指令
psdk/fruits/tsplTSPL 指令
psdk/fruits/posPOS 指令
package main
import (
"psdk/frame/device/bluetooth/manager"
"psdk/frame/device/bluetooth/types"
"psdk/fruits/cpcl"
)
// 创建蓝牙管理器
btManager := manager.NewBluetoothManager()
// 启动蓝牙适配器
err := btManager.Enable()
if err != nil {
log.Fatal("启动蓝牙失败:", err)
}
// 开始搜索设备
devices, err := btManager.StartDiscovery()
if err != nil {
log.Fatal("搜索设备失败:", err)
}
// 列出发现的设备
for _, device := range devices {
log.Printf("发现设备: %s - %s", device.Name(), device.Address())
}
// 连接到指定设备
connectedDevice, err := btManager.Connect(devices[0])
if err != nil {
log.Fatal("连接失败:", err)
}
log.Printf("已连接到: %s", connectedDevice.DeviceName())
err = btManager.Disconnect()
if err != nil {
log.Printf("断开连接失败: %v", err)
}

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)
}
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.TSS161616点阵
cpclTypes.TSS202020点阵
cpclTypes.TSS242424点阵(推荐)
cpclTypes.TSS282828点阵
cpclTypes.TSS323232点阵
cpclTypes.TSS24_MAX14824点阵2倍放大
类型常量说明
cpclTypes.CODE128Code 128(推荐)
cpclTypes.CODE39Code 39
cpclTypes.CODE93Code 93
cpclTypes.EAN8EAN-8
cpclTypes.EAN13EAN-13
cpclTypes.UPCAUPC-A
cpclTypes.UPCEUPC-E
// 查询打印机状态
cpclPrinter.Status()
reporter, _ := cpclPrinter.Write()
// 查询 SN 号
cpclPrinter.SN()
reporter, _ = cpclPrinter.Write()
// 查询电量
cpclPrinter.BatteryVolume()
reporter, _ = cpclPrinter.Write()

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)
}

推荐的打印顺序:

  1. 唤醒打印机
  2. 使能打印机
  3. 打印图片
  4. 打印定位(连续纸不需要)
  5. 结束打印任务
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 指令用于标签条码打印机。详细指令说明请参考 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)
}
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)
// 读取打印机返回数据
data, err := connectedDevice.Read()
if err != nil {
log.Printf("读取失败: %v", err)
} else {
log.Printf("打印机返回: %x", data)
// 解析状态数据
}
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()

完整示例请参考: