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("&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