Berke Özyaşar
博客

开发条码仓储应用:摄像头、OCR 与 Zebra 打印机

来自我为 TCT Lojistik 开发的仓储应用的笔记:手机摄像头扫码、OCR、ZPL 标签打印、打印机发现以及对接现有系统。

·

一个仓库每天都有大量箱子进进出出。如果这些流转先写在纸上、再录入系统,不仅浪费时间,出错也在所难免。我为客户 TCT Lojistik 开发的仓储应用把这个流程搬到了手机上:用摄像头扫描箱子,记录即时进入公司系统,标签从网络中的 Zebra 打印机打印出来。我是 Berke Özyaşar,在这篇文章中分享开发这类应用时做出的技术决策和实用经验。

应用能做什么?

  • 货物入库和出库流程
  • 用手机摄像头扫描条码,必要时用 OCR 读取标签上的文字
  • 车牌选择、箱单以及待出库货物总览
  • 货物查询
  • 创建条码标签、预览并从 Zebra 打印机打印
  • 发现局域网内的打印机及打印机设置
  • 基于 JWT 的用户登录

应用使用 React Native 0.81 编写,并接入公司现有的 ASP.NET Core 和 SQL Server 基础设施。

手持终端还是手机?

一提到仓储软件,人们首先想到的是内置激光扫描头的工业手持终端。在扫码密集的仓库中,这类设备仍然是最快、最耐用的选择。但它们价格昂贵,给每位员工都配一台并不适合所有企业。而如今手机的摄像头已经能很好地识别标准条码和二维码。

好消息是,大多数现代手持终端本身就运行 Android。用 React Native 编写的应用既能在手机上运行,也能在手持终端上运行。终端内置扫描头读到的码,通常以键盘输入或系统广播(broadcast)的形式传给应用;在摄像头扫码之外再加上这种输入方式是可行的。也就是说,选择什么设备并不需要重写应用。

摄像头扫码

摄像头部分我使用了 react-native-vision-camera。应用可以识别 Code 128、Code 39、Code 93、EAN-13 和 EAN-8 等仓库中常见的格式。这类扫码器有几个要点:

  • 限制要扫描的格式。只开启仓库实际使用的格式,既能提高速度,也能减少误读。
  • 同一个码不要计两次。摄像头每秒处理很多帧,同一个条码可能被连续读取多次。需要忽略短时间内重复出现的同一个码。
  • 给出明确的反馈。扫码成功时应有醒目的提示;仓库里干活的人不会一直盯着屏幕。
  • 用真实标签测试。在办公室用干净的打印件测试,看不出应用面对皱褶、裹着缠绕膜或在仓库灯光下反光的标签时的表现。

条码扫不出来时:OCR

并不是每张标签都完好可读。因此应用中有第二种扫描模式:在 OCR 模式下,摄像头画面中的文字也会被识别,条码和标签上的文字可以一起识别并相互比对。当条码损坏但编号仍可辨认时,员工就不必手动输入编号。OCR 方面我使用了一个配合 vision-camera 运行的文字识别插件;由于帧在摄像头端处理,界面不会卡顿。

标签打印:ZPL 与 Zebra

Zebra 打印机使用一种名为 ZPL 的指令语言。简单的标签可以直接用 ZPL 指令设计;但当标签上有标志、特殊字体或复杂布局时,就会变得很麻烦。在这个项目中,我采用了另一种方法:

  • 标签在应用中作为普通的 React Native 组件来设计,并在屏幕上预览。
  • 把这个组件转换成一张图像。
  • 按照打印机的分辨率(203 dpi、4×6 英寸标签)缩放图像,必要时旋转,并转换为黑白位图。
  • 位图经压缩后嵌入 ZPL 的图形指令(^GFA)中,再发送给打印机。

这种做法的好处是所见即所得;修改标签设计也不需要懂 ZPL。需要注意的是,细线和条码条纹在转换为黑白时不能失真。缩放方法和阈值在这里起决定作用。允许用户调整打印比例和位置,在使用不同标签卷时也很有用。

在网络中找到打印机

Zebra 打印机通常通过网络在 9100 端口接收原始数据。应用用 react-native-tcp-socket 直接与打印机建立 TCP 连接并发送 ZPL 数据。与其指望用户知道打印机的 IP 地址,应用会扫描局域网,列出开放了这个端口的设备。以并行但数量受限的连接进行扫描,再对没有响应的地址用更长的超时重试,结果既快又可靠。

对接现有系统

TCT 已经有一套正在运行的服务器基础设施。我没有替换它,而是在其之上构建应用:移动应用与现有的 ASP.NET Core API 通信,数据仍保存在 SQL Server 中。身份验证使用 JWT;令牌保存在设备上,并随每个请求发送。对于这类项目,我的建议始终如一:移动应用不应直接连接数据库,中间应有一层负责权限校验、只提供必要操作的 API。

为仓库用户而设计

仓储应用的用户并不是坐在办公桌前。他手里抱着箱子,可能戴着手套,周围环境嘈杂。因此,页面设计需要遵循大按钮、少步骤、每个页面只做一件主要事情的原则。入库和出库等最常用的操作应能从主屏幕直接启动;菜单层级应尽量减少。

相近领域:Scano QR

摄像头扫描和从图像中提取文字,也是我已在 Google Play 上架的应用 Scano QR 的主题。这款应用可以扫描二维码,用七种模板生成二维码,并从图片中提取文字。不同光线条件下的识别、给用户的即时反馈等问题,在消费级应用和仓储应用中同样重要。

结论

条码仓储应用并不一定要购买昂贵的硬件,也不必替换现有系统。借助手机摄像头、调校得当的扫描流程、在屏幕上设计并转换为 ZPL 的标签,以及对接现有服务器的 API,仓库记录就能做到实时。如果您想为自己的仓库打造类似的解决方案,可以看看条码仓储与手持终端应用页面。

更多文章

一起让您的应用上线吧。

用几句话说说您想做什么,我会当天回复。

↑ ↓ 浏览,Enter 打开,Esc 关闭