• 検索結果がありません。

秋山研究室 nishida

N/A
N/A
Protected

Academic year: 2018

シェア "秋山研究室 nishida"

Copied!
28
0
0

読み込み中.... (全文を見る)

全文

(1)

コンピュータ理工学部特別研究 II AB

Geolocation API における Location Provider 選択手法の検討

A consideration of Location Provider selection method

in Geolocation API

秋山特研

西田 雅一

平成 24 年 3 月 16 日

(2)

概要

ユビキタス情報社会の実現に向けて屋内外で利用可能な測位システムの構築が求められている.W3C に よって標準化が行われてきたGeolocation API は IP アドレス,GPS,WPS の中からユーザに最も適してい る方法で位置情報を取得し提供することができる.現時点でのGeolocation API の実装では位置情報の取得 に利用するLocation Provider(測位サービス)がブラウザごとに 1 つ固定的に割り当てられている.しかし, ユーザの位置やアプリケーションよって,必ずしも単一のLocation Provider で最適な結果が得られるとは限 らない.そのため,Location Provider の特性やアプリケーションの利用方法を考慮した Geolocation API の 改良が求められている.本研究ではGeolocation API を拡張することでアプリケーション提供者が Location Provider を選択的に利用する機能の実現を目指し,現時点での Geolocation API の実装の調査と拡張方法につ いて検討を行った.本研究では広く利用されているFirefox を対象として調査を行った.Firefox の JavaScript 部分のみを拡張するプロバイダの自動選択方式について検討したが本研究の期間内で解決できない問題が残 るため,まずはより単純なProvider 指定方式を実装した.Location Provider 指定方式は XPCOM を経由し て利用されるC++を拡張し,Geolocation API の Options に Provider の URL をオプションとして追加する方 式で実装した.実装した方式より,アプリケーション提供者が最適なProvider を選択できるようになった.

Abstract

To realize Ubiquitous Computing, it is important to the positioning system deploy work everywhere even in- doors. W3C is standardizing Geolocation API which can provide user with the current location by choosing a suitable positioning method from IP address, GPS and WPS, current implementations of the Geolocation API can not choose Location Provider because it is predetermined for each browser. However, single Location Provider can not always provide the best result. It depend on the user’s position and applications of Geolocation API. So thus, it is desirable to extend Geolocation API which utilizes the characteristics of the applications and the Location Provider. In this study, we investigated a current implementation of Geolocation API and considered how to extend its functions. We adopts a famous web browser Firefox as a target of this study. At first, we consider an automatic provider selection approach by applying changes only to JavaScript codes. However, since it has difficult provider problem to be solved in short period, we adopt a simple approach to specify Location Provider. It is implemented by extending C++ codes used via XPCOM interface. As a result of this study, application developers can choose proper Location Provider.

(3)

目 次

目 次

1 はじめに 3

2 Geolocation API 3

2.1 Geolocation API とは . . . 3

2.2 Geolocation API の利用方法 . . . 4

2.3 Geolocation API でサポートされている測位手法について . . . 5

2.3.1 GPS . . . 5

2.3.2 IP アドレス . . . 5

2.3.3 Wi-Fi . . . 6

2.4 GPS と Wi-FI の精度の比較について. . . 7

3 Firefox における Geolocation API の実装の調査と拡張機能の実装 8 3.1 ブラウザの実装調査 . . . 8

3.2 Firefox における Geolocation API の実装調査 . . . 8

4 Geolocation API の拡張機能の実装 10 4.1 JavaScript コードの拡張による自動プロバイダ選択 . . . 10

4.1.1 順次切替方式 . . . 10

4.1.2 推定精度順切り替え方式 . . . 10

4.2 Geolocation API の Options の拡張について . . . 11

5 屋内測位システムの構築準備 16 5.1 WPS Logger のインストールと利用法 . . . 16

5.2 アドオンの作成について . . . 17

5.2.1 instarll.rdf の作成 . . . 17

5.2.2 chrome.manifest の作成 . . . 19

5.2.3 パッケージの作成とインストール方法 . . . 21

6 おわりに 22 7 付録 23 7.1 Geolocation API のサンプル . . . 23

7.2 Firefox のビルド方法 . . . 24

7.3 XPCOM の使用方法. . . 24

7.4 Firefox のデバッグ方法 . . . 25

7.4.1 Firefox の JavaScript コードのデバッグ方法 . . . 25

7.4.2 GDB によるデバッグ方法 . . . 26

(4)

1 はじめに

近年,ユビキタス社会の実現に向けて様々な研究がなされているがその中でも屋内外で利用可能な測位 システムは重要な技術の1 つである.現在普及しているスマートフォンなど位置情報システムを利用するモ バイル機器はGPS で位置を取得するものが多い.GPS は衛星を利用して現在地をほぼ正確に測定すること ができる.しかし,建物が多い都会や屋内では衛星からの電波を受信することが難しく,屋内での利用には 適さない.また,ネットワーク機器などのIP アドレスから現在地を取得する方法もありネットワーク接続 ができる場所であればどこでも利用できる利点がある.しかし,測位の精度は低く,GPS と同程度の精度 が求められる位置情報サービスに利用するには向いていない.一方,公衆無線LAN サービスの増加,家庭 での無線LAN の利用などによりいたるところで無線 LAN の利用が可能になりつつある.そのため,Wi-Fi を利用した測位システム(WiFi Positioning System) の実用性が増してきている.WiFi Positioning System で は,周辺のWi-Fi の電波強度を用いて測位するため,Wi-Fi のアクセスポイントが多い場所ではより正確な 位置情報を取得することができる.

W3C によって標準化が行われてきた Geolocation API は位置情報の取得を上記の測位システムの中から ユーザに最も適している方法で提供することができる.Location Provider(測位サービス,以降 プロバイダ) にはSkyhook[1],PlaceEngine[2],Locky.jp[3] など多くの測位サービスが存在する,現時点で Geolocation API の実装では位置情報の取得は Google や Microsoft の測位サービスなどのブラウザごとに1つのプロバ イダが固定的に割り当てられている.しかし,国内での利用を考えているアプリケーションではSkyhook などの海外の測位サービス(以下 Global Location Provider と呼ぶ) よりも国内のプロバイダを利用すればよ り高い精度の結果を得られる可能性がある.また,屋内での利用を考えているアプリケーションであれば例 えば屋内反射を考慮したPlace Sticker を用いた手法 [4] により構築したプロバイダを利用することで Global Location Provider に比べ屋内測位精度の向上が考えられる.そのため,プロバイダの特性やアプリケーショ ンの利用方法を考慮したGeolocation API の改良が求められている.本研究ではアプリケーションごとにカ スタマイズしたプロバイダの利用により測位精度が向上できると考えた.そこで,プロバイダを選択的に利 用可能にするためにFirefox における Geolocation API の実装の調査および機能の拡張を目指す.またこれ までに京都産業大学のキャンパス内で利用可能な高精度の測位システムを構築するための測定アプリケー ションがFirefox のアドオンとして構築されていたため Firefox のアドオンについても調査する.

以下,2 章で Geolocation API の概要について述べ,3 章では Firefox における Geolocation API の実装の 調査について述べる.4 章では実際に Geolocation API の拡張機能の追加方法や手順について述べる.5 章 ではFirefox のアドオンの調査について述べる.6 章では本研究の今後の課題について述べる.

2 Geolocation API

本研究で調査するGeolocation API とは何かについて述べる [5][6].

2.1 Geolocation API とは

W3C により標準化が進められている API でブラウザ上で JavaScript から Geolocation API で定義された メソッドを呼び出すことで測位できるようになります.測位モジュールの実装はブラウザごとの実装に依

(5)

2.2 Geolocation APIの利用方法

存していますが,Geolocation API を定義することで JavaScript アプリケーションの開発者はブラウザや OS などの環境によらず測位を必要とするアプリケーションを開発できるようになります.

2.2 Geolocation API の利用方法

Geolocation API には

• getCurrentPosition(現在地を取得する)

• watchPosition(現在地を定期的に取得する)

• clearWatch(現在地を定期的に取得するのをやめる.WatchPosition に対応している.) の3 つの API がある.

Geolocation API の記述方法

✓ ✏

void getCurrentPosition(successCallback[, errorCallback[, options]]);

✒ ✑

successCallback には現在地を取得できたときのコールバックを指定する.同様に erraCallback には現在 地を取得できなかったときのコールバックを指定する.option には API を呼び出す際の option を指定する. options には以下のようなオブジェクトを渡して指定する.

Geolocation API options の記述方法

✓ ✏

var options = { timeout: 10000, maximumAge: 20000,

enableHighAccuracy: true

✒}; ✑

timeout は現在地取得にかける時間 (ミリ秒) を指定する.maximumAge はいつまでの位置情報のキャッシュ を受け入れるのかを指定する.(ミリ秒で指定可能.0 だとキャッシュを使用しない)enableHighAccuracy は より精度の高い情報を取得するように指定する(指定した場合レスポンスが遅くなる可能性がある).また, 現在使用しているブラウザがGeolocation API に対応しているかを調べるには以下の記述で確認できる.

Geolocation API 対応ブラウザの確認 の記述方法

✓ ✏

if (navigator.geolocation) {

//Geolocation API がサポートされている } else {

//Geolocation API がサポートされていない

✒} ✑

(6)

2.3 Geolocation APIでサポートされている測位手法について

2.3 Geolocation API でサポートされている測位手法について

GPS と IP アドレス,Wi-Fi による既存の測位手法について調べたことを述べる.

2.3.1 GPS

複数のGPS 衛生からの電波を受信してそれぞれの距離を割り出すことにより,現在地を判定する方法で ある.3つの衛生から緯度・経度をほぼ正確に測定することができる.

2.3.2 IP アドレス

IP アドレスと位置情報の対応付けを行うサーバーに IP アドレスを送ることで対応した位置情報を返して もらう方法である.サーバー側では以下のどちらかを利用して判定することができる[6].

(1) ネットワーク機器の繋がりによる判定方法.

1のようにユーザA の位置情報がわかっている場合,直前のネットワーク機器を利用している他の ユーザはユーザA と同じ位置情報である可能性が高いと推測することができる.

図1: ネットワーク機器からの判定

(2) IP アドレスの逆引き結果からの判定方法.

2のようにIP アドレス「131.215.62.165」の逆引き結果が「62.135.kyoto.co.jp」というホスト名で あるならばホスト名の「kyoto」から「京都」である可能性が高いと推測することができる.

図2: IP アドレスからの判定

(7)

2.3 Geolocation APIでサポートされている測位手法について

2.3.3 Wi-Fi

周囲の無線LAN 基地局から MAC アドレス情報や電波の強度を取得し,電波情報と位置情報の対応付け を行うサーバーに取得した電波を送ることで対応した位置情報を返してもらう方法である.Wi-Fi での位置 推定手法には以下のような方式がある[7].

(1) 近接性方式

3のように,最も電波強度が強い基地局の位置により推測する.基地局の位置さえ分かれば位置推 定が可能である.他の手法に比べ,精度が低い.

3: 近接性方式

(2) 3 角測量

4のように,3 点以上の基地局の位置と電波強度によって推測する.基地局の位置情報さえあれば 位置推定が可能である.ただし,電波が建物などの障害によって影響を受けやすいため精度を上げる ことは難しい.

4: 3 角測量

(3) 環境分析

事前に測位する場所の電波状況を取得しておき図5のようにマップを作成する,ベイズ推定等を用い て,最も近似する受信状況の場所を位置として推測する.高い精度での測位が可能である.

(8)

2.4 GPSWi-FIの精度の比較について

5: 環境分析

2.4 GPS と Wi-FI の精度の比較について

各測位手法の測位精度は周囲の環境によって変化する.skyhook 社のページ [1] によると図6のような特 性を示すと述べられている.図6はGPS と Wi-Fi での位置情報の精度の変化を表している.x 軸は地域を 表しており.左側から農村(Rural),郊外 (Suburban),都心部 (DenseUrban),屋内 (Indoors) となる.y 軸は 精度を表しており.高精度(Excellent),だいたい正しい (Good),精度が低い (Poor) となる.A-GPS が GPS で利用した場合,WPS が Wi-Fi を利用した場合となる.図のように GPS は農村部などのまわりに障害物が 無い場合では精度が高く,都心部や屋内では精度が落ちてしまう.また,Wi-Fi は農村部ではアクセスポイ ントが少ないため精度が低いが都心部などアクセスポイントが多くなるにつれて精度が高まる.よって屋 内測位にはWi-Fi を利用した測位方法が適している.

図6: GPS と Wi-Fi の位置情報精度の変化の比較

(9)

3 Firefox における Geolocation API の実装の調査と拡張機能の実装

Geolocation API の機能を拡張させるために Firefox における Geolocation API の実装について知る必要が ある.本章ではGeolocation API の実装調査について述べる.

3.1 ブラウザの実装調査

現在Geolocation API が利用できるブラウザとバージョンを表1で示す.本研究はアドオンが多く,他の ブラウザよりも開発が容易だと考えFirefox を用いた.ダウンロード及びビルド方法については付録 6.2 に 示す.

表1: Geolocation API を利用可能なブラウザ ブラウザ名 IE Firefox Safari Chrome Opera バージョン 9 3.5 5 5 10

3.2 Firefox における Geolocation API の実装調査

ここではFirefox における Geolocation API の実装について調べたことを示す.図7Geolocatin API の 実装を表している.この実装にはXPCOM という技術が利用されているため先に XPCOM について説明を 行う.

• XPCOM とは

Mozilla プロジェクトにおいて開発されているクロスプラットフォームな技術である.JavaScript や C++などの異なる言語間でのデータのやり取りが可能となる.XPCOM の利用方法については付録 6.3 に示す.

今回はGeolocation API の getCurrentPosition を例として図7の説明を行う.Geolocation API を利用した ページを実行する際にmozilla-release/dom/src/interfaces にある nsGeolocation.cpp に記述されている nsgeolo- cation クラスの GetCurrentPosition 関数が呼ばれる.GetCurrentPosition 関数ではリクエストを受け取ると nsGeolocationRequest のインスタンスを作成します.複数のアプリケーションから同時にリクエストが来た 場合は配列に追加します.nsGeolocationRequest クラスでは Startup 関数と Watch 関数が呼ばれる.Startup 関数では初期化が行われ,Watch 関数で nsIWifiMonitor クラス呼び出します.nsIWifiMonitor クラスではデ バイスから周辺の無線LAN 基地局の [mac adress,ssid,signal] を取得し onChange 関数へ無線 LAN の情報を 送る.このときonChange 関数に送られる無線 LAN の情報を次に示す.

(10)

3.2 FirefoxにおけるGeolocation APIの実装調査

図7: Geolocation API の概要

取得した無線LAN の情報

✓ ✏

client sending: {"version":"1.1.0","request_address":true,

"wifi_towers":[{"mac_address":"00-d0-1d-07-30-0a","ssid":"KSU2010n",

"signal_strength":-54},{"mac_address":"00-d0-1d-07-3f-ab","ssid":"KSU2010g"

,"signal_strength":-38},{"mac_address":"00-24-a5-f1-e5-fd","ssid":"YLB_14312_104ch",

"signal_strength":-86}]}

✒ ✑

onChange 関数では nsIWifiMonitor クラスで取得した無線 LAN の情報が渡される.そして,問い合わせ るプロバイダのURL を取得し無線 LAN の情報を送信する.Firefox で設定されているプロバイダの URL はpreference の geo.wifi.uri という名で設定されている.プロバイダからのレスポンスは JSON フォーマッ トで記述されており次のような情報が含まれる.

プロバイダからのレスポンスに含まれる情報

✓ ✏

service returned: {"location":{"latitude":35.0695349,"longitude":135.7560703,

"address":{"country":"Japan","country_code":"JP","region":"Kyoto Prefecture",

"city":"Kyoto","street_number":"436"},"accuracy":36.0}}

✒ ✑

onChange 関数の最後に XPCOM を利用し nsGeolocation クラスの update 関数が呼び出される.update 関 数では対応する配列を更新してGeolocation API の callback 関数に値が渡されます.

今回の調査によりonChange 関数がプロバイダへデータを送っていることから onChange 関数内で URL を変更することで切り替えができると考えられる.Geolocation API は XPCOM により JavaScript と C++で データのやり取りを行っているためコードを追いかけるのが難しい.また,nsGeolocation.cpp は複数のファ イルから構成されており関連するファイルを探すのは時間がかかる.Eclipse の様な総合開発環境を用いて 該当のコードを検索する方法もあるが本研究ではターミナルでgrep コマンドを使い変数名などからファイ

(11)

ルを特定した.

4 Geolocation API の拡張機能の実装

Geolocation API の概要調査より OnChange 関数内で Location Provider が選択されていることがわかった ため,まずOnChange 関数内で Location Provider を選択する方針で実装方法を検討した.なお Firefox の JavaScript のコードをデバッグする方法については 6.4.1 節で述べる.以下の 4.1 節では複数プロバイダを Firefox の Preference に事前に設定し,Preference に設定されたプロバイダリストから自動的に選択する手 法について検討した結果について述べる.4.2 節では 4.1 節での検討結果より,最終的に本研究で実装した Geolocation API の Options を拡張する方式について述べる.

4.1 JavaScript コードの拡張による自動プロバイダ選択

複数のプロバイダを切り替えて用いる方法として以下の2 つの方式について検討した.

4.1.1 順次切替方式

最も単純な方法として図8のようにLocation Provider を登録し,全てのプロバイダに対して順に問い合 わせをする方法が考えられる.プロバイダの応答を該当する位置情報がない場合はnull を返すように拡張 することで,ブラウザに次のプロバイダへと切り替えさせる.また,Global Location Provider は必ず位置を 返すため一番最後にする.しかし,この方法では登録数が増えるとユーザの待ち時間が増加する問題が起 きる.また,Geolocation API は一定時間で shutdown が呼ばれるために登録した全てのプロバイダに問い合 わせ出来ない可能性がある.

4.1.2 推定精度順切り替え方式

順次切替方式でのユーザーの待ち時間の増加を改善するために,本方式では図9のように初めにGlobal Location Provider に問い合わせ,位置情報を取得する.プロバイダにはあらかじめ担当する緯度・経度の情 報を与えておきGlobal Locatin Provider からの位置情報をもとにプロバイダを選択する方法である.この方 法では問い合わせるプロバイダが限定されるため問い合わせの時間を減少させることができると考えられ る.しかし,同じ位置にプロバイダが存在する場合の選択,プロバイダの精度など判定する基準を設ける必 要がある.Global Location Provider の登録方法,複数プロバイダの選択基準など検討課題が多いため,本研 究ではまずより単純な方式について検討することにした.

(12)

4.2 Geolocation APIOptionsの拡張について

8: 順次切替方式

図9: 推定精度順切り替え方式

4.2 Geolocation API の Options の拡張について

4.1 節で述べたように,自動選択手法には課題が多く残されており,現時点ではよりシンプルな手法で実 装する.4.1 節の方式では Preference にプロバイダの URL を設定していたが Web サイトに埋め込まれた Geolocation API を利用するアプリケーションからはプロバイダが選択できずアプリケーションに最適なプ ロバイダを利用できない.そこで本研究ではGeolocation API の options にプロバイダの URL を指定するオ プションを追加して切り替える方式を用いる.(図10).本方式によりアプリケーション提供者が最適なプロ バイダを選択できる.本研究で追加するoptions の名前は LocationURL とした.Geolocation API の Options を拡張するためにはJavaScript だけでなく C++のコードも改変する必要がある以下では追加手順について 示す.

図10: LocationURL の実装図

Geolocation API の options に LocationURL を追加するためには Firefox にどのようなプロパティやメソッ

(13)

4.2 Geolocation APIOptionsの拡張について

ドを持つのかあらかじめ教えておく必要がある.そのため,Geolocation API の options が定義されている mozilla-release/dom/interfaces/geolocation/の nsIDOMGeopositionOptions.idl というファイルを書き換える必 要がある.次が記述されている内容である.

nsIDOMGeopositionOptions.idl の内容

✓ ✏

ーー 前略 ーー

#include "domstubs.idl"

[scriptable, uuid(453B72DE-EA90-4F09-AE16-C2E7EE0DDDC4)] interface nsIDOMGeoPositionOptions : nsISupports

{

attribute boolean enableHighAccuracy; attribute long timeout;

attribute long maximumAge; attribute string locationURL; };

ーー 後略 ーー

✒ ✑

3 行目の括弧内にはインターフェースを識別するための UUID を指定する.キーワードに scriptalbe を指定 することで作成するコンポーネントがスクリプトからアクセスできるようになる.4 行目は nsDOMGeoPo- sitionOptions は nsISupports を継承している.6 行目から 9 行目まではプロパティ宣言である.

attribute 型 プロパティ名

プロパティの宣言は上記のようになる.読み取り専用のプロパティの場合はreadonly を attribute の前に指 定する.ここでは,9 行目のように string 型の LocationURL というプロパティを宣言する.idl での string 型 はC++では char*型になることに注意する.idl の文字列型と C++の文字列型との対応については「MDN[9]

>Docs > XPCOM string guide」に記述されている.

次にGeolocation API の Options の値の取得方法について説明する.xpidl によって header ファイルを作 成することで値を取得する関数が自動的に生成される.xpidl は XPIDL インタフェース記述ファイルに基 づいたXPCOM インタフェース情報を生成するツールである.xpidl は Firefox のソースコードのビルド後, mozilla-release/dist/bin/xpidl に置いてある.利用するにはターミナルで次のコマンドを入力する.

% ./xpidl -m mode filename.idl

-m mode には作成したいファイルの mode を記述する.mode の一覧は「MDN[9] > Docs > XPIDL > xpidl」 に記述されている.filename.idl には idl のファイル名を記述する.nsIDOMGeopositionOptions.idl の header ファイルを作成する.xpidl によって作成された header ファイル nsIDOMGeoPositionOptions.h を次に記述

(14)

4.2 Geolocation APIOptionsの拡張について

nsIDOMGeoPositionOptions.h の内容

✓ ✏

ーー 前略 ーー

/* attribute string locationURL; */

NS_SCRIPTABLE NS_IMETHOD GetLocationURL(char * *aLocationURL) = 0; NS_SCRIPTABLE NS_IMETHOD SetLocationURL(const char * aLocationURL) = 0; ーー 後略 ーー

✒ ✑

2 行目のように GetLocationURL 関数が生成され,この関数を使い Geolocation API を利用しているサイ トからLocationURL の値を取得することができる.

GetLocatinURL 関数を使い取得した値を JavaScript 側で定義されている startup 関数に渡すことで Location Provider の URL を JavaScript 側に渡すことができると考え実装を行った.初めに Allow 関数内で char*型の aLocationURL を定義し,GetLocationURL 関数を使い値を aLocationURL に渡す.9 行目から 11 行目まで が書き換えた部分になる.

nsGeolocation.cpp の内容

✓ ✏

ーー 前略 ーー NS_IMETHODIMP

nsGeolocationRequest::Allow() {

nsRefPtr<nsGeolocationService> geoService = nsGeolocationService::GetInstance();

// Kick off the geo device, if it isn’t already running

 //////////GetLocationURL/////////// char* aLocationURL = NULL;

if(mOptions){mOptions->GetLocationURL(&aLocationURL)}; nsresult rv = geoService->StartDevice(aLocationURL);  //////////////////////////////////

ーー 後略 ーー

✒ ✑

StartDevice 関数では char*型の引数を取得するため,関数が定義されている mozilla-release/dom/src/geolocation にあるnsGeolocation.h を書き換える必要がある.次は nsGeolocation.h の内容となる.

(15)

4.2 Geolocation APIOptionsの拡張について

nsGeolocation.h の内容

✓ ✏

ーー 前略 ーー

void SetCachedPosition(nsIDOMGeoPosition* aPosition); nsIDOMGeoPosition* GetCachedPosition();

// Find and startup a geolocation device (gps, nmea, etc.) nsresult StartDevice(char* aLocationURL);

// Stop the started geolocation device (gps, nmea, etc.) void StopDevice();

ーー 後略 ーー

✒ ✑

5 行目のように書き換えることで nsGeolocationRequest クラスの Allow 関数で取得した GeolocationURL の値 がnsGeolocationService クラスである StartDevice 関数の引数として渡される.StartDevice 関数では JavaScript で定義されている startup が呼び出されている.startup 関数に aLocationURL を引数として渡すこ とでJavaScript 側に値を渡す.

nsGeolocation.cpp の内容

✓ ✏

ーー 前略 ーー nsresult

nsGeolocationService::StartDevice(char* aLocationURL) {

ーー 中略 ーー

for (PRInt32 i = 0; i < mProviders.Count(); i++) { mProviders[i]->Startup(aLocationURL);

mProviders[i]->Watch(this);

obs->NotifyObservers(mProviders[i],

"geolocation-device-events",

NS_LITERAL_STRING("starting").get()); }

return NS_OK; }

ーー 後略 ーー

✒ ✑

startup 関数では char*型の引数を取得するできるようにするため mozilla-release/xpcom/system に置いてあ nsIGeolocationProvider.idl の startup の定義を変更する.次は nsIGeolocationProvider.idl の内容となる.

(16)

4.2 Geolocation APIOptionsの拡張について

nsIGeolocationProvider.idl の内容

✓ ✏

ーー 前略 ーー

void startup(in string aLocationURL);

void watch(in nsIGeolocationUpdate callback); ーー 後略 ーー

✒ ✑

1 行目のように変更することで startup は引数を持つ.最後に startup 関数の内容が定義されている Net- workGeolocationProvider.js を書き換える.次が書き換えた内容になる.

NetworkGeolocationProvider.js の内容

✓ ✏

ーー 前略 ーー

WifiGeoPositionProvider.prototype = {

classID: Components.ID("{77DA64D3-7458-4920-9491-86CC9914F904}"), QueryInterface: XPCOMUtils.generateQI([Ci.nsIGeolocationProvider,

Ci.nsIWifiListener, Ci.nsITimerCallback]),

prefService: null, wifi_service: null,

timer: null,

locationurl: null,

startup: function(alocatinurl) { if (this.started == true)

return;

this.started = true;

locationurl = alocationurl; ーー 中略 ーー

onChange: function(accessPoints) {

var provider_url = this.prefService.getCharPref("geo.wifi.uri"); if(locationurl){

provider_url = locationurl; }

ーー 後略 ーー

✒ ✑

startup 関数内で引数の値を locationurl に代入している.locationurl は WifiGeoPositionProvider.prototype 内 で宣言されている変数である.22 行目のように if 文を使い locationurl の値が含まれているなら provider url を書き換えるように設定する.あとはFirefox をビルドし再起動する.今回の実装で注意すべき点は idl と

(17)

C++のファイルでは文字列の型が変化するため「MDN[9] > Docs > XPCOM string guide」を参考にして型を そろえる必要がある.また,JavaScript と C++の複数のファイルでデータのやりとりを行っているためコー ドを追うことが難しい.そのため,今回コードを追う際に利用したgdb によるデバッグ方法を付録 6.4 に 示す.

5 屋内測位システムの構築準備

本研究では京都産業大学のキャンパス内で利用可能な高精度の測位システムの構築するためにFirefox の アドオンであるWPS Logger を用いる.本章では WPS Logger の調査と Firefox for Mobile に対応させるた めにアドオンの作成手順について調べたことを示す.

5.1 WPS Logger のインストールと利用法

Firefox のアドオンである WPS Logger を利用することで GPS や周囲の Wi-Fi からのデータを取得する ことが出来る.GPS のデータを取得する場合には gpsd をインストールする必要がある.本実験で利用する WPS Logger は以下のページからインストールすることができる.

• WPS Lgger

https://agile.cse.kyoto-su.ac.jp/wps_logger/

WPS Logger を利用して Wi-Fi から取得したデータを Log に登録する手順を説明する.WPS Logger をイ ンストールするとツールバーに図11のようなアイコンが現れる.

図11: WPS Logger のアイコン

データの取得するにはWPS Logger のページにある 3.Now you are ready to record WiFi signal log!の map をクリックする.ログイン画面が表示されるのでメールアドレスとパスワードを入力する.登録をしてい ない場合はsign up よりメールアドレスとパスワードの登録を行う.ログイン後,図12のような14 号館の B1F から 3F 階までの図が表示されます.map の Log には Show,New の 2 つの項目がある.左の Show は登 録した測位のデータがmap に表示される.New は新しくデータを登録することができる.今回は Log の登 録を行うので現在地のNew を選択する.New を選択すると図13の画面が表示される.まず自分の位置を map 上でクリックすると現在地の座標が登録される.座標は Up,Down のボタンで調整することもできる. 座標を決めたあとWPS Logger のアイコンをクリックし Start WiFi Monitor を選択する.すると現在地から 取得できる無線LAN 基地局からの情報が wifi towers に表示されるので確認できたら save を押す.これで Log を登録することができる.

(18)

5.2 アドオンの作成について

図12: WPS Logger の map 画面

図13: WPS Logger の Log 登録画面

5.2 アドオンの作成について

ここではアドオンの作成方法について調べたことを紹介する[9].コードのサンプルとして WPS Logger を利用する.アドオンを作成する前にFirefox の URL に about:config と入力し,次の変数の値を ture に設定 することでアドオンの作成に役立つ.現在値が設定されていないものについては右クリック「新規作成 > 真偽値」で追加する.

表2: about:config の変数

javascript.options.showInConsole JavaScript のエラーをエラーコンソールに出力する javascript.options.strict JavaScript のエラーを厳密にする

browser.dom.window.dump.enabled dump 関数で文字列を出力可能にする nglayout.debug.disable xul cache XUL のキャッシュを無効にする

Firefox のアドオンである WPS Logger を例としてアドオンを作る際に必要なファイルの構成について紹 介する.まずは,作成するアドオンに関係するファイルを格納するフォルダを作る.名前は,「wps logger」 とする.次に「wps logger」のフォルダの中に instarll.rdf というファイルを作成する.

5.2.1 instarll.rdf の作成

instarll.rdf とは機能の概要や対応するアプリケーションのバージョンなどの基本的な情報が XML 形式で 記述されているファイルである.install.rdf の内容は次のようなコードになる.

(19)

5.2 アドオンの作成について

install.rdf の記述方法

✓ ✏

<?xml version="1.0"?>

<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">

<Description about="urn:mozilla:install-manifest">

<em:id>wps_logger@toyokazu.github.com</em:id> <!-- 拡張機能ごとに UUID を生成(*) -->

<em:version>0.01</em:version> <!-- 拡張機能のバージョン -->

<em:type>2</em:type> <!-- 2:拡張機能、4:テーマ、8:ロケール、16:プラグイン、 32:... -->

<!-- Target Application this extension can install into, with minimum and maximum supported versions. -->

<em:targetApplication>

<Description>

<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <!-- Firefox 固有のUUID -->

<em:minVersion>3.6.0</em:minVersion>

<em:maxVersion>9.*.*</em:maxVersion>

</Description>

</em:targetApplication>

<!-- Front End MetaData --> <!-- 拡張機能の説明 (人間用) -->

<em:name>WPS Logger Extension</em:name>

<em:description>An extension to monitor WiFi RSSI and GPSD outputs.</em:description>

<em:creator>toyokazu@gmail.com</em:creator>

<!--em:homepageURL>http://dev.ariel-networks.com/</em:homepageURL-->

</Description>

</RDF>

✒ ✑

最初の5行はinstall.rdf を記述する際に必ず書かれる.今回使用しているタグの説明を表3に示す.その 他のタグはMozilla Developer Network の「Docs > Install Manifests」に記述されている.

• Mozilla Developer Network の「Docs > Install Manifests」

https://developer.mozilla.org/ja/Install_Manifests

対象のアプリケーションを選択する <em:targetApplication> タグをもう少し詳しく説明する.ここではア

(20)

5.2 アドオンの作成について

表3: <em:⃝ ⃝ > タグの説明

<em:⃝ ⃝ > 説明

id アドオンを識別するID を記述する.

name UI(アドオン一覧) に表示される名前.

version アドオンのバージョン情報を記述する.

type 追加機能の種類を下記の数値で表す.

targetApplication 拡張の対象となる(拡張も含む) アプリケーションを指定する.

description UI(アドオン一覧) に表示される説明.持っている機能を説明するのに用いられる. creator 作成者/メインプログラマの名前.アドオンの情報に表示される.

homepageURL アドオンのホームページアドレス.アドオンの情報からアクセスできる  

• 特定のバージョン以降を指定する minVersion プロパティ.

• 特定のバージョン以前を指定する maxVersion プロパティ.

ターゲットアプリケーションID のリストは Mozilla Addons FAQ の”Valid App Versions for Addon Devel- opers” に記述されている.

• Mozilla Addons FAQ  ”Valid App Versions for Addon Developers”

https://addons.mozilla.org/en-US/firefox/pages/appversions/

アプリケーションはこれらの値を元にインストールできるかどうかを判断する.このtargetApplication は 最低1 つ指定しなくてはいけない.よって targetApplication を複数指定することで複数のアプリケーション に対応したアドオンの作成が可能になる.

5.2.2 chrome.manifest の作成

次に「wps logger」のフォルダの中に chrome.manifest を作成する.chrome.manifest は Firefox に拡張機能 のパッケージを登録するために必要なファイルです.chorome.manifest の内容は次のように記述する.

(21)

5.2 アドオンの作成について

chrome.manifest の記述方法

✓ ✏

content wps_logger chrome/content/

skin wps_logger classic/1.0 chrome/skin/

locale wps_logger en-US chrome/locale/en-US/ locale wps_logger ja-JP chrome/locale/ja-JP/

overlay chrome://browser/content/browser.xul

chrome://wps_logger/content/wps_logger_toolbar.xul

overlay chrome://browser/content/browser.xul chrome://wps_logger/content/fennec.xul

application={a23983c0-fd0e-11dc-95ff-0800200c9a66}

style chrome://global/content/customizeToolbar.xul chrome://wps_logger/skin/wps_logger.css

style chrome://browser/content/browser.xul chrome://wps_logger/skin/wps_logger.css

✒ ✑

4 行目までは「chorome 型 パッケージ名 登録するフォルダ (ファイル)」の形で chorome の内容を宣言 している.1行目の意味は「chorome/content/フォルダ内のファイルを wps logger パッケージの content と して登録する」とである.Firefox の XUL にアドオンの XUL を overlay することで画面に新しくボタンを 追加したりメニュー項目を追加することができる.overlay は次のような記述方法である.

overlay overlay されるファイル overlay するファイル

style はスタイルオーバーレイ (chrome ページに適用するためのカスタム CSS) という.記述方法は overlay と同じである.

application=アプリケーション ID

また,上記のようにアプリケーションのID を指定することでそのアプリケーションにのみ適用するとい う設定が可能になる.8 行目では Firefox for Mobile にのみ fennec.xul を overlay させている.

次にwps logger のフォルダ内に chrome という名前のフォルダを作成する.その中には次のようなフォル ダを作成する.

• content... インターフェースを記述する XUL ファイルや動作を記述する JavaScript ファイルなど中核 となる部分

(22)

5.2 アドオンの作成について

図14: アドオンの構成

アドオンの動作などに関するファイルはcontent フォルダに置く.

次にXUL ファイルの説明を記述する.XUL ファイルは Firefox に新しくボタンを追加したりメニュー項目 を追加するため必要である.サンプルとしてwps logger の wps logger toolbar.xul を例として説明する.

wps logger toolbar.xul のコード

✓ ✏

ーー 前略 ーー

<!-- Tool Menu -->

<menupopup id="menu_ToolsPopup">

<menuitem label="WPS Logger" oncommand="openSetupDialog();"/>

</menupopup>

ーー 後略 ーー

✒ ✑

2 行目のように id を指定することで定義した部分に機能を付け加えることが可能になる.上記の例では ツールメニューにアドオンの機能を付け加えることを宣言している.id を調べるには Firefox のアドオンの DOM Inspector を利用する.DOM Inspector とは HTML や XUL などの DOM ツリー構造,JavaScript のオ ブジェクトやCSS のプロパティなどを調べるための拡張機能である.DOM Inspector は Firefox Add-ons か らインストールできる.

• Firefox Add-ons

https://addons.mozilla.org/ja/firefox/addon/dom-inspector-6622/

使い方はDOM Inspector の URL に「chrome://browser/content/browser.xul」と入力することで Firefox の browser.xul が表示される.あとは機能を付け加えたい部分をクリックすることでその部分の id を調査がで きる.

5.2.3 パッケージの作成とインストール方法

最後に今まで作成してきたinstall.rdf,chrome.manifest,chrome フォルダをまとめて zip 形式で圧縮する. そしてファイル名の拡張子を.xpi に変更し完成.Firefox にドラッグ&ドロップをすることでインストール することが出来る.再起動することでアドオンのインストールが完了する.基本的にアドオンの作成方法 はmobile 版でも同じ作り方になるが UI の部分は PC 版とは異なるため注意が必要である.DOM Inspector はmobile 版でも利用できるため実際に確かめながらアドオンの作成を行うと良い.

(23)

6 おわりに

本稿ではFirefox における Geolocation API の実装の調査と拡張機能の実装を行った。Geolocation API は Mozilla プロジェクトにおいて開発されているクロスプラットフォームな技術である XPCOM が利用されて おり,JavaScript と C++のファイルで構成されていた.また,高精度の測位システムを構築するための測定 アプリケーションはFirefox のアドオンとして構築されているため Firefox のアドオンについても調査を行っ た.PC 版 Firefox のアドオンについては多くのサンプルなどが見つけられたが mobile 版 Firefox のアドオ ンについてのサンプルが少なく,ドキュメントを増やす必要性が感じられた.

現在のGeolocation API では同時に複数のリクエストが送られてきた場合には最初に実行したアプリケー ションと同じ結果が他のアプリケーションにも返されるようになっている.1つのアプリケーションからの 処理が終了するまで他のアプリケーションからの処理が行われることはない.この問題の解決策としては、 Startup 関数呼び出し時に引数として渡された locationURL の値をリストにして保存する方法が考えられる. その後,onChange メソッド内で startup 呼び出し時に作成したリストから locationURL の値を取り出し,取 得したlocationURL に対応するプロバイダから位置情報を取得する.取得した位置情報を,update 関数内で GeolocationRequest に反映する必要があるが,この場合に locationURL の値に応じて戻り値を変更すること でリクエストごとに適切な値を返すことができると考えられる.

今後の課題としては位置情報データをローカルに記憶させることで,ネットワークに接続されていない 状況への対応やユーザの待ち時間の削減ができると考えられるため,新たな機能拡張や実際に京都産業大 学のキャンパス内で利用可能な高精度の測位システムを構築しGlobal Location Provider との比較を行い精 度の向上を確かめる.また,同時に複数のプロバイダを利用する方法などについても検討する.本実験では Firefox のみ調査を行ったが他のブラウザでの Geolocation API の実装についても調査する必要がある.

(24)

7 付録

7.1 Geolocation API のサンプル

このサンプルプログラムはGeolocation API で取得した位置情報を表示する. Geolocation API のサンプルページ

✓ ✏

<!DOCTYPE html>

<html>

<head>

<title>Geolocation API Example</title>

<script type="text/javascript"> function requestPosition(){

var options = { timeout: 10000, maximumAge: 20000, enableHighAccuracy: true };

if(navigator.geolocation){

navigator.geolocation.getCurrentPosition(successCallback,errorCallback,options); }

else{

alert("お使いのブラウザではこの機能はサポートされていません"); }

}

function setText(val, e) {

document.getElementById(e).value = val; }

function successCallback(position) {

setText(position.coords.latitude, "latitude"); setText(position.coords.longitude, "longitude"); }

function errorCallback(position) {

alert("位置情報の取得に失敗しました"); }

</script>

</head>

<body>

<label for="latitude">緯度: </label><input id="latitude" /> <br />

<label for="longitude">経度: </label><input id="longitude" /> <br />

<input type="button" onclick="requestPosition()" value="緯度と経度を取得する" />

</body>

</html>

✒ ✑

(25)

7.2 Firefoxのビルド方法

7.2 Firefox のビルド方法

Firefox とは Mozilla Foundation が開発・公開しているオープンソースの Web ブラウザである.Windows 版,Linux 版,Mac OS X 版があり,いずれも無償で入手・利用することができる.

ダウンロードは以下より行える

• Mozilla Firefox

http://mozilla.jp/firefox/

Firefox を起動するにはランチャーに並んでいる以下のアイコンをダブルクリックする.

図15: Firefox のアイコン

Firefox のソースコードは Mozilla Developer Network の「Docs > 開発者ガイド > Working with Mozilla source code > Downloading Source Archives」 の FTP サーバをクリックし「Firefox > release > バージョン を選択 >source」に置いてある.

• Mozilla Developer Network - Downloading Source Archives

https://developer.mozilla.org/ja/Download_Mozilla_Source_Code

ソースコードをビルドするにはターミナルでソースコードのディレクトリまで移動し,以下のコマンド を実行する.

ソースコードのビルド方法

✓ ✏

%./configure

%make

✒ ✑

Aurora を起動するにはソースコードの「dist > Aurora.app」をダブルクリックする.

図16: Aurora のアイコン

7.3 XPCOM の使用方法

JavaScript 側で XPCOM を利用する方法について説明をする.次の例は XPCOM 経由で geolocatin を利用

(26)

7.4 Firefoxのデバッグ方法

geolocation XPCOM API の記述方法

✓ ✏

var geolocation = Components.classes["@mozilla.org/geolocation;1"]

.getService(Components.interfaces.nsIDOMGeoGeolocation);

geolocation.getCurrentPosition(function(position){

Application.console.log(position.coords.latitude+’,’+position.coords.longitude);

✒}); ✑

上記の例ではgeolocation コンポーネントが変数 geolocation に代入されている.例では classes プロパティ からコンポーネントクラスを取得しています.このclasses プロパティは利用可能なコンポーネントを全て 含むため,別のコンポーネントを取得する場合には角括弧の中のコンストラクトID を置き換えれば良い.

• コンストラクト ID

各コンポーネントを識別するための文字列である.以下のような形式で記述される.

@ドメイン名/モジュール名/コンポーネント名; バージョン番号

今回はgeolocation を XPCOM 経由で利用したが,既存の XPCOM インタフェースは Mozilla のソースコー ドの中のさまざまな場所で閲覧することができる.また,XPCOMViewer という登録済みのインタフェース やコンポーネントを閲覧するためのGUI もある.

• XPCOMViewer

http://www.ondrejd.info/projects/xpcomviewer/

7.4 Firefox のデバッグ方法

この節ではFirefox のデバッグ方法について述べる.

7.4.1 Firefox の JavaScript コードのデバッグ方法

JavaScript で書かれたコードをデバッグする際の例として NetworkGeolocationProvider.js のデバッグ方法 について述べる.コードを書き換える前にNetworkGeolocationProvider.js の gLoggingEnabled を true にする ことでFirefox の「ツールメニュー > Web 開発 > エラーコンソール」からコード内の Log を確認すること ができる.またLog を残す場合にはコード内に次のような記述を行う.

LOG(” ログを残す ”);

ただし変更を反映させるには/User/ユーザー名/Library/Caches/Firefox/Profiles/⃝ ⃝ ⃝ .default にある Cache ファイルを全て消し,Firefox を再起動させる必要がある.

(27)

参考文献

7.4.2 GDB によるデバッグ方法

本研究ではC++の変数の値を調べるために gdb デバッガを用いた.gdb デバッガの利用法を示す.まず 始めにgdb デバッガを起動させる.実際にターミナルで Firefox を実行ファイル名に入力して gdb を起動す る.このとき作業ディレクトリはmozilla-release である.

gdb の起動方法

✓ ✏

% gdb dist/Aurora.app/Contents/MacOS/firefox-bin

✒ ✑

ターミナルで(gdb) と表示され入力待ちになると起動していると確認できる.次はブレークポイントを設 定する.設定するにはターミナルで次のように入力を行う,またブレークポイントの削除についても示す.

gdb ブレークポイントの設定

✓ ✏

(gdb) break 関数名 or 行番号 or ファイル名 //ブレークポイントの設定 (gdb) delete //設定した全てのブレークポイントを削除する

✒ ✑

プログラムを実行と終了するには次のように入力する.今回は引数として-jsconsole を記述しているが引 数はなくても良い.

gdb のプログラム実行

✓ ✏

(gdb) run -jsconsole //プログラムの実行 (gdb) quit //デバッグの終了

✒ ✑

謝辞

本研究を進めるにあたり,ご指導を頂いた秋山豊和准教授に感謝致します.また,日常の議論を通じて多 くの知識や示唆を頂いた秋山研究室の皆様に感謝します.

参考文献

[1] skyhook: http://www.skyhookwireless.com/ [2] PlaceEngine: http://www.placeengine.com/ [3] Locky.jp: http://locky.jp/

[4] “ 位置特定インフラ専用無線 LAN アクセスポイントの試作と測位精度の検討評価 ” 情報処理学会全国 大会(2011)

岡 龍太,Tran Xuan Ducy ,新井 イスマイル, 西尾 信彦 [5] Geolocation API Specification: http://dev.w3.org/geo/api/spec-source.html

(28)

参考文献

[7] サイバーエリアリサーチ: http://www.arearesearch.co.jp/technology/tech 01.html [8] “ 地下鉄構内の制約条件を利用した無線 LAN 位置推定手法 ”

藤田 迪,佐々木 威,河口 信夫

[9] MOZILLA DEVELOPER NETWORK: https://developer.mozilla.org/ja/

図 6: GPS と Wi-Fi の位置情報精度の変化の比較
図 7: Geolocation API の概要
図 9: 推定精度順切り替え方式
図 12: WPS Logger の map 画面

参照

関連したドキュメント

損失時間にも影響が生じている.これらの影響は,交 差点構造や交錯の状況によって異なると考えられるが,

現在,環境問題が大きく懸念されており,持続可能な社会の実現のためにもそ

ても情報活用の実践力を育てていくことが求められているのである︒

90年代に入ってから,クラブをめぐって新たな動きがみられるようになっている。それは,従来の

現在入手可能な情報から得られたソニーの経営者の判断にもとづいています。実

海外旅行事業につきましては、各国に発出していた感染症危険情報レベルの引き下げが行われ、日本における

の総体と言える。事例の客観的な情報とは、事例に関わる人の感性によって多様な色付けが行われ

笹川平和財団・海洋政策研究所では、持続可能な社会の実現に向けて必要な海洋政策に関する研究と して、2019 年度より