Google, к сожалению для многих пользователей GSM-модулей, 2-3 месяца назад заблокировал и перевел на платную основу API для определения местоположения по координатам видимых модулем сотовых вышек. Из-за этого, на модулях серии SIM800 производства SIMCom Wireless Solutions, перестал работать функционал команды AT+CIPGSMLOC. В этой статье я расскажу Вам как можно решить эту проблему воспользовавшись аналогичным сервисом, предоставляемым Яндекс – Яндекс.Локатор.
Опустим то, как Яндекс получает координаты сотовых вышек, главное, что мы можем воспользоваться этим бесплатным сервисом и получить следующие данные: Latitude, Longitude, Altitude, а также примерную погрешность по каждому параметру. Основная цель статьи — дать небольшой туториал по быстрому переходу на API от Яндекс, взамен более не доступного сервиса от Google.
Ниже, в качестве примера, будет приведено получение только широты и долготы расположения модуля.
Итак, приступим
Сначала необходимо прочитать пользовательское соглашение, размещенное по адресу: yandex.ru/legal/locator_api. Следует особо обратить внимание на п.3.6. данного пользовательского соглашения, в котором говорится о том, что Яндекс оставляют за собой право изменять/исправлять или обновлять API Яндекс.Локатор в любой момент, без предварительного уведомления.
Перейти по адресу yandex.ru/dev/locator/keys/get и добавить свой ранее созданный аккаунт Яндекс к группе разработчиков. Эти действия позволят получить ключ для доступа к данному сервису.
Запишите или иным образом сохраните полученный ключ.
После выполнения этих действий будет получен доступ к странице yandex.ru/dev/locator/doc/dg/api/geolocation-api-docpage где приведены основные сведения о механизме работы сервиса Яндекс.Локатор.
Для формирования XML-запроса в формате cURL к сервисам Яндекс.Локатор потребуется получить информацию по «видимым» модулем вышкам сотовой связи:
- countrycode – код страны
- operatorid – код сети моб.связи
- cellid – идентификатор соты
- lac – код местоположения
Данную информацию можно получить от модуля посредством отправки команды ‘AT+CNETSCAN’.
Информация полученная от модуля
Operator:"MegaFon",MCC:250,MNC:02,Rxlev:59,Cellid:2105,Arfcn:96,Lac:1E9E,Bsic:31<CR><LF>
Operator:"MegaFon",MCC:250,MNC:02,Rxlev:54,Cellid:2107,Arfcn:18,Lac:1E9E,Bsic:3A<CR><LF>
Operator:"MegaFon",MCC:250,MNC:02,Rxlev:45,Cellid:10A9,Arfcn:97,Lac:1E9E,Bsic:11<CR><LF>
Operator:"MegaFon",MCC:250,MNC:02,Rxlev:41,Cellid:2108,Arfcn:814,Lac:1E9E,Bsic:1F<CR><LF>
Operator:"MegaFon",MCC:250,MNC:02,Rxlev:43,Cellid:5100,Arfcn:13,Lac:1E9E,Bsic:2B<CR><LF>
Operator:"MegaFon",MCC:250,MNC:02,Rxlev:39,Cellid:5102,Arfcn:839,Lac:1E9E,Bsic:1A<CR><LF>
Operator:"MegaFon",MCC:250,MNC:02,Rxlev:38,Cellid:2106,Arfcn:104,Lac:1E9E,Bsic:0A<CR><LF>
Operator:"MegaFon",MCC:250,MNC:02,Rxlev:37,Cellid:0FE7,Arfcn:12,Lac:1E9E,Bsic:24<CR><LF>
Operator:"MegaFon",MCC:250,MNC:02,Rxlev:44,Cellid:14C8,Arfcn:91,Lac:1E9E,Bsic:24<CR><LF>
Operator:"MegaFon",MCC:250,MNC:02,Rxlev:37,Cellid:04B3,Arfcn:105,Lac:1E9E,Bsic:3A<CR><LF>
Operator:"Bee Line GSM",MCC:250,MNC:99,Rxlev:47,Cellid:29A0,Arfcn:70,Lac:39BA,Bsic:09<CR><LF>
Operator:"Bee Line GSM",MCC:250,MNC:99,Rxlev:43,Cellid:0FDD,Arfcn:590,Lac:39BA,Bsic:09<CR><LF>
Operator:"Bee Line GSM",MCC:250,MNC:99,Rxlev:44,Cellid:29A1,Arfcn:84,Lac:39BA,Bsic:10<CR><LF>
Operator:"Bee Line GSM",MCC:250,MNC:99,Rxlev:40,Cellid:8F95,Arfcn:81,Lac:39BA,Bsic:03<CR><LF>
Operator:"Bee Line GSM",MCC:250,MNC:99,Rxlev:43,Cellid:0FDF,Arfcn:855,Lac:39BA,Bsic:24<CR><LF>
Operator:"Bee Line GSM",MCC:250,MNC:99,Rxlev:37,Cellid:299C,Arfcn:851,Lac:39BA,Bsic:17<CR><LF>
Operator:"Bee Line GSM",MCC:250,MNC:99,Rxlev:37,Cellid:0FDE,Arfcn:852,Lac:39BA,Bsic:1B<CR><LF>
Operator:"Bee Line GSM",MCC:250,MNC:99,Rxlev:35,Cellid:299F,Arfcn:72,Lac:39BA,Bsic:10<CR><LF>
Operator:"Bee Line GSM",MCC:250,MNC:99,Rxlev:33,Cellid:28A5,Arfcn:66,Lac:396D,Bsic:25<CR><LF>
Operator:"Bee Line GSM",MCC:250,MNC:99,Rxlev:33,Cellid:2A8F,Arfcn:71,Lac:39BA,Bsic:23<CR><LF>
Operator:"MOTIV",MCC:250,MNC:20,Rxlev:46,Cellid:39D2,Arfcn:865,Lac:4D0D,Bsic:14<CR><LF>
Operator:"MOTIV",MCC:250,MNC:20,Rxlev:36,Cellid:09EE,Arfcn:866,Lac:4D0D,Bsic:25<CR><LF>
Operator:"MOTIV",MCC:250,MNC:20,Rxlev:28,Cellid:09ED,Arfcn:869,Lac:4D0D,Bsic:22<CR><LF>
Operator:"MOTIV",MCC:250,MNC:20,Rxlev:28,Cellid:09EF,Arfcn:861,Lac:4D0D,Bsic:17<CR><LF>
Operator:"MTS",MCC:250,MNC:01,Rxlev:66,Cellid:58FE,Arfcn:1021,Lac:00EC,Bsic:0A<CR><LF>
Operator:"MTS",MCC:250,MNC:01,Rxlev:50,Cellid:58FD,Arfcn:1016,Lac:00EC,Bsic:08<CR><LF>
Operator:"MTS",MCC:250,MNC:01,Rxlev:49,Cellid:58FF,Arfcn:1023,Lac:00EC,Bsic:09<CR><LF>
Operator:"MTS",MCC:250,MNC:01,Rxlev:46,Cellid:F93B,Arfcn:59,Lac:00EC,Bsic:20<CR><LF>
Operator:"MTS",MCC:250,MNC:01,Rxlev:50,Cellid:381B,Arfcn:1020,Lac:00EC,Bsic:0A<CR><LF>
Operator:"MTS",MCC:250,MNC:01,Rxlev:37,Cellid:3819,Arfcn:42,Lac:00EC,Bsic:08<CR><LF>
Operator:"MTS",MCC:250,MNC:01,Rxlev:34,Cellid:4C0F,Arfcn:43,Lac:00EC,Bsic:0A<CR><LF>
Operator:"MTS",MCC:250,MNC:01,Rxlev:33,Cellid:0817,Arfcn:26,Lac:00EC,Bsic:27<CR><LF>
Operator:"MTS",MCC:250,MNC:01,Rxlev:34,Cellid:3A5D,Arfcn:1017,Lac:00E9,Bsic:34<CR><LF>
Operator:"MTS",MCC:250,MNC:01,Rxlev:33,Cellid:3D05,Arfcn:1018,Lac:00EC,Bsic:1F<CR><LF>
Важно отметить, что в последующем потребуется преобразование данных из ответа модуля о Cellid и Lac из шестнадцатеричного формата в десятичный.
Теперь нам нужно сформировать XML-данные для обращения к серверу Яндекс, которые, в последующем, будут объединены в один элемент.
Таблица данных
Данные | Комментарий |
---|---|
|
|
... | Здесь должен содержаться 88-значный ключ полученный от Яндекс |
|
|
|
|
|
|
|
Код страны (MCC) |
|
|
|
Код оператора (MNC) |
|
|
|
Cellid первой вышки из списка полученного от модуля и преобразованный из числа с основанием 16 в число с основанием 10 (значение полученное от модуля — 2105) |
|
|
|
Lac первой вышки, так же преобразованный из числа с основанием 16 в число с основанием 10 (значение полученное от модуля – 1E9E) |
|
|
|
Группу, объединенную тегом cell можно повторить необходимое кол-во раз для повышения достоверности определенного местоположения |
|
|
|
|
|
IP адрес присвоенный модулю сетью после открытия GPRS контекста, можно получить отправив в модуль команду ‘AT+SAPBR=2,1’ – см. ниже |
|
Таким образом будет сформировано XML-сообщение длиной 1304 символа следующего вида:
Сообщение
xml=<ya_lbs_request><common><version>1.0</version><api_key>{здесь необходимо указать свой ключ}</api_key></common><gsm_cells><cell><countrycode>250</countrycode><operatorid>2</operatorid><cellid>8453</cellid><lac>7838</lac></cell><cell><countrycode>250</countrycode><operatorid>2</operatorid><cellid>8455</cellid><lac>7838</lac></cell><cell><countrycode>250</countrycode><operatorid>2</operatorid><cellid>4265</cellid><lac>7838</lac></cell><cell><countrycode>250</countrycode><operatorid>2</operatorid><cellid>8456</cellid><lac>7838</lac></cell><cell><countrycode>250</countrycode><operatorid>2</operatorid><cellid>20736</cellid><lac>7838</lac></cell><cell><countrycode>250</countrycode><operatorid>2</operatorid><cellid>20738</cellid><lac>7838</lac></cell><cell><countrycode>250</countrycode><operatorid>2</operatorid><cellid>8454</cellid><lac>7838</lac></cell><cell><countrycode>250</countrycode><operatorid>2</operatorid><cellid>4071</cellid><lac>7838</lac></cell><cell><countrycode>250</countrycode><operatorid>2</operatorid><cellid>5320</cellid><lac>7838</lac></cell><cell><countrycode>250</countrycode><operatorid>2</operatorid><cellid>1203</cellid><lac>7838</lac></cell></gsm_cells><ip><address_v4>10.137.92.60</address_v4></ip></ya_lbs_request>
Данное сообщение сформировано на базе данных по сотовым вышкам оператора Мегафон, его можно дополнить данными в т.ч. по другим видимым модулем вышкам полученными по команде ‘AT+CNETSCAN’ для повышения достоверности выдаваемых координат.
Работа с модулем и получение текущих координат
АТ-лог работы с модулем
>AT+SAPBR=3,1,”Contype”,”GPRS” // конфигурирование профиля доступа в Интернет
<OK
>AT+SAPBR=3,1,”APN”,”internet” // конфигурирование APN
<OK
>AT+SAPBR=1,1 // запрос на открытие GPRS контекста
<OK // контекст открыт
>AT+SAPBR=2,1 // запрос текущего IP адреса присвоенного оператором сотовой связи
<+SAPBR: 1,1,”10.137.92.60” // данный IP адрес потребуется вставить в XML-сообщение
<
<OK
>AT+HTTPINIT
<OK
>AT+HTTPPARA=”CID”,1
<OK
>AT+HTTPPARA=”URL”,”http://api.lbs.yandex.net/geolocation”
<OK
>AT+HTTPDATA=1304,10000 // первое число – длина сформированного XML-сообщения
<DOWNLOAD // приглашение к вводу XML-сообщения
< // вводим сформированное нами XML-сообщение
<OK
>AT+HTTPACTION=1
<OK
<
<+HTTPACTION: 1,200,303 // 200 – сообщение отправлено, 303 – получено 303 байт данных
>AT+HTTPREAD=81,10
<+HTTPREAD: 10
<60.0330963 // широта на которой расположен модуль
<OK
>AT+HTTPREAD=116,10
<+HTTPREAD: 10
<30.2484303 // долгота на которой расположен модуль
>AT+HTTPTERM
<OK
Таким образом мы получили текущие координаты модуля: 60.0330963, 30.2484304.
С увеличением числа отправленных данных по сотовым вышкам будет пропорционально расти точность определения местоположения.
Более подробную информацию о содержании ответа от сервиса Яндекс.Локатор и выбора необходимых Вам данных можно прочитать по ссылке: yandex.ru/dev/locator/doc/dg/api/xml-reply-docpage, в разделе API->XML->Ответ
Заключение
Надеюсь этот материал станет хорошим подспорьем разработчикам. Готов ответить на Ваши вопросы в комментариях.
r1000ru
Тут следует заметить, что гугл в общем то и ни при чем и описать поведение команды AT+CIPGSMLOC. А именно, по этой команде модем собирает информацию о вышках, которые находятся вблизи него, отправляет ее на сервер производителя модема, который в свою очередь — запрашивает уже Google Locator о координатах и возвращает ее модему. И то что SimCom не смог оперативно перевести запросы с АПИ Гугла на альтернативные решения — характеризует его как не слишком добросовестного производителя решений. Конечно клиенты (и наша организация в том числе) сами себе злобные буратины, что решили положиться на китайские сервисы, а не реализовать свои.
По этому хотелось бы попросить предоставить следующую информацию, раз уж разруливать эту ситуацию SimCom сам не в состоянии:
Для коллег, попавшихся на этой пренеприятнейшей ситуации, рекомендую все-таки не спамить яндекс.локатор, а установить собственную базу OpenCellId. А вот если в ней геопозиционирование определить не получилось — тогда обращаться к яндексу.
SIMCom_RUS Автор
Ваше сообщение выглядит как претензия, что мы виноваты в отказе Google предоставлять бесплатный сервис. У нас с самого начала была реализована команда AT+CLBS которая предоставляла аналогичный функционал, но работала с нашими китайскими серверами, до которых, ввиду физического расстояния, более высокий пинг и это Ваше решение, что Вы не пользовались этим функционалом.
«И то что SimCom не смог оперативно перевести запросы с АПИ Гугла на альтернативные решения — характеризует его как не слишком добросовестного производителя решений.» — нам это и не требовалось, см. выше, сервис AT+CLBS работал с самого начала.
«Конечно клиенты (и наша организация в том числе) сами себе злобные буратины, что решили положиться на китайские сервисы, а не реализовать свои.» — в данном конкретном случае, при использовании команды AT+CIPGSMLOC, вы положились не на китайские сервисы, а как раз таки на сервисы предоставляемые Google.
По вопросам:
«Описание протокола данных запроса и ответа на их китайские сервера при выполнении команды AT+CIPGSMLOC» — как уже было сказано ранее: данная команда выполняет обращение к серверам Google, протокол реализован в полном соответствии с протоколом API Google работавшим примерно до декабря 2019.
«Описание команды или какой-то патч ПО, для возможности установки собственного хоста, для обращения на сервис геопозиционирования (т.е. чтобы можно было развернуть его локально, изменив только хост).» — мы долго совещались на тему реализации подобной процедуры, но пришли к выводу, что просто не сможем угодить всем нашим клиентам. Если требуется работа с собственным сервером геопозиционирования — можете воспользоваться примером описанным выше.
Вы уверены, что Ваш собственный сервис геопозиционирования будет обладать более полной чем у Яндекс базой местоположения сотовых вышек?
Кстати, мы сейчас переводим сервис AT+CLBS на другую, более производительную облачную платформу и ожидаем снижение времени отклика при получении текущих координат.
r1000ru
Моя резкость и форма "претензии" связана с тем что у нас около 40 тысяч устройств осталось без геолокации, а их удаленная перепрошивка — решение весьма рискованное по определенным причинам, хотя и необходимое в текущей ситуации. И хотелось бы обойтись малой кровью. Я не нашел упоминаний о том что AT+CIPGSMLOC работает напрямую через Google API ни в какой официальной документации. Хотя допускаю что она существует. Месяц назад AT+CLBS так же не работала. То что идет работа над более производительной реализацией — это похвально. Но хотелось бы развернуть что-то подобное локально, чтобы было достаточно подменить хост/путь для обращения со старых устройств. Возможно ли изменение хоста запроса для запроса AT+CIPGSMLOC и проверяется ли корректность SSL-сертификата? Или возможно ли получение документации на протокол запроса AT+CLBS (как там поменять хост и порт — известно)
SIMCom_RUS Автор
Я прекрасно Вас понимаю, т.к. помню шквал обращений по ситуации с CIPGSMLOC, но Ваш запрос все-таки выходит за рамки данной статьи. Напишите дистрибьютору насчет протокола AT+CLBS и изменения хоста AT+CIPGSMLOC и мы вместе попробуем что-нибудь предпринять.
izuware
Кстати да, яндекс обязательно повторит любую гуглову фишку, так что кому надо стоит подумать о железном приемнике. Хотя и agps от симкома вполне сносно работает, правда иногда только с третьего запроса ))
SIMCom_RUS Автор
После ситуации с Google мы провели работу над ошибками и перевели сервис с которым работает команда AT+CLBS на другую платформу. От Вас требуется только снова ее проверить и оценить быстродействие.