起動した PC の IP アドレスを知る

[戻る]

たまに普段と別の場所で仕事をする時があります. そこにもそれなりのコンピュータ環境があり, 仕事に必要なファイル群は事前にサーバに置いたりして仕事に支障が出ないように しています. しかしそれでも突然 普段触っているコンピュータのあそこのファイルを取り出したいとか, あのコンピュータに入っているあのツールにデータを食わせたいとか 思うときがあります. そんな時便利なのがリモートデスクトップです. 普段の仕事場に電話して, そこに居る誰かに 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
などのように使います. なおイニシャライズするスイッチ -i は, 原理上電源投入後一回は必要ですがその後の表示切替では必要ないはずです. 実際その通りなのですが -i を省くと高い確率で「応答が無かった」という レスポンスが返ります. ちゃんと表示画面は切り替わっているのであまり気にしていません.

後は起動時に割り振られた IP アドレスを調べて表示するだけです.


面倒なのでダンボールで形成. ほとんど空中配線. 表面は黒い厚紙で化粧.

3.5 インチベイに格納.

2015.11