Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: определение местоположения по сотам
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Сотовая связь и ее приложения
M_Z
Доброго времени суток!
подскажите каким образом можно определить координаты (долгота, широта) используя GSM модуль по сотам. Или только возможно получить номер соты, а координаты сот надо знать заранее.
Йокамон
в сетке куча проектов - видел постоянные базы москвы и питера и еще какие-то города присутствовали.... даже пользовал на mpx220-м когда то... правда опсосы периодически крутят антены и ессно базы перестают быть актуальными...
Rst7
Не очень точные координаты и не для всех операторов и не для всех мест можно получить следующим образом:

1. Необходимо узнать LAI/LAC/CID текущей рабочей вышки (тут все зависит от модуля, можно ли от него эту информацию получить).
2. Затем, пользуясь сервисом гугли получить координаты этой вышки.

Но это будет координата вышки, а не модуля, как понимаете. Если сможете достать из модуля все вышки, которые он видит (обычно, около 6) и уровни сигналов, то можно оценить координаты самого модуля. Заметьте, оценить, а не измерить wink.gif
MrYuran
Если смотреть на глобус или политическую карту мира, то очень неплохая точность получится
Rst7
Ну вот примерно вот так - Нажмите для просмотра прикрепленного файла

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

Линейку масштаба пришлось прилепить с другого места. Но соответствует.
M_Z
Цитата(Rst7 @ Oct 1 2008, 15:10) *
Ну вот примерно вот так - Нажмите для просмотра прикрепленного файла

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

Линейку масштаба пришлось прилепить с другого места. Но соответствует.

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


Может быть Вы сможете получить от модуля идентификатор соты. Конкретно эти данные называются LAI,LAC и CID. Но, скорее всего, надо патчить софт модуля.

Цитата
А дальше мне нужно где то найти таблицу координат этих сот.


Сходить на сервер гугли, он по этим данным отдаст широту и долготу.


Цитата
Просто по утверждениям некоторых людей, соты передают свои координаты.


Врут.
slog
Некоторые сотовые операторы предоставляют услугу - определение положения телефона. Положение телефона приходит в виде ММСки с картой и крестиком. Точность +/- километр.
Harbinger
Цитата(Rst7 @ Oct 1 2008, 14:46) *
1. Необходимо узнать LAI/LAC/CID текущей рабочей вышки (тут все зависит от модуля, можно ли от него эту информацию получить).
2. Затем, пользуясь сервисом гугли получить координаты этой вышки.

1. Обратный случай просто нет смысла рассматривать. Если модуль молчит, то меняем на тот, который скажет smile.gif
2. Не обязательно гуглевским - там может быть устаревшая информация, может быть ложная или не быть вовсе. Это может быть и собственный сервис - на "ремэксперте" и на сайте microchip.ua этой темой интересовались; просили создать устройство, привязывающее текущие координаты, полученные от GPS-приёмника, к параметрам БС, полученным от модуля GSM. То, что такое устройство должно периодически перемещаться по интересуемой географической зоне с целью обновления данных - вроде вопросов не вызывает. smile.gif
Но координаты конкретных БС априори известны операторам сотовой связи, чем они, собственно, и пользуются, предлагая за (не очень большую) плату услуги по определению местоположения абонента. С точностью до нескольких трамвайных остановок - проверено wink.gif
Йокамон
из источника, имеющего прямое отношение к СБ КС(украинский опсос ) есть инфа - постоянная (по крайней мере раз в месяц) перенаправка антен. и о каких координатах в итоге мона говорить? только если у тебя есть порядка 1000 динамических объектов на средний город которые постоянно обновляют тебе связку жпс-гсм-сот. про географический центр украины с точки зрения операторов я вообще молчу...
uriy
Цитата
из источника, имеющего прямое отношение к СБ КС(украинский опсос ) есть инфа - постоянная (по крайней мере раз в месяц) перенаправка антен.
Никогда еще такого не слышал. И как они объясняют зачем это надо? Но даже если чисто гипотетически предположить что они их крутят, координаты антенны от этого же не меняются.
san822
Цитата(M_Z @ Oct 1 2008, 11:39) *
Доброго времени суток!
подскажите каким образом можно определить координаты (долгота, широта) используя GSM модуль по сотам. Или только возможно получить номер соты, а координаты сот надо знать заранее.


У МТС есть такая услуга www.mpoisk.ru
На номер 7788 отправляется запрос, приходит ответ в текстовом формате(город, ближайшие улицы, метро).
Возможно, с ними можно договориться о предоставлении информации в другом виде.
Точность, правда, не очень большая.
Бывает, что находясь на одном месте, можно получить несколько ответов о своем положении.
Rst7
Цитата
есть инфа - постоянная (по крайней мере раз в месяц) перенаправка антен.


Прямо под окном вышка КС. Че-то никто раз в месяц не приезжает и антенны не крутит. Да и где взять столько народу, чтобы все время крутить антенны? smile.gif Так что слушайте Ваш источник через байт wink.gif
Harbinger
Да крутить могут (изредка) разве что в случае установки дополнительных БС или изменения рельефа (например, многоэтажку построили лишнюю wink.gif ), по просьбам трудящихся - оптимизация сети называется.
Alechek
Насколько я помню, помимо LAI/LAC/CID телефон для каждой вышки отслеживает расстояние до нее, кратное 512 метрам. Это ему необходимо для вычисления задержки сигнала для подавления эха в акустическом тракте.
Отсюда и точность определения координат +-1км при наличии как минимум 3-х БС.
Мобильными яндекс-картами не пробовали ни разу пользоваться??
Rst7
Цитата
телефон для каждой вышки отслеживает расстояние до нее


Не для каждой, а только для текущей, и только при разговоре (точнее, в состоянии обмена данными с BS).
ovik89
На яндекс карты поддерживается для мобильников точьность не измерял но районы соответствуют
Baser
Цитата(Alechek @ Oct 3 2008, 08:33) *
телефон для каждой вышки отслеживает расстояние до нее, кратное 512 метрам. Это ему необходимо для вычисления задержки сигнала для подавления эха в акустическом тракте.

Модет быть все как раз наоборот? smile.gif

По измеренной задержке сигнала от БС, телефон определяет параметры для работы эхоподавителя.
А возможность вычисления расстояния это уже вторично.
Rst7
Окститесь, какое эхоподавление??? Ему надо знать задержку, чтобы с упреждением включить передатчик, чтобы пакет влетел в приемник BS точно в нужном тайм-слоте.
Baser
Цитата(Rst7 @ Oct 3 2008, 15:58) *
Окститесь, какое эхоподавление??? Ему надо знать задержку, чтобы с упреждением включить передатчик, чтобы пакет влетел в приемник BS точно в нужном тайм-слоте.

Наверное, вы правы. Я на глубину не нырял smile.gif
Мне просто показалась забавной фраза Alechek, хотя может быть он имел в виду другое...
Йокамон
по поводу "кручения антен" - когда в город Х. приезжала типа коммисия из стольного города К. начиналось кручение(типа, на скока я понимаю диагармы направленности не те иль покрытие не так), как только уезжали - местные возвращали взад... правда было это с годик тому.. что сичас - не знаю - не интересно.
antisingle
Цитата(Rst7 @ Oct 1 2008, 15:46) *
Не очень точные координаты и не для всех операторов и не для всех мест можно получить следующим образом:

1. Необходимо узнать LAI/LAC/CID текущей рабочей вышки (тут все зависит от модуля, можно ли от него эту информацию получить).
2. Затем, пользуясь сервисом гугли получить координаты этой вышки.

Но это будет координата вышки, а не модуля, как понимаете. Если сможете достать из модуля все вышки, которые он видит (обычно, около 6) и уровни сигналов, то можно оценить координаты самого модуля. Заметьте, оценить, а не измерить wink.gif


А можно немного поподробнее о том, как можно это сделать?

Мой модуль выплевывает следующие данные:
<nbcells>: number of base stations available. The first base station is the serving cell (0 ≤ i ≤ 7)
<ARFCN>: Absolute Radio Frequency Channel Number
<BSIC>: Base Station Identify Code
<PLMN>: PLMN identifiers (3 bytes), made of MCC (Mobile Country Code), and MNC (Mobile Network Code).
<LAC>: Location Area
<CI>: Cell ID, 4 hexadecimal digits, e.g. ABCD.
<RSSI>: Received signal level of the BCCH carrier, decimal value from 0 to 63.
<TA>: Timing advance. Available only during a communication (equals to 0xff=255 at any other time).

В данном случае, CID=>CI, LAC=>LAC, а что такое LAI - не совсем понимаю...
Вот в этом документе нашел информацию, что LAI - это совокупность MNC, MCC, LAC и CID (то есть всего вышеперечисленного).

Также не совсем понятно, как из этой информации можно получить задержку сигнала от определенной вышки...

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

ЗЫ О каком, кстати, сервисе Гугла речь идет? Вроде информации по вышкам там взяться неоткуда...
Rst7
Цитата
А можно немного поподробнее о том, как можно это сделать?


Ну, все данные Вы получаете, судя по тексту ниже.

Цитата
Также не совсем понятно, как из этой информации можно получить задержку сигнала от определенной вышки..


TA - это и есть задержка. В у.е. Актуальна только при наличии соединения.

Цитата
Подскажите, пожалуйста, как можно переколбасить эти данные в координаты.
ЗЫ О каком, кстати, сервисе Гугла речь идет? Вроде информации по вышкам там взяться неоткуда...


Google Maps для мобильных устройств ходит на свой серверок, который по CID/LAC возвращает широту/долготу. Яндекс тоже имеет такой сервис. Недолгое гугление привело к коду

Код
function GetCoordFromGoogle(CountryCode, NetworkCode, LAC, CellID: Integer): string;
var
  strA, strB, strC, strAll: string;
  sResult: string;
  ms: TMemoryStream;
  dLat, dLon: Double;
  iLat, iLon: Integer;
  i: Integer;
  b: byte;
  sTmp, sTmp2: string;
  iCntr: Integer;
  HTTP: TIdHTTP;
begin
  Result := '';
  strA := '000E00000000000000000000000000001B0000000000000000000000030000';
  strB := '0000' + IntToHex(CellID, 2) + '0000' + IntToHex(LAC, 2);
  strC := '000000' + IntToHex(NetworkCode, 2) + '000000' + IntToHex(CountryCode, 2);
  strAll := strA + strB + strC + 'FFFFFFFF00000000';
  HTTP := TIdHTTP.Create(nil);
  HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
  HTTP.Request.ContentLength := Length(strAll) div 2;
  ms := TMemoryStream.Create;
  try
    iCntr := 1;
    for i := 1 to (Length(strAll) div 2) do begin
      b := StrToInt('0x' + Copy(strAll, iCntr, 2));
      iCntr := iCntr + 2;
      ms.Write(b, 1);
    end;
    ms.Seek(0, soFromBeginning);
    try
      sResult := HTTP.Post('http://www.google.com/glm/mmap', ms);
      if Length(sResult) > 14 then begin
        sTmp := '0x';
        for i := 1 to 5 do begin
          sTmp2 := Copy(sResult, i + 6, 1);
          sTmp := sTmp + IntToHex(Ord(sTmp2[1]), 2);
        end;
        iLat := StrToInt(sTmp);
        sTmp := '0x';
        for i := 1 to 4 do begin
          sTmp2 := Copy(sResult, i + 11, 1);
          sTmp := sTmp + IntToHex(Ord(sTmp2[1]), 2);
        end;
        iLon := StrToInt(sTmp);
        dLat := iLat/1000000;
        dLon := iLon/1000000;
        Result := Format('%12.7f%s%12.7f', [dLat, #13#10, dLon]);
      end;
    except
      // stub
    end;
  finally
    HTTP.Free;
    ms.Free;
  end;
end;

function GetCoordFromYandex(CountryCode, NetworkCode, LAC, CellID: Integer): string;
const
cc_URL = 'http://mobile.maps.yandex.net/cellid_location/?&cellid=%d&operatorid=%d&countrycode=%d&lac=%d';
var
  sURL: string;
  rs: TStream;
  node: IXMLNode;
  HTTP: TIdHTTP;
  XML: TXMLDocument;
begin
  Result := '';
  sURL := Format(cc_URL, [CellID, NetworkCode, CountryCode, LAC]);
  rs := TMemoryStream.Create;
  HTTP := TIdHTTP.Create(nil);
  XML := TXMLDocument.Create(HTTP); // если указать nil то будет ошибка :-D
  try
    HTTP.Request.Accept := 'text/plain';
    HTTP.Request.AcceptEncoding := 'windows-1251';
    try
      HTTP.Get(sURL, rs);
      if rs.Size > 0 then begin
        rs.Seek(0, soFromBeginning);
        XML.LoadFromStream(rs);
        XML.NSPrefixBase := 'location';
        node := XML.Node.ChildNodes.FindNode('location');
        if (node <> nil) then begin
          node := node.ChildNodes.FindNode('coordinates');
          if (node <> nil) then begin
            Result :=
              StringReplace(node.Attributes['latitude'], '.', ',', []) + #13#10 +
              StringReplace(node.Attributes['longitude'], '.', ',' ,[]);
          end;
        end;
      end;
    except
      // stub
    end;
  finally
    XML.Free;
    HTTP.Free;
    rs.Free;
  end;
end;
antisingle
Rst7, спасибо!

Круто, я б не догадался, что у Гугла с Яндексом есть такой замечательный сервис smile.gif

Сейчас вижу вокруг себя 7 станций, то есть, если померить задержку до каждой - то можно получить довольно неплохую погрешность!

Осталось найти способ, как можно измерить задержку для требуемой станции, потому как я пока не вижу, как для связи можно использовать какую-то определенную БС. Для этого есть какие-то определенные АТ-команды?
Rst7
Цитата
Осталось найти способ, как можно измерить задержку для требуемой станции


Без ковыряний внутри софта модуля - никак, т.к. можно измерить задержку до текущей БС только в режиме разговора.
etoja
Цитата(Йокамон @ Oct 3 2008, 23:38) *
по поводу "кручения антен" - когда в город Х. приезжала типа коммисия из стольного города К. начиналось кручение(типа, на скока я понимаю диагармы направленности не те иль покрытие не так), как только уезжали - местные возвращали взад... правда было это с годик тому.. что сичас - не знаю - не интересно.


В сетях GSM используется вертикальная поляризация и ваше "кручение антен" - глупость.
Harbinger
Почему? Крутить можно в горизонтальной плоскости, ещё как помогает.
Хотя вживую процесса кручения никогда не видел, это надо куда-то на периферию выезжать в преддверии визита каких-то высокопоставленных wink.gif
antisingle
Цитата(Rst7 @ Apr 30 2009, 14:58) *
Без ковыряний внутри софта модуля - никак, т.к. можно измерить задержку до текущей БС только в режиме разговора.


Итак, как найти задержку разобрался. Убедился, что расстояние (благо, формулу знаю) можно измерить
1.только до текущей станции
2.только в режиме разговора
smile.gif

Погрешность - около полукилометра

Сменить станцию посредством АТ-команд не предоставляется возможным - насколько я понимаю, то базовая станция выбирается не модулем, а сетью. То есть найти свои координаты по ТА не представляется возможным - можно только найти расстояние до текущей станции.

Из остальных данные здесь может помочь, видимо, только уровень сигнала - он хоть как-то коррелирует с расстоянием, однако, как количественно связать эту цифру с расстоянием, я не знаю.
alx125
Цитата(antisingle @ Apr 30 2009, 12:46) *
А можно немного поподробнее о том, как можно это сделать?

Мой модуль выплевывает следующие данные:
<nbcells>: number of base stations available. The first base station is the serving cell (0 ≤ i ≤ 7)
<ARFCN>: Absolute Radio Frequency Channel Number
<BSIC>: Base Station Identify Code
<PLMN>: PLMN identifiers (3 bytes), made of MCC (Mobile Country Code), and MNC (Mobile Network Code).
<LAC>: Location Area
<CI>: Cell ID, 4 hexadecimal digits, e.g. ABCD.
<RSSI>: Received signal level of the BCCH carrier, decimal value from 0 to 63.
<TA>: Timing advance. Available only during a communication (equals to 0xff=255 at any other time).

...



Подскажите пожалуйста, как GSM-модуль Вы используете? Помоему SIM300 не выдает параметр <TA>.
av-master
А где вообще найти спецификацию GSM-a, Например свой модуль.... сделать ))) ? Насколько я понимаю нет в Интернетах ничего секретного )))
Rst7
Цитата
А где вообще найти спецификацию GSM-a


Не вопрос smile.gif

http://webapp.etsi.org/key/queryform.asp

Кое чего тут не достает. Описания криптографических алгоритмов GSM либо ищете на просторах инета (старые версии, но еще вполне применяемы), либо получается лиценизию оператора и с этой лицензией подписываете NDA и получаете их у ETSI.
antisingle
Цитата(alx125 @ May 18 2009, 06:19) *
Подскажите пожалуйста, как GSM-модуль Вы используете? Помоему SIM300 не выдает параметр <TA>.


Hilo, прошивка - 6.00, в более ранних версиях ТА, кажись, также не было.
kslabs
Цитата(antisingle @ May 22 2009, 14:54) *
Hilo, прошивка - 6.00, в более ранних версиях ТА, кажись, также не было.


Спрашивалось про SIM300, а Вы про что?
antisingle
Цитата
Подскажите пожалуйста, как GSM-модуль Вы используете?


Цитата(kslabs @ May 27 2009, 17:25) *
Спрашивалось про SIM300, а Вы про что?


Блин, вопрос прочитал как "...какой GSM-модуль..." smile.gif
kan35
Попробовал отправить данные на www.google.com/glm/mmap
В ответ получаю
Код
HTTP/1.1 501 Not Implemented
Content-Type: text/html; charset=UTF-8
Date: Tue, 05 Mar 2013 16:31:17 GMT
Expires: Tue, 05 Mar 2013 16:31:17 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
Transfer-Encoding: chunked

<HTML>
<HEAD>
<TITLE>Not Implemented</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Not Implemented</H1>
<H2>Error 501</H2>
</BODY>
</HTML>

Вопрос - этот сервис все еще работает, а то появлялась информаия, что он закрыт? http://code.google.com/p/gears/wiki/GeolocationAPI
Возможно, конечно я запрос криво составляю, но ответ подозрителен.
AlexandrY
Цитата
Вопрос - этот сервис все еще работает, а то появлялась информаия, что он закрыт? http://code.google.com/p/gears/wiki/GeolocationAPI


Сервис google на основе JSON насколько знаю никогда не выдавал координат на основе базовых станций.
Самое интересное что он мог это выдать адрес на основе переданных ему координат.

А сервис www.google.com/glm/mmap это закрытый протокол. Исходники для которого тут выше показали.
Только что проверил, этот сервис работает идеально.
kan35
Цитата(AlexandrY @ Mar 5 2013, 23:32) *
Сервис google на основе JSON насколько знаю никогда не выдавал координат на основе базовых станций.
Самое интересное что он мог это выдать адрес на основе переданных ему координат.

Это тоже интересно, кстати. Но я понял, что координаты он выдавать должен...
Цитата(AlexandrY @ Mar 5 2013, 23:32) *
А сервис www.google.com/glm/mmap это закрытый протокол. Исходники для которого тут выше показали.
Только что проверил, этот сервис работает идеально.

Я и делаю по аналогии.
Это хорошая новость, значит у меня что то не так в запросе, прошу посмотреть, а то я в html совсем плохо... Или в теле запроса что то не то...
Код
                        char string_out[1500] = "";
                        unsigned short strleftlen = sizeof(string_out) - 1;
                        strleftlen -= snprintf (string_out + strlen(string_out), strleftlen, "000E00000000000000000000000000001B0000000000000000000000030000");
                        strleftlen -= snprintf (string_out + strlen(string_out), strleftlen, "0000%.4X0000%.4X", u_tri.ya.cellid, u_tri.ya.lac);
                        strleftlen -= snprintf (string_out + strlen(string_out), strleftlen, "000000%.4X000000%.4X", u_tri.ya.operatorid, u_tri.ya.countrycode);
                        strleftlen -= snprintf (string_out + strlen(string_out), strleftlen, "FFFFFFFF00000000");

                        // PREAMBULA
                        char preambula[200] = "";
                        strleftlen = sizeof(preambula)-1;
                        strleftlen -= snprintf (preambula + strlen(preambula), strleftlen, "POST /glm/mmap HTTP/1.1\r\n");
                        //strleftlen -= snprintf (preambula + strlen(preambula), strleftlen, "Host: www.google.com\r\n");
                        //strleftlen -= snprintf (preambula + strlen(preambula), strleftlen, "Accept-Encoding: identity\r\n");
                        strleftlen -= snprintf (preambula + strlen(preambula), strleftlen, "Content-length: %d\r\n", strlen(string_out));
                        strleftlen -= snprintf (preambula + strlen(preambula), strleftlen, "Content-type: application/x-www-form-urlencoded\r\n");
                        strleftlen -= snprintf (preambula + strlen(preambula), strleftlen, "\r\n");
                        
                        if ( netconn_write(google_locator, preambula, strlen(preambula), NETCONN_NOCOPY) == ERR_OK )
                        {
                            printf("\r\n1\r\n");
                        }
                        if ( netconn_write(google_locator, string_out, strlen(string_out), NETCONN_NOCOPY) == ERR_OK )
                        {
                            printf("\r\n2\r\n");
                        }
                        struct netbuf * in_buf = netconn_recv(google_locator);

Ответ сервера - в предыдущем моем сообщении
kan35
Вот непосредственно что отправлено на www.google.com:

POST /glm/mmap HTTP/1.1
Content-length: 114
Content-type: application/x-www-form-urlencoded

000E00000000000000000000000000001B000000000000000000000003000000002FAF00006D0100
0000006300000000FAFFFFFFFF00000000
AlexandrY
Цитата(kan35 @ Mar 6 2013, 10:01) *
Вот непосредственно что отправлено на www.google.com:

POST /glm/mmap HTTP/1.1
Content-length: 114
Content-type: application/x-www-form-urlencoded

000E00000000000000000000000000001B000000000000000000000003000000002FAF00006D0100
0000006300000000FAFFFFFFFF00000000


Вот дамп запроса и ответа чтоб была полная ясность:

Код
00000000  50 4f 53 54 20 2f 67 6c  6d 2f 6d 6d 61 70 20 48 POST /gl m/mmap H
00000010  54 54 50 2f 31 2e 30 0d  0a 43 6f 6e 6e 65 63 74 TTP/1.0. .Connect
00000020  69 6f 6e 3a 20 6b 65 65  70 2d 61 6c 69 76 65 0d ion: kee p-alive.
00000030  0a 43 6f 6e 74 65 6e 74  2d 54 79 70 65 3a 20 61 .Content -Type: a
00000040  70 70 6c 69 63 61 74 69  6f 6e 2f 62 69 6e 61 72 pplicati on/binar
00000050  79 0d 0a 43 6f 6e 74 65  6e 74 2d 4c 65 6e 67 74 y..Conte nt-Lengt
00000060  68 3a 20 35 35 0d 0a 48  6f 73 74 3a 20 77 77 77 h: 55..H ost: www
00000070  2e 67 6f 6f 67 6c 65 2e  63 6f 6d 0d 0a 41 63 63 .google. com..Acc
00000080  65 70 74 3a 20 74 65 78  74 2f 68 74 6d 6c 2c 20 ept: tex t/html,
00000090  2a 2f 2a 0d 0a 41 63 63  65 70 74 2d 45 6e 63 6f */*..Acc ept-Enco
000000A0  64 69 6e 67 3a 20 69 64  65 6e 74 69 74 79 0d 0a ding: id entity..
000000B0  55 73 65 72 2d 41 67 65  6e 74 3a 20 4d 6f 7a 69 User-Age nt: Mozi
000000C0  6c 6c 61 2f 33 2e 30 20  28 63 6f 6d 70 61 74 69 lla/3.0  (compati
000000D0  62 6c 65 3b 20 49 6e 64  79 20 4c 69 62 72 61 72 ble; Ind y Librar
000000E0  79 29 0d 0a 0d 0a                                y)....
000000E6  00 0e 00 00 00 00 00 00  00 00 00 00 00 00 00 00 ........ ........
000000F6  1b 00 00 00 03 00 00 00  f6 00 00 00 03 00 00 00 ........ ........
00000106  00 a8 5f 00 00 00 02 00  00 00 03 00 00 00 f6 ff .._..... ........
00000116  ff ff ff 00 00 00 00                             .......
    00000000  48 54 54 50 2f 31 2e 30  20 32 30 30 20 4f 4b 0d HTTP/1.0  200 OK.
    00000010  0a 43 6f 6e 74 65 6e 74  2d 54 79 70 65 3a 20 61 .Content -Type: a
    00000020  70 70 6c 69 63 61 74 69  6f 6e 2f 62 69 6e 61 72 pplicati on/binar
    00000030  79 0d 0a 43 6f 6e 74 65  6e 74 2d 4c 65 6e 67 74 y..Conte nt-Lengt
    00000040  68 3a 20 32 35 0d 0a 44  61 74 65 3a 20 57 65 64 h: 25..D ate: Wed
    00000050  2c 20 30 36 20 4d 61 72  20 32 30 31 33 20 31 30 , 06 Mar  2013 10
    00000060  3a 34 32 3a 34 35 20 47  4d 54 0d 0a 45 78 70 69 :42:45 G MT..Expi
    00000070  72 65 73 3a 20 57 65 64  2c 20 30 36 20 4d 61 72 res: Wed , 06 Mar
    00000080  20 32 30 31 33 20 31 30  3a 34 32 3a 34 35 20 47  2013 10 :42:45 G
    00000090  4d 54 0d 0a 43 61 63 68  65 2d 43 6f 6e 74 72 6f MT..Cach e-Contro
    000000A0  6c 3a 20 70 72 69 76 61  74 65 2c 20 6d 61 78 2d l: priva te, max-
    000000B0  61 67 65 3d 30 0d 0a 58  2d 43 6f 6e 74 65 6e 74 age=0..X -Content
    000000C0  2d 54 79 70 65 2d 4f 70  74 69 6f 6e 73 3a 20 6e -Type-Op tions: n
    000000D0  6f 73 6e 69 66 66 0d 0a  58 2d 46 72 61 6d 65 2d osniff.. X-Frame-
    000000E0  4f 70 74 69 6f 6e 73 3a  20 53 41 4d 45 4f 52 49 Options:  SAMEORI
    000000F0  47 49 4e 0d 0a 58 2d 58  53 53 2d 50 72 6f 74 65 GIN..X-X SS-Prote
    00000100  63 74 69 6f 6e 3a 20 31  3b 20 6d 6f 64 65 3d 62 ction: 1; mode=b
    00000110  6c 6f 63 6b 0d 0a 53 65  72 76 65 72 3a 20 47 53 lock..Se rver: GS
    00000120  45 0d 0a 43 6f 6e 6e 65  63 74 69 6f 6e 3a 20 4b E..Conne ction: K
    00000130  65 65 70 2d 41 6c 69 76  65 0d 0a 0d 0a 00 0e 1b eep-Aliv e.......
    00000140  00 00 00 00 03 41 fa b9  01 82 0b 36 00 00 06 1b .....A.. ...6....
    00000150  00 00 00 4b 00 00                                ...K..
kan35
Спасибо за ответ, часть проблем действительно прояснилась, зато другая часть... у вас дамп данных слишком отличается от шаблона в примере. И в остальных примерах из интернета все поиному тоже, я в замешательстве.
Например, начало у всех одинаковое:
00 0E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1B 00 00 00 0000000000000000030000
00 0e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1b 00 00 00 03
(в вашем дампе)
Как интерпретировать остальные поля? Кое что понятно, типа код страны вижу F6, а остальное - не догадываюсь как идет, да и длина у вас 55, у меня 57...
kan35
Порблему нашел: на самом деле пример написан весьма криво. У автора написано, IntToHex каждый раз в параметре принимает длину в байт, в его конкретном случае это прокатило (2-байтные числа просто насильно выводились), а я смотря на параметр в функции подумал, этот параметр уже означает 2-байтный результат. Потом уже хелп на деkab глянул и прояснилось. Ну в общем и нарушил длину и выравнивание.
А на самом деле ВСЕ 4 параметра передаются 4-байтными числами и не будет уже значительного количества непонятных нулей.
Код
strleftlen -= snprintf (string_out + strlen(string_out), strleftlen, "000E00000000000000000000000000001B0000000000000000000000030000");
                        strleftlen -= snprintf (string_out + strlen(string_out), strleftlen, "%.8X%.8X", u_tri.ya.cellid, u_tri.ya.lac);
                        strleftlen -= snprintf (string_out + strlen(string_out), strleftlen, "%.8X%.8X", u_tri.ya.operatorid, u_tri.ya.countrycode);
                        strleftlen -= snprintf (string_out + strlen(string_out), strleftlen, "FFFFFFFF00000000");

Интересно, что значат остальные байты...
kan35
А вообще, тут нафиг не нужно работать со строками, преобразовывать их туда-сюда. Все тупо в структуру укладывается. Если бы еще не big endian, то совсем было бы красиво, но и так сойдет:
Код
                                        struct GOOGLE_REQUEST_Y{
                                            unsigned char pre[31];
                                            unsigned long cellid;
                                            unsigned long lac;
                                            unsigned long operatorid;
                                            unsigned long countrycode;
                                            unsigned char post[8];                            
                                        }send = {
                                            {0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00},
                                            ((u_tri.ya.cellid<<24)&0xFF000000) | ((u_tri.ya.cellid<<8)&0x00FF0000) | ((u_tri.ya.cellid>>8)&0x0000FF00) | ((u_tri.ya.cellid>>24)&0x000000FF),
                                            ((u_tri.ya.lac<<24)&0xFF000000) | ((u_tri.ya.lac<<8)&0x00FF0000) | ((u_tri.ya.lac>>8)&0x0000FF00) | ((u_tri.ya.lac>>24)&0x000000FF),
                                            ((u_tri.ya.operatorid<<24)&0xFF000000) | ((u_tri.ya.operatorid<<8)&0x00FF0000) | ((u_tri.ya.operatorid>>8)&0x0000FF00) | ((u_tri.ya.operatorid>>24)&0x000000FF),
                                            ((u_tri.ya.countrycode<<24)&0xFF000000) | ((u_tri.ya.countrycode<<8)&0x00FF0000) | ((u_tri.ya.countrycode>>8)&0x0000FF00) | ((u_tri.ya.countrycode>>24)&0x000000FF),
                                            {0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00}
                                        };


Теперь вот столкнулся с проблемой собственно определения местоположения. Для начала тупо усреднил координаты видимых вышек и получил вполне сравнимый с яндекс-локатором результат. Даже лучче))
Но понятно, что нужно решать некую систему квадратных уравнений. У кого нибудь такое решение может имеется? поделитесь плиз.
GeGeL
Цитата(kan35 @ Mar 13 2013, 18:08) *
Если бы еще не big endian, то совсем было бы красиво

htonl( ) украсит код
kan35
Цитата(GeGeL @ Mar 13 2013, 21:42) *
htonl( ) украсит код

Код украсил, спасибо :-)
Код
                                        #pragma pack(1)
                                        struct GOOGLE_REQUEST_Y{
                                            unsigned char pre[31];
                                            unsigned long cellid;
                                            unsigned long lac;
                                            unsigned long operatorid;
                                            unsigned long countrycode;
                                            unsigned char post[8];                            
                                        }send = {
                                            {0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00},
                                            htonl((unsigned long)u_tri.ya.cellid),
                                            htonl((unsigned long)u_tri.ya.lac),
                                            htonl((unsigned long)u_tri.ya.operatorid),
                                            htonl((unsigned long)u_tri.ya.countrycode),
                                            {0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00}
                                        };
                                        #pragma pack(4)
                                        // PREAMBULA
                                        char preambula[200] = "";
                                        unsigned short strleftlen = sizeof(preambula)-1;
                                        strleftlen -= snprintf (preambula + strlen(preambula), strleftlen, "POST /glm/mmap HTTP/1.1\r\n");
                                        strleftlen -= snprintf (preambula + strlen(preambula), strleftlen, "Content-type: application/binary\r\n");
                                        strleftlen -= snprintf (preambula + strlen(preambula), strleftlen, "Content-length: %d\r\n", sizeof(send));
                                        strleftlen -= snprintf (preambula + strlen(preambula), strleftlen, "Accept-Encoding: identity\r\n");
                                        strleftlen -= snprintf (preambula + strlen(preambula), strleftlen, "\r\n");
                                        
                                        if ( netconn_write(google_locator, preambula, strlen(preambula), NETCONN_NOCOPY) == ERR_OK )
                                        {
                                        }
                                        if ( netconn_write(google_locator, &send, sizeof(send), NETCONN_NOCOPY) == ERR_OK )
                                        {
                                        }
                                        struct netbuf * in_buf = netconn_recv(google_locator);
                                        if ( in_buf )
                                        {
                                            unsigned long buflen = netbuf_len(in_buf);
                                            ...

Но правильно вычислить координаты все еще не получилось. Мозг зачерствел. Прошу помощи:
Нужно из координат и силы сигнала вышек базовых станций определить координату точки. Задача вроде бы для школы, где то на уровне подсознания "крутятся" вектора, но... эх..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.