Подключение устройства C2 с использованием Java и Hex - PullRequest
0 голосов
/ 12 февраля 2012

Я пытаюсь подключить устройство C2 устройства идентификации отпечатков пальцев (tc400) в Linux.Поставщик оборудования предоставляет мне файл DLL, который я не могу использовать в Linux, поэтому я попытался использовать программирование сокетов и общаться с устройством с помощью шестнадцатеричного кода.Проблема в том, что устройство вообще не отвечает, и код вылетает, когда я пытаюсь получить входной поток клиентского сокета.Это весь мой код:

 import java.io.*;
 import java.net.*;
 public class Client{
Socket requestSocket;
ObjectOutputStream out;
ObjectInputStream in;
String message;
Client(){}
void run()
{
    try{
        //1. creating a socket to connect to the server
        requestSocket = new Socket("172.16.16.192", 5010);
        //requestSocket = new Socket("localhost", 5010);
        System.out.println("Connected to Machine in port 5010");
        //2. get Input and Output streams
        System.out.println("-1");
        out = new ObjectOutputStream(requestSocket.getOutputStream());
        //out.flush();
        System.out.println("D0");
        sendMessage("A5\\x00\\x00\\x00\\x00\\x30\\x00\\x00\\x51\\x10"); // getting the device information
        in = new ObjectInputStream(requestSocket.getInputStream());
        //3: Communicating with the server
        System.out.println("D1");
        do{
            System.out.println("D2");
            try{
                System.out.println("D3");

                sendMessage("A5\\x00\\x00\\x00\\x00\\x30\\x00\\x00\\x51\\x10"); // getting the device information
                System.out.println("D5");
                byte msg [] = null;
                System.out.println("D6");
                msg = (byte[])in.readObject();
                System.out.println("D7");
                System.out.println("Machine>" + msg);

                //sendMessage(message);
                //message = (String)in.readObject();
            }
            catch(ClassNotFoundException classNot){
                System.err.println("data received in unknown format");
            }
        }while(!message.equals("bye"));
    }
    catch(UnknownHostException unknownHost){
        System.err.println("You are trying to connect to an unknown host!");
    }
    catch(IOException ioException){
        ioException.printStackTrace();
    }
    finally{
        //4: Closing connection
        try{
            in.close();
            out.close();
            requestSocket.close();
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
    }
}
void sendMessage(String msg)
{
    System.out.println("D4");

    try{
        System.out.println("D41");
        out.writeObject(msg.getBytes());
        out.flush();
        System.out.println("client>" + msg);
    }
    catch(IOException ioException){
        ioException.printStackTrace();
    }
}
public static void main(String args[])
{
    Client client = new Client();
    client.run();
}
 }

Если кто-нибудь может помочь мне связаться с устройством, я буду благодарен.

1 Ответ

0 голосов
/ 12 февраля 2012

Хранение двоичных данных в строках - ИМХО плохая идея.Тем более, что используемый в String метод getBytes () возвращает байты в зависимости от кодировки системы по умолчанию (в большинстве случаев для Linux это не UTF-8), что может привести к неожиданным последовательностям байтов.Массивы байтов также могут быть определены следующим образом:

new byte{(byte) 0xA5, (byte) 0x00, (byte) 0x00 (byte) 0x00 (byte) 0x00 (byte) 0x30 (byte) 0x00 (byte) 0x00 (byte) 0x51 (byte) 0x10}

В качестве альтернативы вы можете использовать Общий кодек Apache Hex для преобразования шестнадцатеричных строк в байтовый массив.

Вторая ошибкаэто использование ObjectInputStream и readObject() для чтения восстановленных данных.Он предназначен для чтения данных сериализованного класса Java.Лучше используйте DataInputStream и этот код:

byte msg [] = new byte[1024];
System.out.println("D6");
int bytesReturned = in.read(msg, 0, msg.length);

Обратите внимание, что результат может быть неполным, если данные не передаются как один блок.Если вы знаете точный размер сообщения, используйте взамен readFull (msg).

...