スリープ復帰後、AirMacに自動的につながらない対策
いつの頃からか発生していた、スリープ復帰後、AirMacに自動的につながらない問題。スリープ復帰直後につながらないだけで、AirMacカードの切入を繰り返せば正常につながるので今まで放っておいたが、習慣になりつつある以下の単純クリック操作がいいかげん嫌になってきた...。
わずか5秒程度のクリック操作なのだが、これを毎回、これからも繰り返すのかと思うと...精神衛生上よくない。実はつい最近の「AirMacユーティリティ 5.3.1」アップデートに淡い期待をしてインストールしてみたのだが、この症状については全く改善の兆し無し。これでやっと自分自身で何か対策をしてみる決心がついた。
- 2008-06-11のソフトウェアアップデートAirMac ユーティリティ 5.3.2によって、自分の環境では上記の接続できない問題は解消された!
- wake_up_AirMacもログイン項目から外して、晴れて快適な無線LAN環境になった。
具体的な症状
症状はApple Support Discussions - スリープ復帰後に自動的につながらないと全く同様だと思う。さらに自分の環境や気付いたことは以下。
- MacBook、MacOSX 10.5.2、AirMacユーティリティ 5.3.1 アップデート済。
- AirMacネットワークは非公開で、WEPパスワードによる保護を利用。
- AirMacベースステーション近くで、周辺にその他の無線LANネットワークが見えない環境では、スリープ復帰後も問題なくAirMacに接続してくれる。
- AirMacベースステーションから離れていて、周辺に複数の無線LANネットワークが見える環境では、AirMacにつながらない。AirMacカードの切入を繰り返せば正常につながる。
期待して以下のサポート情報も試してみたが、状況は変わらなかった...。
対策
検索してみたが根本的な解決法は見つからなかった...。現状では、マウスをクリックしてAirMacを切入をするしか方法が無いのかもしれない。それならこの単純だけど面倒な操作をAppleScriptで自動実行してしまえば良いと考えた。試行錯誤したが、それを実現するAppleScriptのポイントは2つあった。
- スリープからの復帰を検知する。
- AirMacの切入の操作を実行する。
スリープからの復帰を検知する
AppleScriptで直接スリープからの復帰を検知することは出来ない。しかし、ちゃらんぽらんさんで、以下の方法が紹介されていた。素晴らしい!まさに知りたかったこと、そのものです。
property theRes : "" on run set theRes to do shell script "grep -i 'system wake' /var/log/system.log" end run on idle set tmp to do shell script "grep -i 'system wake' /var/log/system.log" if tmp is not theRes then set theRes to tmp display dialog "Wake up!" buttons {"OK"} default button 1 giving up after 15 with icon 1 end if return 1 end idleちゃらんぽらん : スリープの解除を検出
実行されているのは以下の処理。
- スリープから復帰した時、system.logというファイルに「System Wake」が記録される。
- そのsystem.logの「System Wake」部分を1秒に1回比較して、変化していたらスリープから復帰したと解釈する。
そうか!こんな方法があるのかという感じ。このsystem.logというファイルにはOSの動作状況が刻々と記録されているので、スリープ復帰以外にも様々なタイミングで欲しい処理を実行することができそうだ。幅広い応用ができそうな技だ!
AirMacの切入の操作を実行する
AirMacの切入を実行するAppleScriptというのも発想できず、悩んでいた。AppleScript2.0リリースノートによると、OSX 10.5からはシステム環境設定のネットワークから自由に操作できそうなのだが、AirMac切入の方法はどうするべきかわからなかった。仕方なく、最初はGUIを直接操作するAppleScriptで処理していたが、そのとき開いているウィンドウの状態に依存していて、ちょっとした状況の変化でうまく動かなくなったりと困っていた。辿り着いたのがシンプルな以下の方法。
- システム環境設定 >> ネットワークで「ネットワーク環境: AirMac_off」を追加した。(AirMacサービスを無効にした設定)
- あとはAppleScriptから以下のシェルコマンドを実行するだけでOK。(scselectはネットワーク環境を切り替えるコマンド)
do shell script "scselect AirMac_off" do shell script "scselect Automatic"
-
-
- ネットワーク環境名は英語で。日本語ではうまく動かなかった。
- ちなみに、ターミナルでscselectと引数無しで実行すると、以下のようにネットワーク環境の一覧が表示される。
-
$ scselect
Defined sets include: (* == current set)
57BDFC5C-893B-43C5-9438-ED639EF7E11A (AirMac_off)
* EAC29E89-E5AF-418C-9E00-40A62EC653A4 (Automatic)
-
-
- デフォルトのネットワーク環境名「自動」は「Automatic」と指定する必要がある。
-
AirMacを接続状態にするAppleScript
以上の技をあわせて、最終的には以下のようなコードにしてみた。
property broadcastLog : "" property grepCommand : "grep 'Broadcast requests failed' /var/log/system.log" #アプリケーション起動時の処理 on run #ログ'Broadcast requests failed'の状態を保存 set broadcastLog to do shell script grepCommand #自分自身の名前を取得 tell application "Finder" set myName to name of (path to me) -- as text end tell #自分自身を隠す tell application "System Events" tell process myName set visible to false end tell end tell end run #2秒間隔で繰り返す処理 on idle set newLog to do shell script grepCommand #新しいログ'Broadcast requests failed'を取得して、以前と違っていたらAirMac切入を実行する if newLog is not broadcastLog then set broadcastLog to newLog delay 0.5 do shell script "scselect AirMac_off" do shell script "scselect Automatic" # 以下の行を有効にすれば、growlnotifyがメッセージを通知する # do shell script "/usr/local/bin/growlnotify 'Wake up AirMac!' -m '「ネットワーク環境 >> 自動」を選択しました。'" end if return 2 --2秒間隔で繰り返す指定 end idle
使い方
- 上記AppleScriptをスクリプトエディターにコピーして、以下の設定で保存する。
- ファイル名: 「wake_up_AirMac」
- フォーマット: 「アプリケーション」を選択する。
- オプション: 「実行後、自動的に終了しない」にチェックを入れる。
- 保存したwake_up_AirMacをダブルクリックして起動する。その後は、AirMacがつながらない時だけ、自動的にAirMacの切入を操作してくれるはず。
- growlnotifyがインストールされているなら、コメントを解除して有効にすれば、スクリプトが動作したときメッセージが表示される。
-
- 以前の日記のgrowlnotifyの参考ページ:http://d.hatena.ne.jp/zariganitosh/20080305/1204672076
-
これでMacBookのディスプレイを開く時の憂鬱がなくなった!
参考
上記本文中でリンクした以外にも、以下のページにとても助けられました。素晴らしいページに感謝です。
追記
自分の環境では快適に使えているので、ダウンロードページを準備しました。(エラー処理やGUI操作の処理を追加したスクリプトです。)
使い方
- wake up AirMacをダブルクリックで起動します。その後は、スリープ復帰後にAirMac接続が解除された時、AirMac切入の操作が自動的に行われます。
- 起動時、またはドックアイコンをクリックした時、AirMacの接続状態に関係なくAirMac切入の操作が行われます。
- ネットワーク環境に「AirMac_on」「AirMac_off」を追加しておくと、AirMac切入の操作が素早く完了します。(おすすめ)
- 上記ネットワーク環境がなくても、GUIを直接操作することで動作します。(上記に比べ動作は遅いです)
- growlnotifyがインストールされていれば、動作状況をGrowlが通知します。
- 終了する場合は、ドックアイコンを長押しして表示されるメニューから「終了」を選択してください。