PHS経由でネットに接続できるEthernetアダプタのファームウェアをハック・後編 ―― 画像付きメールを利用した遠隔監視システムの製作事例

中本伸一

tag: 組み込み

技術解説 2007年11月27日



// Send sub
char SendStr(char s,char *b){if(Write(s,b,StrLen(b))<0)return -2;
WaitWriteComplete(s);return 0;}
// File send sub
SendFile(char soc,char *name,char n){int fp,len;char *buf;
fp=OpenFile(name);if(!fp)return;buf=MemoryAlloc(128);FileGets(fp,0,0);
while(n--)FileGets(fp,buf,128);
for(;;){len=FileGets(fp,buf,128);if(len==1&&*buf=='.')break;
StrCat(buf,"エrエn");if(SendStr(soc,buf)<0)break;}
FileGets(fp,0,1);MemoryFree(buf);CloseFile(fp);}
SMTPAUTHとの差分.
SendFile関数を追加した.
この関数で指定されたファイルを
オープンし1行分のデータ
を読み込んでTCP/IPに出力する
// SMTP handler (with SMTP auth)
char SmtpHandler(char soc)

int len; char *recbuf, *sendbuf;
char *MailFrom="camera@server.jp", *MailName="OS-1 Camera";
char *Subject="Photo from OS-1",*MsgBody="Mail from OS-1エrエn";
char *SmtpName="name", *SmtpPass="passwd";
  if(SmtpState)
    {if((len=Read(soc,2000))<0)return -1;recbuf=GetReceiveBuffer(soc,1);
// PrStr(recbuf); デバッグ用表示(必要に応じて有効にする)
    if(*recbuf!='3'&&*recbuf!='2'){MemoryFree(recbuf);return -4;}
  }
  MemoryFree(recbuf);
  switch(SmtpState){
  case 1:
    if(SendStr(soc,"HELO OS1エrエn")<0)return -2;
    SmtpState++;break;
    // SmtpState=6;break;
  case 2:
    if(SendStr(soc,"AUTH LOGINエrエn")<0)return -2;SmtpState++;break;
  case 3:
    sendbuf=MemoryAlloc(128);BASE64::Enc64(sendbuf,SmtpName);
    StrCat(sendbuf,"エrエn");if(SendStr(soc,sendbuf)<0)return -2;
    MemoryFree(sendbuf);SmtpState++;break;
  case 4:
    sendbuf=MemoryAlloc(128);BASE64::Enc64(sendbuf,SmtpPass);
    StrCat(sendbuf,"エrエn");if(SendStr(soc,sendbuf)<0)return -2;
    MemoryFree(sendbuf);SmtpState++;break;
  case 5:
    if(SendStr(soc,"RSETエrエn")<0)return -2;SmtpState++;break;
  case 6:
    sendbuf=MemoryAlloc(StrLen(MailFrom)+15);
    StrCpy(sendbuf,"MAIL FROM:<");StrCat(sendbuf,MailFrom);
    StrCat(sendbuf,">エrエn");if(SendStr(soc,sendbuf)<0)return -2;
    MemoryFree(sendbuf);SmtpState++;break;
  case 7:
    sendbuf=MemoryAlloc(StrLen(MailTo)+13);
    StrCpy(sendbuf,"RCPT TO:<");StrCat(sendbuf,MailTo);
    StrCat(sendbuf,">エrエn");if(SendStr(soc,sendbuf)<0)return -2;
    MemoryFree(sendbuf);SmtpState++;break;
  case 8:
    if(SendStr(soc,"DATAエrエn")<0)return -2;SmtpState++;break;
  case 9:
    sendbuf=MemoryAlloc(StrLen(MailTo)+8);
    StrCpy(sendbuf,"To:<");StrCat(sendbuf,MailTo);StrCat(sendbuf,">エrエn");
    if(SendStr(soc,sendbuf)<0)return -2;MemoryFree(sendbuf);
    sendbuf=MemoryAlloc(StrLen(MailName)+StrLen(MailFrom)+12);
    StrCpy(sendbuf,"From: ");StrCat(sendbuf,MailName);StrCat(sendbuf," <");
    StrCat(sendbuf,MailFrom);StrCat(sendbuf,">エrエn");
    if(SendStr(soc,sendbuf)<0)return -2;MemoryFree(sendbuf);
    sendbuf=MemoryAlloc(StrLen(Subject)+14);StrCpy(sendbuf,"Subject: ");
    StrCat(sendbuf,Subject);StrCat(sendbuf,"エrエn");
    if(SendStr(soc,sendbuf)<0)return -2;MemoryFree(sendbuf);
    SendFile(soc,"EncHeader",0);if(SendStr(soc,MsgBody)<0)return -2;
    SendFile(soc,"EncHeader",9);UserDriver(2,1);for(;;){
    len=UserDriver(2,3);if(len==0)break;
    if(Write(soc,UserDriver(2,0),len)<0)return -2;WaitWriteComplete(soc);}
    UserDriver(2,4);SendFile(soc,"EncHeader",15);
SMTPAUTHとの差分.
EncHeaderというファイル内のヘッダ情報と
メールの本文,撮影したJPEGデータを
BASE64に変換したものをTCP/IPに出力する

    if(SendStr(soc,"エrエn.エrエn")<0)return -2;SmtpState++;break;
  case 10:
    if(SendStr(soc,"QUITエrエn")<0)return -2;SmtpState++;break;
  case 11:
    SmtpState=0;return 1;
  }
  return 0;



リスト1 画像を添付してメールを送信するSMTPCAMファイル

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日