最近公司对接好多打印机,最后找到佳博。对接的时候有很多的坑,在没有技术对接的情况下我只能一个一个坑的探
首先有必要讲明一下必须完成和注重的地方

准备工作(必要)

主要是文档上说的,看文档真的很有必要。

1-sdk大致分为两部分,打印机与客显,不使用客显可以不添加so。如果只考虑打印就只把libs文件的jar拷贝的自己的项目

同样这也是我要实现的部分。

2-注册服务和权限

 <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.sample"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="14"android:targetSdkVersion="22" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.hardware.usb.accessory" /><uses-permission android:name="android.permission.WAKE_LOCK" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /><uses-permission android:name="android.permission.GET_TASKS" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /><uses-permission android:name="android.permission.WRITE_SETTINGS" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-feature android:name="android.hardware.usb.host" /><applicationandroid:allowBackup="true"android:icon="@drawable/launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><serviceandroid:name="com.gprinter.service.GpPrintService"android:enabled="true"android:exported="true"android:label="GpPrintService" ><intent-filter><action android:name="com.gprinter.aidl.GpPrintService" /></intent-filter></service><service android:name="com.gprinter.service.AllService" ></service></application></manifest>

3-添加aidl 文件

其内容大致为

package com.gprinter.aidl;interface GpService{int openPort(int PrinterId,int PortType,String DeviceName,int PortNumber);void closePort(int PrinterId);int getPrinterConnectStatus(int PrinterId);int printeTestPage(int PrinterId);void queryPrinterStatus(int PrinterId,int Timesout,int requestCode);int getPrinterCommandType(int PrinterId);int sendEscCommand(int PrinterId, String b64);int sendLabelCommand(int PrinterId, String b64);void isUserExperience(boolean userExperience);String getClientID();int setServerIP(String ip, int port);
}

4-启动并绑定PrinterPrintService 服务

   private PrinterServiceConnection conn = null;class PrinterServiceConnection implements ServiceConnection {@Overridepublic void onServiceDisconnected(ComponentName name) {Log.i("ServiceConnection", "onServiceDisconnected() called");mGpService = null;}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {mGpService = GpService.Stub.asInterface(service);}}@Overridepublic void onCreate(Bundle savedInstanceState) {conn = new PrinterServiceConnection();Intent intent = new Intent(this, GpPrintService.class);bindService(intent, conn, Context.BIND_AUTO_CREATE); // bindService}

5-使用打印服务

到了这一步我就开始跳坑了,一步两步似魔鬼的步伐,我就开始一步一步把自己遇到的坑的解决方法贴出来

1、USB打印调用int openPort(int PrinterId,int PortType,String DeviceName,int PortNumber);

该接口的作用主要是打开客户端打开客户端与打印机通讯端口,该接口会通过广播返回PrinterId的打印机的连接状态。这就是我遇到的第一个坑,如果仔细看文档的朋友可以看到‘DeviceName’该字段需要获取USB链接设备的名字的
我该怎么获得呢,静下心深挖以后,终于找到了方法。

    /*** 获取USB打印机的名字** @return 返回的打印设备的名字, noDevices:没有获取到任何打印设备*/private String getUsbDevices() {String usbname = "";UsbManager manager = (UsbManager) context.getSystemService(Context.USB_SERVICE);HashMap<String, UsbDevice> devices = manager.getDeviceList();Iterator<UsbDevice> deviceIterator = devices.values().iterator();int count = devices.size();Log.d(DEBUG_TAG, "count " + count);if (count > 0) {while (deviceIterator.hasNext()) {UsbDevice device = deviceIterator.next();String devicename = device.getDeviceName();if (checkUsbDevicePidVid(device)) {Log.e(DEBUG_TAG, "DevicesName " + devicename);usbname = devicename;}}} else {Log.e(DEBUG_TAG, "noDevices ");usbname = "noDevices";}return usbname;}/*** 判断是否是USB打印机** @param dev* @return*/private boolean checkUsbDevicePidVid(UsbDevice dev) {int pid = dev.getProductId();int vid = dev.getVendorId();boolean rel = false;if ((vid == 34918 && pid == 256) || (vid == 1137 && pid == 85) || (vid == 6790 && pid == 30084) || (vid == 26728 && pid == 256) || (vid == 26728 && pid == 512) || (vid == 26728 && pid == 256) || (vid == 26728 && pid == 768) || (vid == 26728 && pid == 1024) || (vid == 26728 && pid == 1280) || (vid == 26728 && pid == 1536)) {rel = true;}ret

链接打印机

class PrinterServiceConnection implements ServiceConnection {
@Override
public void onServiceDisconnected(ComponentName name) {

         Log.i(DEBUG_TAG, "onServiceDisconnected() called");mGpService = null;}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {mGpService = GpService.Stub.asInterface(service);initUSBDevices();}}/*** 启动打印服务*/public void connection() {conn = new PrinterServiceConnection();Log.i(DEBUG_TAG, "connection");Intent intent = new Intent(context, GpPrintService.class);context.bindService(intent, conn, Context.BIND_AUTO_CREATE); // bindService}/*** 链接USB打印设备*/private void initUSBDevices() {int rel = 0;if (TextUtils.isEmpty(DeviceName)) {if (DeviceName.equals("noDevices")) showToast("请检查打印机设备是否连接");return;}try {rel = mGpService.openPort(PrinterId, PortParameters.USB, DeviceName, 0);GpCom.ERROR_CODE r = GpCom.ERROR_CODE.values()[rel];switch (r) {case SUCCESS://正常Log.e(DEBUG_TAG, "正常");break;case FAILED://失败Log.e(DEBUG_TAG, "失败");break;case TIMEOUT:// 超时Log.e(DEBUG_TAG, "超时");break;case INVALID_DEVICE_PARAMETERS://无效的参数Log.e(DEBUG_TAG, "无效的参数");break;case DEVICE_ALREADY_OPEN://端口已经打开Log.e(DEBUG_TAG, "端口已经打开");break;case INVALID_PORT_NUMBER://无效的端口号Log.e(DEBUG_TAG, "无效的端口号");break;case INVALID_IP_ADDRESS://无效的 ip 地址Log.e(DEBUG_TAG, "无效的 ip 地址");break;case INVALID_CALLBACK_OBJECT://无效的回调Log.e(DEBUG_TAG, "无效的回调");break;case BLUETOOTH_IS_NOT_SUPPORT://设备不支持蓝牙Log.e(DEBUG_TAG, "设备不支持蓝牙");break;case OPEN_BLUETOOTH: //请打开蓝牙Log.e(DEBUG_TAG, "请打开蓝牙");break;case PORT_IS_NOT_OPEN://端口未打开Log.e(DEBUG_TAG, "端口未打开");break;case INVALID_BLUETOOTH_ADDRESS://无效的蓝牙地址Log.e(DEBUG_TAG, "无效的蓝牙地址");break;case PORT_IS_DISCONNECT://端口连接断开Log.e(DEBUG_TAG, "端口连接断开");break;}} catch (RemoteException e) {e.printStackTrace();}}

这样基本上就已经链接上打印设备了你就可以调用打印设备了。这些方法基本上我都卸载 PrinterUtils中,有什么的不明白的可以下载下来dome看一下

dome地址

USB热敏打印机(佳博)相关推荐

  1. android通过USB连接佳博80打印机

    GitHub项目地址 条件:1安卓主板上有USB口,2,rom内置了打印驱动 不行就用其他方式或者换主板吧(本人当初使用的工控主板坑得不要不要的) 本文介绍的是使用USB方式 佳博提供两个函数打印 1 ...

  2. win7 usb 热敏打印机 记录 佳博 GP-L80180

    使用的是 佳博的 GP-L80180 系列 热敏票据打印机 上面这个工具可以使用: USB以及串口打印机测试软件(POS指令集) https://download.csdn.net/download/ ...

  3. 佳博 GP-L80180 USB ESCPOS VC 开发

    手头有一个佳博 GP-L80180 热敏打印机,该打印机有USB口 ,串口. 给的例子,串口通了,通过USB口,安装驱动之后,也可以打印测试页. 但是用VC程序 通过系统驱动打印的方式 ,不是很熟悉. ...

  4. 佳博 热敏打印机 ESCPOS 指令研究

    Test.txt内容: 参考打印到文档功能: 初识打印机驱动 http://www.cnblogs.com/MrDing/p/4078189.html 热敏打印头打印原理和C实现黑白位图的放大 htt ...

  5. 佳博/芯桦打票机对接(含USB和网口)

    佳博/芯桦打票机对接(含USB和网口) 记录一下最近实现的一个需求,用PHP远程连接芯桦.佳博打票机,代码还未进行优化,基本功能已经实现打印,具体打印指令需要查看佳博/芯桦的打票机指令,USB口打印质 ...

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

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

  7. JAVA 佳博热敏打印机利用TSCLIB.dll动态链接库打印物料条码

    JAVA 佳博热敏打印机利用TSCLIB.dll动态链接库打印物料条码 准备 1.TSCLIB.dll (下载版本与jdk版本一致,32位/64位) 2.佳博热敏打印机一台(或其他tsc系列打印机) ...

  8. Android接入热敏打印机,Android 关于佳博和汉印蓝牙热敏打印机开发

    接上篇文章Android之BLE(低功耗)蓝牙开发,本篇文章针对上篇博文中提出的两款打印机的开发流程进行记录. 首先不管时佳博打印机还是汉印打印机,都是先对他们各自的lib进行导入,如图: 导入lib ...

  9. Android 关于佳博和汉印蓝牙热敏打印机开发

    接上篇文章Android之BLE(低功耗)蓝牙开发,本篇文章针对上篇博文中提出的两款打印机的开发流程进行记录. 首先不管时佳博打印机还是汉印打印机,都是先对他们各自的lib进行导入,如图: 导入lib ...

最新文章

  1. 一些链接, 关于不可变数据
  2. 华人小哥开发“黑话”数据集,AI:你连dbq都不知道,xswl!| NAACL 2021
  3. OPENCV裁剪图片
  4. python PyQt5 sender(是发出信号的对象)、receiver(接收信号的对象)、slot(插槽)(是对信号做出反应的方法)
  5. 在win10系统中安装Visual C++ 6.0的具体方法
  6. 使用Java 9向Javadoc搜索添加术语
  7. vue 用key拿对象value_利用 WeakMap 对 Vue 新建数组中的对象赋予 :key
  8. 需求分析师的基本功:逻辑思维、逻辑分析与逻辑表达
  9. 使用pscp实现Windows 和 Linux服务器间远程拷贝文件
  10. 如何使用C#操作WinAPI
  11. TIM-VX编译体验
  12. 【2020年领域新星】 Ruibo Liu 达特茅斯学院
  13. 【计算机组成与结构】中央处理器
  14. SAP那些事-理论篇-15-SAP顾问的三重境界
  15. can‘t decrement vector iterator before begin
  16. 无线ap安全dhcp服务器,AC+AP时代——办公区内满足安全性又够人性化的WiFi漫游设置攻略...
  17. 〖Python 数据库开发实战 - Python与MySQL交互篇⑰〗- 项目实战 - 实现用户管理 - 修改用户
  18. (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(printf)
  19. CBitmap Detach DeleteObject关系
  20. MySQL ODBC驱动安装和配置数据源

热门文章

  1. Leetcode 1386:安排电影院座位(超详细的解法!!!)
  2. 【大唐杯学习超快速入门】5G技术原理仿真教学——5G移动性管理
  3. sqlite3用法详解草稿
  4. 磁盘、柱面、磁道、磁头、扇区
  5. 如何设置Google Chrome的界面显示语言
  6. ActiveMQ知识概括
  7. 专题总纲目录 计算机学科基础
  8. 基于UGUI 的 游戏UI框架的一些想法
  9. java JSR303 参数验证
  10. MacBook使用技巧:如何解决经常死机