Skip to content

Go SDK

This content is not available in your language yet.

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

完整示例请参考: