Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сервер для работы с GPS-трекером СИГНАЛ S-2117, Сервер для работы с GPS-трекером 
:(
    Опции темы
Sano83
Дата 20.4.2012, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 20.4.2012

Репутация: нет
Всего: нет



Добрый день!

Есть ли здесь те, кто писал TCP-сервер для работы с GPS-трекером?

Я пишу такой сервер для работы с трекером GPS СИГНАЛ S-2117

Даже если б это был S-2115, то там протокол NTCB тот же.

И вот авторизация работает, ответ на нее проходит, а вот с приемом данных не все хорошо -
данные текущего состояния приходят правильные, с каждый раз новой датой-временем события.

А вот информация из черного ящика выгружается все время старая и постоянно одна и та же запись, хотя ответ на нее я вроде правильно шлю, как в протоколе и сказано: *<A<количество телеметрических записей>

Пытаюсь принимать так:

Код

if ReadHeader(Hdr) then
 begin

  try


       if hdr.DataSize = 0 then
       begin
               RecsCount := 0;


                {$IFDEF DEBUG}
                AssignFile(TMI_Hex, 'GPS_INFO.HEX');
                if FileExists('GPS_INFO.HEX') then Append(TMI_Hex) else Rewrite(TMI_Hex);

                write(TMI_Hex, '['+TimeToStr(Now)+']'+#32); { регистрируем время заголовка }
                { запись заголовка пакета в HEX-дамп }
                HdrByte := @Hdr;
                for j := 0 to SizeOf(TPacketHeader)-1 do
                begin
                  write(TMI_Hex, IntToHex(HdrByte^, 2)+#32);
                  Inc(HdrByte);
                end;

                // сколько GPS-записей принято?
                write(TMI_Hex, IntToHex(RecsCount, 2)+#32);

                // филлер для разделения блоков данных -
                for j := 0 to 15 do write(TMI_Hex, 'FF'+#32);

                Writeln(TMI_Hex);
                Writeln(TMI_Hex);


               {$ENDIF}

               { Если заголовок пустой - отвечаем, что не приняли ничего }
               ServerLogAddSync('ПУСТОЙ ПАКЕТ - отвечаем об этом');
               ServerLogAddSync(Format('Отвечаю, что принято %d записей', [RecsCount]));
               {$IFDEF DEBUG}
                 DebGPSDataReceived(ADevice, RecsCount);
               {$ELSE}
                 SayGPSDataReceived(ADevice, RecsCount);
               {$ENDIF}
                 CloseFile(TMI_Hex);

       end
       else
       begin

            
          AssignFile(TMI_Hex, 'GPS_INFO.HEX');
          if FileExists('GPS_INFO.HEX') then Append(TMI_Hex) else Rewrite(TMI_Hex);

          write(TMI_Hex, '['+TimeToStr(Now)+']'+#32); { регистрируем время заголовка }

          HdrByte := @Hdr;
          { Далее в отладочном дампе содержимое заголовка - 16 байт + пробел после каждого байта}
          for j := 0 to SizeOf(TPacketHeader)-1 do
          begin
            write(TMI_Hex, IntToHex(HdrByte^, 2)+#32);
            Inc(HdrByte);
          end;

          for j := 0 to 15 do write(tmi_hex, 'FF'+#32);

          writeln(TMI_Hex);
          writeln(TMI_Hex);

         RecsCount := 0;

         FillChar(RecvBuf, SizeOf(recvbuf), 0);

         { Тут принимаем собственно данные }
         mfile := TMemoryStream.Create;

         tr := 0;
         while (tr < hdr.DataSize) do
         begin
          br := FCliSock.Read(RecvBuf, 90);
          mfile.Write(recvbuf, br);
          tr := tr + br;
         end;
         { Тут принимаем собственно данные }

          { Анализ, что же получили, чтоб понять, что отвечать трекеру }
          mfile.Seek(0, soFromBeginning);
          mFile.Read(head, 3);

          if head = '*>A' then
           begin
            mFile.Read(RecsCount, 1);
            DebGPSDataReceived(ADevice, RecsCount); { ответ трекеру }
            ServerLogAddSync(Format('Считано записей ЧернЯщика: %d', [RecsCount]));
           end
           else if head = '*>T' then
            begin
              mFile.Seek(4, soFromBeginning); { 5-8-й байты = 0. Это при типе события FF00 }
              mFile.Read(CurIndex, 4);
              ServerLogAddSync(Format('Посылка индекса записи ТекСост. %d', [CurIndex]));
              SendCurrentStatusAnswer(Device, CurIndex);
            end;

          mfile.Seek(0, soFromBeginning);
          SetLength(TMI_Bytes, hdr.DataSize);
          mFile.Read(TMI_Bytes[0], hdr.DataSize);  { считываем весь пакет в массив }

          write(TMI_Hex, '['+TimeToStr(Now)+']'+#32); { записываем время приема пакета }

          for j := 0 to High(TMI_Bytes) do write(TMI_Hex, inttohex(tmi_bytes[j], 2)+#32);

          for j := 0 to 15 do write(TMI_Hex, 'FF'+#32);

          Writeln(TMI_Hex);
          Writeln(TMI_Hex);

          Finalize(TMI_Bytes);

          CloseFile(TMI_Hex);

          mfile.Free; { уничтожаем временный буфер }


       end;

  finally
   if TMI_Info <> nil then Finalize(TMI_Info);
  end;

end
else
 begin
  ServerLogAddSync('Заголовок пакета не удалось принять');
 end;


Все никак не пойму, чего ему не хватает?

Сервер сделан через компонент TServerSocket, Delphi 7.

Если с таким трекером приходилось работать, не подскажете ли, как добиться чтоб и записи "черного ящика" нормально принимались?
PM MAIL   Вверх
winner13
Дата 21.4.2012, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 21.4.2012

Репутация: нет
Всего: нет



Интересная тема, отписал на мыло с линком на пост. Буду рад пообщаться онлайн. smile 

Это сообщение отредактировал(а) winner13 - 21.4.2012, 23:58
PM MAIL   Вверх
Sano83
Дата 23.4.2012, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 20.4.2012

Репутация: нет
Всего: нет



Ну, собственно примерчик дать могу. Вот.

Работает пока только так, как написано - текущие данные принимаются, а черный ящик...

Хм, наверно это получится разве что запросом записи ящика по индексу записи или по дате. Пока толком не получилось.









Присоединённый файл ( Кол-во скачиваний: 32 )
Присоединённый файл  GPS_SERV.rar 58,95 Kb
PM MAIL   Вверх
Sano83
Дата 26.4.2012, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 20.4.2012

Репутация: нет
Всего: нет



Н-да, сколько и что я ни пробовал, но даже при правильном вроде, судя по протоколу, ответе на "Массив сообщений в диспетчерский центр, содержащий size записей из черного ящика", все время передается только одна и та же запись черного ящика.

Ведь вроде правильно делаю - оно мне присылает, ответ в виде *>A<количество записей в массиве><запись ЧЯ>. А количество записей 1.

И отвечаю на это *<A1 -принята одна запись.

Вот текущая телеметрия - та принимается как надо.

Неужели никто не знает, как это сделать правильно? Или знают, но промолчат, мол "секрет" это?

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.