最近公司需要用热敏打印机POS88V实现打印小票。本文采用Kotlin 语言来实现

首先看看SP-POS88Ⅴ系列开发手册.pdf。你会发现这文档只有一堆的指令说明,而且是无序的。按道理应该先初始化设备,所以找到初始化打印机地方

ESC @
[名称] 初始化打印机
[格式] ASCII ESC @
Hex 1B 40
Decimal 27 64
[描述] 清除打印缓冲区数据,打印模式被设为上电时的默认值模式。
[注释] · DIP开关的设置不进行再次检测。
· 接收缓冲区内容保留。
· 宏定义保留。
· flash位图数据不擦除。
· flash用户数据不擦除。
· 维护计数器值不擦除。
· 由GS ( E 指定的设置值不擦除。

它支持3指令格式,分别是ASCII ,Hex ,Decimal 。 我喜欢用hex ,所以建个HexCommands 类维护各种指令

/*** 采用16进制定义指令*/
enum class HexCommands(vararg parameters: Int) {/*** 初始化打印机*/INIT_PRINTER(0x1B, 0x40),/*** 选择标准模式*/STANDARD_MODE(0x1B, 0x53),/*** 进纸并且半切纸*/FEED_AND_CUT(0x1D, 0x56, 65),/*** 设置绝对打印位置*/PRINT_ABSOLUTE_LOCATION(0x1B, 0x24),/*** 选择/取消加粗模式*/TEXT_BOLD(0x1B, 0x45),/*** 选择字符对齐模式*/TEXT_ALIGNMENT(0x1B, 0x61);val hexValues = parameters
}

建立连接

如何建立连接呢?我这里采用网络方式,用socket 很方便实现

class PosPrinter {var encoding: String = "GBK"private lateinit var client: Socketprivate lateinit var writer: PrintWriter@Throws(IOException::class, UnsupportedEncodingException::class)fun connect(ip: String, port: Int = 9100, timeout: Long = 1, timeUnit: TimeUnit = TimeUnit.SECONDS) {client = Socket()client.connect(InetSocketAddress(ip, port), TimeUnit.MILLISECONDS.convert(timeout, timeUnit).toInt())writer = PrintWriter(BufferedWriter(OutputStreamWriter(client.getOutputStream(), encoding)))}@Throws(IOException::class)fun disconnect() {writer.close()client.close()}private fun write(hexCommands: HexCommands, vararg moreHexValues: Int) {hexCommands.hexValues.forEach {writer.write(it)}moreHexValues.forEach {writer.write(it)}writer.flush()}fun initPosPrinter(): PosPrinter {write(HexCommands.INIT_PRINTER)return this}fun selectStandardMode(): PosPrinter {write(HexCommands.STANDARD_MODE)return this}fun printText(text: String): PosPrinter {writer.write(text)writer.flush()return this}fun printLine(line: Int = 1): PosPrinter {for (i in 0 until line) {writer.write("\n")writer.flush()}return this}fun printTextLine(text: String, line: Int = 1): PosPrinter {printLine(line)printText(text)return this}fun innerPrint(function: PosPrinter.() -> PosPrinter): PosPrinter {function(this)return this}/*** 打印空白(size个汉字的位置)*/fun printWordSpace(size: Int): PosPrinter {for (i in 0 until size) {writer.write("  ")}writer.flush()return this}/*** 选择字符对齐模式*/fun setTextBold(isBold: Boolean = false): PosPrinter {write(HexCommands.TEXT_BOLD, if (isBold) 1 else 0)return this}/*** 选择字符对齐模式*/fun setTextAlignment(@TextAlignment textAlignment: Long): PosPrinter {write(HexCommands.TEXT_ALIGNMENT, textAlignment.toInt())return this}/*** 设置绝对打印位置*/fun setTextAbsoluteLocation(@IntRange(from = 0, to = 255) offsetX: Int,@IntRange(from = 0, to = 255) offsetY: Int = 1): PosPrinter {write(HexCommands.PRINT_ABSOLUTE_LOCATION, offsetX, offsetY)return this}fun feedAndCut(length: Int = 100): PosPrinter {write(HexCommands.FEED_AND_CUT, length)return this}companion object {/*** Align to the start of the paragraph, e.g. ALIGN_LEFT.** Use with [.setTextAlignment]*/const val TEXT_ALIGNMENT_TEXT_START = 0L/*** Center the paragraph, e.g. ALIGN_CENTER.** Use with [.setTextAlignment]*/const val TEXT_ALIGNMENT_CENTER = 1L/*** Align to the end of the paragraph, e.g. ALIGN_RIGHT.** Use with [.setTextAlignment]*/const val TEXT_ALIGNMENT_TEXT_END = 2L@IntDef(TEXT_ALIGNMENT_TEXT_START, TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_TEXT_END)@Retention(AnnotationRetention.SOURCE)annotation class TextAlignment}
}

安卓设备上打印小票

    //订单菜品集合private var goodsBean: MutableList<GoodsBean>? = nullprivate var posPrinter: PosPrinter? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)doAsync {//初始化订单数据initData()posPrinter = PosPrinter()posPrinter!!.connect("192.168.2.150")posPrinter!!.initPosPrinter().selectStandardMode().setTextBold(true).setTextAlignment(PosPrinter.TEXT_ALIGNMENT_CENTER).printText("*** 天龙店铺 ***").printLine().setTextBold(false).setTextAlignment(PosPrinter.TEXT_ALIGNMENT_TEXT_START).printTextLine("订单编号:1005199").printTextLine("交易机台:test").printTextLine("交易时间:2016/2/19 12:34:53").printTextLine("支付方式:微信支付").printLine(2).printText("商品").setTextAbsoluteLocation(20).printText("单价").printWordSpace(3).printText("数量").printWordSpace(3).printText("小计").printTextLine("----------------------------------------------").innerPrint({for (foods in goodsBean!!) {printTextLine(foods.name)setTextAbsoluteLocation(20)printText(foods.price)printWordSpace(3)printText(foods.number)printWordSpace(3)printText(foods.sum)}this}).printTextLine("----------------------------------------------").printLine().printText("总计(人民币):").printText("80.00").printLine().feedAndCut(50)}}private fun initData() {goodsBean = ArrayList()(0..1).map { GoodsBean("测试商品" + it, "10.00", "2", "20.00") }.forEach { goodsBean!!.add(it) }}data class GoodsBean(val name: String, val price: String, val number: String, val sum: String)

热敏打印机实现打印小票相关推荐

  1. esc pos java打印图片_android 调用蓝牙打印机(ESC/POS 热敏打印机)打印小票和图片...

    [实例简介]其中对蓝牙配对和连接打印功能进行了封装,可以快速实现蓝牙打印功能 [实例截图] [核心代码] package com.xmwdkk.boothprint; import android.M ...

  2. Android集成佳博热敏打印机打印小票商品名称换行问题

    一.说明 在打印小票的时候,商品名称一行显示不下需要折行打印,但是这个折行又不是放在末尾,到头后再折回来接着打印,该怎么办呢 ? 二.思路 大体的思路就是将商品名称切割成最大不超过一定长度的若干个字符 ...

  3. Android集成佳博热敏打印机打印小票功能

    一.说明 最近公司项目需要做打印机打印小票功能,首先公司买了一个佳博小票打印机作为测试用机.然后在开发的过程中也遇到一些坑,在此记录一下. 二.集成过程 1. 下载开发文档 首先需要去其官网下载SDK ...

  4. vue热敏打印机_electron + vue项目实现打印小票功能及实现代码

    一 需求: 公司项目需要通过electron调用系统打印机,实现打印小票的功能. 二.分析: electron打印大概有两种: 第一种:通过window的webcontent对象,使用此种方式需要单独 ...

  5. 热敏打印机在小票上打印条码和开钱箱打印小票

    开钱箱和打印小票,在前面的文章中已经发过了.和今天发的内容也一样.主要是打印条码也需要那些api,所以一块发上来了. Imports System.Runtime.InteropServices Im ...

  6. C# 收银机顾显(客显)及打印小票(58热敏打印机)

    最近做winform收银机,设计顾显及打印小票总结. 1.顾显(串口COM1) 只涉及到总计,所以只是简单的功能. public static ClientDisplayResult Display( ...

  7. vue热敏打印机_vue h5+app蓝牙打印小票

    参考网址: 链接蓝牙:https://blog.csdn.net/cxgasd/article/details/78208708 蓝牙打印机指令:https://www.jianshu.com/p/c ...

  8. vue热敏打印机_electron + vue项目实现打印小票功能

    前言:该文章需要一定的electron基础同学.如需了解更多相关信息,请移步electron官方文档. 一.需求: 公司项目需要通过electron调用系统打印机,实现打印小票的功能. 二.分析: e ...

  9. Android蓝牙打印小票,仿美团外卖小票打印

    这个一个Android蓝牙打印小票demo,类似美团外卖小票打印 自适应排版小票格式,一行两列和三列轻松搞定,文本长短不用愁 先看一下效果图: demo里主要是使用汉印打印机进行蓝牙小票打印,它还支持 ...

最新文章

  1. 众测 Nebula Graph | 捉虫计划已开启,这项有礼
  2. JS一起学02:函数传参、操作属性第二种方式、提取行间事件、循环、this、焦点问题、联动选择、选项卡焦点图
  3. 《算法竞赛进阶指南》打卡-基本算法-AcWing 97. 约数之和:递归、快速幂
  4. popen函数_PHP中16个高危函数
  5. 接口中也可以有方法了
  6. [导入]Ajax使用初步
  7. AI技术的“践行者” — 云测试成为企业降本增效利器
  8. 微信小程序page设定css,微信小程序——启动,渲染与Page
  9. Android NDK生成及连接静态库与动态库
  10. python电影院售票系统毕业设计开题报告
  11. Android 权限汇总大全
  12. 计算机导论结业报告大一,河北工业大学计算机导论结业论文
  13. 博士申请 | 香港城市大学刘晨老师组招收机器学习方向全奖博士/博后/硕士/RA...
  14. 智能农场 阳光温湿度 检测 远程控制开关 机智云
  15. 亚马逊 MWS上传数据 API部分的相关内容 amazon api 文档
  16. 微信Tinker 热修复介绍及接入(一)
  17. OS X键盘快捷键Cheatsheet
  18. ERNIE: 2.0带来了什么
  19. 公众号接收普通消息并回复
  20. maven-之Lifecycle详解

热门文章

  1. PostGre数据库操作
  2. 【高效降压DCDC转换器】SCT2632Q 车规 4.2V-60V Vin 3A,可兼容LMR16030、LMR14030
  3. 苹果cms明星数据库文件、免采集使用
  4. 5-13 日K蜡烛图
  5. 如何用html制作标题栏,第一天学习html前端,制作标题栏
  6. ROS机器人操作系统底层原理及代码剖析
  7. 2020年PMP笔记归纳第五章项目管理范围
  8. java 井号转义字符,井号'#'用英语怎么说(计算机字符 - 英文读音)
  9. 【老生谈算法】matlab实现巴特沃斯IIR滤波器程序设计源码
  10. 关于嵌入式方向(同济大学软件学院院长谈择业)