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

Оффлайн 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

    • Старожил
    • ****
    • Сообщений: 272
    • Карма: +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 »
        http://geosight.cvstsk.com/ | http://geoalarm.cvstsk.com/

        Оффлайн 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#, поэтому ничем помочь не могу.
          мой пост лишь к тому, что все отлично работает, и проверено мной далеко не на одном языке.
          так что проблема в вашем коде.. разбирайтесь, успехов.
          http://geosight.cvstsk.com/ | http://geoalarm.cvstsk.com/

          Оффлайн REA

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

          Оффлайн das124

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

            Оффлайн REA

            • Розов Евгений Анатольевич
            • Глобальный модератор
            • *****
            • Сообщений: 1305
            • Карма: +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

                • Розов Евгений Анатольевич
                • Глобальный модератор
                • *****
                • Сообщений: 1305
                • Карма: +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

                   



                  Покер онлайн