Автор Тема: Помогите разобрать TCP пакет данных от Geoscape.  (Прочитано 1116 раз)

Оффлайн das124

  • Старенький
  • **
  • Сообщений: 26
  • Карма: +0/-0
Доброго времени суток, Хозяева подземелий.  8)
Что ходить вокруг да около излагаю как есть.
У нас работают станции с штатным ПО GEOScape. Соответственно на выносных ПК, для просмотра данных, стоит GeoSigth.
Встал вопрос не неудобстве использования Геосайта, мол хотим программу геотайма и бесплатно. Как говориться "Чем бы детя не тешилось лишь бы не забеременело  ;D" ну что еще возьмешь с убоги суперов.
В общем была поставлена задача сделать что то более менее свое и практичное и удобное "и что бы мир можно было захватить".
Начал разбираться с TCP пакетами геоскейпа.
В итоге что мы имеем.
Не получается декодировать ответ с флагом 'S'.
Судя по описанию протокола. Логика проста.
1) получаем TCP пакет.
2) смотрим 3-й байт и уже обрабатывает пакет начиная с 4-го по два байта на одно значение до конца пакет.
Поскольку C# не знает такой тип данных как WORD  но он знает ushort, то в него и конвертируем.
Все бы ничего но вот на выходе получаем полную белиберду, ни как не соответствующую тому что должно быть.
Подскажите, Может дело не в бобине?
« Последнее редактирование: 01 Март 2016, 14:38:58 от das124 »
Стадо ежей способно убить слона, но неспособно его съесть.
Ох уж этот жестокий и не справедливый мир.

Оффлайн geofizika2006

  • Старожил
  • ****
  • Сообщений: 273
  • Карма: +16/-11
  • RTFM, изыди!
Хакеров/кракеров преследуют по закону  ;D

Оффлайн das124

  • Старенький
  • **
  • Сообщений: 26
  • Карма: +0/-0
Вообще то имей я какой либо незаконный умысел, то не стал бы вывешивать подобную просьбу на столь еще и специфичном форуме.
Тема на форуме не уведена в сторону.
Протокол был написано REА, к нему по большей части и есть обращение.
А проблема по большей части в том что самопровозглашенные короли Супервайзинга. Тупо не умеют пользоваться программой просмотра данных для станции Разрез обосновывая это словами "Да мне на ПОЛ это не упало что то вести и постоянно смотреть, ставьте мне гео*айм а иначе снимаю вшу станцию с объема."
Стадо ежей способно убить слона, но неспособно его съесть.
Ох уж этот жестокий и не справедливый мир.

Оффлайн cvstsk

  • Местный
  • ***
  • Сообщений: 52
  • Карма: +3/-2
все нормально там работает, разбирайтесь в своем коде.
писал что на java под android, что на delphi, что на php. все отлично приходит.

а чем не нравится геосайт? сколько юзаем -- вопросов не было ни у кого. тут скорее вопрос уже о компетенции супервайзеров ваших нужно ставить ))
единственный вопрос, который иногда задают -- так это в длине буфера, что мол "кажет всего 8/10/12 часов". так это легко правится в geosight.ini на клиенте.

рабочий пример говнокода на java
// get server sensor list
outputStream.write((int) 'S');
outputStream.flush();

packet_length = (inputStream.readUnsignedByte() - 3);
serverResponse = inputStream.readChar();

// Log.d("packet_length=", "" + packet_length);
// Log.d("s?", "" + serverResponse);

response += "";
bytesRead = 0;
totalBytesRead = 0;
int firstbyte, secondbyte;
while (bytesRead < packet_length) {
firstbyte = (0x000000FF & ((int) inputStream.readByte()));
secondbyte = (0x000000FF & ((int) inputStream.readByte()));
response += " /" + (int) (secondbyte << 8 | firstbyte);
bytesRead += 2;
sensorIds[sensorCount] = (short) (secondbyte << 8 | firstbyte);
sensorName[sensorCount] = getSensorFromId((short) (secondbyte << 8 | firstbyte));
sensorCount++;
sensorListTxt += getSensorFromId((short) (secondbyte << 8 | firstbyte)) + "\r\n";

}
Log.e("sensor count", "scount=" + sensorCount);
serverSensorCount = sensorCount;
« Последнее редактирование: 02 Март 2016, 22:16:38 от cvstsk »

Оффлайн das124

  • Старенький
  • **
  • Сообщений: 26
  • Карма: +0/-0
все нормально там работает, разбирайтесь в своем коде.
писал что на java под android, что на delphi, что на php. все отлично приходит.

а чем не нравится геосайт? сколько юзаем -- вопросов не было ни у кого. тут скорее вопрос уже о компетенции супервайзеров ваших нужно ставить ))
единственный вопрос, который иногда задают -- так это в длине буфера, что мол "кажет всего 8/10/12 часов". так это легко правится в geosight.ini на клиенте.

рабочий пример говнокода на java
// get server sensor list
outputStream.write((int) 'S');
outputStream.flush();

packet_length = (inputStream.readUnsignedByte() - 3);
serverResponse = inputStream.readChar();

// Log.d("packet_length=", "" + packet_length);
// Log.d("s?", "" + serverResponse);

response += "";
bytesRead = 0;
totalBytesRead = 0;
int firstbyte, secondbyte;
while (bytesRead < packet_length) {
firstbyte = (0x000000FF & ((int) inputStream.readByte()));
secondbyte = (0x000000FF & ((int) inputStream.readByte()));
response += " /" + (int) (secondbyte << 8 | firstbyte);
bytesRead += 2;
sensorIds[sensorCount] = (short) (secondbyte << 8 | firstbyte);
sensorName[sensorCount] = getSensorFromId((short) (secondbyte << 8 | firstbyte));
sensorCount++;
sensorListTxt += getSensorFromId((short) (secondbyte << 8 | firstbyte)) + "\r\n";

}
Log.e("sensor count", "scount=" + sensorCount);
serverSensorCount = sensorCount;
вот попытка на C#
Ткните носом где не так?
arr - входящий массив байт
ByteForUshort - уже переведенный массив байт в массив значений USHORT
case "83":
                    try
                    {
                        for (int i = 3; i <= lengpack; i++)
                        {
                            ByteForUshort.Add(BitConverter.ToUInt16(new byte[] { arr[i], arr[i++] }, 0));
                            i++;
                        }
                        textBox2.Invoke(new Action(() =>
                            {
                                textBox2.Text += debug(ByteForUshort.ToArray()) + "===\r\n";
                                textBox2.Refresh();
                                textBox2.Select(textBox2.Text.Length, 0);
                                textBox2.ScrollToCaret();
                            }
                            ));
                    }
                    catch (Exception exp2)
                    {
                        new Logging().Exception("Exp2 " + exp2.Message, exp2.StackTrace);
                    }
                    break;
Стадо ежей способно убить слона, но неспособно его съесть.
Ох уж этот жестокий и не справедливый мир.

Оффлайн cvstsk

  • Местный
  • ***
  • Сообщений: 52
  • Карма: +3/-2
я не пишу на c#, поэтому ничем помочь не могу.
мой пост лишь к тому, что все отлично работает, и проверено мной далеко не на одном языке.
так что проблема в вашем коде.. разбирайтесь, успехов.

Оффлайн REA

  • Розов Евгений Анатольевич
  • Глобальный модератор
  • *****
  • Сообщений: 1309
  • Карма: +85/-62
    • GeoSensor
Напишите почту куда скинуть протокол, поделюсь.
Код конечно злой... внутри цикла увеличивать i... почему сразу не написать i+=2?
« Последнее редактирование: 06 Март 2016, 17:40:37 от REA »

Оффлайн das124

  • Старенький
  • **
  • Сообщений: 26
  • Карма: +0/-0
Напишите почту куда скинуть протокол, поделюсь.
Код конечно злой... внутри цикла увеличивать i... почему сразу не написать i+=2?
Протокол то есть, присылали.
Стадо ежей способно убить слона, но неспособно его съесть.
Ох уж этот жестокий и не справедливый мир.

Оффлайн REA

  • Розов Евгений Анатольевич
  • Глобальный модератор
  • *****
  • Сообщений: 1309
  • Карма: +85/-62
    • GeoSensor
За отдельные деньги могу еще продать DLL которая работает с этим протоколом. Не дорого.

PS:
arr, arr[i++] - сдается мне тут надо i + 1
i++ вроде как увеличит i да еще после индексации, что даст i

« Последнее редактирование: 08 Март 2016, 19:03:22 от REA »

Оффлайн Aspir

  • Старенький
  • **
  • Сообщений: 26
  • Карма: +5/-5
  • Буц буц буц
Re: Помогите разобрать TCP пакет данных от Geoscape.
« Ответ #9 : 18 Октябрь 2016, 16:00:09 »
Возможно уже поздно, но когда-то делал ДЛЛ на C#, для это-го код тут: https://github.com/Aspirq/GSTcp/blob/master/GSTcpInLib/GSTcpIn.cs
Еда - лекарство от голода!

Оффлайн soloveid

  • Начинающий
  • *
  • Сообщений: 5
  • Карма: +0/-0
Re: Помогите разобрать TCP пакет данных от Geoscape.
« Ответ #10 : 07 Декабрь 2016, 17:16:22 »
Подниму тему ...

Я правильно понимаю что схема взаимодействия между GeoScape и GeoSight следующая
На этапе установки связи (после установки соединения):
- GeoSight отправляет запрос на получение порядковых номеров мнемоник (код запроса - 'S' (83))
- GeoScape отвечает списком кодов мнемоник (код ответа - 'S' (83))

Рабочий режим:
- GeoSight отправляет запрос на получение значений мнемоник. (код запроса 'D' (68))
- GeoScape отвечает списком значений мнемоник. (код ответа 'D' (68) или 'M' (77))

?

При этом, как я понимаю, у каждой мнемоники есть свой код.

Но есть вопросы:

Зачем при запросе значений мнемоник отправляется текущее время? (это я увидел в представленных исходниках на gitHub). Может быть надо
отправлять время с которого хочется получить данные? Но тогда возникает вопрос о нескольких значениях мнемоники (который ниже).
Как посылается несколько значений одной мнемоники?
Можно ли получить сразу значения мнемоник за последние X минут?
Что за ответ с кодом 'M' (77)?
Есть ли ещё какие-то команды при общении между GeoScape и GeoSight? Может быть есть документация какая-то?
Это реально притвориться GeoScape и подсовывать GeoSight данные для отрисовки или есть подводные камни?

Оффлайн REA

  • Розов Евгений Анатольевич
  • Глобальный модератор
  • *****
  • Сообщений: 1309
  • Карма: +85/-62
    • GeoSensor
Re: Помогите разобрать TCP пакет данных от Geoscape.
« Ответ #11 : 07 Декабрь 2016, 18:34:11 »
Но есть вопросы:

Зачем при запросе значений мнемоник отправляется текущее время? (это я увидел в представленных исходниках на gitHub). Может быть надо
отправлять время с которого хочется получить данные? Но тогда возникает вопрос о нескольких значениях мнемоники (который ниже).
Как посылается несколько значений одной мнемоники?
Можно ли получить сразу значения мнемоник за последние X минут?
Что за ответ с кодом 'M' (77)?
Есть ли ещё какие-то команды при общении между GeoScape и GeoSight? Может быть есть документация какая-то?
Это реально притвориться GeoScape и подсовывать GeoSight данные для отрисовки или есть подводные камни?


Время отправляется, чтобы можно было продолжить получать данные с того момента, где произошел разрыв связи (или любое другое в пределах размера буфера). Время не текущее, а время последнего принятого пакета. Если время не отправлять, то скорее всего будет передан последний (по времени) пакет. М обозначает, что в буфере есть еще данные и можно не делать паузу перед запросом следующего пакета данных. Это все в протоколе написано. Напишите мне на почту и я вышлю вам протокол бесплатно.
Притвориться можно, хотя я это и не приветствую. А что за исходники на github-е?

Оффлайн soloveid

  • Начинающий
  • *
  • Сообщений: 5
  • Карма: +0/-0
Re: Помогите разобрать TCP пакет данных от Geoscape.
« Ответ #12 : 07 Декабрь 2016, 18:42:48 »
А что за исходники на github-е?
Возможно уже поздно, но когда-то делал ДЛЛ на C#, для это-го код тут: https://github.com/Aspirq/GSTcp/blob/master/GSTcpInLib/GSTcpIn.cs

 



Покер онлайн