SIM800x モジュールの GSM 位置情報サービスと Yandex.Locator API との連携

SIM800x モジュールの GSM 位置情報サービスと Yandex.Locator API との連携

GSM モジュールの多くのユーザーにとって残念なことに、Google は 2 ~ 3 か月前に、モジュールから見える基地局の座標に基づいて位置を特定するための API をブロックし、有料ベースに移行しました。 このため、SIM800 シリーズのモジュールでは、 SIMCom ワイヤレス ソリューション、AT+CIPGSMLOC コマンドの機能が動作しなくなりました。 この記事では、Yandex が提供する同様のサービスを使用してこの問題を解決する方法を説明します。 Yandex.ロケーター.

Yandex が基地局の座標をどのように受け取るかについては省略します。重要なことは、この無料サービスを使用して、緯度、経度、高度、および各パラメーターのおおよその誤差のデータを取得できることです。 この記事の主な目的は、利用できなくなった Google のサービスの代わりに Yandex API に素早く切り替えるための短いチュートリアルを提供することです。

以下では例として、モジュールの位置の緯度と経度のみを表示します。

それでは始めましょう

まず、次の場所にあるユーザー契約を読む必要があります。 yandex.ru/legal/locator_api。 条項 3.6 には特に注意を払う必要があります。 このユーザー契約には、次のことが記載されています Yandex は、予告なしに、いつでも Yandex.Locator API を変更/修正または更新する権利を留保します。.

住所に移動 yandex.ru/dev/locator/keys/get 以前に作成した Yandex アカウントを開発グループに追加します。 これらの手順により、このサービスにアクセスするためのキーを取得できるようになります。

SIM800x モジュールの GSM 位置情報サービスと Yandex.Locator API との連携
受け取ったキーを書き留めるか、保管しておいてください。

これらの手順を完了すると、ページにアクセスできるようになります。 yandex.ru/dev/locator/doc/dg/api/geolocation-api-docpage ここでは、Yandex.Locator サービスの動作メカニズムに関する基本情報が提供されます。

Yandex.Locator サービスに対する cURL 形式の XML リクエストを生成するには、モジュールによって「表示される」携帯電話基地局に関する情報を取得する必要があります。

  • 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 応答のデータを XNUMX 進数から XNUMX 進数に変換する必要があることに注意することが重要です。

ここで、Yandex サーバーに接続するための XML データを生成する必要があります。これは、後で XNUMX つの要素に結合されます。

データ表

データ
コメント

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

...
これには、Yandex から受け取った 88 桁のキーが含まれている必要があります

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

国コード (MCC)

</countrycode><operatorid>
2

オペレータコード(MNC)

</operatorid><cellid>
8453

モジュールから受信し、基数 16 の数値から基数 10 の数値に変換されたリストの最初のタワーの Cellid (モジュールから受信した値は 2105)

</cellid><lac>
7838

最初のタワーの Lac、これも 16 進数から 10 進数に変換されました (モジュールから受け取った値は 1E9E)

</lac></cell>
...

セルタグによって結合されたグループは、特定の場所の信頼性を高めるために必要なだけ繰り返すことができます

</gsm_cells>
<ip><address_v4>
10.137.92.60

GPRS コンテキストを開いた後、ネットワークによってモジュールに割り当てられた IP アドレスは、コマンド「AT+SAPBR=2,1」をモジュールに送信することで取得できます。以下を参照してください。

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

これにより、次のような 1304 文字長の XML メッセージが生成されます。

メッセージ

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>

このメッセージは、Megafon オペレーターの携帯電話基地局のデータに基づいて生成され、次のようなデータで補足できます。 他のモジュールに表示されるタワーの場合は、発行された座標の信頼性を高めるために「AT+CNETSCAN」コマンドを使用して受信されます。

モジュールを操作して現在の座標を取得する

モジュールでの作業の AT ログ

>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.Locator サービスからの応答の内容と必要なデータの選択に関する詳細情報は、次のリンクで参照できます。 yandex.ru/dev/locator/doc/dg/api/xml-reply-docpage、API -> XML -> Response セクション

まとめ

この資料が開発者にとって良い助けとなることを願っています。 コメント欄で質問にお答えします。

出所: habr.com

コメントを追加します