Bom dia amigos,
Estou precisando ‘escutar’ uma mensagem hexadecimal via socket de um rastreador GPS (Maxtrack) que utiliza GPRS.
Segundo o manual do equipamento esta é a mensagem em Hexadecimal:
01 08 2D 05 02 72 2A 25 10 21 FF 42 6C 49 49 39 38 00 00 00 00 00 00 10 30 6B 24
A1 1F E3 00 B4 30 00 0B 05 10 31 17 10 21 20 10 24 00 00 00 1E 00 00 00 0D 36 00
10 24 13 C9 04
Implementei a ‘escuta’ via socket com o seguinte codigo:
String leitura;
...
//
// para receber os dados dos clientes
//
BufferedReader entrada = new BufferedReader(new InputStreamReader(
conexao.getInputStream()));
leitura = entrada.readLine();
...
Este código está dentro de uma Thread.
Acontece que não estou conseguindo ‘entender’ a valor capturado, quando exibo o valor da variável leitura é me retornado:
-??V*K?! 37kM9A ?0j Ò?Î?!ÿ2
Esta é a forma certa para ler um valor hexadecimal em uma porta especifica ?
Desde já agradeço uma possível ajuda.
[]s
Júnior Carvalho
Primeira coisinha - não use um BufferedReader, ou qualquer coisa que termine em Reader, para pegar dados binários de um socket.
Segunda coisa - não vêm dados em hexa pelo socket, mas dados binários.
Ele está só facilitando as coisas para você e mostrando o byte em hexadecimal (08) em vez do byte como um número (que seria 8). Até porque não dá para imprimir, por exemplo, o byte 00 (que seria mostrado como um espaço em branco).
Você não entendeu isso?
Obrigado pela resposta.
Voce teria alguma dica de qual funcao usar para escutar de forma certa o Socket?
Eu conseguindo escutar/receber em Byte eu depois transformo para Hexa. É isto ?
grato
Júnior Carvalho
Um byte contém um valor numérico. Esse número é comumente exibido na base decimal, mas pode ser representado em qualquer base, inclusive a hexadecimal.
Então, se vc tem um byte na mão, essas duas comparações são equivalentes:
seuByte == 13
seuByte == 0xD; //O mesmo que testar se esse byte tem o valor 0D, que é 13 em decimal.
Para ler do Socket, use um BufferedInputStream.
Ou, melhor do que isso, crie um SocketChannel e use ByteBuffers.
Boa tarde a todos,
Todos os exemplos que achei sobre BufferedInputStream foram de transmissão de arquivos. Tentei fazer seguindo a lógica de alguns exemplos e não obtive sucesso.
Algum colega teria um exemplo do BufferedInputStream sem ser lendo arquivo ?
E quando eu conseguir o retorno do BufferedInputStream, o mesmo será em Byte ?
grato
Júnior Carvalho
O manual do equipamento não te diz como interpretar esses bytes?
Você precisa entender completamente o protocolo de comunicação. Sem isso, nem exemplo podemos dar.
ViniGodoy, obrigado pela sua ajuda.
Li o tópico que voce faz referência na resposta e entendi o conceito de protocolo.
Quando ao manual do equipamento, so tem esta parte do hexa que citei na 1º mensagem. E o fabricante não tem suporte de desenvolvimento.
O equipamento é um Maxtrack, MTC500. Ele envia via GPRS alguns dados para um servidor pre-configurado.
Ja tenho o servidor configurado com a porta liberada. Fiz um teste usando um cliente(Java e Delphi) simulando o envio e deu certo.
Quando utilizo BufferedReader o que recebo do GPS é:
-??V*K?! 37kM9A ?0j Ò?Î?!ÿ2
e ao tentar usar BufferedInputStream não consegui pegar nada do GPS.
Estou agora tentando usar o SocketChannel para ver se consigo.
Grato
Júnior Carvalho
Cara, como o entanglement falou, não adianta imprimir os bytes como se fossem texto. O resultado vai ser só lixo indecifrável (até pq, muitos bytes se converterão em caracteres invisíveis ou indistinguíveis).
Sem ter a documentação do protocolo, fica muito, muito, muito, muito, muito difícil interpretar esses bytes. Você, por exemplo, não saberá nem quantos bytes ler do canal. Sem essa informação, fica impossível saber onde um pacote de dados acaba e onde outro começa. Isso porque no socket, um “write” do lado do servidor não corresponde necessariamente a um “read” do lado do cliente. Entendeu? Um servidor pode fazer um único write de 500 bytes, e o cliente ser obrigado a fazer 3 reads, um de 200, um de 100 e outro de mais 200 para ler os dados. E como o cliente sabe que eram 500 bytes? Através do protocolo.
Ou seja, provavelmente um, dois, ou quatro bytes desse monte de hexa aí irá conter a informação do tamanho do pacote. Outros bytes irão conter o tipo do dado, informações de coordenadas, dados dos satélites, etc… Sem entender como isso está organizado, é pouco provável que você consiga fazer qualquer coisa útil com esses dados.
Obrigado camarada,
lendo aqui o manual (uma pena nao poder passar para o guj, pois é restrito) tenho o seguinte:
Apesar da mensagem nao ter tamanho ela tem byte de inicio e byte de fim.
“O início do frame é demarcado pelo caractere 01h e o final do frame pelo caractere 04h. Todos os caracteres anteriores ao inicio do frame(01h) ou posteriores ao final de frame(04h) devem ser desconsiderados, funcionando o caractere 01h como um comando flush e o carctere 04h como um comando de push”.
Bom com isto , ao meu entender, mesmo eu nao tenho o tamanho , eu consigo dentro de um while verificar os dados recebidos.
Qual seria a melhor forma ? Utilizar BufferedInputStream e fazer um while de leitura e testar byte a byte ?
Meu código de leitura está assim:
//
// para receber os dados dos clientes
//
BufferedInputStream in;
try {
in = new BufferedInputStream(conexao.getInputStream());
int c = 0;
while ((c = in.read()) >= 0) {
// como ler aqui byte a byte ?
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
Minha dúvida é como ler byte a byte dentro do while e testar o byte?
Obrigado
Júnior Carvalho
Com este código consegui pegar a mensagem do servidor.
Obrigado a todos que responderam.
Estarei implementando a parte de comunicação com o rastreador. Assim que tiver concluido vou disponibilizar as classes como exemplo para todos.
Valeu galera.
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.Socket;
public class Server implements Runnable {
private Socket conexao;
public Server(Socket s) {
conexao = s;
}
@Override
public void run() {
//
// para receber os dados dos clientes
//
BufferedInputStream in;
String leitura = "";
try {
conexao.setTcpNoDelay(true);
in = new BufferedInputStream(conexao.getInputStream());
int c;
byte[] b = new byte[4];
while ((c = in.read(b, 0, 4)) != -1) {
leitura += getHex(b);
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(" " + conexao.getInetAddress() + ":"
+ conexao.getLocalPort());
System.out.println(leitura);
}
public static String getHex(byte[] raw) {
final String HEXES = "0123456789ABCDEF";
if (raw == null) {
return null;
}
final StringBuilder hex = new StringBuilder(2 * raw.length);
for (final byte b : raw) {
hex.append(HEXES.charAt((b & 0xF0) >> 4)).append(
HEXES.charAt((b & 0x0F)));
}
return hex.toString();
}
}
Grato
Júnior Carvalho
Julio estou na mesma situação poderíamos trocar umas idéias ??
melhor ainda se for pelo skype.
Obrigado.
por favor, estou precisando de uma ajuda, configurei um GPS do meu
carro tudo corretamente, para o meu celular (SMS) tudo esta vindo corretamente
latitude e longitue, porém agora configurei para eu ler essa informação via
IP/Porta, ocorre que recebo a informação utilizando SOCKET do delphi 7 porém
somente recebo IMEI do gps e o restante das informações não vem.
Se puderem me dar uma ajudar fico grato e se eu puder ajudar em alguma coisa estarei aqui.
Obriagdo…
Vinícius…
Esqueci de falar, estou usando o GPS Tracker TK103.
Aguardo Resposta…
Boa tarde a todos,
tenho recebido mensagens solicitando informações sobre o post em questão.
Peço desculpa por não responder pois não estou mais trabalhando com este sistemas.
Na verdade trabalhei em 2011 com o gateway de rastreamento.
Tudo o que consegui está postado neste post. E não possuo nem documentação nem fontes.
Att.
Júnior
Amigos, desculpe por levantar o tópico, é que não consegui enviar mensagem privado aos envolvidos.
Alguém aqui conseguiu resolver a questão do socket ?
Obrigado.
Estou com o mesmo problema, leio o Socket porém só recebo o número do IMEI ?
Como ler o restante dos dados, utilizo Delphi7
agradeço qualquer ajuda.
marciofermino você conseguiu resolver ??
na verdade não mexi mais, voce conseguiu ?
Vinicius eu preciso entrar em contato com vc estou fazendo uma aplicação desse tipo e queria sanar uma dúvidas.