EPSON Printer 打印机 Sdk For Android

  近日需求,有一个windows系统的设备web点餐系统,需要移植到Android 平板端, 需要考虑的交互主要就是通过 JS 传入打印数据到 WebView 之后,通过 Android 调用打印机打印小票了,这需要查找打印机品牌设备的对应 的 SDK。

  接下来就是直接通过Android 封装一个WebView进行网页的展示,添加对javascript的支持 交互,还有一些细微的处理而已。

  这里只讲解下如何植入使用 EPSON 品牌的打印机 SDK 。本例子使用 ESPON TM-T88IV 系列热敏打印机 进行打印小票,其它系列打印机也类似代码中通过创建打印类时指定系列。

image.png

  其它打印机品牌也类似,顶多是使用的指令方式,但是一般都会进行方法封装让开发者更简单的接入。
期间对于打印机这块没啥经验,从 EPSON 官网找到的 SDK Sample 踩了一些坑,完后发现不会很难,即使是英文文档也可以通过谷歌翻译啃下来 ~

  本文基于EPSON 爱普生 打印机(看起来这玩意确实很国际化,这个品牌的打印设备种类多挺厉害的)
Google查找到官网 EPSON 并没什么卵用,半天你都看不到SDK文档的下载位置。
搜索 Epson SDK

image.png

image.png


  其实这个官方打印的Demo 里头的话没啥注释应该是外国淫写的,但是读起来还不算太吃力。

这里介绍几个套路:

1. 安装好Demo之后你会发现,我手机App连接着USB调试呢,待会咋通过USB连打印机设备呢。 这里就可以使用WIFI调试 进去搜索 无线连接(需要借助 USB 线)了, 记得手机连接到打印机设备需要一条转换头的线,或者是Epson的 支持的USB接口,调试一定要断开数据线使用远程调试

操作步骤:

  1. 将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。

  2. 将设备与电脑通过 USB 线连接。

    应确保连接成功(可运行 adb devices 看是否能列出该设备)。

  3. 让设备在 5555 端口监听 TCP/IP 连接:

    adb tcpip 5555
    
  4. 断开 USB 连接。

  5. 找到设备的 IP 地址。

    一般能在「设置」-「关于手机」-「状态信息」-「IP地址」找到,也可以使用下文里 查看设备信息 - IP 地址 一节里的方法用 adb 命令来查看。

  6. 通过 IP 地址连接设备。

    adb connect <device-ip-address>
    

    这里的 <device-ip-address> 就是上一步中找到的设备 IP 地址。

  7. 确认连接状态。

    adb devices
    

    如果能看到

    <device-ip-address>:5555 device
    

    说明连接成功。

2. EPOSN SDK 打印的步骤 (详细查看Demo)
  • (2.1) 先通过USB广播监听内,开启发现打印机设备,完后会有个回调监听获取已连接的打印机设备的 TargetId(初始化打印需要使用到它);

  • (2.2) 需要通过初始化 Printer打印类 ,并且设置打印监听;

  • (2.3) 创建打印数据添加到已创建到 Printer对象 中,设置小票字体样式都在这里进行设置;

  • (2.4) 连接到打印设备并且通过 sendData() 方法发送到命令缓冲区进行打印;

  • (2.5) 完成打印,清空命令缓冲区,关闭释放打印对象 。

3. 接下来到就是调试和再到植入自己的App了,期间可能会出现很多 ERRO 错误不要慌,基本上copy 在文档进行查询都能够解决问题。
4. 打印中文繁体的设置
      通过 addTextLang(Printer.LANG_ZH_TW);//繁体,看内部参数即可查找
     mPrinter.addText("取號時間取號時間  取號時間取號時間\n ");
5. 如果植入你的App时把开启搜索的代码 放入application中去初始化(建议放在USB广播监听中去获取!根据插拔的时候监并搜索),获取到target之后记录并 停止搜索 ;不能写死打印机target直接连接,必须通过开启的方式去获取
    try {
            Discovery.start(this, mFilterOption, mDiscoveryListener);//开启
        } catch (Exception e) {
            ShowMsg.showException(e, "start", mContext);
        }

     Discovery.stop();//关闭方法可以写在设备连接监听 mDiscoveryListener
  • 5.1 在开启打印的时候 运行MainActivity中的代码,封装整理成一个打印类传入数据就好。
6. 关于打印格式的问题,我这边的处理是根据和后台的协商定义好的一套规则,说白了就是指令和打印文本一同返回, 逐一解析指令转换成EPSON SDK封装好的方法即可。这样比较灵活些。tips:命令缓冲区中每处于一个模式的指令之后需要切换回原来的固定格式。也就是如下
            mPrinter.addTextSize(2, 2);//打印下一个字符集的时候定义字体大小
            method = "addText";
            mPrinter.addText("TOTAL    174.81\n");
            method = "addTextSize";
            mPrinter.addTextSize(1, 1);//继续以默认字体继续打印以下内容
使用谷歌翻译的 Printer 打印类的所有方法,传参都复制方法进去文档中查找即可

   控制打印机打印。有两种打印模式可供选择;标准和页面模式。
  ✔✔意思两种模式都能使用该方法

  标准模式逐行打印。行间距根据字符大小、图像大小和条码高度自动调整。适合印刷收据,其印刷长度因印刷内容而异。
  页面模式打印页面的页面。在一个被定义为打印区域的页面上打印字符、图像和/或条码。
要在页面模式中打印,请分别使用addPageBegin和addPageEnd来开始和结束页面模式流程。

  通信路径连接到打印机。断开与打印机的断开。状态监视器startMonitor启用状态事件通知。

 ✔✔stopMonitor 禁用状态事件通知。
✔✔地位acquisi,getStatus 获得连接打印机的状态。
✔✔传输sendData 将命令发送到打印机
✔✔事务beginTransaction 开始一个事务。
✔✔endTransaction    结束一个事务。
✔✔打印作业requestPrintJobStatus    获得打印结果。
✔✔缓冲区清除clearCommandBuffer    清除命令缓冲区。

- ✔✔文本
addTextAlign    添加文本对齐方式设置为com缓冲区。
✔- addLineSpace    将行间距设置添加到命令缓冲区
。✔✔addTextRotate    添加文本旋转设置命令缓冲区。
✔    addText    将文本添加到打印命令缓冲区。
✔✔addTextLang    将语言设置添加到命令缓冲区。
✔✔addTextFont    添加字符的字体设置为com缓冲区。
✔✔addTextSmooth    将字符平滑设置添加到命令缓冲区。
✔✔addTextSize    添加字符比例因子设置命令缓冲区。
✔✔addTextStyle    将字体设置添加到com缓冲区。
✔✔addHPosition    添加字符打印位置设置命令缓冲区。

✔✔馈纸
addFeedUnit    添加进纸设置点com的缓冲区。
✔✔addFeedLine    添加进纸设置在com行缓冲。

✔✔图形
- addImage    将光栅图像打印命令添加到命令缓冲区。
✔✔addLogo NV 打印机内置logo   标志打印命令添加到com缓冲区。
✔✔Barcode    addBarcode    向com - mand缓冲区添加条形码打印命令。
addSymbol    添加一个2 d标志打印命令的命令缓冲区。

 ✔✔统治
addHLine    行添加一个水平统治行打印命令来命令缓冲区。
✔——addVLineBegin    添加一个垂直统治开始命令行命令缓冲区。
✔——addVLineEnd    添加一个垂直统治结束命令行命令缓冲区。

 ✔页模式
addPageBegin    添加一个页面模式启动命令,命令缓冲区。
✔——addPageEnd    添加一个页面模式结束命令的命令缓冲区。——
✔addPageArea    添加页面模式打印区域设置命令缓冲区。——
✔addPageDirection    添加页面模式打印方向设置命令缓冲区。——
✔addPagePosition    添加页面模式打印位置设置命令缓冲区。——
✔addPageLine    添加一个页面模式绘制命令行命令缓冲区。——
✔addPageRectangle    添加一个页面模式矩形画com命令缓冲区。——

✔削减 
addCut    将一张切命令添加到com缓冲区。

 ✔抽屉
addPulse    将抽屉踢命令添加到com缓冲区。

 ✔蜂鸣器 
addSound    添加一个蜂鸣器声音命令com缓冲区。
✔标签纸/污点
addFeedPosition    增加了纸饲料命令com缓冲区。
✔——addLayout    添加表布局设置命令缓冲区。
✔——命令addCommand    将命令添加到命令缓冲区。

官网代码没注释,这里奉上自己封装过的打印类并且带有注释的 EpsonPrinterSample SDK开发文档 .

注意 ⚠️1

要注意添加对应的 .so ,注意当前设置的对应架构 ,
上面Demo 里面 目前只添加了默认支持32位,因为那时只有 32 位的 arm
现在2024/03/29 我看了最新的 API 2023/10/02 Ver.2.27.0 里面支持了所有架构!如果你的设备需要的话请移步下载最新的API 內對應的 .so 并且 copy 到你的項目內。记得在 build.gradle 中 設置 支持的 ndk abiFilters

在这里插入图片描述
我只添加了两个支持。按需所需。

  ndk {
            //add support SO  USB EPSON Need Eposon  
            abiFilters 'armeabi', 'x86', 'arm64-v8a'
        }

注意2⚠️
EPSON官网移到新的域名了。
https://download.epson-biz.com/modules/pos/index.php?page=soft&scat=61&ml_lang=zh-Cn

该站点将不再使用新材料进行更新,并且所有功能都将迁移到 https://epson.sn。
epson-biz.com 网站计划于 2024 年 6 月 16 日起永久关闭。
今后请使用新的 https://epson.sn 网站。
https://epson.sn/?PINF=category&OSC=WS&GROUP=pos_product

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
在Delphi安卓平台下,可以使用Android的USB主机模式API来连接USB热敏打印机进行打印。以下是一个示例代码: ``` procedure TForm1.Button1Click(Sender: TObject); var manager: JUsbManager; deviceList: JHashMap; deviceIterator: JIterator; device: JUsbDevice; intf: JUsbInterface; ep: JUsbEndpoint; conn: JUsbDeviceConnection; buffer: TJavaArray<Byte>; printerCmd: AnsiString; begin // 获取USB设备列表 manager := TJUsbManager.Wrap(TAndroidHelper.Context.getSystemService(TJContext.JavaClass.USB_SERVICE)); deviceList := manager.getDeviceList; // 遍历设备列表 deviceIterator := deviceList.values.iterator; while deviceIterator.hasNext do begin device := TJUsbDevice.Wrap(deviceIterator.next); if device.getVendorId = VENDOR_ID then // VENDOR_ID是热敏打印机的厂商ID begin // 打开设备 conn := manager.openDevice(device); if Assigned(conn) then begin // 打印小票 intf := device.getInterface(0); ep := intf.getEndpoint(0); conn.claimInterface(intf, True); try // 设置打印机参数 printerCmd := #27#64; // 初始化打印机 printerCmd := printerCmd + #27#33#0; // 设置字符大小为标准 printerCmd := printerCmd + #27#100#4; // 打印并换行 printerCmd := printerCmd + #27#109; // 切纸 buffer := TJavaArray<Byte>.Create(TEncoding.UTF8.GetBytes(printerCmd)); conn.bulkTransfer(ep, buffer, Length(buffer), 5000); finally // 关闭设备 conn.releaseInterface(intf); conn.close; end; end; end; end; end; ``` 需要注意的是,此代码仅供参考,实际使用时需要根据具体的热敏打印机型号和接口进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值