Общаться с кассовым ящиком с веб-сайта
В настоящее время я создаю 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, но с google. Я уверен, что смогу понять эту часть.
Проблема, с которой я сталкиваюсь, заключается в том, что решение - это просто веб-сайт, размещенный за пределами сайта, и мне нужно, чтобы он мог это сделать, - это команды сайта на клиентской машине, используя его. Так что, когда они завершают продажу, я могу открыть ящик для этой конкретной машины.
Мне нужно уточнить, как я это делаю. Например, я бы предположил, что устанавливаю драйвер на клиентской машине и подключаю к нему денежный ящик. Затем, когда они обращаются к сайту, мне нужно выполнить команду С, показанную выше, чтобы открыть ящик. Проблема, с которой я столкнулась, - это обернуть мою голову тем, как это будет работать. Конечно, если я выполню команду на сервере, она будет эффективно смотреть на порты USB-портов и пытаться открыть ящик. Вместо того, чтобы выдать команду клиентской машине. Поэтому для того, чтобы обойти это, можно было бы иметь файл c на машине клиентов, а затем просто вызвать файл на сайте, используя что-то вроде
C:\Windows\execute.bat
Что в свою очередь вызывает файл c на клиентской машине.
Я понимаю, что у меня нет большой информации, поскольку я пытаюсь понять это, прежде чем идти дальше с покупкой, и я, вероятно, слишком усложняю это, но любые указатели или информация будут оценены наиболее высоко. Также я не полностью настроен на эту модель, поэтому, если вы знаете альтернативу с хорошей документацией или существующим решением, я также открыт для этого.
Примечания
Я понимаю, что может быть возможное решение с вызовами chrome api
Я могу потенциально установить xampp и создать простые php файлы, которые называет exe, который выполняет необходимую работу. Поэтому, возможно, доступ к локальному адресу на клиентской машине может быть другой потенциальной идеей (например, 127.0.0.1/open.php).
Обновление
Мой сайт, в том числе POS-сторона, построена и готова к работе. Он построен с использованием PHP и размещен на внешнем сервере. Мы обращаемся к сайту через домен.
Когда пользователь выполняет определенное действие на внешнем сайте, он должен открывать сотрудники локально до ящика либо путем открытия локального файла (например, exe, который может открыть ящик), либо путем доступа к локальному веб-серверу на машина, то есть localhost/open.
Ящик до тех пор, как указан выше, и подключен через USB к машине клиентов. Принтер чеков не используется.
Ответы
Ответ 1
Позвольте мне понять это:
- Вы сделали веб-приложение, которое является POS (предположительно в PHP).
- Ваши пользователи получают доступ к POS через веб-браузер на локальном сервере.
- Вам нужно иметь возможность открывать клиентскую сторону денежного ящика... (например, чтобы вернуть клиента)
Вариант 1:
Учитывая, что:
- Вы контролируете клиентские POS-клиенты (как вы можете установить программное обеспечение и установить политики)
- Вы можете установить google chrome и установить его как требование для своего приложения.
Затем вы можете попробовать использовать собственную USB-библиотеку chrome:
http://developer.chrome.com/apps/app_usb
Он имеет ли он оговорки, да, но, скорее всего, вам может повезло и что устройство может быть открыто с этим. Я проработал несколько лет для POS-софтверной компании, и у серийных и USB-накопителей был действительно очень простой протокол, который позволил нам открыть их даже с FoxPro.
Вам нужно будет создать небольшое хром-приложение, которое отправит команду, чтобы открыть ящик. Это приложение должно выставить одну функцию, которая может быть вызвана после того, как вы напишете операцию или зафиксируете транзакцию на сервере (например, когда вы сохранили запись о продаже), чтобы вы могли присоединить обратный вызов в jQuery o javascript, который делает это после публикации данных и получить успешный ответ.
Вариант 2:
Java-апплет:
У меня нет опыта в этом. Но вы можете использовать JNI (собственный интерфейс Java) для вызова собственного кода. Я не уверен, что контейнер апплета изолирован песочником, который не позволяет вам это делать, но эти две ссылки могут пригодиться:
Как вызвать собственный (DLL) код с Java с помощью JNI
Вызов функций библиотеки C из java
Вариант 3:
Выполнение этого действия по OS:
Другим вариантом и, пожалуй, самым легким для меня, является сопоставление нажатия клавиши на уровне ОС, чтобы комбинация выполняла определенную команду. Вы можете увидеть здесь описание того, как это сделать в окнах. В linux (gnome и kde и т.д.) Это очень просто.
Как только вы это сделали, вы можете использовать эту библиотеку jQuery, которая "имитирует" нажатия клавиш, поэтому снова, когда вы получаете ответ, что транзакция выполнена и что вам нужно открыть денежный ящик, вы захотите вызвать функцию, которая выполняет симуляцию нажатия клавиши, которую вы ранее настроили в соответствии со статьей, которую я вам дал.
И, конечно, эта команда будет запускать локально собственное приложение, которое фактически открывает ящик, может быть в C/С++/С# или независимо от того, какой API поддерживаемого устройства. Но я уверен, что это стандартный интерфейс, поэтому вы можете легко закодировать это приложение на любом языке. Вот хороший старт для С#.
Вариант 4:
Локальный веб-сервер.
Теперь, когда вы упоминаете наличие локального веб-сервера, на самом деле это может быть вариант. Но зачем устанавливать XAMPP на клиентских машинах? Есть лучший способ сделать это. И ответ будет писать действительно очень маленький и простой HTTP-сервер в С#/. NET. Поэтому, следуя этому подходу, вы захотите:
- Записывать HTTP-сервер в С#/. Net, прослушивая определенный порт (здесь руководство, его всего лишь 50 строк кода)
- В коде С# вам нужно либо использовать любой API интеграции, поставляемый с оборудованием, P/Invoke в библиотеку C (который я не рекомендую ) или просто используя команду отправки USB-портов. И, таким образом, будет проще открыть ящик, распечатать или сделать все, что вам нужно, внутри С#, который интегрирован с ОС. (даже для linux/mac с моно)
- Настройте свой код на С#, чтобы сервер только прослушивал локальные адреса, поэтому никто не может открыть до тех пор, пока не будет той же сети, черт возьми, я бы разрешил только 127.0.0.1 только для того, чтобы убедиться, что только локальный машина может открыть его.
- Поместите этот скомпилированный exe на автозапуск Windows, чтобы всякий раз, когда компьютер запускает мини-веб-сервер, который открывает допуск, также запускается.
-
Просто перехватите свой обратный вызов всякий раз, когда транзакция будет успешной для 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-запрос на локальный компьютер, который прослушивает HTTP-протокол в порту 8088 (или независимо от того, что вы настроили в своем коде), а затем он будет обрабатывать внутренний запрос как открытие ящика, если вы выкинете исключение внутри этого кода, чем вы можете вернуть ответ HTTP 500 с этого веб-сервера С# mini, чтобы вы его уловили на обработчике ошибок jquery (или любой другой библиотеки, которую вы используете)
И я очень рекомендую, как я уже сказал, что это приложение только слушает локальные запросы по соображениям безопасности, даже если вы делаете только простую операцию. Он будет работать, потому что код jQuery на стороне клиента вызывается локальной машиной.
Вы также можете оптимизировать приложение веб-сервера, чтобы он читал файл .ini или какой-либо файл настроек (у .NET есть значение по умолчанию .config), так что вы можете настроить его для каждого клиента, и вы не 'Параметры жесткого кода.
Удачи! И дайте нам знать, как вы это сделали.
Ответ 2
Не совсем ответ, хотя слишком долго для комментария.
Мне кажется, что вы хотите называть собственный код из браузера. Это не понравится многим людям, хотя я знаю точно один из способов добиться этого. Он включает Internet Explorer и COM-сервер (activeX). IE может создать экземпляр программы activeX, которую вам нужно будет написать.
Этот activeX может затем выдать команду в DLL, поставляемую поставщиком. Проблема с этим заключается в том, что если бы я сидел на одном из терминалов и имел клавиатуру, я мог бы также открыть ящик. Вам также понадобится метод передачи намерения открыть ящик с сервера клиенту. Я полагаю, вы могли бы использовать WebSockets для поддержания канала связи между клиентом и сервером, с помощью которого вы намерены открыть ящик.
Это может быть в порядке в заблокированной ситуации, хотя есть все виды проблем безопасности, которые я не рассматривал и не упоминал здесь.
Напомним, что это возможное решение:
- Установить соединение WebSocket между клиентом и сервером.
- Выполните команду через этот канал в браузере клиента с сервера.
- Поймать эту команду в браузере, а затем создать объект ActiveX.
- Используя javascript, скажите этому объекту activeX, чтобы открыть ящик.
- Внутри объекта ActiveX ответьте на запрос, чтобы открыть ящик, вызвав соответствующую функцию в поставляемой поставщиком DLL.
Я бы чувствовал себя немного неловко в реализации этого лично (и хотел бы получить финансовую компенсацию).
Кстати, вы можете контролировать среди других примеров MS Office таким образом - позволяя вам создавать электронную таблицу /word doc/etc из браузера, заполняя новый документ введенной пользователем информацией.
Вот файл JS, который я написал для проекта 18 месяцев назад, который управляет 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>
Мне немного любопытно, какие еще ответы вы получите по этому вопросу. Это звучит как длинный марш через минное поле со всех точек зрения, о которых я могу думать.
Я бы очень серьезно подумал о внедрении собственной архитектуры сервера/клиента с использованием С++ и забыл об использовании HTML/PHP. Это может быть из-за того, что я слишком мало знаю, или может быть, потому что я знаю достаточно, чтобы увидеть опасности - я не знаю!
Ответ 3
Учитывая, что клиентские машины предположительно будут в какой-то степени под вашим контролем, мое понимание - это все, что вам нужно, это простая система удаленного вызова процедур, я думаю, что настаивать на том, что код должен запускаться через браузер, излишне сложно. Моя рекомендация вместо этого заключалась бы в том, чтобы на компьютере-клиенте был установлен демон (или служба, предоставленная нам на земле Windows), которая будет реагировать на удаленный запрос для контроля за наличными. Эта программа может быть полностью отдельной программой для браузера. Затем у вас есть сервер, после того как клиент откроет веб-страницу, отправьте пакет на IP-адрес клиента, который инициирует эту услугу на клиенте, чтобы контролировать денежный выигрыш.
Я, к сожалению, слишком ржав с программированием на Windows C, чтобы привести пример, но попытаюсь сломать это как можно проще:
На клиентских компьютерах запустите демон, который будет принимать соединения на определенном порту (только с IP-адреса сервера, конечно, чтобы избежать просто подключения и управления им). Вы также можете использовать сертификаты безопасности, но это выходит за рамки от этого ответа.) После принятия соединений на этом порту он ответит на набор пакетов, которые он может отправить, которые будут соответствовать действиям в денежном обращении. Это может быть просто простая программа на C, которая будет прослушивать сокет, а затем запускать функции в этой DLL, когда он получает данные.
На сервере вам понадобится программа, которая реагирует на попытку клиента получить доступ к определенной веб-странице, вы можете подключить ее к PHP, чтобы PHP запускал программу на сервере при доступе к странице, я полагаю, вы уже знаете как это сделать из того, что было сказано в вопросе. Затем эта программа откроет соединение с IP-адресом клиента, указанное в HTTP-запросе, и отправьте команду денежного рисования в сокет, который прослушивает служба клиента. Это должно заставить клиента сделать что-то с помощью ничьей. (вы должны надеяться, что клиент не маскирует IP-адрес.)
Наконец, вам нужна веб-страница, чтобы клиент мог запрашивать эти команды с сервера, существует ряд проблем безопасности, особенно связанных с безопасностью клиентской службы, но все они относительно просты в освоении. Для простой реализации этого также потребуется всего около 150 строк кода. Он также избегает любого нечетного специфичного для конкретной платформы или специфического для браузера кода и полностью избегает веб-узлов.
Я надеюсь, что это поможет, если он каким-либо образом неясен, пожалуйста, оставьте комментарий.
Ответ 4
Используете ли вы принтер с поддержкой EPSON (язык ESC/POS)? Если это так, вы можете использовать принтер ethernet и получить доступ к принтеру с помощью PHP, чтобы открыть загрузочный ящик для принтера.
Вот фрагмент кода из того, что я сделал раньше:
<?php
$texttoprint = $_POST['printthis'];
$texttoprint = stripslashes($texttoprint);
$fp = fsockopen("192.168.10.30", 9100, $errno, $errstr, 10);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fwrite($fp, "\033\100");
$out = $texttoprint . "\r\n";
fwrite($fp, $out);
fwrite($fp, "\012\012\012\012\012\012\012\012\012\033\151\010\004\001");
fclose($fp);
}
?>
Подробнее о кодах печати см. http://files.support.epson.com/pdf/general/escp2ref.pdf.
Как человек с многолетним опытом POS, лучший совет, который я мог бы дать вам о создании POS с нуля, заключается в следующем: НЕ ДЕЛАЙТЕ ЭТО!
Есть некоторые бесплатные решения с открытым исходным кодом, которые делают то, что вам, вероятно, им нужно, но даже если вы в конечном итоге заплатите за что-то, это будет гораздо меньше головной боли, чем создание POS. Извините, если это не то, что вы хотели услышать, но я видел, как многие люди пытаются, особенно на основе Интернета (что также плохой идеей по многим другим причинам).