商米机打印调试

  • 简介
  • K1自助收银机
  • 扫码台说明
  • K1 内置打印机说明
  • 补充


简介

本人公司最近使用到商米机设备,但是网上参考资料有限,官网文档的资料比较陈旧,有不少坑点,结合自身使用情况,对商米机的基本调试进行说明.以下以K1型号自助收银机为例

K1自助收银机

挂壁式无人收银机,我使用到的是USB扫码台样式的,还有一种串口式的.USB式的只能获取扫码信息,不能发送指令:

  1. 扫码台说明;
  2. 内置打印机说明

扫码台说明

·USB 扫码台相当于 USBkeyboard 键盘,只支持数据接收。接收方式有如下 2 种:
1.系统默认“模拟键盘输出”
直接用 dispacthKeyEvent 进行数据接收即可。
2.设置为“广播输出”
此模式下类似于串口扫码台,数据不会像键盘模式那样输出到 APP 页面中的输入
框内;此时须用广播方式接收数据,与如下“串口扫码台”一致。
设置方式:
法 1:在设备的“设置”->“扫码与键盘”中修改为“不输出”+“广播输出”。
法 2 在代码设置(建议):
action:com.sunmi.scanner.ACTION_BAR_DEVICES_SETTING

字段说明: key 解释 字段类型(*必传字段) *name:设备名--String(可为空 String-"";name/pid/vid 可在“设置”->“扫码与 键盘”中查看) *pid:扫码枪-产品识别码(PID)--Integer *vid:扫码枪-供应商 ID(VID)--Integer *type:是否是扫码枪--Integer toast:是否显示调试 Toast 提示--Boolean 默认:false

type 类型说明: 0-->键盘(默认) 1-->扫码枪,直接到 UI(KeyEvent) 2-->扫码枪,不直接到 UI(广播模式) 3-->扫码枪,加速模式(copy,需要 1.0.18)

坑点 :1.USB扫码台不支持发送指令,而且扫码灯常亮,需要自己添加开关防止多扫,
2.获取扫码回调的code 是以一串数字+"\n"的形式返回,导致打log的时候看不出来,但是数据处理就是错误,打断点调试的时候就会发现.

示例(设置某设备为广播输出):

设置设备为广播输出的示例

Intent intent = new Intent();
// ACTION_BAR_DEVICES_SETTING == "com.sunmi.scanner.ACTION_BAR_DEVICES_SETTING"
        intent.setAction(ACTION_BAR_DEVICES_SETTING);
        //name/pid/vid 可在“设置”->“扫码与键盘”中查看
        intent.putExtra("name", "Synmbol Bar Code Scanner.");
        intent.putExtra("pid", 4608);
        intent.putExtra("vid", 1504);
        intent.putExtra("type", 2);
        intent.putExtra("toast", true);
        sendBroadcast(intent);

监听扫码回调示例

private void registerAddGoodsReceiver() {
        IntentFilter filter = new IntentFilter();
        //注意:监听回调的广播和设置广播输出不一样
        filter.addAction("com.sunmi.scanner.ACTION_DATA_CODE_RECEIVED");
        registerReceiver(mAddGoodsReceiver, filter);
    }
  //上面有提到USB扫码台只能获取数据,不支持发送指令,因此扫码会常亮,需要自己设置开关防止多扫出现
    /**
     * 自定义扫码标记,防止多扫
     */
    boolean isScaning = false;
    private BroadcastReceiver mAddGoodsReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String code = intent.getStringExtra(DATA);
            if (code != null && !code.isEmpty() && !isScaning) {
              //注意!这里有个大坑,code是一组数字后面会加上"\n",需要自己进行处理
                String[] final_code = code.split("\\n");
                LogUtil.e(final_code[0]);
                isScaning = true;
                //TODO
                //拿到结果进行操作  
                isScaning = false;
            }
        }
    };

K1 内置打印机说明

打印方式使用Aidl方式,文档可以在开发文档 导入文档后有几个小坑点:

1;aidl放置位置

python模拟奶茶店收银机 奶茶店收银机怎么设置_串口


2.需要导入基础包

python模拟奶茶店收银机 奶茶店收银机怎么设置_python模拟奶茶店收银机_02


aidl使用 文档里有,可以参照文档来,这里就是帮大家说明了几个容易遗漏的点

补充

1.获取当前设备pid vid 等信息

HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();

        for (UsbDevice usbDevice:deviceList.values()){
            LogUtil.e("usbDevice="+usbDevice);
        }

mProductId —pid
mVendorId — vid
mProductName — name

2.去掉扫码返回数据的后缀方法:
1.软件中做处理;
2.手动扫配置码,关掉后缀(需要联系有关人员获取)