如何将智能手机变成成熟的收银台

每天在商店中,我们都会看到不同的收银台-各种带有神秘按钮的嵌入式解决方案。 这些收银台的后面是收银员,他们喊“加利,我们已经取消了。” 这对于收银员和购买者都是不方便的。


随着时间的推移,结帐界面变得更加用户友好,并且已经不需要Gali,但是结帐仍然是繁琐而复杂的工件。



我叫Vladimir Sarbeev,我是MySklad的一名Android开发人员。 而且我敢肯定收银机可以紧凑方便。 此外,您可以将智能手机变成收银员。


在MyStore中,我们创建了Kassa MyStore移动应用程序。 这是智能手机内的完整票房。


它的工作方式是这样的:授权后,收银员可以打开和关闭班次,直接或通过预订出售商品,将现金考虑在内。 您可以将需要工作的设备连接到收银员。 它们在照片中:



1-票房Atol Sigma 10; 2-不支持该应用程序,与员工集成
3-售票处Atol 11F; 4-终端Verifone VX820; 5-终端PAX S90
6-Shtrikh-Nano-F的票房; 7-售票处Atol 15F; 8-票房Bar-ON-LINE
9-条码扫描器; 10-PayMe终端; 11-收银台MSPOS-K


智能手机本身无法打印出现金收据并无法通过信用卡接受付款,因此需要收银台和付款终端。 如果智能手机的相机不适合完全替换条形码扫描仪,则需要硬件扫描仪。


全视之眼


甚至在Cash Desk MySklad发布之前,我们就确定该相机是一台相机,但是用户可能拥有他要使用的硬件条形码扫描仪。


我们可以使用普通HID(人机界面设备)形式的扫描仪。 读取条形码后,我们会从扫描仪获得一系列字符。 这也许是最简单的集成。 最简单的,即使不是两个“ buts”。


首先,扫描仪“开箱即用”可能根本无法传输任何内容。 其次,并非所有扫描仪型号都向我们发出条形码读取完成的信号。


第一个“ but”可以简单地解决:如果扫描仪开始不发送应扫描的内容,则需要查找扫描仪的说明并使用服务条形码进行配置。 通常,说明以纸质形式或由制造商以电子形式完成。 描述可用的设置后,它包含按所需顺序扫描的条形码。 因此,您可以根据需要配置扫描仪。


第二个“但是”是一个更严重的问题。 扫描仪的范围很广,并且并非所有设备都显示读取行的末尾。 解决此问题有两种选择。 第一种是使用相同的服务条形码来设置将在读取后传输换行符的设置。 如果您对模型不满意,并且第一个选项不合适,则可以设置扫描仪后缀。 使用服务条形码,在读取序列的末尾添加一个字符,您可以通过该字符捕获输入的末尾。


连接收银台


因此,该应用程序已存在,条形码扫描器已连接,但我们仍然无法打印支票。 为此,我们需要票房本身。 在MySklad中,我们支持KKT Atol和Shtrikh,也支持MSPOS,我将在另一篇文章中介绍。


当与收银员整合时,铁码的数量开始无休止地增长。 我们决定将所有与连接设备有关的工作放到一个单独的库中。 收银机应用程序本身已成为客户通过gradle获取图书馆的服务。


根据型号,您可以通过USB,蓝牙或Wi-Fi连接。 而且还根据UART协议,在一种情况下,这是收银机和Android设备的刚性耦合。 同样,不同的供应商在将客户端连接到结帐的实现方式上也有根本不同。 通过本机.so库进行Java包装,通过开放源jPOS库进行附加,甚至通过具有AIDL接口(Android接口定义语言)的服务访问的财务内核。


在第一次尝试集成一个制造商的设备时,我们对KKM设备交互方案感到满意:



但是考虑到驱动程序实现的数量,连接方法和功能的一致性,我们决定重新考虑使用硬件。 结果,以前的方案变成了这种形式:



T是特定的低级驱动程序包装器


设备管理器向客户端隐藏连接的实现。 创建一个连接向导就足够了,它将需要您依次选择收银员的制造商​​,连接类型并指定设置。 如果连接成功,它将向我们返回一个实现KKMDevice接口的对象。


KKMDevice隐藏使用单个供应商驱动程序的详细信息。 每个特定制造商的包装器均包含指向T驱动程序的链接,以及实现某些功能集的委托。 例如,FiscalDelegate,NonFiscalDelegate,DeviceInfoDelegate。


我将指出一些集成的一般要点:


  • 请确保随时关注驱动程序更新。 除了修复错误和提高速度外,质量通常还会发生飞跃。 相信我,从低级HEX命令到类似Java的界面以及从它到json任务的过渡极大地简化了工作,并使代码更易于理解。
  • 在操作期间,请使用进度栏阻止UI。 该标语表明,在连接了CCP的情况下,连续数次按下“付款”按钮,这预示着任务跟踪器的批评。
  • 确保使用CCP进行的所有操作均严格按顺序执行。 “成功”的流程竞赛可以使KKT挂断,同时进度条同时旋转也是一种应用。
  • 如果您需要配置数据传输到财政数据操作员,我建议您从预定义列表中选择最大数量的参数。 因为用军用财政驱动器手动输入数据是一种很好的方式来射击自己,但在使用该应用程序时却是在用户方面。

财务驱动器是一种收集和处理有关交易操作信息的设备。 它的成本可能超过票房本身。 如果驱动器配置不正确,则可能需要清零过程。 为此,请打开售票处,保修马上生效。


取得


因此,我们拥有收银台界面,我们可以通过条形码扫描货物并打印支票。 仍然需要增加通过卡支付的功能。


我们的应用程序集成了对PayMe和Inpas终端的支持。 前者通过蓝牙连接,而后者可以通过USB或Wi-Fi连接。


支付终端的连接方案与连接CCP非常相似,除非需要其他授权。


但是,在处理设备的异常行为方面存在严重差异。 因此,在CCP中,任何操作都成功通过或未成功通过。 如果操作失败,则可以重试或取消操作。 其他一切都会在没有干预的情况下发生。


对于终端机,有必要在任何步骤监视支付过程的可能中断。 可能不会考虑使用银行卡,或者卡上的资金不足。 您不能等待银行的响应或等待,而是获得5xx HTTP代码作为响应。 在任何阶段,连接都可能断开。


此外,如果没有认证,您将无法使用Inpas终端支持发布功能良好的应用程序。 认证包括检查终端的所有用户操作的可用性和正确操作,以及处理事件,例如在购买者已经将卡连接到终端之后从网络断开连接。


测试终端时,您需要考虑与之配对的银行或支付系统。 在某些情况下,即使在开发模式下,也只能通过该帐户的个人帐户退款,而不会自动退款。


您还需要记住,银行也参与付款过程。 例如,如果银行的个人帐户中没有必要的设置,则可能会缺少支票检查。


结论


将各种设备连接到Android应用程序是一个复杂而有趣的过程。 我们从整体上谈论他,形容所有障碍当然是不现实的。


如果您有任何问题,我将很乐意在评论中回答。 如果问题在单独的文章中键入,请写:)

Source: https://habr.com/ru/post/zh-CN462993/


All Articles