4

这是我的代码(它工作正常):

document.addEventListener('deviceready', myDeviceReady, false);
function myDeviceReady() {
    $('#Print').append('Device is ready');
    function Scan() {
        try {
            $('#Print').append('Scanning')
            window.plugins.barcodeScanner.scan(mySuccess,myError);
        } catch (myCatch) {
            $('#Print').append('catch: ' + myCatch)
            Scan();
        }   
    }
    function mySuccess(result) {
        if (result.cancelled) {
            $('#Print').append('The user cancelled the scan.')
        } else {
            $('#Print').append(result.text);
            $('#Print').append(result.format);
        }
        Scan();
    }

    function myError(error) {
        $('#Print').append('Scanning failed: ' + error);
        Scan();
    }
    Scan();
}

问:有什么方法可以更快地轮询扫描仪?每次扫描都需要几秒钟,我的用户需要扫描大量条码。

他们过去常常用楔子扫描笔记本电脑,但现在他们想使用 iPad。

编辑:

也许我正在寻找的是第 3 方解决方案。

4

3 回答 3

3

除非您的 HTML 很大(通过 $('#Print') 获取 DOM 节点可能需要一些时间),或者您正在运行应用程序很长时间(在这种情况下 .append 可能会变慢,因为它是从未清除),您的 JavaScript 代码没有任何问题。事实上,我假设延迟来自您的条形码插件,而不是您的 JavaScript 处理程序。

在做任何其他事情之前,您应该检查我的假设是否正确,并且延迟实际上发生在您的 .barcodeScanner.scan() 调用和 mySuccess()/myFailure() 函数之间。

PhoneGap 似乎正在使用 ZXing(“斑马线”),这是一个既定标准。如果这还不够快,您可能想尝试其他库:

但可能是移动相机的自动对焦速度不足以满足您的要求,您需要基于激光的硬件。此链接有许多与硬件接口的产品。

于 2013-03-01T16:35:59.960 回答
2

如果您在cordova中使用官方插件http://ngcordova.com/docs/plugins/barcodeScanner/

你可以让它在 iOS 上更快,

在您的 XCode 项目中,转到 plugins 文件夹,然后打开 CDVBarcodeScanner.mm

改变这一行:

captureSession.sessionPreset = AVCaptureSessionPresetHigh;

为了:

captureSession.sessionPreset = AVCaptureSessionPresetMedium;
于 2016-07-26T20:19:23.200 回答
1

在之前的工作中,我曾在条形码扫描仪制造商CipherLab工作。

关于条码扫描仪

首先,您需要澄清不是扫描仪本身很慢,而是读取它的应用程序。扫描仪性能本身在某种程度上是价格的函数。如果你有一个便宜的扫描仪,它可能会更慢,把钱花在一个好的扫描仪上会提高性能和适应性(读取损坏/弄脏/脏条码的能力)。仅供参考,大多数移动扫描仪没有@Hazzit 建议的“自动对焦”,但有一个针对特定距离范围优化的固定预对焦镜头。如果它是成像扫描仪(不是激光),则将扫描仪对准条形码,然后将其拉回,直到扫描仪读取。如果最终用户正在扫描大量条码,他们将很快记住“最佳位置”。

关于你的 JS 代码

扫描仪插件似乎正在同步执行(阻止 JS 直到它获得条形码)。该库中是否还有另一个功能可以异步使用扫描仪?如果没有,请考虑查看其他 SDK,看看是否有其他人允许异步使用条形码扫描仪。

可能有点小,但我会尝试将您的 DOM 操作 JS 与扫描仪代码分开。DOM 操作可能会很慢,具体取决于 DOM 结构、您的选择器和您在做什么。

如果您可以获得对扫描仪的异步访问,您可能能够解耦这些并在“可能的情况下”进行所有 DOM 操作,如果扫描仪在等待下一个条形码时没有阻塞(基本上是在您启动扫描仪接受后 UI 更新下一个条形码)。

关于键盘楔形扫描

现在,键盘楔形扫描仪显然输入数据的速度与打字一样快,无论应用程序是否已为它们做好准备或是否可以跟上击键。这将很快,但缺乏应用程序级别的控制。

您可以将蓝牙条码扫描仪用作 HID 设备(在现代技术中基本上是“键盘楔”),它的工作原理与上述完全一样。速度快,但仍缺乏对硬件的应用级控制。

当然,这些蓝牙库中的许多还支持 SPP 串行端口蓝牙配置文件,这为您提供了应用程序级别的控制。您可以发送扫描仪命令/配置,然后读回扫描的数据。

这就是您的 SDK 工具发挥作用的地方。它们只是读取/写入蓝牙串行端口(扫描仪)以轮询扫描的条形码。这可能非常快,但取决于 SDK 的质量。我不是 iOS 程序员,对那个特定平台一无所知,但我知道在 Windows 中它们是访问串行端口的高级方法和性能更高的低级方法。

不管怎样,如果你愿意,你仍然可以选择回到键盘楔形的做事方式!只是想我会指出这一点。

同样在此键盘楔形模式中,通常会在扫描仪数据前加上快捷键。大多数扫描仪可以在扫描数据的开头或结尾插入一些额外的击键。例如,您可以将扫描仪配置为键入F3+{barcode data}+Enter并让您的页面监视该快捷方式,将焦点移动到正确的输入框,然后接受数据。

如果一切都失败了

如果所有其他方法都失败了,并且您无法获得所需的性能……唯一的方法是为 iOS 编写本机应用程序。虽然高级工具很棒,但无论如何(对于硬件访问或 UI 性能),您永远无法完全获得本机应用程序的性能。

于 2013-03-01T17:45:54.090 回答