Develop and Download Open Source Software

Recent Changes

2012-04-05
2012-03-30
2012-03-29
2012-03-20
2012-03-12
2012-03-08

Wiki Guide

Side Bar

pepogmail4dio

最初に

pepogmail4dioとはPepoLinux-0.52以降に収録されているwgetでgmailの新着メールを定期的にチェックして、シリアルDIOボードの各ポートへの書き込みや0~7チャンネルの入力ポート情報をメールしてくれる、ちょっとしたプログラムです。

PepoLinuxに収録されているプログラムを必要とするので単独では動作しませんが、シリアル経由でコマンドのやり取りで制御する機器やボードのプログラムに応用出来ると思います。

usage:メールの件名に入力ポートの状態通知メール:『dio』

出力ポートチャンネル0へ『1』writeライト:『dio 0 1』など

更新履歴

2011.12.7:ファーストリリース

2011.12.11

o ネットワーク遅延時間による揺れを自動補正するようにに変更

o DIOのライトコマンドの結果を入力全ポート情報で返信するよう変更

現在のバージョンではwgetを使い新着メール到着時間と現在時間とネットワーク遅延時間による揺れを変数で補正して検出しているこの為コマンドが10%以上の確立で不実行となる

これを出力ポート6本を入力ポート端子へジャンパ接続すればライトコマンドの結果を返信メールで良否が判定出来る

2011.12.11現在、携帯(DOCOMO)からコマンドのメール送信で、LOOP変数:10秒、JITTER変数:7秒とした時に10回に1回位失敗する

2011.12.16

o 件名がマッチしなくてもDIO入力情報を返信していたバグを修正

2012.1.19

o gmail新着チェック方法を強化してよりDIOコマンドが確実になった

o DIO出力コマンドとメールを多重化出来るようにした、これにより下記のようなコマンドの多重化と入力ポート情報のメール返信が同時実行できるようになった

dio 1 1 60000 <= 出力ポート1番を60秒オン

2012.1.24

o メール応答分の入力端子エイリアス名が正しく参照出来ないバグ修正

2012.3.7

DIO操作キーワードのマッチングチェック変更(キーワードのマッチパターンとlengthをANDでチェック)

2012.3.11

o pepodiodのバージョンUPに伴い15ビット入出力全ての情報を返信するようにした

2012.3.29

o DIO入力端子のカウンターを取得出来るように機能UP

例:menud11のKey Wordで設定した『dio_get』で入力ポート1番目の情報を取得する

送信件名:dio_get 1

以下返信メール内容

件名:remote-hand dio report

本文:

うさぎ小屋の扉=high

dio0high

Reset 2012/03/30 05:19:57

Update 2012/03/30 05:22:50

Count 2

http://sourceforge.jp/projects/pepolinux/wiki/chobit_prog+pepogmail4dio

2012.3.30 by.Yamauchi Isamu also IZAMUKARERA

#!/bin/sh
# pepogmail4dio ; get mail & dio actions
# licence GPLv2 ; this scripts designed by IZAMUKARERA 2011.11.28 update 2012.3.29
PATH=$PATH:/usr/local/bin:/usr/local/sbin
RETRYTIME=10
RETRY=2
WORKDIR=/var/www/html/remote-hand/tmp
CONF="$WORKDIR/.pepogmail4dio.conf"
USERAGENT="Chrome/15.0.874.121"
SUBJECT="remote-hand+dio+report"
WORK=$WORKDIR/.wget_tmp
tWORK=$WORKDIR/.wget_tmp.tmp
tAWK=$WORKDIR/.wget_awk.tmp
DIRD=$WORKDIR/.di_read_data
DOWD=$WORKDIR/.do_write_data
ALIAS_DI=$WORKDIR/.alias_di
ALIAS_DO=$WORKDIR/.alias_do
DIOCTL="/usr/local/bin/pepodioctl"
DIOEXEC="/usr/local/bin/pepodiodexec"
DIOCMD_DIO="$WORKDIR/.pepogmail4dioexec"
DIOCMD_MAIL="$WORKDIR/.pepogmail4mailexec"
MATCHDIO="dio"
GETSIZE="1k"
prog=pepogmail4dio
pidfile=/var/run/$prog.pid
echo -en $$ >$pidfile
error(){
  [ -e $DIOCMD_DIO ] && rm -f $DIOCMD_DIO
  [ -e $DIOCMD_MAIL ] && rm -f $DIOCMD_MAIL
  [ -e ${WORK} ] && rm -f ${WORK}
  [ -e ${tWORK} ] && rm -f ${tWORK}
  [ -e ${tAWK} ] && rm -f ${tAWK}
  exit 0
}
trap error SIGTERM SIGHUP SIGKILL

exec_dio() {
# dio write & exec command
# exec_dio message_id diocmd ch 0|1 [time]
  local pid CH
  [ ! -z $3 ] && CH=$(($3 - 1))
  pid=`echo $1 | cut -c 1-10`
  CMDDIO=${DIOCMD_DIO}.${pid}
  CMDMAIL=${DIOCMD_MAIL}.${pid}
  if [ $# -gt 3 ];then
# dio write
    cat >${CMDDIO}<<END
#!/bin/sh
PATH=$PATH:/usr/local/bin:/usr/local/sbin
${DIOCTL} $CH $4 $5
rm -f $CMDDIO
END
    chmod +x ${CMDDIO}
    ${DIOEXEC} ${CMDDIO}
  fi
# dio read & send mail
  msleep 2000
  [ -e $DIRD ] && . $DIRD
  [ -e $DOWD ] && . $DOWD
  [ -e $ALIAS_DI ] && . $ALIAS_DI
  [ -e $ALIAS_DO ] && . $ALIAS_DO
  [ -e $tWORK ] && rm -f $tWORK && touch $tWORK || touch $tWORK
  for n in 0 1 2 3 4 5 6 7;do
    DI[$n]="none"
    [ "${di[$n]}" = "1" ] && DI[$n]="high"
    [ "${di[$n]}" = "0" ] && DI[$n]="low"
    [ -z "${alias_di[$n]}" ] && alias_di[$n]="入力"`expr $n + 1`
    echo -en "${alias_di[$n]}=${DI[$n]}\r\n" >>$tWORK
  done
  for n in 0 1 2 3 4 5;do
    DO[$n]="none"
    [ "${do[$n]}" = "1" ] && DO[$n]="high"
    [ "${do[$n]}" = "0" ] && DO[$n]="low"
    [ -z "${alias_do[$n]}" ] && alias_do[$n]="出力"`expr $n + 1`
    echo -en "${alias_do[$n]}=${DO[$n]}\r\n" >>$tWORK
  done
  if [ $# = 3 ];then
# read di only ?
    n=$CH
    if  [ ! "$n" -gt 9 ] && [ ! "$n" -lt 0 ];then
      [ -z "${alias_di[$n]}" ] && alias_di[$n]="入力"`expr $n + 1`
      echo -en "${alias_di[$n]}=${DI[$n]}\r\n" >$tWORK
      CT=`ls -a $WORKDIR/|egrep ".dio[$n][low|high]+.count+$"`
      if [ `echo $CT | wc -w` != 0 ];then
        for DIO in $CT ; do
          DIOCONT=$WORKDIR/$DIO
          echo $DIO| awk '{gsub("\\.","");sub("count","");printf("%s\r\n",$0)}' >>$tWORK
          cat $DIOCONT | awk '
            /^Reset/{printf("%s\r\n",$0)}
            /^Update/{printf("%s\r\n",$0)}
            /^#/{sub("#","Count ");printf("%s\r\n\r\n",$0)}
          ' >>$tWORK
        done
      fi
    fi
  fi
  echo -n "{gsub(/ /,\"+\",\$0);printf \$0}" >$tAWK
  MESSAGE=`cat $tWORK | awk -f $tAWK`
  WGETMAIL=/pepolinux/wget_mail.sh
cat >${CMDMAIL}<<END
#!/bin/sh
PATH=$PATH:/usr/local/bin:/usr/local/sbin
${WGETMAIL} ${MAILFROM} ${SUBJECT} ${MESSAGE}
rm -rf ${CMDMAIL}
END
  chmod +x ${CMDMAIL}
  ${DIOEXEC} ${CMDMAIL}
}

while true
do
  while true
  do
    if [ ! -e $CONF ];then
       LOOPTIME=10000
       break
    fi
    if [ -e $CONF ];then
      msleep 100
      . $CONF
      USER=$GMAILUSER
      PASSWORD=$GMAILPASSWORD
      MAILFROM=$PERMITMAIL
      JITTER=$JITTER
      LOOPTIME=`expr $LOOPTIME "*" 1000`
      MATCHMAIL="<email>${MAILFROM}"
      MATCHDIO=$KEYWORD
    fi
    wget -Q $GETSIZE -T $RETRYTIME -t $RETRY -q --secure-protocol=TLSv1 --no-check-certificate --user-agent=${USERAGENT} https://mail.google.com/mail/feed/atom/unread --http-user=${USER} --http-password=${PASSWORD} --output-document=${WORK}
    [ -z ${WORK} ] && break
    cat ${WORK} | head -n 20 >${tWORK}
    NOW=`date -ud "${JITTER} second ago" +%Y-%m-%dT%H:%M:%S | cut -c 1-17`
    tNOW=`date -u +%Y-%m-%dT%H:%M:%S | cut -c 1-17`
    MATCHNOW="<issued>${NOW}"
    tMATCHNOW="<issued>${tNOW}"
    echo -n "BEGIN{I=\"NO\"};/${MATCHNOW}/{I=\"YES\";exit};END{printf I}" >${tAWK}
    NEW_YESNO=`cat ${tWORK}|awk -f ${tAWK}`
    echo -n "BEGIN{I=\"NO\"};/${tMATCHNOW}/{I=\"YES\";exit};END{printf I}" >${tAWK}
    tNEW_YESNO=`cat ${tWORK}|awk -f ${tAWK}`
    echo -n "BEGIN{I=\"NO\"};/$MATCHMAIL/{I=\"YES\";exit};END{printf I}" >${tAWK}
    FROM_YESNO=`cat ${tWORK}|awk -f ${tAWK}`
    if [ ${NEW_YESNO} = "YES" -o ${tNEW_YESNO} = "YES" -a ${FROM_YESNO} = "YES" ];then
      newMESSAGEID=`cat ${tWORK} | grep "message_id="|awk -F "=" '{gsub("&amp;view","",$5);print $5}'`
      [ "$oldMESSAGEID" = "$newMESSAGEID" ] && break || oldMESSAGEID=$newMESSAGEID
      echo -n "/${MATCHDIO}/{gsub(\"</title>\",\"\",\$0);gsub(\"<title>\",\"\",\$0);exit};END{printf \$0}" >${tAWK}
      CMD=`cat ${tWORK}| grep "<title>" | grep ${MATCHDIO} | awk -f ${tAWK}`
      CMDCNT=`echo -en $CMD | grep ${MATCHDIO} | wc -c`
      [ ${CMDCNT} = 0 ] && break
      CMD_ARG1_LEN=`echo ${CMD}|awk -F " " '{printf length($1)}'`
      MATCHDIO_LEN=`echo ${MATCHDIO}|awk -F " " '{printf length($1)}'`
      [ "${CMD_ARG1_LEN}" != "${MATCHDIO_LEN}" ] && break
      exec_dio $newMESSAGEID ${CMD}
    fi
    msleep ${LOOPTIME}
    [ -e ${WORK} ] && rm -f ${WORK}
    [ -e ${tWORK} ] && rm -f ${tWORK}
    [ -e ${tAWK} ] && rm -f ${tAWK}
  done
  msleep ${LOOPTIME}
done

SourceForge.JP is a Japanese version of SourceForge.net. For developments that are not related to Japan, we recommend you to use SourceForge.net.