最近公司需要用热敏打印机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. python中如何判断两个字符串是否相等_python怎样判断两个字符串是否相同
  2. 关于KN95口罩:可以使用多久?要不要呼吸阀?怎么佩戴?
  3. python openpyxl读取excel_Python使用openpyxl读写excel文件
  4. hibernate和spring学习
  5. Matlab | Matlab从入门到放弃(6)——数组
  6. 《操作系统》实验报告——进程管理
  7. 小说中场景的功能_场景在小说中的作用
  8. Centos 7安装RabbitMQ 3.7.8版本(单机版)-不使用RPM
  9. 读取配置文件(configparser,.ini文件)
  10. 网游服务端开发入门知识
  11. [日期]字符串转Data对象
  12. java两矩阵相加(二维矩阵重要细节解析)
  13. 笔记本电脑修改BIOS及刷写教程
  14. p9plus升级鸿蒙,华为P9 Plus(VIE-AL10 EMUI 8.0)手机完美获取root教程,最强root工具,亲测可用!...
  15. cyj sql 收藏
  16. BZOJ1864: [Zjoi2006]三色二叉树
  17. 【笨木头Cocos2dx 038】战争迷雾效果 第01章_要探索,不要地图全开!
  18. 【CodeForces 1077E --- Thematic Contests】思维+贪心
  19. 条码标签纸的种类,常见的条码标签纸有哪些?条码标签纸的用途
  20. 基于springboot实现注册功能发送激活码至邮箱激活账户登录

热门文章

  1. AI: 机器学习的模型是如何训练的?(在试错中学习)
  2. Eclipse中svn插件site包下载安装图文
  3. 基础java项目6( notic)
  4. 解决.pde文件打开
  5. |Vijos|图论最短路|P1391 想越狱的小杉
  6. 重力加速度与逃逸速度
  7. WebRTC Android 回声消除
  8. STM32F10X、HK32F030单片机的Flash学习
  9. hex和bin文件的区别和读取
  10. 时频分析方法总结:傅里叶级数及傅里叶变换、STFT 、小波变换、Wigner-Ville 分布