A-GPS

提供: きまぐれ手記 Kimagurenote
2015年2月14日 (土) 15:21時点におけるCory (トーク | 投稿記録)による版 (NTTドコモとそのMVNO: 図に注記追加)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

A-GPS (Assisted GPS) の概要と、Android端末で使えない場合(MVNO SIM使用中のNTTドコモ端末など)の設定方法など。

Assisted GPS

まっさらな状態からのGPS測位には、良好な状態で、必要な衛星電波(Almanac, Ephemeris の両方)の受信に数分~12.5分かかる。(参考:GPSと測位

この一部、例えば Almanac データを衛星の代わりにネットワークから受信すると、最初の測位にかかる時間を30秒程度(測位に必要なだけの Ephemeris データの受信にかかる時間)にまで短縮できる(それ以上短縮するには基地局情報や「Google位置情報サービス」を使う必要がある)。

このように、通信等で必要なデータを補う手法を A-GPS (Assisted GPS) と呼ぶ。

ネットワークアシスト

A-GPS用のデータを自社製品・サービス向けにインターネット上で提供している会社(Google, Sony Ericsson, Nokia など)と、自社網のみで提供している会社(NTTドコモなど)がある。

後者では基地局情報などを使うことで、より使い勝手の良いデータが提供されている場合もある。また、この場合は OMA で規定されている SUPL (Secure User Plane Location) が使われる。

Android端末での利用

例えばNTTドコモでは独自に基地局情報を含む補足情報を提供しているが、同社のA-GPSサーバ (dcm-supl.com) へは SPモード(かiモード)からでないと接続できないため、SPモードを利用できない/していない場合は使えない。しかも、同社が販売する端末は dcm-supl.com へ接続する設定になっているため、SPモード以外で使う場合(MVNOを含む)は /etc/gps.conf を書き換える(後述、要root権限)などしないと、A-GPSが使えなくなる。

一方、Sony Ericsson社製でNTTドコモ向け以外の端末では、同社が運営するA-GPSサーバが使えるよう設定されている。 例えば EMOBILE S51SE では supl.sonyericsson.com が設定されていた。 同社の端末を使っていて、カスタムROMを焼く場合は、予め公式ROMの /etc/gps.conf の設定内容を控えておくと良い。

この他、Google社が提供するA-GPSサーバを使うこともできる。(SBM などA-GPSを提供していないキャリアの端末では予め設定されているらしい。)

root権限がない場合は /etc/gps.conf の書き換えは出来ないが、"AngryGPS" を探すと幸せになれるという噂も(筆者は使ったことないが)。

Google の A-GPS サーバを使う

/etc/gps.conf を下記のように書き換える(要root権限)。

日本以外で使う端末は、NTPサーバは近くの安定稼働しているサーバを探して書き換えると良い。

NTP_SERVER=ntp.nict.jp
XTRA_SERVER_1=http://xtra1.gpsonextra.net/xtra.bin
XTRA_SERVER_2=http://xtra2.gpsonextra.net/xtra.bin
XTRA_SERVER_3=http://xtra3.gpsonextra.net/xtra.bin
SUPL_HOST=supl.google.com
SUPL_PORT=7276

ちなみに、supl.google.com:7275 はSSL必須、supl.google.com:7276 はSSL無し、のよう。

カスタムROMを焼いている場合、CyanogenMod ではおそらく既に supl.google.com が使えるようになっている。

アプリで対応する方法

とある GpsLocationProvider の969行以降に、

// Set the SUPL server address if we have not yet
if (mSetSuplServer) {
	try {
		InetAddress inetAddress = InetAddress.getByName(mSuplHost);
		if (inetAddress != null) {
			byte[] addrBytes = inetAddress.getAddress();
			long addr = 0;
			for (int i = 0; i < addrBytes.length; i++) {
			int temp = addrBytes[i];
			// signed -> unsigned
			if (temp < 0) temp = 256 + temp;
			addr = addr * 256 + temp;
		}
		// use MS-Based position mode if SUPL support is enabled
		mPositionMode = GPS_POSITION_MODE_MS_BASED;
		native_set_supl_server((int)addr, mSuplPort);
		mSetSuplServer = false;
	}

こんなくだりがあり、この関数を呼ぶという話があった

ただし、Android 2.2 以降のRelease用ソースコードには native_set_supl_server が含まれておらず、似たような名前の native_set_agps_server が含まれている。こちらに名前が変わったのだろう。

有効なAPNのAPNタイプsuplが含まれていないと、こうしたエラーが出る場合がある。

実際これで対応されているかは分からないんだけれど、APNタイプにsuplを指定していない端末で山旅ロガーを動かしたら右図のエラーが出てきたので、この類の処理を内部でしているのかなと思われた。

アプリによっては、こういった処理を内蔵してsuplを設定してくれる物もあるようなので、とりわけ MVNO SIM を使う場合は、APNタイプに supl を追加しておくと良さそう。

MVNOとGPSについて

IIJmio meeting #5 で報告があったらしい。プレゼン資料が公開されていた。

GPS測位の基礎知識は習得済みを前提にしているのと、それを踏まえても正直解りやすいとまでは言えないが、MVNOでGPSを使いたいという向きには格好の参考資料になると思う。またGPSチップメーカー独自実装まで言及している資料は少ないと思う(チップメーカーのホームページ等を探せば出てくるが)ので、参考になるのではと。

NTTドコモとそのMVNO

NTT DOCOMO テクニカル・ジャーナル VOL.17 NO.2国際ローミングSUPLによるFOMA位置情報機能の開発 ―現在地確認機能―」の2ページ目にある図が分かりやすかった(ただし今回は海外事業者ネットワークという所もドコモネットワークになる)ので下に引用しているが、NTTドコモ網では網内に位置情報サーバを持っており、中継パケット交換機(GGSN)でSUPL通信が振り分けられているようだ(通常のデータ通信はISPで振り分けられる)

Docomo tj vol17 2 006jp p02f01.jpg

上図はW-CDMA(3G)のもの。C-plane (Control plane) を使うのは従来のi-mode端末。いわゆるスマートフォンでは U-plane (User plane) を使う。ただしLTEで追加された #LTE Positioning では C-plane も使われる。


MVNOにもいろいろあるが、最近流行りのレイヤー2接続のMVNO(※)はGGSNを自前で運用している(から細かい通信量制御ができる)。つまり、GGSNに辿り着いた時点でドコモ網を出ているので、ドコモのSUPLサーバを使うよう設定されている端末では、同じドコモ網を使っていたとしても、(ドコモがSUPLサーバをインターネット側に公開するでもない限り)ドコモのSUPLサーバには接続できないと考えられる。

(これは、レイヤー3接続のMVNOなら接続できるという意味ではない。dcm-supl.com の名前解決ができるかどうかに加え、仮にできたとしてもドコモのGGSNの設定次第に思える。)

※日本通信、フリービット、IIJ、OCN、BIGLOBE、So-net など。(日経コミュニケーション 2014年5月号

LTE Positioning

情報不足で(もとい、勉強不足で)よくわかっていないが、 3GPP Specifications Release 9 から位置情報サービスが追加されているらしい。 そこで使われる専用プロトコルが LTE Positioning Profile (LPP)。

参考

関連記事

(準備中)