Javaprinter - Star TSP100

In diesem Forum können Fragen zum OrderSprinter gestellt werden.
Dux

Javaprinter - Star TSP100

Beitrag von Dux »

Hallo zusammen, hallo Stefan,

bei der Einrichtung bzw. Verwendung des Druckers/Javaprinters komme ich nicht weiter.

Drucker wird erkannt:

Code: Alles auswählen

~ $ lsusb

Bus 001 Device 006: ID 046d:c050 Logitech, Inc. RX 250 Optical Mouse
Bus 001 Device 004: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 010: ID 0519:0003 Star Micronics Co., Ltd TSP100ECO/TSP100II
Bus 001 Device 007: ID 0424:7800 Standard Microsystems Corp. 
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Config wurde entsprechend angepasst:

Code: Alles auswählen

config.json

{
   "instance" : 1,
   "vendorid" : "3",
   "productid" : "519",
   "printersize" : 40,
   "printcode" : "123",
   "baseurl":"http://192.168.178.73",
   "baseusername" : "",
   "basepass" : "",
   "escinits" : [ 27, 64, 27, 116, 0 ],
   "escposts" : [ 29, 86, 66, 10, 27, 64],
   "useeveryprintdevice" : 0,
   "verbose_closing_summary" : 1,
   "smallformat" : 0,
   "logoscale" : 1.0
}
Druckauftrag wird empfangen und ausgeführt. Nach der "bytes sent" Rückgabe scheint der Druckauftrag zwar gesendet bzw. abgeschlossen zu sein, der Drucker zuckt aber nicht.

Code: Alles auswählen

$ cd /usr/local/bin/javaprinter
$ sudo java -jar javaprinter.jar -configfile=config.json

Javaprinter version 2.0
Operation mode: 
OperationMode [asyncUsb=false, allowBigPackets=false, weakssl=false, cups=false, legacy=false, onlydump=false, cupsPrintername=, configFile=config.json]
Read: config.json
Instance: 1
Config: Config [printersize=40, vendorid=519, productid=3, currency=Euro, decpoint=,, companyinfo=Musterrestaurant
ABC-Stra\u00dfe 123
12345 Beispielstadt
Deutschland
StNR: 123
UStID:456, escinits=[27, 64, 27, 116, 0], escposts=[29, 86, 66, 10, 27, 64], printcode=123, baseurl=http://192.168.178.73, baseusername=, basepass=, verbose_closing_summary=0]
Print Work Job: 33
Scaled from 271 to width: 144 by scale 0.5313653136531366
Endpoint: 2
3303 bytes sent
Gibt es eine Möglichkeit den Druckauftrag zu debuggen? Unter Windows funktioniert der Drucker ohne Probleme. In den Einstellen musste ESC/POS Routing zwar aktiviert werden, damit das Abschneiden der Bons funktioniert, ansonsten musste ich jedoch keine weiteren Einstellungen vornehmen.

Gruß Frank
pichel
Administrator
Beiträge: 1168
Registriert: So 13. Sep 2015, 19:48
Wohnort: Hamburg
Kontaktdaten:

Re: Javaprinter - Star TSP100

Beitrag von pichel »

Hallo Frank,

ich sende die ESC/POS-Daten ziemlich direkt über die USB-Schnittstelle an den Drucker, nachdem ich mir das Interface geclaimt habe. Hier habe ich mich an den Beispielen, die das usb4java-Projekt veröffentlicht hat, orientiert. Ich kann dir den entsprechenden Code-Abschnitt gerne zeigen:

Code: Alles auswählen

	private static void sendToUsb(final UsbInterface iface, byte[] content, boolean asyncUsb, boolean allowBigPackets) throws UsbNotActiveException, UsbNotOpenException, UsbDisconnectedException, UsbException, UnsupportedEncodingException {
		byte outEndPointAddr = getOutEndpoint(iface);
		System.out.println("Endpoint: " + outEndPointAddr);
		
		UsbEndpoint endpoint = iface.getUsbEndpoint(outEndPointAddr);
		UsbPipe pipe = endpoint.getUsbPipe();
		
		if (asyncUsb) {
			pipe.addUsbPipeListener(new UsbPipeListener()
			{            
			    @Override
			    public void errorEventOccurred(UsbPipeErrorEvent event)
			    {
			        UsbException error = event.getUsbException();
			        System.err.println("An error occured with asynchronous transfer" + error.getMessage());
			        try {
					iface.release();
				} catch (UsbNotActiveException | UsbDisconnectedException | UsbException e) {
					e.printStackTrace();
				}
			    }
			    
			    @Override
			    public void dataEventOccurred(UsbPipeDataEvent event)
			    {
			        byte[] data = event.getData();
			        System.out.println("Bytes sent: " + event.getActualLength());
			        try {
					iface.release();
				} catch (UsbNotActiveException | UsbDisconnectedException | UsbException e) {
					e.printStackTrace();
				}
			    }
			});
		}
		
		pipe.open();
		try
		{
			if (!asyncUsb) {
				int sent = 0;
				if (allowBigPackets) {
					sent = pipe.syncSubmit(content);
				} else {	
				int packageSize = 4;
			    	int written = 0;
			    	int len = content.length;
			    	while (written < len) {
			    		int size = Math.min(len-written, packageSize);
			    		byte[] contentToSend = Arrays.copyOfRange(content, written, written + size);
			    		sent += pipe.syncSubmit(contentToSend);
			    		
			    		written += contentToSend.length;
			    		if (written > len) break;
			    	}
				}
			    System.out.println(sent + " bytes sent");
			} else {
				pipe.asyncSubmit(content);
			}
		}
		finally
		{
			try {
				Thread.sleep(1*1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		    pipe.close();
		}
	}
Wenn nun der Star-Drucker eine andere Kommunikation über USB erwartet, geht sowas natürlich schief. Ich mache meine Tests mittlerweile stets mit einem Eson-Drucker TM T-88. Bisher funktionierten alle anderen Drucker außer den Produkten von Munbyn damit, aber das ist natürlich nie garantiert.

Für solche Fälle (und wenn der Drucker z.B. drahtlos statt per USB angeschlossen werden soll) habe ich dem Javaprinter auch beigebracht, CUPS zu verwenden.

Bitte versuche doch mal folgendes:
1. Hole dir den Linux.CUPS-Treiber vom Star-Drucker und richte ihn unter CUPS ein.
2. Mache einen Einzeiler in einem Texteditor und drucke den auf den Drucker (also unabh. von OrderSprinter).
3. Wenn (2) funktioniert hat, dann mache den Drucker zum Standard und teste mal mit javaprinter -cups -configfile=...

Gruß,

Stefan
Stefan Pichel
Entwickler der Kassensoftware OrderSprinter (http://www.ordersprinter.de)
Frank S.

Re: Javaprinter - Star TSP100

Beitrag von Frank S. »

Hallo Stefan,

vielen lieben Dank für deine Antwort und Erklärung. Hier ein kleines Update, falls jemand anders auch mal versucht diesen Drucker (oder ähnliche von STAR) auf einem Raspberry Pi mit dem Javaprinter zu verwenden. Leider hatte ich keinen Erfolg!
In den Einstellen musste ESC/POS Routing zwar aktiviert werden[...]
1. Hier hatte ich bereits kurz erwähnt, dass es unter Windows eine ESC/Pos Routing Einstellung gibt. Die genaue Erklärung dazu findet man hier:

https://github.com/mike42/escpos-php/is ... -127620436

==> Weder die direkte Verwendung mit dem Javaprinter noch https://github.com/klirichek/zj-58 funktioniert also unter Raspberry Pi OS.
Bitte versuche doch mal folgendes:
1. Hole dir den Linux.CUPS-Treiber vom Star-Drucker und richte ihn unter CUPS ein.
2. Mache einen Einzeiler in einem Texteditor und drucke den auf den Drucker (also unabh. von OrderSprinter).
3. Wenn (2) funktioniert hat, dann mache den Drucker zum Standard und teste mal mit javaprinter -cups -configfile=...
2. Zunächst sei gesagt, dass ich mich mit CUPS etc. nicht wirklich auskenne. Um alles zu testen habe ich also erst einmal einen Kyocera SW-Laserdrucker installiert. Hat sofort funktioniert!

Unter http://www.starmicronics.com habe ich mir für den TSP100 den entsprechenden Treiber herunter geladenen und die Filter- und PPD-Dateien dementsprechend in "//usr/lib/cups/filter/" und "//usr/share/cups/model/star/" kopiert. Die anschließende Installation des Druckers war keine Problem. Der richtige Treiber wird automatisch gefunden und kann folglich konfiguriert werden (Papier, Druckgeschwindigkeit, Kassenschubladen etc.). Beim Testdruck erscheint dann jedoch folgender Fehler: "Filter failed". Dem Log-File unter "//var/log/cups/error_log" konnte ich dann entnehmen, dass die rastertostart Filter-Datei mit einem Fehler stoppt. Dieses Fehlerbild führte mich dann zu der banale "Lösung", dass die Linux-Treiber von Star natürlich für die x86- und nicht ARM CPU-Architektur gedacht sind. Im Netz konnte ich leider keinen entsprechenden Treiber finden.

3. An dieser Stelle wurde der Star-Drucker eingepackt und ein Epson TM T-88 IV für 30€ gekauft. Den Epson angeschlossen und sofort hat es per "direktem" Druck funktioniert. Den STAR-Drucker wollte ich mir später nochmal anschauen.

4. Im Nachhinein konnte ich feststellen, dass im Treiberpaket von starmicronics der Quellcode und ein makefile des Treibers zu finden sind. "sudo make und sudo make install" im entsprechenden Verzeichnis enden zwar mit einigen Warnungen, tatsächlich können nun aber normale (Texteditor, LibreOffice) Ausdrucke über den CUPS-Server getätigt werden.

==> Kleiner Erfolg! :-)

5. Beim Druck über den Javaprinter kommt es jedoch zu folgendem Fehler:

Code: Alles auswählen

Print Work Job: 56
Scaled from 271 to width: 144 by scale 0.5313653136531366
Starting CUPS print
Document transferred to printer
Print job failed
javax.print.PrintException: java.io.IOException: Cannot run program "/usr/bin/lpr": error=2, No such file or directory
...

6. Über "sudo apt-get install cups-bsd" wurde das scheinbar fehlende Paket installiert

==> "sudo apt-get install lpr" führt im Javaprinter zu einem Fehler, da lpr den Druckername nicht zuordnen kann.

7. Testdrucke über "lp -d TSP test.txt" bzw. "lpr -P TSP test.txt" (TSP ist der Druckername) funktionieren einwandfrei.

==> Nächster Erfolg! :-)

8. Voller Hoffnung nun der finale Test mit dem Javaprinter unter der Verwendung von CUPS.

Code: Alles auswählen

pi@raspberrypi:~ $ cd /usr/local/bin/javaprinter
pi@raspberrypi:/usr/local/bin/javaprinter $ sudo java -jar javaprinter.jar -mode=cups -cupsprinter="TSP" -configfile=config.json
Javaprinter version 2.0
Operation mode: 
OperationMode [asyncUsb=false, allowBigPackets=false, weakssl=false, cups=true, legacy=false, onlydump=false, cupsPrintername=TSP, configFile=config.json]
CUPS information:
  Number of print services: 1
  Available printer: 
TSP
Read: config.json
Instance: 1
Config: Config [printersize=40, vendorid=519, productid=3, currency=Euro, decpoint=,, companyinfo=Musterrestaurant
ABC-Stra\u00dfe 123
12345 Beispielstadt
Deutschland
StNR: 123
UStID:456, escinits=[27, 64, 27, 116, 0], escposts=[29, 86, 66, 10, 27, 64], printcode=123, baseurl=http://192.168.178.73, baseusername=, basepass=, verbose_closing_summary=0]
Print Work Job: 66
Scaled from 271 to width: 144 by scale 0.5313653136531366
Starting CUPS print
Document transferred to printer
Document transferred to printer
Printed to TSP
Print Work Job: 67
Scaled from 1000 to width: 480 by scale 0.48
Starting CUPS print
Document transferred to printer
Document transferred to printer
Printed to TSP
==> Der Druckauftrag erscheint kurzzeitig in der Druck-Übersicht, verschwindet dann wieder. Der Druck wird jedoch nicht ausgeführt.

9. Dem Log-File unter "//var/log/cups/error_log" kann ich außer einem "HTTP_STATE_WAITING Closing for error 32 (Broken pipe)" gefolgt von "Closing connection" keine weitere Infos entnehmen.

10. Trotz der erfolgreichen Drucke (siehe Punk 4 und 7) scheint weiterhin ein Treiber-Problem vorzuliegen. Die Javaprinter/CUPS-Drucke über den Kyocera oder Epson funktionieren ohne Probleme.

==> Der STAR-Drucker dient nun als Ersatzgerät für den Windows-Printserver. Der Epson funktioniert wie erwähnt problemlos.

Gruß Frank
pichel
Administrator
Beiträge: 1168
Registriert: So 13. Sep 2015, 19:48
Wohnort: Hamburg
Kontaktdaten:

Re: Javaprinter - Star TSP100

Beitrag von pichel »

Hallo Frank,

vielen Dank, dass du dir so viel Zeit für die Fehlersuche genommen hast und die Erfahrungen mit uns teilst!

Da ich keinen Star-Bondrucker zuhause habe, kann ich hier leider keine weitergehende technische Forschung machen, obwohl es mir schon in den Fingern juckt, es zumindest zu versuchen.

Allerdings bin ich sowieso im Moment so mit anderer Arbeit voll, dass ich dafür gar keine Zeit hätte.

Viele Grüße,

Stefan
Stefan Pichel
Entwickler der Kassensoftware OrderSprinter (http://www.ordersprinter.de)
Antworten