从网站与现金抽屉通信

php c
2022-08-30 23:15:07

我目前正在为我的公司构建POS解决方案。最困难的部分是购买现金抽屉,因为我没有太多的经验,更喜欢USB现金抽屉。我找到了一个我感兴趣的模型

CR-4005系列

http://www.thebarcodewarehouse.co.uk/epos-systems/cash-drawers/cr-4005-b/

供应商包括可在此处找到的驱动程序

http://www.posiflexusa.com/driver.php

这允许您使用dll文件打开抽屉等。给出的代码示例如下所示:

Public Declare Function OpenUSB Lib "usbcr.dll" () As Long

我对C有一点经验,但使用谷歌,我相信我可以弄清楚这部分。

我遇到的问题是,解决方案实际上是一个异地托管的网站,我需要能够做的是从站点问题命令到使用它的客户端计算机。这样,当他们完成销售时,我可以打开该特定机器的抽屉。

我需要澄清的是我如何做到这一点。例如,我假设我在客户端计算机上安装驱动程序并插入现金抽屉。然后,当他们访问网站时,我需要执行上面显示的C命令来打开抽屉。我遇到的问题是把我的头缠绕在它是如何工作的。当然,如果我在服务器上执行命令,它将有效地查看服务器的USB端口并尝试打开抽屉。而不是向客户端计算机发出命令。因此,为了解决这个问题,可以在客户端计算机上拥有c文件,然后我只需在站点上使用类似的东西调用文件即可

C:\Windows\execute.bat

这反过来又调用客户端计算机上的 c 文件。

我知道我没有很多信息可以提供,因为我试图在继续购买之前弄清楚这一点,我可能对此过于复杂,但任何指针或信息将不胜感激。此外,我并不完全采用此模型,因此,如果您知道具有一些良好文档或现有解决方案的替代方案,我也对此持开放态度。

笔记

我知道可能有一个可能的解决方案与chrome api调用

我可能会安装xampp并创建一个简单的php文件,该文件调用执行必要工作的exe。因此,也许访问客户端计算机上的本地地址可能是另一个潜在的想法(即127.0.0.1 / open.php)。

更新

我的网站包括POS方面的东西已经建成并准备就绪。这是使用PHP构建的,并托管在外部服务器上。我们通过域访问网站。

当用户在外部网站上执行特定操作时,它需要通过打开本地文件(即可以打开抽屉的exe)或通过访问计算机上的本地Web服务器(即localhost/open)来打开员工本地抽屉。

收银机是上面列出的抽屉,它通过USB连接到客户端计算机。不使用收据打印机。


答案 1

让我直截了当地说:

  1. 您做了一个Web应用程序,它是一个POS(大概在PHP中)
  2. 您的用户通过本地服务器上的 Web 浏览器访问 POS
  3. 您需要能够打开de现金抽屉客户端...(例如,将零钱返还给客户)

选项 1:

考虑到:

  • 您可以控制客户 POS 客户端(如您可以安装软件和设置策略)
  • 您可以安装谷歌浏览器并将其设置为您的应用程序的要求

然后,您可以尝试使用本机chrome USB库:

http://developer.chrome.com/apps/app_usb

它有它的警告,是的,但很可能你可能有运气,并且可以使用它打开设备。我在一家POS软件公司工作了几年,串行和USB现金抽屉都有一个非常非常简单的协议,即使使用FoxPro,我们也可以打开它们。

您必须创建一个小型chrome应用程序,用于发送打开抽屉的命令。这个应用程序应该公开一个函数,一旦你写了操作或将交易提交到服务器(例如,当你保存了销售记录时),就可以调用该函数,这样你就可以在jQuery o javascript中附加一个回调,在你发布数据并收到成功的响应后执行此操作。

选项 2:

Java 小程序:

我对此没有经验。但是你可以使用JNI(java原生接口)来调用原生代码。我不确定小程序容器是否以一种不允许你这样做的方式进行沙盒处理,但这两个链接可能会派上用场:

如何使用 JNI 从 Java 调用本机 (DLL) 代码 从 Java 调用 C 库例程

选项 3:

在操作系统方面做到这一点:

另一种选择,对我来说似乎是最简单的,是在操作系统级别映射击键,以便组合执行某些命令。您可以在此处查看有关如何在窗口中执行此操作的说明。在linux(gnome和kde等)中,这很容易。

完成此操作后,您可以使用这个jQuery库,该库“模拟”击键,因此,当您再次收到交易已完成的响应并且您需要打开de cash抽屉时,您将需要回调一个函数,该函数执行您根据我给你的文章预先配置的模拟击键。

当然,此命令将运行一个本地本机应用程序,该应用程序实际上打开了抽屉,可以是C / C++ / C#或任何受支持的设备API。但我确信这是一个标准界面,所以你可以用任何语言轻松编写该应用程序。这是 C# 的良好开端。

选项 4:

本地网络服务器。

现在您提到拥有本地Web服务器,实际上这可能是一种选择。但是,为什么要在客户端计算机上安装 XAMPP?有更好的方法可以做到这一点。答案是用C#/.NET编写一个非常小而简单的HTTP Web服务器。因此,按照这种方法,您需要:

  1. 在C#/.Net中编写一个HTTP服务器,侦听一个特定的端口(这是一个指南,它只有50行代码)
  2. 在 C# 代码中,您需要使用硬件附带的任何集成 API,将 P/Invoke 添加到 C 库(我不建议这样做),或者仅使用发送到 USB 端口命令的方法。因此,从操作系统集成的C#中打开抽屉,打印或做任何您需要的事情会更简单。(即使对于带有单声道的linux / mac)
  3. 在C#中设置代码,以便服务器仅侦听本地地址,因此除非是同一网络,否则没有人可以打开收银机,哎呀,我只允许127.0.0.1,只是为了确保只有本地机器才能打开它。
  4. 将此编译的exe放在Windows自动启动上,以便每当计算机启动时,打开直到的迷你Web服务器也会启动。
  5. 只要在交易成功到POS服务器时抓住您的回调,最后做如下操作:

    $.ajax({
        type: 'POST',
        dataType: 'json',
        data: 1,
        url: '127.0.0.1:8088/open',
        error: function() {
            alert('Could not open cash drawer');
        },
        success: function() {
            //do something else
        }
    });
    

因此,您将向本地计算机发送POST请求,该计算机侦听8088端口中的HTTP协议(或您在代码中设置的任何内容),然后它将在内部处理该请求作为打开抽屉,如果您在该代码中抛出异常,则可以从此C#迷你Web服务器返回HTTP 500响应,以便在jquery(或任何库)的错误处理程序上捕获它您使用的)

我强烈建议,就像我告诉你的那样,出于安全原因,这个应用程序只听本地请求,即使你只是做一个简单的操作。它可以工作,因为客户端jquery代码正在被本地计算机调用。

您还可以优化Web服务器应用程序,以便它读取.ini文件或某些设置文件(.Net具有.config默认值,这是要走的路),以便您可以根据客户进行调整,并且您不硬编码选项。

祝你好运!让我们知道你是如何做到的


答案 2

不是真正的答案,虽然太长了,无法发表评论。

在我看来,这就像您希望从浏览器调用本机代码。这不会让很多人满意,尽管我知道只有一种方法可以实现这一目标。它涉及Internet Explorer和COM服务器(activeX)。IE 可以创建 activeX 程序的实例,您需要编写该实例。

然后,此 activeX 可以向供应商提供的 DLL 发出命令。但这样做的问题是,如果我坐在其中一个终端上并有键盘,我也可以打开抽屉。您还需要一种方法来传达从服务器到客户端的打开抽屉的意图。我想你可以使用WebSockets来维护客户端和服务器之间的通信通道,通过它发出打开抽屉的意图。

这在锁定的情况下可能是可以的,尽管有各种安全问题,我没有考虑过,也没有在这里提到过。

回顾一下,这里有一个可能的解决方案:

  1. 在客户端和服务器之间建立 WebSocket 连接。
  2. 通过此通道从服务器向客户端浏览器发出命令。
  3. 在浏览器中捕获此命令,然后创建一个 ActiveX 对象。
  4. 使用javascript,告诉这个activeX对象打开抽屉。
  5. 在 ActiveX 对象中,通过调用供应商提供的 DLL 中的相应函数来响应打开抽屉的请求。

我个人对实现这一点感到有点不安(并希望得到丰厚的报酬)。

顺便说一句,您可以以这种方式控制MS Office等示例 - 允许您从浏览器中创建电子表格/ word doc / etc,使用用户输入的信息填充新文档。

这是我18个月前为一个项目写的JS文件,它控制着Excel。

//
// jsExcelObj.js
// 28/08/2012 

// the (only Excel) app instance - we only want to have 1
// **** don't access this variable directly ****
var jsExcelApp = null;

/*****************************************************************************
    Excel class
*****************************************************************************/
function startExcel()
{
    jsExcelApp = new ActiveXObject("Excel.Application");
}

function stopExcel()
{
    jsExcelApp.Quit();
    delete(jsExcelApp);
    jsExcelApp = null;
}

function jsExcelWorkbook(filename)
{
    if (jsExcelApp == null)
        startExcel(); //jsExcelApp = new ActiveXObject("Excel.Application");

    this.mFilename = filename;
    this.mExcelSheet = null;
    this.mWorkbook = jsExcelApp.Workbooks.Open(filename);

    this.close = function()
    {
        this.mWorkbook.Close(false);
        this.mFilename = null;
        this.mExcelSheet = null;
        this.mWorkbook = null;
    }

    this.open = function(filename)
    {
        if (jsExcelApp == null)
            startExcel();

        if (this.mFilename != null)
            this.close();

        this.mFilename = filename;
        this.mExcelSheet = null;
        this.mWorkbook = jsExcelApp.Workbooks.Open(filename);
    }

    this.setSheet = function(sheetName)
    {
        this.mExcelSheet = this.mWorkbook.Worksheets(sheetName);
    }

    this.getCellValue = function(column, row)
    {
        return this.mExcelSheet.Cells(row, column).value;
    }

    // returns the cells background colour as a html hex color value - e.g "7a554a"
    this.getCellColor = function(column, row)
    {
        var hexStrVel, r, g, b, decNum;

        decNum =  this.mExcelSheet.Cells(row, column).Interior.Color;
        // get a hexidecimal string representation of the number
        hexStrVal = decNum.toString(16);

        // pad to 6 bytes long
        while (hexStrVal.length < 6)
        {
            hexStrVal = "0" + hexStrVal;
        }

        // extract the 3 components
        r = hexStrVal.substr(4,2);
        g = hexStrVal.substr(2,2);
        b = hexStrVal.substr(0,2);

        return r+g+b; // return them in reverse order
    }
}

使用它很简单:

<script src='script/jsExcelObj.js'></script>
<script>
var fullyQualifiedPathToExcelWorkbook = "C:/someFile.xls";
var mExcel = new jsExcelWorkbook(fullyQualifiedPathToExcelWorkbook);
mExcel.setSheet("Sheet1");
var col1Row1 = mExcel.getCellValue(1, 1);
alert(col1Row1);
mExcel.close();
stopExcel();
</script>

我有点好奇,你会得到这个问题的其他答案。从我能想到的每一个角度来看,这听起来像是一次穿越雷区的长途跋涉。

我会非常认真地考虑使用c ++实现我自己的服务器/客户端架构,而忘记使用HTML / PHP。这可能是因为我知道的太少,也可能是因为我知道的足够多,可以看到危险 - 我不知道!


推荐