April 02, 2024

Assisted GPS (A-GPS)クライアントの実装

GPS関係の処理をRubyから使えるようにしたgps_pvt gemは色々なストリームやファイル、シリアルポート(GPSデバイス直結)から情報を読み込めるようにしてあります。このたびv0.10で初期測位を早めるためのAssisted GPS (A-GPS)に対応しました。単独測位をするのであればgemをインストール後に以下のコマンドで例えばAndroidなどて使われているGoogleのサーバから情報を取得してA-GPSを利用できます。

$ gps_pvt supl://supl.google.com/ (Ntrip等のリアルタイムストリームを指定)

生データに近い物が見たければ、以下のコマンドでJSON形式でエフェメリス等が得られます。

$ gps_get supl://supl.google.com/

エフェメリス(軌道情報)を読み込む程度なので実装は簡単かなと思って始めたのですが、結果的に色々調べる必要がありました。羅列ですが、調べたものを残しておこうと思います。

SUPL
Secure user plane location。A-GPSの事実上の標準実装(という理解)。プロトコル名としてはUserPlane Location Protocol(ULP)。表面を覆っているのがULPで、中身のペイロードにはLPPやRRLPといった別のプロトコルが使われる。実装例が少ない中、tajuma/suplgoogle/supl-clientが参考になった。
LPP (TS 37.355)
LTE Positioning Protocol。エフェメリスなどの定義がある。GPS以外の定義もしっかりされている。
RRLP (TS 44.031)
Radio Resource Location service Protocol。LPP同様エフェメリスなどの定義があるが古めの規格。プロトコルとしてはGPS以外も使えそうに見えるが、GoogleのSUPLサーバに問い合わせてもGPSのエフェメリスしかくれない模様。
ASN.1 (X.680)
Abstract Syntax Notation One。ULP, LPP, RRLPなどの文法は全てこれで書かれている。Rubyにも主にSSL証明書をパースする目的でOpenSSL::ASN1の実装があるが、機能が限定的で今回は使わなかった。代わりにRubyの構文解析ツールであるRaccを使う前提で文法asn1.yを定義し、asn.1形式の文法ファイルをパースできるようにした。asn.1をasn1.y(から作ったRubyコード)で事前にJSONに変換(upl.json.gz)して本番では利用している(rake upl.json)。Samayou Oharikuiの和文解説Gusztáv ADAMISさん(ERICSSON)のスライド(PDF)がとても参考になった。OSS NokalvaObjective Systemsも参考にした。
PER (X.691)
Packed Encoding Rules。SUPLではバイナリで情報がやり取りされるが、その時のエンコーディングルールにBasic Unaligned PERが指定されている。前述の参考資料にも解説あり。RSpecで(asn.1から変換した)JSONとPER間のテストを書いて検証した。

最後におまけとなりますが、SUPLサーバに対しては携帯のようにIMEIを渡すわけではなく、問い合わせホストのGlobal IPを渡すようにしてみています。

22:39 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/960