Управление на фискален принтер от браузера
Бих искал да споделя моя опит с една задача, която трябваше да свърша на работа по един проект. Проектът представлява billing софтуер и имаше нужда от възможност за печат на касови бележки. Има няколко начина за справяне със задачата – създаване на XPCOMM добавка за FireFox, използване на activeX control (поддържащ само IE) и Java Applet. Разучих
първите два подхода и изглеждаше, че нито единия не поддържа всички браузери и среди. Datecs FP 550-05 е фискалния принтер, който имах на разположение. Той има комуникационен протокол и върви заедно с готов за ползване dll фаил, а това предполага използането на ActiveX. За съжаление нямам никакъв опит с разработката на такива компоненти и този подход просто се оказа по сложен и труден за мен. Това е и причината да го отхвърля.
Разработката на XPCOMM разширение за FireFox е интересно нещо , в което да задълбаеш, но аз нямах време за това точно в този момент. Отхвълих и този вариант.
Затова реших да използвам Java и намерих един много полезен готов за ползване applet ето тук – JavaScript Serial. Има добри пояснения за използването на applet-а, но аз все пак съм си нууб като стане въпрос за Java. Всъщност я мразя и никога не съм се чувствал комфортно програмирайки на Java. Затова в допълнение бих добавил някои неща, за да подкарате правилно applet-a:
- след инициализация на applet-а използвайте setTimeout за около секунда преди отварянето на порта иначе хвърля грешка
- изпрограмирайте го така, че порта да бъде затворен след използването му. Ако не, ще трябва да си затворите браузера.
Останалото е просто имплементация на протокола на устройството, което ще поддържате. За FP 550 протокола не беше много ясно описан, но пък върви заедно с една апликация за изпращане на прости команди към принтера. Потърсих програмка, която може да подслушва портовете, но нямаше нищо, което да върши работа освен Advanced Serial Data Logger. Тя е безплатна за пробен период, което абсолютно ме устройва . И така аз си я инсталирах и зпочнах да декодирам съобщенията към принтера. По този начин се запознах по-добре с протокола и изясних нещата, които не разбирах от описанието.
Искам също да отбележа една критична част от разработката. Пиша по порта директно по битове и поради това имах проблем с кирилските символи. Страницата е в utf-8 и аз използвам функция ,която генерира нужните битове от стринг:
function stringToBytes ( str ) { var ch, st, re = []; for (var i = 0; i < str.length; i++ ) { ch = str.charCodeAt(i); // get char if(ch >= 1040 && ch <= 1103) { re = re.concat( [ch - 912] ); } else { st = []; // set up "stack" do { st.push( ch & 0xFF ); // push byte to stack ch = ch >> 8; // shift value down by 1 byte } while ( ch ); // add stack contents to result // done because chars have "wrong" endianness re = re.concat( st.reverse() ); } } // return an array of bytes return re; }
Намерих тази функция в stackoverflow, но трябваше да я модифицирам заради споменатия проблем. Отместването от 912 е при utf8, но при друг енкодинг може да е различно.
Прочети статията на: English
Все още няма коментари.