Wake On LAN機能付 PICNICファームウエア
「Wake On LAN PICNIC」でググってみると、「Wake On LANはルータ越えはできません」とか、「PICNICでやるにしてもファームウエアを作り直さないと…」というコメントがあります。ということで、Wake On LAN機能付ファームウエアを作りました。MPASMでアセンブルして書き込んでください。
picnic_wol_1440.asm バージョン 1.4.4.0 (2014/01/21版)
コンフィグワードは下のとおりです。
FOSCHS
WDTEDisable
PWRTEEnable
BODENEnable
LVPDisable(RB3=I/O)
CPDNot-Protect
WRTDisable
DEBUGDisable
CPNot-Protect

ファームウエアの作成にはトラ技2001年1月号と信州大学 情報工学科のページからMPASM版Ver.1.2.0.0のソースリストを参考にさせていただきました。
使い方
使い方が以前のバージョンから大きく変わっているので、使い方を詳しく書いておきます。
1. 画面構成
2. URL引数の詳細
3. 画面カスタマイズ
4. 設定用EEPROMの内容
1. 画面構成
従来のPICNICではURLに何を打ち込んでも同じ画面が表示されていましたが、PCの起動終了を行うという機能を考えると誰でもアクセスできるのはあまり良い状態とはいえません。そのため、Ver.1.4.2.0のファームウエアからは、URLを認識して制限画面・操作画面・設定画面と3つの画面を分けて表示するようにしました。下のリンクが各画面のプレビューです。

制限画面 30秒ごとにリロードを行い、PCの起動状態を表示します。
操作画面 WakeOnLANの送信と、PCの状態表示、PCのシャットダウンを行います。
設定画面 PICNICの設定画面を表示します。

URLの http://a.b.c.d/ に続いて picnic/control.html を入力すると操作画面が表示され、同じく picnic/config.html を入力すると設定画面が表示されます。赤の他人が完全なURLを使ってアタックしてくることはまず無いと思うので、セキュリティ的にはそれなりに安全だと思います。
URLのお尻に何もつけなかった場合や指定したものと違うURLが指定された場合はとりあえずステータスを表示していますが、何も応答せずにPICNICの存在自体を隠したい場合は、3. 画面カスタマイズを参考にしてください。
2. URL引数の詳細
PICNICのドキュメントにはURLの後に続くコマンドの引数の詳細が記述されていなかったので、拡張したものも含めて書いておきます。
引数内容指定可能画面
Rx=y出力ポートのレベル変更
x には A または Bを指定。
y には L または H を指定。
操作画面
Mxマジックパケット送信
x には A,B,C,D のいずれかを設定。
操作画面
I設定の初期化設定画面
xxb=a.b.c...EEPROMのxxH番地にa、b、cの10進数のデータを書き込む。
書き込むa、b、cのデータは0~255まで。
引数があまり長くなりすぎると失敗するかも。
設定画面
xxw=aEEPROMのxxH番地に a の10進数のデータを書き込む。
書き込む a のデータは0~65535まで。
xxbのように複数は指定できない。
設定画面
xxh=a.b.c...EEPROMのxxH番地にa、b、cの16進数のデータを書き込む。
書き込むa、b、cのデータは00~FFまで。
引数があまり長くなりすぎると失敗するかも。
設定画面
&設定画面の各コマンドは & で区切って複数並べることが可能。設定画面
3. 画面カスタマイズ
httpのレスポンスはIPパケットのサイズ制限のため4つのパケットに分割して送信されています。これを応用して、画面を4つのブロックに区切りURLに応じて別々のメッセージを挿入するようにして1画面を構成するようにしてあります。
メッセージのテキストは、プログラムメモリに直接データが埋め込んであり、プログラムEEPROM読み出しを使ってダイレクトにデータを取得しています。メッセージデータの配置は100Hバイトの境界で0バイト目から始まるようにORGを使って配置します。現在は以下のようにテキストデータが格納されています。
0800H~0801H改行文字のみ・空のデータ
1400H~14FFHhttpレスポンス・ヘッダ リロードあり 制限画面用
1500H~16FFH制限画面本文・フッタ
1700H~17FFHhttpレスポンス・ヘッダ リロードなし 操作・設定画面用
1800H~19FFH操作画面本文 Part1
1A00H~1AFFH操作画面本文 Part2
1B00H~1CFFH設定画面本文
1D00H~1DFFHステータス表示・フッタ
1E00H~1EFFH未使用(今後の拡張用)

入力されたURLに応じて制限画面・操作画面・設定画面でどのメッセージテキストを使用するかは、データEEPROMの80Hから8BHに4バイトづつ書かれています。このエリアには各画面でどのアドレスのデータをロードするかが定義されていて、アドレスの上位8ビット分(14Hや16Hなど)を設定しておきます。たとえば制限画面の場合、14H、15H、08H、08Hとなっています。余った2つのパケット分は08H、08Hを入力しておき、何もデータを返さないようにしておきます。
特定のURLが入力されなかった時に表示される制限画面で、PICNICを隠蔽するためにhttpのレスポンスすら返さないようにしたい時は、08H、08H、08H、08Hを書き込むことによってhttpレスポンスを含まない空のデータを返すことができます。受信側ではhttpレスポンスが返ってこないためWebサーバがつながっている事はおそらく認識できないでしょう。
4. 設定用EEPROMの内容
PICのEEPROMにはPICNICを動作させるための設定値が書き込まれています。以下は初期のデータです。
Addr0123456789ABCDEF文字
0000C0A800C8FFFFFF000000000001040300・・・・・・・・・・・・・・・・
00100050000027110000FFFFFFFFFFFFFFFF・P・・・・・・・・・・・・・・
0020000000000000FFFF000000000000FFFF・・・・・・・・・・・・・・・・
0030000000000000FFFF000000000000FFFF・・・・・・・・・・・・・・・・
0040202F7069636E69632F636F6E74726F6C /picnic/control
00502E68746D6C00FFFFFFFFFFFFFFFFFFFF.html・・・・・・・・・・・
0060202F7069636E69632F636F6E6669672E /picnic/config.
007068746D6C00FFFFFFFFFFFFFFFFFFFFFFhtml・・・・・・・・・・・・
00801415080817181A1D171B1D08FFFFFFFF・・・・・・・・・・・・・・・・

以下はメモリ内の意味です。
01234567
00hIPアドレスネットマスク
08hゲートウェイFWバージョン
10hhttpポートLCDポートパラレルポートシリアルポート
18h未使用
20hHost A MAC Address未使用
28hHost B MAC Address未使用
30hHost C MAC Address未使用
38hHost D MAC Address未使用
40h操作画面用URL
48h
50h
58h
60h設定画面用URL
68h
70h
78h
80h制限画面の定義操作画面の定義
88h設定画面の定義未使用

40h~5Fhおよび60h~7Fhは操作画面・設定画面のURLが書いてあります。このデータと照合して各画面の切り替えを行うので、これらのアドレスを書き換えると指定のURLを変更することができます。40hと60hに注目するとスペースが入っていることが分かると思いますが、これはhttpのGETコマンドの後に続くURLとの間にスペースが入っていることに起因しています。スペースを入れてURLを書き込んだ場合はフルパス指定で認識されるようになり、スペースが無い場合は書き込んだURLの文字列が存在すれば認識されるようになります。たとえば(スペース)piccont.htmlと書き込むと、http://a.b.c.d/piccont.htmlと入力しない限り制限画面に落ちますが、スペースを入れずにpiccont.htmlだけ書き込むと、http://a.b.c.d/piccont.htmlでもhttp://a.b.c.d/picnic/piccont.htmlでも応答するようになります。

また、URL変更時の注意点ですが、操作画面と設定画面のレスポンステキストにあるformタグのactionにも正しいURLを入れてアセンブルしなおさないと、単にEEPROMを書き換えても実際にボタンを押した時に制限画面に移行してしまってボタンが反応しないという状況に陥りますので注意してください。

Update 2011/9/10