Сервіс GSM Location модулів SIM800x та його робота з API Яндекс.Локатор

Сервіс GSM Location модулів SIM800x та його робота з API Яндекс.Локатор

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 та додати свій раніше створений обліковий запис Яндекс до групи розробників. Ці дії дозволять отримати ключ доступу до даного сервісу.

Сервіс GSM Location модулів SIM800x та його робота з API Яндекс.Локатор
Запишіть або іншим чином збережіть отриманий ключ.

Після виконання цих дій буде отримано доступ до сторінки 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-дані для звернення до сервера Яндекс, які будуть об'єднані в один елемент.

Таблиця даних

Дані
Коментар

xml=<ya_lbs_request><common><version>1.0</version><api_key>

...
Тут має бути 88-значний ключ отриманий від Яндекс

</api_key></common>
<gsm_cells>
<cell><countrycode>
250

Код країни (MCC)

</countrycode><operatorid>
2

Код оператора (MNC)

</operatorid><cellid>
8453

Cellid першої вежі зі списку отриманого від модуля і перетворений з числа з основою 16 в число з основою 10 (значення отримане від модуля - 2105)

</cellid><lac>
7838

Lac першої вишки, так само перетворений з числа з основою 16 число з основою 10 (значення отримане від модуля – 1E9E)

</lac></cell>
...

Групу, об'єднану тегом cell можна повторити необхідну кількість разів для підвищення достовірності певного розташування

</gsm_cells>
<ip><address_v4>
10.137.92.60

IP адреса присвоєна модулю мережею після відкриття GPRS контексту, можна отримати відправивши в модуль команду 'AT+SAPBR=2,1' – див.

</address_v4></ip></ya_lbs_request>

Таким чином буде сформовано 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->Відповідь

Висновок

Сподіваюся цей матеріал стане гарною підмогою розробникам. Готовий відповісти на Ваші запитання у коментарях.

Джерело: habr.com

Додати коментар або відгук