Intereting Posts
Фотографии import facebook-php-sdk не работают PHP CLI – вводите пользователя, когда делаете что-то в фоновом режиме Проблемы с передачей данных в php с помощью jquery ajax тайм-аут сеанса в php-коде и в htaccess? Как я могу вернуть статические файлы в PHP? Запрос аудио / видеофайла для информации PHP-элемент функции синтаксиса из кода Javascript Как я могу устранить неполадку, почему мой PHP-скрипт не будет работать в cron, если это произойдет из командной строки? Как определить экран DPI с помощью JavaScript PHP Word, отправка сгенерированного файла в браузер в качестве вывода без сохранения его на диске MySQL: добавьте в несколько таблиц в одном запросе с помощью BEGIN & COMMIT Поиск тегов HTML в строке Laravel preg_match (): Без конечного разделителя '/' найдено запланировать электронное письмо в php Структура макета шаблонов laravel – добавляет строку-жидкость для каждого 4 пролета

Общаться с кассовым ящиком с веб-сайта

В настоящее время я создаю решение для 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 /открытый.

Ящик до тех пор, как указан выше, и подключен через USB к компьютеру клиентов. Принтер чеков не используется.

Solutions Collecting From Web of "Общаться с кассовым ящиком с веб-сайта"

Позвольте мне понять это прямо:

  1. Вы сделали веб-приложение, которое является POS (предположительно в PHP)
  2. Ваши пользователи получают доступ к POS через веб-браузер на локальном сервере
  3. Вы должны иметь возможность открыть клиентскую сторону денежного ящика … (например, чтобы вернуть клиента)

Опция 1:

Учитывая, что:

  • Вы управляете клиентскими POS-клиентами (так как вы можете устанавливать программное обеспечение и устанавливать политики)
  • Вы можете установить google chrome и установить его как требование для своего приложения.

Затем вы можете попробовать использовать встроенную хром-библиотеку USB:

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

У него есть оговорки , да, но, скорее всего, вам может повезти и что устройство можно открыть с этим. Я проработал несколько лет для компании, занимающейся программным обеспечением для POS, и у серийных и USB-накопителей был действительно очень простой протокол, который позволил нам открыть их даже с FoxPro.

Вам нужно будет создать небольшое хром-приложение, которое отправит команду для открытия ящика. Это приложение должно выставить одну функцию, которая может быть вызвана после того, как вы напишете операцию или зафиксируете транзакцию на сервере (например, когда вы сохранили запись о продаже), чтобы вы могли присоединить обратный вызов в jQuery o javascript, который делает это после публикации данных и получить успешный ответ.

Вариант 2:

Java-апплет:

У меня нет опыта в этом. Но вы можете использовать JNI (собственный интерфейс Java) для вызова собственного кода. Я не уверен, что контейнер апплета изолирован песочником, который не позволяет вам это делать, но эти две ссылки могут пригодиться:

Как вызвать собственный (DLL) код из Java с помощью JNI Calling C библиотечных процедур из java

Вариант 3:

Выполнение этого по OS-мудному:

Другой вариант, и, кажется, самый легкий для меня, состоит в том, чтобы отобразить нажатие клавиши на уровне ОС, чтобы комбинация выполняла определенную команду. Вы можете увидеть здесь описание того, как это сделать в окнах. В linux (gnome и kde и т. Д.) Это очень просто.

После того, как вы это сделали, вы можете использовать эту библиотеку jQuery , которая «имитирует» нажатия клавиш, поэтому снова, когда вы получаете ответ, что транзакция завершена, и что вам нужно открыть денежный ящик, вы хотите вызвать функцию, которая выполняет симуляционное нажатие клавиши, которое вы ранее настроили в соответствии со статьей, которую я вам дал.

И, конечно, эта команда будет запускать локально собственное приложение, которое фактически открывает ящик, может быть в C / C ++ / C # или независимо от того, какой API поддерживаемого устройства. Но я уверен, что это стандартный интерфейс, поэтому вы можете легко закодировать это приложение на любом языке. Вот хороший старт для C #.

Вариант 4:

Локальный веб-сервер.

Теперь, когда вы упоминаете о наличии локального веб-сервера, на самом деле это может быть вариант. Но зачем устанавливать XAMPP на клиентских машинах? Есть лучший способ сделать это. И ответ будет писать действительно очень маленький и простой HTTP-сервер в C # /. NET. Поэтому, следуя этому подходу, вы захотите:

  1. Напишите HTTP-сервер в C # /. Чистая прослушивание определенного порта ( вот руководство , его всего лишь 50 строк кода)
  2. В коде C # вам нужно либо использовать любой интеграционный API, поставляемый с аппаратным обеспечением, P / Invoke в библиотеку C (который я не рекомендую), либо просто используя команду send to USB port . И, таким образом, будет проще открыть ящик, распечатать или сделать все, что вам нужно, внутри C #, который интегрирован с ОС. (даже для linux / mac с моно)
  3. Настройте свой код на C #, чтобы сервер только прослушивал локальные адреса, поэтому никто не может открывать до тех пор, пока не будет той же сети, черт возьми, я бы разрешил только 127.0.0.1 только для того, чтобы убедиться, что только локальный компьютер может открыть Это.
  4. Поместите этот скомпилированный exe на автозапуск окон, чтобы всякий раз, когда компьютер запускает мини-веб-сервер, который открывает прелюд, также запускается.
  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 на локальный компьютер, который слушает HTTP-протокол в порту 8088 (или независимо от того, что вы настроили в своем коде), а затем он будет обрабатывать внутренний запрос как открытие ящика, если вы выбросите исключение внутри этого кода, чем вы можете вернуть ответ HTTP 500 с этого веб-сервера C # mini, чтобы вы его уловили на обработчике ошибок jquery (или любой другой библиотеке, которую вы используете)

И я бы очень рекомендовал, как я уже сказал, что это приложение только слушает локальные запросы по соображениям безопасности, даже если вы делаете только простую операцию. Он будет работать, потому что код jQuery на стороне клиента вызывается локальной машиной.

Вы также можете оптимизировать приложение веб-сервера, чтобы он читал файл .ini или какой-либо файл настроек (у .NET есть .config default, который является способом перехода), так что вы можете настроить его на основе клиента и не жестко кодировать опции.

Удачи! И дайте нам знать, как вы это сделали

Не совсем ответ, хотя слишком долго для комментария ..

Мне кажется, что вы хотите называть собственный код из браузера . Это не понравится многим людям, хотя я знаю точно один из способов добиться этого. Он включает 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 из браузера, заполняя новый документ введенной пользователем информацией.

Вот 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 - eg "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. Это может быть из-за того, что я слишком мало знаю, или может быть, потому что я достаточно знаю, чтобы увидеть опасности – я не знаю!

Учитывая, что клиентские машины предположительно будут в какой-то степени под вашим контролем, мое понимание – это все, что вам нужно, это простая система удаленного вызова процедур, я думаю, что настаивать на том, что код должен запускаться через браузер, излишне сложно. Моя рекомендация вместо этого заключалась бы в том, чтобы на компьютере-клиенте был установлен демон (или служба, предоставленная нам на земле Windows), которая будет реагировать на удаленный запрос для контроля за наличными. Эта программа может быть полностью отдельной программой для браузера. Затем у вас есть сервер, при открытии клиента веб-страница отправляет пакет на IP-адрес клиента, который инициирует эту услугу на клиенте для управления денежной наличностью.

К сожалению, я слишком ржав с программированием на Windows C, чтобы привести пример, но попытаюсь сломать это как можно проще:

На клиентских компьютерах запустите демон, который будет принимать соединения на определенном порту (только с IP-адреса сервера, конечно, чтобы избежать просто подключения и управления им). Вы также можете использовать сертификаты безопасности, но это выходит за рамки этого ответа .) После принятия соединений на этом порту он будет отвечать на набор пакетов, которые он может быть отправлен, которые будут соответствовать действиям при денежном обращении. Это может быть простая программа на языке C, которая будет прослушивать сокет, а затем запускать функции в этой DLL, когда он получает данные.

На сервере вам понадобится программа, которая реагирует на попытку клиента получить доступ к определенной веб-странице, вы можете подключить ее к PHP, чтобы PHP запускал программу на сервере при доступе к странице, я полагаю, вы уже знаете, как это сделать это из того, что было сказано в вопросе. Затем эта программа откроет соединение с IP-адресом клиента, как указано в HTTP-запросе, и отправьте команду денежного рисования в сокет, который прослушивает служба клиента. Это должно заставить клиента сделать что-то с помощью ничьей. (вы должны надеяться, что клиент не маскирует IP-адрес.)

Наконец, вам нужна веб-страница, чтобы клиент мог запрашивать эти команды с сервера, существует ряд проблем безопасности, особенно связанных с безопасностью клиентской службы, но все они довольно просты в освоении. Для простой реализации этого также потребуется всего около 150 строк кода. Он также избегает любого нечетного специфичного для конкретной платформы или специфического для браузера кода и полностью избегает веб-узлов.

Надеюсь, это поможет, если он каким-либо образом неясен, пожалуйста, оставьте комментарий.

Используете ли вы принтер с поддержкой 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. Извините, если это не то, что вы хотели услышать, но я видел, как многие люди пытаются, особенно на основе Интернета (что также плохой идеей по многим другим причинам).