たまに普段と別の場所で仕事をする時があります. そこにもそれなりのコンピュータ環境があり, 仕事に必要なファイル群は事前にサーバに置いたりして仕事に支障が出ないように しています. しかしそれでも突然 普段触っているコンピュータのあそこのファイルを取り出したいとか, あのコンピュータに入っているあのツールにデータを食わせたいとか 思うときがあります. そんな時便利なのがリモートデスクトップです. 普段の仕事場に電話して, そこに居る誰かに PC の電源を入れてもらえばいいわけですから...
ところがリモートデスクトップで繋ぐには IP アドレスが必要です. ところが最近はいろいろ情シス系がやかましく IP アドレスが DHCP で毎回割り振られます. ちょっと怪しいことをしていた時期も ありましたが, この技も使えないほどやかましくなってきました.
現在はこっそり立てているファイルサーバに誰でも書き込める (でも cron で数日以内に消す) テンポラリ的なディレクトリを作り
ipconfig | D:\tools\openssl aes-256-cbc -e -out \\xx.xx.xx.xx\Free\hoge.txt -pass pass:fugaとかいったフレーズを スタートアップスクリプト に書いています. openssl は cygwin のが動くかもしれませんが当方は ここにあるものを 使っています. インストールして環境変数をいじれと書いてますが exe と数個の dll だけで暗号化は動きます. 復号は cygwin でやってるため試したことありません. でもこの技もサーバがこっそり立てられなくなったらアウトです. そうなる前に次なる技を用意しておきたいものです.
PC の電源を入れてもらった人に割り振られた人に 割り振られた IP アドレスを教えてもらうという原点に戻るしかなさそうです. しかし先に編み出した技と違い, ロック画面でなくログイン画面の背景を変更することはなかなか難しそうです. というわけで LCD で表示させるようにしてみました.
どうせ画面には xxx.xxx.xxx.xxx という 15 文字しか出すつもりはありません. そこで小さくて安い (秋月価格 320 円) AQM0802A を使ってみることにしました. こいつの IF は I2C ですがそれを簡単に操作する技は 前回編み出しました. それを使うと...
ftdiI2Clib lib; if (lib.OpenDevice(pDevice)){ fprintf(stderr, "ERROR: Can not open FT232R Device\n"); return -1; } else { if (bInit){ lib.SendStart(); bErr |= !lib.SendByte(0x7c); // I2C Address bErr |= !lib.SendByte(0x00); // Co:0, Rs:0 bErr |= !lib.SendByte(0x38); // function set (8bit mode) bErr |= !lib.SendByte(0x39); // function set (Instruction table set) bErr |= !lib.SendByte(0x14); // Internal OSC frequency // contrast set bit 0-3 bErr |= !lib.SendByte(0x70+(contrast & 0x0f)); // display:on, booster:off, and contrast bit 0-1 bErr |= !lib.SendByte(0x54+((contrast>>4) & 0x03)); bErr |= !lib.SendByte(0x6c); // follower circuit on bErr |= !lib.SendByte(0x0C); // Display:on, no cursor bErr |= !lib.SendByte(0x01); // Clear Display lib.SendStop(); if (!bErr) Sleep(500); } if (!bErr){ lib.SendStart(); bErr |= !lib.SendByte(0x7c); // I2C Address bErr |= !lib.SendByte(0x80); // Co:1, RS:0 bErr |= !lib.SendByte(0x80); // 1st ROW address bErr |= !lib.SendByte(0x40); // Co:0, RS:1 for (int i=0;i < LCDCOLUMN;i++) bErr |= !lib.SendByte(DisplayString[i]); lib.SendStop(); lib.SendStart(); bErr |= !lib.SendByte(0x7c); // I2C Address bErr |= !lib.SendByte(0x80); // Co:1, RS:0 bErr |= !lib.SendByte(0xc0); // 2nd ROW address bErr |= !lib.SendByte(0x40); // Co:0, RS:1 for (int i=LCDCOLUMN;i < LCDCOLUMN*2;i++) bErr |= !lib.SendByte(DisplayString[i]); lib.SendStop(); } lib.CloseDevice(); if (bErr){ fprintf(stderr, "ERROR: LCD Device not response.\n"); return -1; } } |
これを使った実行ファイルが これです. 引数なしで実行すると使い方が表示されますが,
LCDctrl -i -o hogehoge |
後は起動時に割り振られた IP アドレスを調べて表示するだけです.