Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Komunikacja z lokalną drukarką fiskalną POSNET poprzez PHP
Forum PHP.pl > Forum > PHP
mlattari
Witam!

Czy ktoś wie jak komunikować się z drukarkami fiskalnymi POSNET Thermal za pomocą PHP z użyciem interfejsu Active-x ?
Stworzyłem obszerną aplikację wspomagającą zamówienia i sprzedarz, która działa w przeglądarce, i pojawił się problem z lokalną drukarką fiskalną, którego nie mogę rozwiązać w żaden sposób... podobno można się z nią komunikować za pomocą Active-x .... ale jak? Chodzi mi tylko o wystawianie paragonów do sporządzonych przez program faktur VAT.

Bardzo dziękuje z góry z pomoc


Czy naprawdę nikt nie wie jak się za to brać?

Dzięki z góry za pomoc!
erix
Cytat
Czy ktoś wie jak komunikować się z drukarkami fiskalnymi POSNET Thermal za pomocą PHP z użyciem interfejsu Active-x ?


Jeśli chodzi o ActiveX, to serwer MUSI działać pod kontrolą Windows (wiadomo, ale lepiej nadmienić winksmiley.jpg). A przyda się rozszerzenie COM: http://pl.php.net/com
mlattari
No tak :-) ale chodzi mi o drukarkę fiskalną podłączoną lokalnie.... tzn klient łączy się z serwerem (na szczęście pod Linuxem), uruchamia pod Windowsem aplikację php w swojej przeglądarce i ma lokalną drukarkę fiskalną podłączoną do swojego kompa :-) Z tego co wiem, da się to zrobić ale nie mogę nigdzie znaleźć jak...
Chodzi o wielostanowiskowy system sprzedaży w firmowej sieci LAN, gdzie jest kilka stanowisk, każde ze swoją drukarką fiskalną :-)

Dzięki jeszcze raz za sugestie, podpowiedzi, pomoc :-)
bim2
To już nie będzie od strony php smile.gif
mlattari
hmmm czemu? z tego co się w necie naczytałem to raczej można poprzez php i active-x sterować różnymi urządzeniami podłączonymi do kompa... ale nie mogłem znaleźć konkretnych przykładów... w moim przypadku chodzi o komunikację z urządzeniem podłączonym do lokalnego portu rs-232...
bim2
W php jedynie co zrobisz to wyświetlisz prośbę o kontrolkę. smile.gif ActiveX to nie PHP :]
mlattari
Czyli za pomocą samego PHP nie da się przesyłać danych poprzez lokalny port szeregowy... potrzebna jest kontrolka Active-x napisana specjalnie do danego urządzenia... hmm.. na to wygląda... no ale taka kontrolka jest na stronie producenta urządzenia tylko nie wiem jak się do niej zwrócić z poziomu php :-)
erix
Cytat
no ale taka kontrolka jest na stronie producenta urządzenia tylko nie wiem jak się do niej zwrócić z poziomu php :-)

Przecież napisałem. :]

Ale warunek konieczny: PHP musi działać na tym samym systemie, co zainstalowana kontrolka.

Choć przypuszczam, że lepiej byłoby tu napisać skrypt VBS, a nie babrać się z PHP.
mlattari
To tak... ale skrypty chodzą na serwerze a klienty łączą się z sewerem poprzez przeglądarki z kompów do których są podpięte lokalne drukarki fiskalne.... zastanawiam się czy w ogóle jest na to jakieś rozwiązanie.... ewentualnie mógłbym podpiąć pod serwer kilka drukarek pod różnymi portami COM (w sumie są jak narazie tylko 3 drukarki, z których 2 są używane a jedna awaryjna) ... wtedy raczej by się dało... szkoda że nie można tego zrobić w prosty sposób... Jak wszystko będzie po stronie serwera to już nie problem i chyba tak zrobie... No nic... w każdym razie dzięki za pomoc :-)
erix
To wiesz, wcale niegłupim pomysłem byłoby skorzystanie z VBS po stronie klienta.
mlattari
No lokalnie,pod Windowsem, przez VB to nie problem dostać się do portu COM: ale zastanawiam się jak połączyć lokalny VBS z działającym na serwerze skryptem php...
erix
A kojarzysz ten obiekt:
Kod
new ActiveXObject("Microsoft.XMLHTTP")

? winksmiley.jpg
mlattari
Nie znam takiego obiektu :-( ale z tego co piszesz to chyba będę musiał się z nim zapoznać... ale to chyba właśnie chodzi o Active-x...
Uważasz, że za pomocą ActiveXObject("Microsoft.XMLHTTP") można przekazać dane z php do tego obiektu a z niego do portu COM: ?
Powiedzmy, że moje dane są $tutaj[] albo w $_POST, ale to wszystko jedno... no to jak je wysłać z php to portu com? Szukałem w sieci po tym jak wspomniałeś o tym rozwiązaniu ale nigdzie nie mogę znaleźć konkretów... Mógłbyś, jeżeli to nie kłopot, podać jakiś najprostszy przykład?

Dzięki z góry...
bim2
W php generujesz powiedzmy jakiś text który chcesz wysłać do kontrolki. Więc robisz tak:
activex.php
  1. <?php
  2. echo 'tekst do kontrolki';
  3. ?>

I później za pomocą kontrolki otwierasz http:/twoja_strona.pl/activex.php i dostajesz tekst smile.gif
mlattari
ehhh znalazłem rozwiązanie.... wszystko jest bardzo ładnie udokumentowane przez producenta i do tego są dołączone działające skrypty java :-)
Rzecz ma się dużo prościej niż się spodziewałem.... mogę przekazać dane z php do skryptów java i drukuję paragon :-)

W każdym razie dzięki za pomoc

Witam!

Ponieważ już kilku z forumowiczów do mnie napisało, podpowiem wszystkim zainteresowanym tym tematem, jak się za to brać.

Otóż na stronie http://www.posnet.com.pl/index.php?pid=1307 jest do pobrania kontrolka Active-X dla drukarki Posnet Thermal (EXE; 644 KB). Trzeba ją najpierw pobrać i zainstalować :-)))

W katalogu DOC są 2 ważne pliki: strona_testowa_ocx.htm oraz instrukcja_ocx.pdf, natomiast biblioteka ThermalLib.ocx (najważniejsza z tego wszystkiego - ale jej nie modyfikujemy :-) ) znajduje się piętro wyżej :-)

Wszystkie potrzebne Wam funkcje są użyte w pliku strona_testowa_ocx.htm i można sobie je łatwo podejrzeć i użyć we własnych skryptach. Trzeba pamiętać o poprawnym osadzeniu obiektu:

<OBJECT id=ThermalLib height=0 width=0 classid=clsid:904511D2-5407-4033-8DAD-07B33EC7317E><PARAM NAME="_Version" VALUE="65536"><PARAM NAME="_ExtentX" VALUE="26"><PARAM NAME="_ExtentY" VALUE="26"><PARAM NAME="_StockProps" VALUE="0"></OBJECT>

a także o tym, że Active-x działa niestety tylko w IE no i trzeba go nieraz "włączyć" w zabezpieczeniach przeglądarki. Pamiętajcie, że także biblioteka .ocx musi być dostępna najlepiej w tym samych katalogu co Wasz skrypt.

Oto, w skrócie i bez kontekstu, jak dostosowałem funkcje do moich potrzeb - tzn bez formularzy itp i jak je połączyłem z moimi skryptami (przykład 3 podstawowych funkcji, które używam - inne mi są akurat w tej chwili niepotrzebne):


[funkcje]

...

<script LANGUAGE='JavaScript1.1'>

function OpenPort() {
data = ('COM1')
ThermalLib.THLOpenPort(data)
ThermalLib.THLSendBel()
}

function LBTRSHDR( ilosc_pozycji_sprzedazy,ilosc_dodatkowych_linii_tekstu,linia1,linia2,linia3 )
{
var ico = ThermalLib.LBTRSHDR(ilosc_pozycji_sprzedazy,ilosc_dodatkowych_linii_tekstu,linia
,linia2,linia3)
alert(\"LBTRSHDR: \" + ico)
}

function LBTRSLN( numer_linijki,rodzaj_rabatu,opis_rabatu,nazwa_towaru,ilosc,stawka_ptu,cena_jedno
tkowa_brutto,razem_brutto,
kwota_rabatu,opis_rabatu )
{
var ico = ThermalLib.LBTRSLN( numer_linijki,rodzaj_rabatu,opis_rabatu,nazwa_towaru,ilosc,stawka_ptu,cena_jedno
tkowa_brutto,razem_brutto,kwota_rabatu,opis_rabatu )
alert( \"LBTRSLN : \" + ico)
}

function LBTREXIT(rabatu_procentowy,ilosc_dodatkowych_linii_stopki,rodzaj_rabatu,kod_kasy
kasjera,linia1,linia2,linia3,razem_zaplacono,razem_naleznosc,rabat)
{
var ico = ThermalLib.LBTREXIT(rabatu_procentowy,ilosc_dodatkowych_linii_stopki,rodzaj_raba
u,kod_kasy_kasjera,linia1,linia2,linia3,razem_zaplacono,razem_naleznosc,rabat)
alert(\"LBTREXIT : \" + ico)
}

</script>

...

[zastosowanie funkcji (bez kontekstu - fragmenty wycięte ze skryptów)]

...

/* ##### FISKALIZACJA Etap I - Otwarcie portu COM + inicjalizacja fiskalizacji ##### */

echo "<script language='Javascript'>";
echo "OpenPort();";
echo "LBTRSHDR( '0','0','0','0','0' );";
echo "</script>";

/* ######################################################## */


/* ##### FISKALIZACJA Etap II - wysłanie pozycji sprzedaży ############################# */

echo "<script language='Javascript'>";
echo "LBTRSLN( '".$linijka."','0','0','".substr($produkt[0],0,20)."(".$produkt[2].")"."','".$produkt[1]."','".
$produkt[2]."','".$produkt[3]."','".$produkt[4]."','0','0' );";
echo "</script>";

/* ##################################################################### */


/* ##### FISKALIZACJA Etap III - zakończenia ####################### */

echo "<script language='Javascript'>";
echo "LBTREXIT( '0','0','0','1SW','0','0','0','".$laczna_naleznosc."','".$laczna_naleznosc."','0' );";
echo "</script>";

/* ###################################################### */

...

Nie zastanawiałem się jeszce nad tym co z kontrolą błedów ale nawet nie mam pojęcia jak przekazać do php wynik funkcji Javascript :-)

Wszystkie funkcje są dobrze udokumentowany w instrukcji .pdf

Pozdrawiam i zyczę powodzenia

mlattari



Witam!

Ponieważ już kilku z forumowiczów do mnie napisało, podpowiem wszystkim zainteresowanym tym tematem, jak się za to brać.

Otóż na stronie http://www.posnet.com.pl/index.php?pid=1307 jest do pobrania kontrolka Active-X dla drukarki Posnet Thermal (EXE; 644 KB). Trzeba ją najpierw pobrać i zainstalować :-)))

W katalogu DOC są 2 ważne pliki: strona_testowa_ocx.htm oraz instrukcja_ocx.pdf, natomiast biblioteka ThermalLib.ocx (najważniejsza z tego wszystkiego - ale jej nie modyfikujemy :-) ) znajduje się piętro wyżej :-)

Wszystkie potrzebne Wam funkcje są użyte w pliku strona_testowa_ocx.htm i można sobie je łatwo podejrzeć i użyć we własnych skryptach. Trzeba pamiętać o poprawnym osadzeniu obiektu:

<OBJECT id=ThermalLib height=0 width=0 classid=clsid:904511D2-5407-4033-8DAD-07B33EC7317E><PARAM NAME="_Version" VALUE="65536"><PARAM NAME="_ExtentX" VALUE="26"><PARAM NAME="_ExtentY" VALUE="26"><PARAM NAME="_StockProps" VALUE="0"></OBJECT>

a także o tym, że Active-x działa niestety tylko w IE no i trzeba go nieraz "włączyć" w zabezpieczeniach przeglądarki. Pamiętajcie, że także biblioteka .ocx musi być dostępna najlepiej w tym samych katalogu co Wasz skrypt.

Oto, w skrócie i bez kontekstu, jak dostosowałem funkcje do moich potrzeb - tzn bez formularzy itp i jak je połączyłem z moimi skryptami (przykład 3 podstawowych funkcji, które używam - inne mi są akurat w tej chwili niepotrzebne):


[funkcje]

...

<script LANGUAGE='JavaScript1.1'>

function OpenPort() {
data = ('COM1')
ThermalLib.THLOpenPort(data)
ThermalLib.THLSendBel()
}

function LBTRSHDR( ilosc_pozycji_sprzedazy,ilosc_dodatkowych_linii_tekstu,linia1,linia2,linia3 )
{
var ico = ThermalLib.LBTRSHDR(ilosc_pozycji_sprzedazy,ilosc_dodatkowych_linii_tekstu,linia
,linia2,linia3)
alert(\"LBTRSHDR: \" + ico)
}

function LBTRSLN( numer_linijki,rodzaj_rabatu,opis_rabatu,nazwa_towaru,ilosc,stawka_ptu,cena_jedno
tkowa_brutto,razem_brutto,
kwota_rabatu,opis_rabatu )
{
var ico = ThermalLib.LBTRSLN( numer_linijki,rodzaj_rabatu,opis_rabatu,nazwa_towaru,ilosc,stawka_ptu,cena_jedno
tkowa_brutto,razem_brutto,kwota_rabatu,opis_rabatu )
alert( \"LBTRSLN : \" + ico)
}

function LBTREXIT(rabatu_procentowy,ilosc_dodatkowych_linii_stopki,rodzaj_rabatu,kod_kasy
kasjera,linia1,linia2,linia3,razem_zaplacono,razem_naleznosc,rabat)
{
var ico = ThermalLib.LBTREXIT(rabatu_procentowy,ilosc_dodatkowych_linii_stopki,rodzaj_raba
u,kod_kasy_kasjera,linia1,linia2,linia3,razem_zaplacono,razem_naleznosc,rabat)
alert(\"LBTREXIT : \" + ico)
}

</script>

...

[zastosowanie funkcji (bez kontekstu - fragmenty wycięte ze skryptów)]

...

/* ##### FISKALIZACJA Etap I - Otwarcie portu COM + inicjalizacja fiskalizacji ##### */

echo "<script language='Javascript'>";
echo "OpenPort();";
echo "LBTRSHDR( '0','0','0','0','0' );";
echo "</script>";

/* ######################################################## */


/* ##### FISKALIZACJA Etap II - wysłanie pozycji sprzedaży ############################# */

echo "<script language='Javascript'>";
echo "LBTRSLN( '".$linijka."','0','0','".substr($produkt[0],0,20)."(".$produkt[2].")"."','".$produkt[1]."','".
$produkt[2]."','".$produkt[3]."','".$produkt[4]."','0','0' );";
echo "</script>";

/* ##################################################################### */


/* ##### FISKALIZACJA Etap III - zakończenia ####################### */

echo "<script language='Javascript'>";
echo "LBTREXIT( '0','0','0','1SW','0','0','0','".$laczna_naleznosc."','".$laczna_naleznosc."','0' );";
echo "</script>";

/* ###################################################### */

...

Nie zastanawiałem się jeszce nad tym co z kontrolą błedów ale nawet nie mam pojęcia jak przekazać do php wynik funkcji Javascript :-)

Wszystkie funkcje są dobrze udokumentowany w instrukcji .pdf

Pozdrawiam i zyczę powodzenia

mlattari
dr_bonzo
Cytat
Nie zastanawiałem się jeszce nad tym co z kontrolą błedów ale nawet nie mam pojęcia jak przekazać do php wynik funkcji Javascript :-)


AJAX AJAX AJAX

Ajaxem wywolasz request w php i mozesz do niego przekazac dane GETem czy POSTem
mlattari
hmm :-) nie jestem obeznany w AJAXie :-) Mógłbyś dać treściwy i prosty przykład? Wielkie dzięki z góry :-))
8bolek
mlattari czy Twoja aplikacja dziala online na zewnetrznym serwerze? czy lokalnie?

>u mnie dziala z kontrolka ale jedynie lokalnie, gdy odpalam z serwera przestaje dzialac...
kurt
Mam pytanie odświeżające temat. Czy ktoś uporał się z problemem użycia biblioteki ThermalLib.ocx w plikach php ? testowałem zamieszczony na stronie Posnet pliczek html (lokalnie!) i faktycznie ładnie komunikuje się z drukarką. Problem pojawia się kiedy chcę go użyć w php - wszystko przestaje działać.
f1xer
jak może przestać działać javaScript? z tego co przeczytałem wcześniej to instalujesz kontrolkę ocx na kliencie i teraz masz scenariusz

Zapytanie do serwera -> twoja aplikacja generuje odpowiedną stronę z JavaScript -> użytkownik klika drukuj paragon co wywołuje przygotowany wcześniej kod Java Script ten kod komunikuje się z ocx a kontrolka komunikuje się z drukarką.

I to musi działać (chyba że przeglądarka nie obsługuje Active-x ale to inna bajka).
erix
W jednym wątku pytasz, to się tego trzymaj, a nie spamujesz. Zamykam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.