Sunmi收银demo

商米提供一个简易App来展示如何使用副屏,扫码,打印,电子秤,人脸支付等功能。支持台式收银系列(除T1,T1Mini),手持非金融系列,电子秤系列,K1

SunmiCashierDemo_2.0.46

酒店自助发卡demo,包含身份证读取,发卡,指示灯控制

2.0.0 增加支付开关,增加自动安装支付宝刷脸支付app,合并版本

由于使用了GreenDao,下载使用时需要build一下生成daomaster和daosession

Sunmi收银demo介绍

T1设备请参考开发者文档上T1目录下的内容,这里不做介绍

参考代码在s 和main目录下

使用支付宝刷脸支付时,需使用商米收银台实现刷脸功能,具体请联系商米客服。

功能介绍:

1. 双屏功能:

商米双屏设备分 15.6寸大屏和10寸小屏,其中15.6寸副屏支持触控。有且仅当副屏为Presentation显示时才能获取触控。

双屏使用的是Presentation类来实现双屏异显:

首先是权限

创建一个类继承 Presentation

public class TextDisplay extends Presentation

获得真实存在的副屏

public Display getPresentationDisplays() {
DisplayManager mDisplayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
displays = mDisplayManager.getDisplays();
for (int i = 0; i < displays.length; i++) {
Log.e(TAG, “屏幕” + displays[i]);
if ((displays[i].getFlags() & Display.FLAG_SECURE) != 0
&& (displays[i].getFlags() & Display.FLAG_SUPPORTS_PROTECTED_BUFFERS) != 0
&& (displays[i].getFlags() & Display.FLAG_PRESENTATION) != 0) {
Log.e(TAG, “第一个真实存在的副屏屏幕” + displays[i]);
return displays[i];
}
}
return null;
}

显示副屏

textDisplay = new TextDisplay(this, getPresentationDisplays());
textDisplay.show();

既可实现在副屏显示页面

2.打印服务

商米打印服务是使用AIDL自行研发

其中 k1系列的打印服务和台式的有些许不同,连接方式如下

自助系列

private void connectKPrintService() {
Intent intent = new Intent();
intent.setPackage(“com.sunmi.extprinterservice”);
intent.setAction(“com.sunmi.extprinterservice.PrinterService”);
bindService(intent, connService, Context.BIND_AUTO_CREATE);
}
private ServiceConnection connService = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
extPrinterService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
extPrinterService = ExtPrinterService.Stub.asInterface(service);
}
};

台式与手持系列:

在gradle中

dependencies {
implementation’com.sunmi:printerlibrary:1.0.5’
}

兼容以前的aidl方式

privateSunmiPrinterServicewoyouService=null;//商米标准打印打印服务
//连接打印服务
privatevoidconnectPrintService(){
try{
InnerPrinterManager.getInstance().bindService(this,
innerPrinterCallback);
}catch(InnerPrinterExceptione){
e.printStackTrace();
}
}
privateInnerPrinterCallbackinnerPrinterCallback=newInnerPrinterCallback(){
@Override
protectedvoidonConnected(SunmiPrinterServiceservice){
woyouService=service;
}
@Override
protectedvoidonDisconnected(){
woyouService=null;
}
};

3. 支付(支持 扫码支付,支付宝刷脸支付)

 推荐使用Sunmi收银台聚合支付。

详细使用方式和情况请联系商米技术支持秦昌盛
Phone: 18101767460 与业务支持赵琨 Phone:
18101811986

demo中只提供基础交易方式

初始化

PayMentPayPresenter payMentPayPresenter = new PayMentPayPresenter(mContext);

注册监听

payMentPayPresenter.init(callback);

开启刷脸支付

payMentPayPresenter.startFaceService(orderId, phoneNumber,money);

开启扫码支付

payMentPayPresenter.startPayCode(orderId, qrCode ,money);

关闭sunmi收银

payMentPayPresenter.destoryReceiver();

消息接收广播

public class ResultReceiver extends BroadcastReceiver {
private static final String TAG = “ResultReceiver”;
@Override
public void onReceive(Context context, Intent intent) {
if (“sunmi.payment.action.result”.equals(intent.getAction())) {
String responseStr = intent.getStringExtra(“response”);
Log.e(TAG, “response = “ + responseStr);
final PaymentResponse response = JSON.parseObject(responseStr, PaymentResponse.class);
if (“T00”.equals(response.resultCode)) {
aliResultCallback.onSuccess(response);
} else {
aliResultCallback.onFail(response);
}
}
}
private AliResultCallback aliResultCallback;
public void setResultCallback(AliResultCallback callback) {
this.aliResultCallback = callback;
}
public interface AliResultCallback {
void onSuccess(PaymentResponse response);
void onFail(PaymentResponse response);
}
}

支付宝刷脸支付QA

Q:使用源码编译的apk无法刷脸?
A:源码中的AlipaySmileModel文件中填入你在蚂蚁开放平台申请开通的参数之后,根据支付宝相关规定进行数据调整才可以直接使用支付宝刷脸功能

Q:如何使用支付宝刷脸支付功能?

A:您可以使用商米收银台调用刷脸功能。或直接在蚂蚁开放平台申请此功能,并且在商米开发者平台申请调用支付宝刷脸服务的权限。

Q:双屏机器如何使用刷脸支付?

A:直接使用商米收银台,收银台将同步支持最新版的支付宝刷脸功能。或者由第三方软件自主控制是否显示在副屏,需要调用zolozVerify方法时增加参数params.put("smile_mode", "1");

Q:调用刷脸报1070错误?

A:在设置-应用中找到simle软件,开启允许在其他应用上运行的权限。

4.电子秤

S2系列电子秤直接使用封装好的jar包 scale-service-lib.jar

//连接电子秤服务
private void connectScaleService() {
mScaleManager = ScaleManager.getInstance(this);
mScaleManager.connectService(new ScaleManager.ScaleServiceConnection() {
@Override
public void onServiceConnected() {
getScaleData();
}
@Override
public void onServiceDisconnect() {
}
});
}
//实时获取电子秤数据
private void getScaleData() {
try {
mScaleManager.getData(new ScaleCallback.Stub() {
@Override
public void getData(final int i, int i1, final int i2) throws RemoteException {
net = i;
// i = 净重量 单位 克 ,i1 = 皮重量 单位 克 ,i2 = 稳定状态 1 为稳定。具体其他状态请参考商米开发者文档
}
});
} catch (RemoteException e) {
e.printStackTrace();
}
}

5.扫码枪

扫码枪其实就是一个外接键盘,事件在dispatchKeyEvent中获取,二维码和条形码每一位都会触发一次该方法,有些扫码枪在输入完成后会主动多调用一次enter按键。

demo中提供一个简易的扫码监听方式:

private StringBuilder sb = new StringBuilder();
private Handler myHandler = new Handler();
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
int action = event.getAction();
switch (action) {
case KeyEvent.ACTION_DOWN:
int unicodeChar = event.getUnicodeChar();
sb.append((char) unicodeChar);
Log.e(TAG, “扫码===“ + event.getKeyCode() + “ “ + sb.toString());
if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP) {
return super.dispatchKeyEvent(event);
}
if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) {
return super.dispatchKeyEvent(event);
}
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
return super.dispatchKeyEvent(event);
}
if (event.getKeyCode() == KeyEvent.KEYCODE_MENU) {
return super.dispatchKeyEvent(event);
}
if (event.getKeyCode() == KeyEvent.KEYCODE_HOME) {
return super.dispatchKeyEvent(event);
}
if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) {
return super.dispatchKeyEvent(event);
}
final int len = sb.length();
myHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (len != sb.length()) return;
Log.e(TAG, “isQRcode”);
if (sb.length() › 0) {
//Do something
sb.setLength(0);
}
}
}, 200);
return true;
default:
break;
}
return super.dispatchKeyEvent(event);
}

扫码底座

扫码底座

功能介绍

  1. USB接口扩展
  2. 充电
  3. 扫码

使用demo下载

扫码头引擎(红外线扫码)

扫码头引擎(红外扫码)

软件编程请参考:   用户指南

1.      可识别的码

不同的扫码头支持的码类型不同

新大陆二维扫码头支持的码类型:

code128,uccean128,ean8,ean13,upce,upca,itf,matrix,code39,codabar,code93,isbn,

industrial25,standard25,Plessey,code11,msiplessey,pdf417,qr,datamatrix,hanxin

斑马二维扫码头支持的码类型:

auspostal,Aztec,chinese25,codabar,code11,code128,code39,code93, itf, pdf417,

compositeab,composite,uccean128,ean8,ean13,issnean,isbn,upca,upce,upce1,

matrix,discrete25,msiplessey,gs1databar, qr,datamatrix,hanxin,maxi, isbt128,korea35,uspostnet,usplanet,ukpostal,japanpostal

新大陆/鹰捷支持的码类型:

ISSN EAN,MIS-Plessey,Standard 2 of 5,Industrial 2 of 5,ISBN,Code 11,Code 93,Codabar,Code 39,Matrix 2 of 5,Interleaved 2 of 5(ITF),UPC-A,UPC-E,EAN13,EAN8,UCC-EAN128,Code128

选择可识别的码:

用户可在设置界面中选择开启或关闭制定识别码,默认开启全部识别码。

        

2.      编码方式

用户可在设置中进行输出编码的设置

默认utf8

可选UTF-8,GBK,ISO-8859-1,SHITF-JIS

3.      提示方式

用户可在设置中进行提示方式设置

默认打开声音提示和震动提示

4.      输出方式

用户可在设置中进行扫码结果的输出方式设置

默认选中模拟键盘方式输出,默认自动补回车

默认开启广播输出

5.      触发模式

用户可在设置中选择触发模式

默认短按触发扫码,扫码成功后扫码头自动熄灭

新大陆扫码头和斑马扫码头在短按触发,连续扫码选项表现的现象不同

当机器为新大陆扫码头,并且选中了短按触发,连续扫码后,扫码头会自动进入连续扫码模式,扫码头会常亮一段时间后熄灭,然后又重新亮起开始扫描,如此循环

当机器为斑马扫码头,并且选中了短按触发,连续扫码后,机器会自动进入连续扫码模式,扫码头会常亮,除非再次按下扫码键,否则扫码头灯光不会熄灭,且相同的码只会输出一次。

—————————————————————————————————————-

6.     Q&A

常见问题:

1,问:如何对接扫码头

答:为了方便开发者,商米把扫码头做成了一个免开发的设备。一般用户无需针对扫码头做开发即可获取扫码内容

2,问:如何获取扫码结果

答:商米提供了3中数据输出方式,

1),模拟键盘:会把扫码结果模拟成按键事件,会自动输出到焦点框文本,用户可以通过获取焦点框内容或者监听按键事件来获取扫码结果;2),直接填充:会把扫码结果拷贝到粘贴版,会自动输出到焦点框文本,相比较与模拟键盘输出方式,直接填充的输出速度更快;3),广播输出:会把扫码结果作为广播发送,用户可以监听广播来获取扫码结果。

3,问:连续扫码结果不一致

答:输入法会影响扫码输入结果,已知百度小米版输入法会影响扫码结果输出,可更换谷歌拼音输入法。

4,问:扫码结果比较慢

答:如果选择了模拟按键输出模式,按键间隔时间会影响输出速度,设置为0为最快速度。(默认0)

5,问:需要兼容摄像头扫码和扫码头扫码

答:L2斑马扫码头与摄像头不可同时开启,用户可以判断机型来区分商米设备和其他设备,在商米设备上使用侧键扫码

6,问:软件触发扫码

答:可参考L2用户指南 中的aidl接口,扫码服务提供了软触发的接口。

7,问:扫描中文二维码出现乱码

答:解析带中文的二维码需要把 输出编码 匹配 二维码中中文的编码格式,比如二维码的中文“你好”的编号格式为UTF-8,扫码头输出编码也需要设置UTF-8才能正确输出“你好”,否则将会输出乱码。

外接USB串口设备

USB、串口设备使用说明文档

1. 简介:

外设接口 LAN 口,钱箱口, usb2.0 口,串口,耳机孔等通用通信接口。
本文主要介绍钱箱口,usb 口和串口的使用方式。

2.接口说明

1)钱箱口:钱箱口使用RJ12接口。 开发者可以通过向钱箱口发送数据来控制钱箱。
钱箱开发者文档及资源文件
2)串口: 串口使用 RJ11 接口。 开发者可以通过串口的数据发送来控制外设。 商米设备的RJ11为四线,不支持硬流控(部分外设默认开启硬件流控,这些设备无法通过RJ11连接商米主机)。
由于安全考虑,不支持串口节点遍历,但可以直接打开端口进行通信 (
D2mini,T1,T1mini:机器底座串口的节点路径/dev/ttyHSL1,
T2,S2,T2lite,X2,T2mini:/dev/ttyHSL3,
N1、D2、D1s单屏:/dev/ttyS1,
N1、D2、D1s双屏:/dev/ttyS3) 
串口参考demo ,JNI参考
16001521077720_
通信文档事例:Jaynes 串口电子秤通信文档(不同电子秤通信协议需参考每家厂商提供的 文档)
3) USB 口: 支持 USB2.0 协议的 USB 设备。
USB 通信开发者文档   

SunmiOS支持的USB转串口芯片列表

目前支持的USB转串口芯片有:CH341、FT系列、PL2303、CP210X系列

插入USB转串口线或者板子会生成:/dev/ttyUSERx节点,其中x:表示序号0,1,2,3…..

使用USB转串口时请勿使用USB调试线,二者互斥,只能同时使用一个功能 
3.1 获取 USB 设备的 PID/VID:
方法1:java代码
try { //获得外接USB输入设备的信息 Process p=Runtime.getRuntime().exec(“cat /proc/bus/input/devices”); BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); String line = null; while((line = in.readLine())!= null){ } String deviceInfo = line.trim(); //对获取的每行的设备信息进行过滤,获得自己想要的。 } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } *deviceinfo中包含每个设备的pid和vid*
方法2:adb命令
 adb shell cat /proc/bus/input/devices 
3.2 通用 USB 外设HID设备默认支持 HID 协议设备(鼠标键盘扫码枪等),可即插即用。 
HID 扫码枪
HID扫码枪可即插即用:连接商米设备,在商米设备上打开一个可编辑框并获取焦点,扫码。此时编辑框应该被输入条码或者二维码内容。
从代码获取扫码内容可参考USB 外设通信谷歌开发者文档
U盘
支持的U盘格式: FAT32:可读可写;NTFS:可读不可写 ;exFAT:不支持
摄像头
商米支持 USB UVC 摄像头 (如LogitechC170,C100,C525)

Demo

源码
商米读写器侧边栏可接入商米读卡器(刷卡槽接口)
商米读卡器包含两部分,一部分为磁条卡刷卡,磁条卡刷卡可参考商米读卡器开发包和读卡器demo。另一部分为nfc,nfc为android原生接口,可参考android nfc开发文档
商米读卡器开发包
商米读卡器demo
商米读卡器demo源码

第三方通用读写器商米目前已经支持四款第三方usb通用读写器,开发者可参考商米提供的demo做读卡写卡操作。

  1. 上海亿矽智能科技有限公司 UM002读卡器
  2. 深圳市德卡科技有限公司 T10读写器(需支持android版本,电源充电版)
  3. 香港龙杰智能卡有限公司 ACR1281U-C1读写器
  4. 香港龙杰智能卡有限公司 ACR1281U-K1读写器

开发文档2.0

通用读写器demo

通用读写器demo源码

打印

打印服务文档

1.内置/一体机打印开发文档

连接方式:蓝牙(蓝牙设备名:InnerPrinter),AIDL、JS桥。第三方APP可以通过连接内置打印机进行打印业务。商米打印机包含的功能:58和80mm两种打印规格的热敏打印机,切刀(部分机器),钱箱(部分机器),客显(部分机器)

内置打印机开发文档

开发者可以参考内置打印机开发文档来了解打印机的工作模式和接口调用方式

ESCPOS指令文档

打印机兼容ESC&POS指令,但与标准ESC&POS指令有略微区别,通过指令文档了解商米支持的escpos指令集

打印Demo 源码

demo仅支持商米内置打印机,外部蓝牙串口网络USB打印机不适用此demo,自助机打印方式请参考本文下方《自助机打印文档》

eclipse Demo  |  Android Studio Demo

商米提供一个简易版的通过JS的方式调用打印机的demo,开发者可参考demo来通过网络调用打印机。

如果用户需要把网页端的内容通过商米打印机打印出来,除了通过js的方式,还可以通过android原生打印功能实现,商米提供了一个打印插件支持。用户可以通过商米应用市场搜索Sunmiprinterplugin,下载并安装后,即可通过浏览器的打印功能来打印网页内容。

  • 其他工具

从应用市场下载随印,可支持屏幕截图打印和相机拍摄打印,有黑白和抖动灰度两种打印方式可选(现已支持V1设备)。

2.自助机打印文档

自助机打印文档适用于SunmiK1、SunmiK2

自助机打印开发文档|自助机打印AIDL文档资源

3.外配打印机开发文档

目前支持打印机:NT210 usb打印机

外配打印机开发文档

摄像头扫码说明

针对商米设备,如果使用摄像头扫码,商米提供了经过优化的扫码SDK和扫码组件供开发者使用,能够更快的识别二维码和条形码。

一、扫码开发文档

二、Demo

  1. 手持设备

手持设备摄像头扫码DEMO

  1. 台式设备

目前支持的摄像头扫码的商米台式设备包括:T1mini/T2mini 等带摄像头的设备,调用扫码的方法跟手持设备一样,但有一些不同的地方需要注意,如提示灯,横屏竖屏,定焦和变焦等,参考示例:

横屏demo    竖屏demo

三、网页调用

商米提供了一个简单的demo,来演示如何在chrome中打开摄像头。
网页调用摄像头demo

四、目前支持扫码类型

一维码:EAN-8, EAN-13, UPC-A, UPC-E, Codabar, Code39, Code93, Code128, ISBN10, ISBN13, DataBar, DataBar Expanded, Interleaved 2 of 5

二维码:QR Code , PDF417,DataMatrix,AZTEC

五、注意事项
1. 商米扫码库仅支持在商米设备上使用
2. 为了确保用户体验,商米扫码库会不定期的更新,如果是自己集成的方式,只需要替换相应的so和jar文件即可。

资源包下载

版本 更新内容
1.3.3 1.修正部分一维码(Code39,Code93,Interleaved25,Codabar,Code128)无法禁止识读的bug
2.jar包版本更新为1.1.3,libsunmiscan.so版本号更新为1.3.3
1.3.0 1.去掉libiconv.so,即解码库只有一个so文件libsunmiscan.so(包括32,64位平台)
2.解决内存泄漏问题
3.增加点阵打印QR码识读,开启方式scanner.setConfig(Symbol.QRCODE, Config.ENABLE_DPM,1);//允许识读点阵打印QR码,默认0:禁止
1.2.9 1.增加64位平台(arm64-v8a)解码库
2.去掉libscaninit.so,同时jar包去掉libscaninit.so库版本查询接口
3.jar包版本更新为1.1.1
4.修复若干由于增加64位解码库发现的兼容性问题
1.2.8 1.优化code39解析能力
2.针对银联扫码能力测试要求的部分修改,该版本已通过银联扫码能力测试和最佳实践测试
3. 增加ISBN10 ISBN13输出使能控制
1.2.6 1.增加解码结果字节模式输出接口
2.解决倾斜角度扫一维码偶现程序异常的问题
1.2.5 1. 增加解码结果字节模式输出接口
2.优化一维码定位算法和解码时间
1.2.4 1.解决码字符中有不可以显示字符导致的解码结果字符解析异常的问题
2.其他优化
1.2.2 1. 优化打开相册读取高分辨率的图片解码慢的问题
2.解决使用Android7.0后硬件管家的扫码成功后没有结果返回的问题,
1.2.1 1.新增支持的二维码DataMatrix和Aztec(默认关闭,需要设置开启识读)
2.支持识读缺损一个定位符的QR码的识读
3.解决因开启多码同时识读时的bug
1.1.0 1.一维码可360度识读,之前的版本只在接近水平垂直方向识读
2.QR码识别速度提升一倍
3.解决QR码混合编码(中英文等)译码出现的bug
4.解决PDF417测试出现的潜在内存异常风险(如除0,内存溢出等)
1.0.1 1.增加了二维码PDF417的解码算法(默认关闭,需要设置开启识读)
2.减少了部分一维码的误码率
3.对于比较长的一维码可以竖屏全屏读取
4.对于上下并排的多个一维码,优先读取中间的条码
5.一维码和QR码支持反色和镜像解码,PDF417支持镜像解码
6.增加了解码库版本查询功能
1.0.0 基础版本, 支持识读二维码QR和10多种主流一维码

电子秤

电子秤

主机型 S2
量程 15Kg
分度数(精度等级) 3000(C3)
检定分度值 e=d=2/5g
蠕变(%FS/30min) ±0.0167
安全过载(%FS) 150
破坏过载(%FS) 300
工作温度(℃) 0-40℃
电子水平校准 支持
精度 <6Kg 精度0.002Kg;6Kg到15Kg精度 0.005Kg

电子秤使用指南

Sunmi收银demo来展示如何使用副屏,扫码,打印,电子秤,人脸支付等功能

小闪

小闪是一款即插即用的扫码设备,使用方式类似扫码枪。

把小闪插入主机设备,通过小闪扫码后,小闪将会把扫码内容通过按键键值的方式传输给系统,系统的焦点输入框会自动输入扫码结果。