«前の日(07-15) 最新 次の日(07-17)» 追記

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。

OSS活動をご支援いただける方を募集しています


2009-07-16 iPhone OS 3.0

iPhone OS 3.0 の Wi-Fi 自動接続

iPhone OS 3.0 になって、Wi-FiアクセスポイントのWeb上でのログインを自動で行ってくれる機能が付いたのは既知のとおりだが、釈然としない点がある。ソフトバンクモバイルのページによると、「インターネットテザリング、Wi-Fiへ自動ログインの機能は、日本では対応しておりません。」というのだ。

インターネットテザリングに対応しないのはキャリアの回線の都合なので許可するか否かや料金の設定はキャリア(国)によって異なるというのは理解できるが、Wi-Fiへの自動ログイン機能が使えるか否かにどの国で使うかが関係あるのだろうか。

納得のいかない点がいくつかあったので、iPhone OS 3.0 の Wi-Fi 自動ログイン機能がどのような仕組みなのか調べてみることにした。

FreeBSDとOpengateで公衆無線LANのような認証を設けたネットワークを構築し、Wi-Fi自動ログインの挙動を調べる。 Opengateではファイヤウォールにipfwを使用しており、未認証の端末の通信には以下のルールが適用される。

60000 fwd 127.0.0.1 tcp from 192.168.16.0/24 to any dst-port 80

要するに未認証の端末の外向き80番へのTCPパケットはすべてOpengateサーバにフォワードされる。フォワードされたHTTPアクセスへはOpengateサーバ上のApacheが応答し、認証ページへリダイレクトする。Apacheのログを調べると、

192.168.16.251 - - [01/Jul/2009:18:17:42 +0900] "GET /library/test/success.html HTTP/1.0" 404 833 "-" "CaptiveNetworkSupport/1.0 wispr"
192.168.16.251 - - [01/Jul/2009:18:18:46 +0900] "GET /library/test/success.html HTTP/1.0" 404 833 "-" "CaptiveNetworkSupport/1.0 wispr"

というログが残っていた。Wi-Fiアクセスポイントに接続すると同時に、

へのアクセスを試み 404 Not Found や 301 などのリダイレクトHTTP応答ならWeb認証のあるアクセスポイントとみなしログイン画面を出すようだ。

Opengateによる認証でも自動ログイン機能のログイン画面が表示されて、ネットワーク設定の画面では「自動認証」のスイッチも現れたが、切断後再接続したときに自動でログインするには至らない。


2011-07-16 パソコン用学習リモコン

パソコン用学習リモコン PC-OP-RS1

自宅のエアコンを外出先から制御するために PC-OP-RS1 を買いました。以前研究室のエアコンを自動制御していたときは、cron で CD トレイをイジェクトして壁に貼りつけたリモコンのボタンを押すというピタゴラスイッチ的な方法で制御していたんですが、自宅ではサーバとエアコンの位置関係上それが難しいのでPC-OP-RS1を買うに至りました。

FreeBSD で PC-OP-RS1 を使うようにするパッチはとうの昔に取り込まれているようで、8.2-RELEASE では挿すだけでシリアルポート /dev/cuaU0 として認識してくれました。

# usbconfig | grep BUFFALO
ugen0.3: <BUFFALO RemoteStation PC-OP-RS1 BUFFALO> at usbus0, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON

そのままでは一般ユーザで使用できないので、自分を dialer グループに入れるか /etc/{devd.conf,devfs.conf} を弄ってパーミッションを適切設定するかします。

crw-rw----  1 uucp  dialer    0, 112  7月 16 04:41 /dev/cuaU0
crw-rw----  1 uucp  dialer    0, 113  7月 16 04:41 /dev/cuaU0.init
crw-rw----  1 uucp  dialer    0, 114  7月 16 04:41 /dev/cuaU0.lock

パーミッションを設定して使えるようになったらを使用して制御しますが、FreeBSD で使用するには少しだけ修正が必要です。デフォルトのデバイス名を書き換えているだけなので必須ではありません。このスクリプトを使用するには comm/p5-Device-SerialPort が必要なのでインストールしておきます。

--- irrc.orig   2011-07-16 04:01:43.000000000 +0900
+++ irrc        2011-07-16 04:01:58.000000000 +0900
@@ -19,7 +19,7 @@
 if ($opt_d) {
     $device = $opt_d;
 } else {
-    $device = "/dev/ttyUSB0";
+    $device = "/dev/cuaU0";
 }
 my $ch = 1;
 if ($opt_c && $opt_c =~ /^[1-4]$/) {

あとは簡単。

$ ./irrc -r
ffffffffff1f000(略)

でリモコンの信号を読み取る。読み取ったら、irrc スクリプトの先頭に読み取った信号を追加します。

# エアコンを自動モードでオン
$Ir{'airconAutoOn'} = [
 pack("H*", "読み取った信号")
];

信号を送出するには、

$ ./irrc airconAutoOn

などとします。PC-OP-RS1 は 240 バイトまでの信号にしか対応していないため、エアコンの機種によっては操作できないようですが自宅で使用している東芝のエアコンは問題なく操作できました。こんな形のリモコンなら大丈夫でしょう。

制御に使っているサーバは HP の ML115 で、こいつは IPMI で吸気温度を測ることができるので外出先で室温を確認して、室温が 30℃ を超えていたら帰宅前にエアコンを入れておくという使い方ができます。前回のエントリで書いた九州電力簡易APIと組み合わせれば電力使用率が 90% を超えたらエアコンを自動的にオフにするとかいう制御も可能です。

参考にしたページ

ML115 で IPMI 経由で室温やCPU温度を取得する

どっかで書いたかもしれないけど、エアコンの制御のために室温を取得する方法を書いておく。

ipmitool をインストールし、カーネルモジュールをロードする。

# portinstall sysutils/ipmitool
# kldload ipmi

起動時に自動的にロードするにはもちろん、

ipmi_load="YES"

と /boot/loader.conf に書いておく。ipmitool コマンドで以下のような情報が取得できる。

# ipmitool sdr
(略)
CPU Diode        | 41.50 degrees C   | ok
Front Ambient    | 23.50 degrees C   | ok
(以下略)

CSV形式が欲しければ -c オプションをつける。

# ipmitool -c  sdr
(略)
Front Ambient,23.500,degrees C,ok
(以下略)

特定のセンサのみ欲しければ get "センサ名" をつける。

# ipmitool -c sdr get "Front Ambient"
Front Ambient,23.500,degrees C,ok,0.0,Unspecified,Temperature,,,,,42.000,35.000,,,,0.000,0.000

Front Ambient の数値のみが欲しければ、cut コマンドなどを使って取り出す。

# ipmitool -c sdr get "Front Ambient" | cut -d, -f2
23.500