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/suplやgoogle/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 NokalvaやObjective 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