投稿日

基地局の位置情報を取得できる API を公開しました!

© OpenStreetMap contributors

みなさまこんにちは。
ソラコムのソフトウェアエンジニアの小熊 (ogu) です。

今日は、少し技術寄りなお話になりますが、新しい API を公開いたしましたのでそのご紹介をさせていただきたいと思います。この新しい API を使って、どんなことができるようになるのか、何が嬉しいのか、技術の話題が得意でないという読者の方にも少しでも伝わるように書いてみますので、少し長いですがぜひ最後までお読みいただければと思います。

API とは?

そもそも API って何?という方のために簡単にご説明いたしますと、API というのは Application Programming Interface(アプリケーション プログラミング インターフェース)の略で、アプリケーションから SORACOM プラットフォームの機能を利用したり、SORACOM プラットフォームを他のシステムと連携させることでより高機能なアプリケーションを実現していただいたりするために、ユーザーの皆様のプログラムと SORACOM プラットフォームがやり取りをするための決まりごとです。

私たちは、SORACOM ユーザーの皆様に追加料金なしでお使いいただける API をこれまでも数多く公開してきましたが、ご要望の多かったある機能について今回新たに API として公開させていただくこととなりました。

その機能とは・・・

基地局の位置情報を取得する API です!

基地局とは?

SORACOM Air の SIM を使ってネットワークに接続していただく場合、スマートフォンや IoT デバイスなどは必ず電波を発して、携帯電話ネットワーク(モバイルネットワークとかセルラーネットワークということもあります)の「基地局」と交信しています。

総務省発行「電波と安心な暮らし 携帯電話基地局編 携帯電話基地局とわたしたちの暮らし」より引用

基地局は日本中・世界中の至るところに配置されておりますので、皆様も目にしたことがあるのではないでしょうか。総務省情報通信統計データベース によりますと、令和元年度末時点で日本国内には 100 万を超える数の基地局が設置されているようです。そしてその基地局一つ一つに固有の ID が割り振られています。

基地局の位置がわかると、デバイスの “だいたい” の位置がわかる

SIM を使ってネットワークに接続しているデバイスは必ずいずれかの基地局と交信しており、その基地局の ID を SORACOM プラットフォームでは常に把握している=どこの基地局にデータを送れば目的のデバイスにデータを送り届けられるか知っているのでデバイスと相互にデータ通信が行えるわけです。

SIM(およびその SIM を搭載したデバイス)が接続している基地局が特定できるということは、その SIM はその基地局の周辺に物理的に所在しているということが言えるはずですので、もしその基地局自体が物理的にどこに存在しているかという位置情報(緯度・経度の座標など)が分かれば、デバイスがおおよそどのあたりに存在しているのかということがわかることになります。

基地局からの電波が届く範囲は数百メートルから数キロメートルと言われておりますし、人口の多い地域やビルなどの建物で電波が届きにくいエリアなどでは周辺をくまなくカバーするために基地局が数百メートル間隔(もしくはそれよりももっと狭い間隔)で設置されているものと考えられます。つまり、デバイスの所在地が数百メートルくらいの精度でわかるということになります。

GPS による位置情報は誤差が 10 メートル程度と言われていますから、それよりは精度が劣ることにはなりますが、GPS の電波を受信するための別のアンテナやモジュールが必要無く、セルラー通信用のアンテナとモジュールだけで位置情報を知ることができることから、用途によっては十分な場合もあります。

では、基地局の ID からその基地局の位置情報(緯度・経度)はどのようにわかるのでしょうか?

基地局の ID とは

その前に、そもそも基地局の ID とは何でしょうか?

実は基地局の ID(基地局を一意に特定する情報)は以下のような 4 つの要素からなっています:

  • 3G の場合: MCC(Mobile Country Code、モバイル国コード)、MNC(Mobile Network Code、モバイルネットワークコード)、LAC(Location Area Code、位置エリアコード)、CID(Cell ID、セル ID)
  • 4G の場合: MCC、MNC、TAC(Tracking Area Code、追跡エリアコード)、ECID(Enhanced CellID、拡張 セル ID)

MCC は国を表すコードで、日本には 440 というコードが割り当てられています。
MNC はネットワークを表すコードで、ひらたく言うとどの会社が運営しているネットワークかを表します。日本の場合はドコモが 10、ソフトバンクが 20、KDDI が 50, 51, 52 など、楽天モバイルが 11、といったように割り当てられています。

LAC や TAC は、ネットワークの中で区切られたエリアを表すコードで、これは携帯電話会社が決めるものなので、たとえば一つのエリアがどのくらいの大きさかといったことは一概には言えませんが、実際にデータを眺めているといくつかの市区町村にまたがった大きさだったり、あるいはある特定の大型施設(遊園地など)の周辺だけを表すような場合もあるようです。
CID や ECID はそのエリアの中で基地局に割り当てられた番号です。

これらを組み合わせることで、世界中で一つの基地局を一意に定めることができます。

基地局 ID の取得方法

SIM がつながっている基地局の ID を知る方法は大きく分けて 2 つあります。
一つは SORACOM プラットフォームから取得する方法、もう一つはデバイス自身で取得する方法です。

まず一つ目の SORACOM プラットフォームから取得する方法ですが、具体的には、SIM の情報取得に関するAPI群 listSubscribers APIgetSubscriber API および listSims APIgetSim API のいずれかを用います。それらの API を実行してレスポンスを受け取ると、オンラインの SIM の場合には sessionStatus.cell という属性が含まれており、その値をそのまま利用することができます。
これらの API を直接呼び出す代わりに、soracom-clisoracom subscribers listsoracom subscribers get および soracom sims listsoracom sims get を実行していただくことでも同じ情報が取得できます。

sessionStatus.cellの例(4G(LTE)の場合)

また、最近のアップデートで、オフラインの SIM についても「直前までつながっていた基地局の情報」を取得することもできるようになりました:

これにより、たとえばデバイスがバッテリー切れになる直前までつながっていた基地局がわかるようになったりします。

二つ目のデバイス自身で取得する方法ですが、何らかの方法でデバイスの通信モジュールにアクセスすることができれば、つながっている基地局の情報を通信モジュールから取得することができます。
Android スマートフォンにはそのための API が用意されていますし、通信モジュールを制御するためのコマンドである AT コマンドを実行できるデバイスであれば AT+CREGAT+CGREG といったコマンドを実行 することで基地局の情報を取得できます。

基地局の ID と対応する位置情報

さて、つながっている基地局の ID がわかったとして、それだけではまだその基地局が実際にどこにあるのかはわかりません。
基地局の正確な場所を知っているのは、基地局を設置した事業者だけです。では事業者はその基地局の位置情報を公開してくれているのでしょうか?

答えはノーです。

セキュリティ上の理由などによるようですが、基地局の位置情報を開示している事業者は私の知る限りでは存在していないようです。ではどうやって基地局の位置情報を知るのでしょうか?
それには、有志により集められた基地局位置情報データベースを使います。有名なところでは OpenCelliDMozilla Location Service といったものが存在します。

しかし、彼らは公開されていない基地局の位置情報をどうやって集めているのでしょう?
ヒントはおそらく今この記事を読んでくださっている読者の皆様も持っているものです。

そう、スマートフォンです。

スマートフォンアプリによる位置情報の収集

スマートフォンには SIM が入っています。スマートフォンの OS は、現在どの基地局と接続しているか、周辺にどんな基地局が「見えている」かを知っています。そしてスマートフォンには GPS がついています。
これらを組み合わせることで、基地局の位置情報のビッグデータを作り出すことができます。

具体的には、スマートフォンにある特定のアプリを常駐させておくと、そのアプリは日夜、そのスマートフォンがどの基地局と接続しているか、そしてその時の GPS 座標はいくつだったかというデータをひたすら記録し続けます。そして自動的に、もしくはユーザーが指示したタイミングで、そのデータをアップロードします。

そのアプリのユーザーが全世界で何万、何百万人もいたとしたらどうでしょう?
基地局の位置情報に関するビッグデータの誕生です!

しかしちょっと待ってください。基地局の真下で位置情報を記録しない限りは、基地局の位置情報は不正確になってしまいそうです。アプリのユーザーがある基地局から南に 100 メートル離れた場所で位置情報を記録することもあれば、別のユーザーが同じ基地局から北西に 500 メートル離れている地点で位置情報を記録することもあるかもしれません。
そのような不正確なデータは有用なのでしょうか・・・?

ここでビッグデータの出番です。多数のユーザーがいろいろな地点でデータを採取し、それを集めたとしたら・・・
ある特定の基地局に関する位置情報がどんどん集まれば、その位置情報から基地局が存在している地点を推定できる可能性が高くなるのではないでしょうか?

そのようにして集められ、作られたデータベースが OpenCelliD や Mozilla Location Service のデータベースです。
OpenCelliD はクリエイティブコモンズライセンス(CC BY-SA 4.0) の元で、Mozilla Location Service は Public Domain としてそれぞれデータベースが公開されています。(ソラコムでは Mozilla Location Service のデータを利用させていただいています)
なお、スマートフォンアプリによる位置情報の収集については、以前にもブログでご紹介いたしました:

基地局位置情報の活用

ソラコムではこの位置情報データベースをどのように活用しているかご存知でしょうか?
そうですね。ユーザーコンソールを開くと、オンラインの SIM の位置が地図上に表示されます。まさにあの表示のために使っています。

オンラインになっている SIM が接続された基地局の位置を示す地図(イメージ)

これまで、諸事情により内部向けの API としてユーザーコンソールから利用するのみで一般公開は行っていなかったのですが、この度、準備が整いましたので SORACOM のアカウント(Operator ID)をお持ちの皆様に無料でお使いいただけるように公開することといたしました。今すぐお使いいただける状態です!

基地局位置情報を利用して簡易的な位置トラッキング(追跡)を行ったり、特定のエリアに出入りしたときに所定のアクションを実行するジオフェンシングを行ったりといった応用が考えられます。

たとえば、運送用の車両が自社のどの拠点(店舗や倉庫など)にいるかを把握するという目的であれば十分な精度かもしれませんし、お子さんやご高齢の方の見守りで、家にいるか、それとも学校や塾や公園など、よく行く場所にいるかどうかがわかれば良いという目的にもお使いいただくことができるかもしれません。

基地局位置情報 API

さて、前置きが長くなってしまいました。

幼い頃から地図を見るのが大好きで、中学校の休み時間はひたすら社会科の副教材の地図帳を隅から隅まで眺めてはその土地その土地での人々の生活などいろいろなことを想像してニンマリしているような(ちょっと変わった)生徒だった私は、こういう話になるとどうしても話が長くなってしまいます。どうぞお許しください。

この度公開した API は、基地局 ID(MCC/MNC/LAC/CID もしくは MCC/MNC/TAC/ECID の組)を与えるとそれに対応する位置情報(緯度、経度など)を返すというとてもシンプルなものです。

API の定義は SORACOM API リファレンス をご参照ください。

ご利用いただくにあたっては、いくつかご注意いただきたい点がございます。
まず、有志によりデータが集められたオープンなデータベースを活用していることから、そのデータの正確性を保証することができません。単にちょっとずれているという場合もあれば、全然関係のない地点の誤った位置情報が取得されてしまうこともごく稀にあります。また、すべての基地局の情報が網羅されているわけでもありませんので、そもそも位置情報が得られない場合もあります(ご自身で改善する方法もあります)。特に、plan-KM1 で利用している基地局の位置情報は現時点ではほとんど収録されていないため、plan-KM1 の SIM の位置情報はこの API では取得できないとお考えください(その代わり、plan-KM1 用には簡易位置測位機能がございますのでそちらをご利用ください)。

その他、ご利用いただく上での条件等についてくわしくは FAQ をご参照ください。
それらをご理解いただいた上で、ぜひご活用いただければと思います。

soracom-cli も v0.6.1 でこの新 API に対応済みです。
soracom cell-locations get もしくは soracom cell-locations batch-get をお使いください。

今回公開させていただいた基地局位置情報 API をぜひご活用いただき、フィードバックをお寄せいただけましたら幸いです。

ソフトウェアエンジニア ogu