Чтение двойных значений из соединения TCP / IP (JAVA) - PullRequest
0 голосов
/ 03 декабря 2018

Мне нужно прочитать значение скорости из симулятора вождения, который отправляется по TCP / IP.

Определение пакета из симулятора выглядит следующим образом:

<PacketDefinition> =  ((VariableNames, Datatype, Defaultvalue));

, поэтому мой SendDefinitionвыглядит следующим образом:

SendDefinition = ((speed, double, 0.0));

В документации симулятора вождения указывается, что double имеет длину данных = 8.

Я уже пытался прочитать значение следующим образом:

Socket s = new Socket(server, port);
InputStream is = s.getInputStream();
DataInputStream dis = new DataInputStream(is);
System.out.println(dis.readDouble());

Но это дает мне бессмысленные значения.

Может кто-нибудь, пожалуйста, помогите мне прочитать правильные значения?Дополнительная информация: симулятор вождения называется "SILAB"

1 Ответ

0 голосов
/ 03 декабря 2018

Может быть, этот код C ++ может помочь:

void ClusterClientSocket::on_readyRead(){

typedef enum _typeRead{typeRev, typeSpeed, typeSpeedLimit} TypeRead;
static TypeRead nextType = typeRev;

// read recurringly the data from the simulator in the order rev, speed, speed limit
while(m_socket->bytesAvailable() >= sizeof(double)) {
    char buffer[sizeof(double)];
    qint64 size = m_socket->read(buffer, sizeof(double));
    if(size != sizeof(double)) {
        break;
    }

    double value = *(reinterpret_cast<double *>(buffer));
    switch(nextType) {
    case typeRev:
        // qDebug() << "rev: " << value;
        emit revReceived(value);
        nextType = typeSpeed;
        break;
    case typeSpeed:
        //qDebug() << "speed: " << value;
        emit speedReceived(value);
        nextType = typeSpeedLimit;
        break;
    case typeSpeedLimit:
        //qDebug() << "speedLimit: " << value;
        emit speedLimitReceived(value);
        nextType = typeRev;
        break;
    default:
        qDebug() << "unknown value for nextType";
        break;
    }
}}

Это пример, который я получил для следующего SendDefinition

SendDefinition =
            (
                (rev, double, 0.0),
                (speed, double, 0.0),
                (speedLimit, double, 0.0)
            );
...