Usando portas (com, lpt) atravez de Applet em web browser

22 respostas
Glaudiston

Oi Comunidade,

Estou ralando pra descobrir uma forma que funcione em todos os browsers para conseguir acesso direto às portas do client, preciso de acessar as COM1-8, LPT1 e impressoras configuradas na rede, mas tem q ser via client.

Consegui em activeX mas soh funciona em i.e., sendo assim ainda tô ferrado nos meus clients linux e nos que usam firefox.

Fucei muito no w3c e encontrei uma possível saída, são esses tais javaapplets, que pelo que entendi é um programa feito em java (.class) que é baixado pro client e executado,

agora, já descobri que a função de impressão do javaapplet usa o windows, o q eu não quero, então o que quero saber é:

1 - Existe como acessar uma determinada porta de comunicação do client e enviar informações para ela sem o “dedão” do sistema operacional?

2 - Tem como me enviar um exemplo ou pelo menos un artigo?

Espero que vocês consigam me ajudar, Sei q não sou o único com esse pepino, e com certeza vou compartilhar a saída se houver alguma.

Abs,
Ton

22 Respostas

cv1

Eu odeio ser o cara que dah mas noticias, mas voce acabou de dar de cara com um problemasso. Nao tem absolutamente NENHUM outro jeito que nao envolva fazer uma pagina web acessar o hardware?

Luca

Olá

Acho que entendi porque o CV perguntou se você não tem outra opção. Foi o fato de você nem ao menos saber o que é uma applet.

Este tipo de problema pode ser resolvido usando applets e pode rodar em Windows, Linux, IE, Firefox, Netscape, etc.

[]s
Luca

cv1

Sim, mas costuma dar um trabalho do cao pra conseguir fazer o treco funcionar mesmo em todas as plataformas e browsers, alem de passar por cima do modelo de seguranca dos browsers e JVMs :frowning:

Luca

Olá

CV, mas é claro que dá trabalho. Sei que não é coisa trivial porque já participei de vários projetos que faziam isto. Se estou bem lembrado, o Banco Postal para ser portado para Linux precisou de uns 3 dias.

Mas não considero que o uso de applets assinadas seja passar por cima do modelo de segurança do browser. Na minha opinião a exigência de uso de um certificado de preferência de raiz confiável é exatamente reforçar o modelo de segurança. O Activex é que pode passar batido

[]s
Luca

fmeyer

ele poderia usar webservices … mas pra isso é outras 5000 horas de voo em java …
antes que o cv fale de novo …

to rindo até agora … hehehehe

Glaudiston

Luca:
Olá

Acho que entendi porque o CV perguntou se você não tem outra opção. Foi o fato de você nem ao menos saber o que é uma applet.

Este tipo de problema pode ser resolvido usando applets e pode rodar em Windows, Linux, IE, Firefox, Netscape, etc.

[]s
Luca

Boa tarde a todos,

Luca,

Não tem problema ser difícil, se resolve meu problema de acesso às portas do client eu vou correr atraz disto, e como vc já fez isto antes, tem como me ensinar como fazer, ou pelo menos me passar algum artigo?

Realmente não conheco nada de criação de applets, e do java soh conheço o javascript, não possuo compilador nenhum de java (tenho j#)
Mas se vc me disser o que eu preciso estudar e que compilador ou ide preciso ter, já ajuda d+.

Preciso de toda a ajuda que puderem me dar, sou autônomo e estou quase perdendo clientes por conta deste problema.

Conto com vocês,
Abs,
Ton

fmeyer

[list]
[1] JavaScript não é Java e nem j#
[2] http://java.sun.com/j2se/1.5.0/download-netbeans.html Download do java + IDE netbeans
[3] http://www.guj.com.br/user.article.list.chain listas de artigos pra voce iniciar
[4] http://java.sun.com/docs/index.html isso vai ser util
[/list]
flw s

Glaudiston

scottys0:
ele poderia usar webservices … mas pra isso é outras 5000 horas de voo em java …
antes que o cv fale de novo …

to rindo até agora … hehehehe

scottys0,

Até onde conheço de webservices, eles servem apenas para comunicação entre aplicativos, e eu quero conversar com um dispositivo do client atraves de um webbrowser,

Se tem jeito de usar webservices pra fazer o q eu quero, tem jeito de me mostrar um exemplo???

T

Então vamos lá.

  1. Para acessar as portas COM e LPT locais do computador, pode-se usar uma biblioteca que siga a especificação javax.comm. Uma delas é da própria Sun e funciona (modo de dizer) em Windows e Solaris Sparc. A outra é do projeto rxtx ( www.rxtx.org ) , e funciona em Linux.
  2. Se você precisa de acessar o seu dispositivo e ele se comporta como uma impressora, no caso LPT, você pode usar o javax.comm tranquilamente. Se ele não se comporta como uma impressora (você quer acessar os bits para fazer alguma outra coisa) o javax.comm não é indicado.
  3. Como a biblioteca javax.comm precisa de copiar uma biblioteca .dll ou .so para o seu path (não classpath), é aconselhável fazer um instaladorzinho - não dá para usar direto.
  4. Referências sobre javax.comm há algumas aqui mesmo neste fórum.
fmeyer

Glaudiston:
scottys0:
ele poderia usar webservices … mas pra isso é outras 5000 horas de voo em java …
antes que o cv fale de novo …

to rindo até agora … hehehehe

scottys0,

Até onde conheço de webservices, eles servem apenas para comunicação entre aplicativos, e eu quero conversar com um dispositivo do client atraves de um webbrowser,

Se tem jeito de usar webservices pra fazer o q eu quero, tem jeito de me mostrar um exemplo???

ai que está … voce pode fazer um aplicativo nativo em java para comunicar como o webservice … quando o cliente fizesse uma requisição onde a resposta do servidor envolveria um acesso a porta … voce (via webservice) enviaria o resultado para um programa no cliente ouvindo em uma porta x … e este por sua vez faria o trabalho … sem ter a necessidade de implementação de applet …
o problema seria para a instalação … se forem muitas maquinas pode ficar uma #$$#@% instalar o programinha client em varias maquinas …

cv1

Fernando, usar webservices aqui nao faz o menor sentido (bom, faz tanto sentido quanto usar RMI, sockets, HTTP ou qualquer outro protocolo de comunicacao). O problema nao eh fazer o servidor falar com o cliente, eh fazer o cliente falar com o hardware :wink:

fmeyer

Mas um cliente nativo seja ele em java ou não seria melhor para converar com o hardware do que um Applet … este receberia a requisição e faria o trabalho, mais limpo e sem a complicada arte burocratica de assinaturas e reconhecimento de firmas em cartorio dos Applets …

PS. Applet assinado até parece coisa do governo brasileiro … :twisted:

Glaudiston

Oi Comunidade,

Baixei o tal do javax.comm e o java sdk1.5.0_03 e o netbeans, até funciona legal, pra fazer o hello world e outros tutoriais q encontrei no javacoffeebreak etc, mas com o javax.comm tah difícil,

pra começar, consegui fazer funcionar a BlackBox que controla as portas COM, mas as ParallelBlackBox nada feito.
quando chamo:
java -native ParallelBlackBox

ele retorna:
Error: native VM not supported

já procurei pra tudo quanto é lado na net, unica coisa q achei é que meu sdk tem q estar atualizado, mas acabei de instalar!!!

Outra coisa, nunca consigo carregar os pacotes javax.comm nas classes q crio, sempre dá um erro dizendo q o package naum existe ou a classe naum é valida ou algo assim.
tentei:
package javax.comm
e tambem:
imports javax.comm

não é apenas uma questão dos browsers, nem o javax.comm eu consigo acessar, fiz a instalação do jeito q estava no html, com excessão de uma linha que não funcionou:
C:>\JRE\bin\jre -cp c:\JRE\jre\lib\comm.jar;c:\commapi\samples\Blackbox\BlackBox.jar BlackBox
e nada funciona, se alguem tem alguma dica ou artigo, agradeço

T

Esse pacote javax.comm foi disponibilizado pela Sun no milênio passado, quando o Papa não estava doente e a Sun não tinha brigado ainda com a Microsoft (agora estão amiguinhas de novo).
Então a documentação supõe que você está usando o JDK 1.1 (tanto é que a implementação deles funciona belezinha com MSJVM!)
Há um HTML cujo nome é JDK12.html (se não me engano), use esse HTML como referência para a instalação e configuração. É terrível, não dá para seguir as instruções exatamente como estão escritas - por exemplo, não existe mais esse parâmetro -native, e outras coisas.

Glaudiston

Blz... consegui fazer um class controlar a impressora...

estou quase lá,

agora fiz o applet e está dando o seguinte erro no console do java:

Java Plug-in 1.5.0_03
Using JRE version 1.5.0_03 Java HotSpot(TM) Client VM
User home directory = C:\Documents and Settings\Glaudiston


----------------------------------------------------
c:   clear console window
f:   finalize objects on finalization queue
g:   garbage collect
h:   display this help message
l:   dump classloader list
m:   print memory usage
o:   trigger logging
p:   reload proxy configuration
q:   hide console
r:   reload policy configuration
s:   dump system and deployment properties
t:   dump thread list
v:   dump thread stack
x:   clear classloader cache
0-5: set trace level to <n>
----------------------------------------------------

 * * * Rotina de controle de portas de comunicação * * * 
Antes de definir a string
Antes de pegar o getParameter
Antes de imprimir a linha
Insert your message here!
Antes do getPortIdentifiers
java.lang.ExceptionInInitializerError
	at portcontrol.init(portcontrol.java:44)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.security.AccessControlException: access denied (java.util.PropertyPermission javax.comm.properties read)
	at java.security.AccessControlContext.checkPermission(Unknown Source)
	at java.security.AccessController.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
	at java.lang.System.getProperty(Unknown Source)
	at javax.comm.CommPortIdentifier.<clinit>(CommPortIdentifier.java:678)
	... 3 more
Acredito que este erro seja por falta de permissão, deve ser o tal problema de assinatura dos applets, então como assino ele?

Vai aí o código do applet que criei:

/*
 * 
 *  Controle de portas seriais e paralelas
 *  2005 por Glaudiston Gomes da Silva
 *  [email removido]
 * 
 * */
import javax.comm.*;
import java.util.*;
import java.lang.*;
import java.io.*;
import java.awt.*;
import java.applet.*;
public class portcontrol extends Applet
{
	static CommPortIdentifier CPIone;
	static Enumeration Eone;
	static ParallelPort Pone;
	static OutputStream OSone;
	static DataOutputStream DOSone;
        private final String PARAM_linha = "linha";
        // Retorna a lista de parametros
        public String[][] getParameterInfo() 
        {
        String[][] info = {
            {
                PARAM_linha, "String", "String a ser impressa" 
            }, 
        }; 
        return info; 
        } 
	public void init ( )
	{
            System.out.println(" * * * Rotina de controle de portas de 

comunicação * * * ");
		System.out.println("Antes de definir a string");
        	String linha;
		System.out.println("Antes de pegar o getParameter");
            	linha = getParameter(PARAM_linha);
		Label mLabel = new Label ("linha teste ");
		add(mLabel);
		System.out.println("Antes de imprimir a linha");
		System.out.println(linha);
		System.out.println("Antes do getPortIdentifiers");
		Eone=CommPortIdentifier.getPortIdentifiers();
		System.out.println("Antes de entrar no while");
		while(Eone.hasMoreElements())
		{
			CPIone=(CommPortIdentifier)Eone.nextElement();
			

if((CPIone.getPortType()==CommPortIdentifier.PORT_PARALLEL)&&((CPIone.getNam

e()).compareTo("LPT1")==0))
			{
				try
				{
					
Pone=(ParallelPort)CPIone.open(CPIone.getName(),3000);
				}
				catch(PortInUseException e){}
				
System.out.println(CPIone.getCurrentOwner());
				System.out.println(Pone.getMode());
				try
				{
					Pone.setMode(1);
                                        //other modes not working..
				}
				catch(UnsupportedCommOperationException e)
				{
					System.out.println("unsupported byte 

mode");
				}
				System.out.println("unidirectional");
			}
		}
		try
		{
			OSone=Pone.getOutputStream();
			DOSone=new DataOutputStream(OSone);
			/// the data goes out here.. this is just a test 

byte
			DOSone.writeChars("Testes de impressão");
                        DOSone.writeByte(10);
			System.out.println("You have come here");
		}
		catch(IOException e)
		{
			System.out.print("you are in ioexception");
			e.printStackTrace();
		}

	}
}

Se alguem puder me ajudar com a assinatura deste applet agradeço muito.
Já estou muito atrazado para a entrega desta rotina.

Abs,
Ton

lordExorcist

No site da SUN tem a nova versão da javax.comm, a 3.0; porém esta versão não tem a API para Windows. Para essa plataforma temos que nos virar com a versão 2.0, que segundo é sabido, é uma versão buguenta!
Eu estou pensando em trabalhar com java e automação industrial… estava esperando mais da SUN nessa área :cry:

http://www.sun.com/download/products.xml?id=41bdadf9

Luca

Olá

Blz! Funciona no Linux (RedHat) e tem bem mais documentação do que o pacote anterior! Talvez não precise mais do rxtx

[]s
Luca

Glaudiston

é mas preciso de um javax.comm que rode em windows tbm ainda preciso de ajuda pra assinar meu applet…

ajuda ai pessal…

Luca

Olá

O javax.comm 2.0 para Windows vc baixa no site da Sun.

Só eu já passei uns trocentos links de assinatura de applet. Já coloquei passo a passo e citei o link várias vezes. Será que está faltando busca?

[]s
Luca

Glaudiston

luca desculpa…

mas ainda to tendo problema com a assinatura, já vi os post sobre isto, consegui criar o applet, o keystore, o jar , o crt e até o html mas mesmo assim dá o mesmo erro da falta de permissão…

o browser não me pergunta se quero aceitar nenhum certificado e no javaconsole está dando o mesmo erro…

tentei até instalar o certificado, o windows xp disse q ia confiar nele e tudo… mas continua igual…

vi em um post q vc disse q tem q importar pro cacerts… mas não disse como fazer isto… o cacerts é binario… que comando eu uso pra importar meu certificado pra ele?

se tiver algum artigo sobre isso pode soh me passar o link… naum precisa responder denovo…

obrigado.

Luca

Olá

  1. Você assinou [size=18][color=red]TODOS[/color][/size] os jars inclusive o comm.jar?

  2. Você instalou o javax.comm de acordo com as intruções de instalação?

  3. Caso responda sim para 2 e PRINCIPALMENTE 1, mostre aqui tudo o que vc fez. Mas antes veja os helps dos utilitários keytool, jarsigner, etc. Procure no site da Sun ou no google.

[]s
Luca

A

Olá Glaudiston,
gostaria de saber se vc conseguiu resolver o seu problema com o JAVA. Estou precisando muito de ajuda para o meu TCC, preciso fazer uma página WEB interagir com um leitor biométrico. Criei uma Applet que funciona perfeitamente, mas quando coloco pra rodar no browse (IE, Firefox, etc) não roda.

Criei o JAR, assinei ele na minha máquina e não tem jeito de funcionar. Talvez esteja errando em algum detalhe, pois tb sou leigo em Java.

Agradeço se conseguir ajudar!

Criado 7 de maio de 2005
Ultima resposta 12 de out. de 2013
Respostas 22
Participantes 7