スリープ復帰後、AirMacに自動的につながらない対策

いつの頃からか発生していた、スリープ復帰後、AirMacに自動的につながらない問題。スリープ復帰直後につながらないだけで、AirMacカードの切入を繰り返せば正常につながるので今まで放っておいたが、習慣になりつつある以下の単純クリック操作がいいかげん嫌になってきた...。

  • MacBookのディスプレイを開く。
  • AirMacを切りにする」
  • AirMacを入りにする」

わずか5秒程度のクリック操作なのだが、これを毎回、これからも繰り返すのかと思うと...精神衛生上よくない。実はつい最近の「AirMacユーティリティ 5.3.1」アップデートに淡い期待をしてインストールしてみたのだが、この症状については全く改善の兆し無し。これでやっと自分自身で何か対策をしてみる決心がついた。

  • 2008-06-11のソフトウェアアップデートAirMac ユーティリティ 5.3.2によって、自分の環境では上記の接続できない問題は解消された!
  • wake_up_AirMacもログイン項目から外して、晴れて快適な無線LAN環境になった。

具体的な症状

症状はApple Support Discussions - スリープ復帰後に自動的につながらないと全く同様だと思う。さらに自分の環境や気付いたことは以下。

期待して以下のサポート情報も試してみたが、状況は変わらなかった...。

対策

検索してみたが根本的な解決法は見つからなかった...。現状では、マウスをクリックして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
  • system.logで確認すると、スリープ復帰後にAirMacに接続できない時は「Broadcast requests failed」が発生していた。
  • そこで、上記メッセージを監視して、新たに発生した時だけAirMac切入の動作を行うようにしてみた。すると、繋がるまで切入を繰り返し、接続している状態では無駄な処理が発生しないので、いい感じだ。
使い方
  • 上記AppleScriptスクリプトエディターにコピーして、以下の設定で保存する。
    • ファイル名: 「wake_up_AirMac
    • フォーマット: 「アプリケーション」を選択する。
    • オプション: 「実行後、自動的に終了しない」にチェックを入れる。


これでMacBookのディスプレイを開く時の憂鬱がなくなった!

参考

上記本文中でリンクした以外にも、以下のページにとても助けられました。素晴らしいページに感謝です。

追記

自分の環境では快適に使えているので、ダウンロードページを準備しました。(エラー処理やGUI操作の処理を追加したスクリプトです。)

使い方
  • wake up AirMacをダブルクリックで起動します。その後は、スリープ復帰後にAirMac接続が解除された時、AirMac切入の操作が自動的に行われます。
  • 起動時、またはドックアイコンをクリックした時、AirMacの接続状態に関係なくAirMac切入の操作が行われます。
  • ネットワーク環境に「AirMac_on」「AirMac_off」を追加しておくと、AirMac切入の操作が素早く完了します。(おすすめ)
    • AirMac_onはAirMacサービスを有効に設定しておきます。
    • AirMac_offはAirMacサービスを無効に設定しておきます。
  • 上記ネットワーク環境がなくても、GUIを直接操作することで動作します。(上記に比べ動作は遅いです)
  • growlnotifyがインストールされていれば、動作状況をGrowlが通知します。
  • 終了する場合は、ドックアイコンを長押しして表示されるメニューから「終了」を選択してください。