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を渡すようにしてみています。
コメント
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。