blob: 2a07703194cf800147bc9f0479a355e825fac64b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
---
title: WiFi アクセスポイントのモニタリング
slug: orphaned/Monitoring_WiFi_access_points
original_slug: Monitoring_WiFi_access_points
---
<p>{{ gecko_minversion_header("1.9.1") }}</p>
<p>UniversalXPConnect 特権を用いたコードを利用することで、周囲の WiFi アクセスポイントの SSID 、 MAC アドレス、信号強度の一覧を取得することができます。この機能は、主に WiFi 情報に基づいた <a class="internal" href="/Ja/Using_geolocation" title="Ja/Using geolocation">geolocation</a> サービスのために導入されました。</p>
<h2 id="例">例</h2>
<p>この例では、利用可能なアクセスポイントの一覧を出力します。</p>
<div class="note"><strong>注意:</strong> wiki の仕様上、 21 行目の表示がおかしくなることがあります。最初の "dd" は単純に "d" ですが、どういうわけか余分な1文字が付いてしまうようです。</div>
<pre class="brush: html"><html>
<head>
<title>WiFi Monitor Example</title>
<script>
var count = 0;
function test() {
}
test.prototype =
{
onChange: function (accessPoints)
{
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var d = document.getElementById("d");
d.innerHTML = "";
for (var i=0; i<accessPoints.length; i++) {
var a = accessPoints[i];
d.innerHTML += "<p>" + a.mac + " " + a.ssid + " " + a.signal + "</p>";
}
var c = document.getElementById("c");
c.innerHTML = "<p>" + count++ + "</p>";
},
onError: function (value) {
alert("error: " +value);
},
QueryInterface: function(iid) {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
if (iid.equals(Components.interfaces.nsIWifiListener) ||
iid.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_ERROR_NO_INTERFACE;
},
}
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var listener = new test();
var wifi_service = Components.classes["@mozilla.org/wifi/monitor;1"].getService(Components.interfaces.nsIWifiMonitor);
wifi_service.startWatching(listener);
</script>
</head>
<body>
<div id="d"><p></p></div>
<div id="c"><p></p></div>
</body>
</html>
</pre>
<h3 id="nsIWifiListener_オブジェクト">nsIWifiListener オブジェクト</h3>
<p>上述のコードでは、まずアクセスポイントの一覧に変更が起こった時点で通知を受け取るリスナーオブジェクトのプロトタイプが作成されます。このオブジェクトは11行目から40行目にかけての部分に相当します。</p>
<p><code>onChange()</code> メソッド(13~27行目)は UniversalXPConnect 特権を有効にすることから始まり、次にアクセスポイントの一覧を表示する <code>div</code> (<code>d</code>) の内部 HTML を消去します。19~22行目の for ループ部分では、 accessPoints 配列に渡されたアクセスポイントの一覧を、 MAC アドレス、 SSID 、信号強度に分けて <code>div</code> 要素内に HTML として出力します。</p>
<p>そして、 <code>div (</code><code>c)</code> は一覧が読み込まれるたびに更新されます。</p>
<p><code>onError()</code> メソッドは、単に受け取ったエラーコードを表示するメッセージボックスを開きます。</p>
<h3 id="アクセスポイントのモニタリングを始める">アクセスポイントのモニタリングを始める</h3>
<p>アクセスポイントのモニタリングを始めるためには、まず44行目のようにリスナーオブジェクトのインスタンスを作成しなければなりません。その後、45行目で示すように WiFi モニターインターフェースへアクセスを行い、47行目で WiFi モニタリングサービスの <code>startWatching()</code> メソッドを呼び出すことでモニタリングが始まります。</p>
<h2 id="参考文献">参考文献</h2>
<ul> <li>{{ interface("nsIWifiMonitor") }}</li> <li>{{ interface("nsIWifiListener") }}</li> <li>{{ interface("nsIWifiAccessPoint") }}</li>
</ul>
<p> </p>
|