#!/bin/bash
export PATH=/home/noizumi/bin:$PATH
GPIO=26
GPIO_DIR=/sys/class/gpio
MOTION_MOVIE_DIR=/ramdisk/motion/detected
MOTION_PID=/ramdisk/motion/motion.pid
MOTION_STOP=/ramdisk/motion.stop
GPS_BASE=/ramdisk/gps_base
GPS_LATLON=/home/noizumi/bin/gpslatlon.sh
GPS_LIMIT=100
initialize(){
# GPIO26を有効化。プルアップ抵抗ON
echo $GPIO >${GPIO_DIR}/export
sleep 0.1
echo in >${GPIO_DIR}/gpio${GPIO}/direction
sleep 0.1
echo high >${GPIO_DIR}/gpio${GPIO}/direction
}
shutdown_handler(){
# GPIOクリーンアップ
echo $GPIO >$GPIO_DIR/unexport
if [ "${BT_CHECK_PID}" != "" ]; then
kill -TERM ${BT_CHECK_PID}
fi
motion_stop
exit 0
}
# 車載警報装置が発報したら、メールで通知する
mail_send(){
cat << _EOD_|/usr/sbin/sendmail -t -f yuji@noizumi.org
From: yuji@noizumi.org
To: yuji@noizumi.org
Subject: Car Security alert $1
Car Security alarm was $1 at `date +"%Y/%m/%d %H:%M:%S"`
$2
_EOD_
}
# 車載警報装置が発報したら、twilio で携帯電話にSMSを送る
sms_send(){
# 通常のSMS送信は、電話番号を購入して月額約164円払わねばならないが、
# Verify だと電話番号買わなくていいので、固定費が発生しない。
#
# 通知内容は「あなたの車載警報装置 認証コード:123456」みたいな内容だが
# 警報が発報した事が分かればよい。
curl -X POST \
https://verify.twilio.com/v2/Services/[twilio Service SID]/Verifications \
--data-urlencode "To=[わしの電話番号]" \
--data-urlencode "Channel=sms" \
-u [twilio Account SID]:[twilio Auth Token]
}
# 車載警報装置は、発報するとイヤホンマイクスイッチをONにする
# イヤホンマイク信号を GPIO 26で検知して、発報時の処理
button_pushed(){
motion_start
mail_send activated
sms_send activated
# ボタンが押されている間、ループ
while [ "`cat ${GPIO_DIR}/gpio${GPIO}/value`" = "0" ]; do
sleep 1
done
mail_send stopped
sms_send stopped
}
# 動体検知スタート
motion_start(){
MOTION_STATUS=`curl -s http://localhost:8080/0/detection/status |grep "Detection status"`
PATTERN=".*Detection status PAUSE"
if [[ $MOTION_STATUS =~ $PATTERN ]]; then
curl -s http://localhost:8080/0/detection/start >/dev/null 2>&1
fi
if [ ! -e ${GPS_BASE} ]; then
GPS_NOW=`${GPS_LATLON}`
if [ "${GPS_NOW}" != "" ]; then
echo "${GPS_NOW}" > ${GPS_BASE}
GPS_SAVE=${GPS_NOW}
fi
fi
}
# 動体検知ストップ
motion_stop(){
MOTION_STATUS=`curl -s http://localhost:8080/0/detection/status |grep "Detection status"`
PATTERN=".*Detection status ACTIVE"
if [[ $MOTION_STATUS =~ $PATTERN ]]; then
curl -s http://localhost:8080/0/detection/pause >/dev/null 2>&1
fi
if [ -e ${GPS_BASE} ]; then
rm -f ${GPS_BASE} || true
fi
}
# bluetooth チェックは別処理にし、ファイルの有無で状態を判断する
bluetooth_check(){
# bluetooth 接続状態確認
if [ -e ${MOTION_STOP} ]; then
# 接続してたら、動体検知止める
motion_stop
else
# 接続してなかったら、動体検知スタート
motion_start
fi
}
# GPSで移動距離チェック
# 警戒モードONの時、GPSの位置を gps_base ファイルに記録し、
# 以後、100m以上移動毎に現在位置をメール送信
gps_check(){
if [ "`ls /dev/gps* 2>/dev/null`" != "" ]; then
if [ -e ${GPS_BASE} ]; then
GPS_NOW=`${GPS_LATLON}`
if [ "${GPS_NOW}" != "" ] && [ "${GPS_SAVE}" != "" ]; then
DISTANCE=`distance.sh ${GPS_SAVE} ${GPS_NOW}`
if [ "`echo \"${DISTANCE}>${GPS_LIMIT}\"|bc`" = "1" ]; then
GPS_BASE_VALUE=`cat ${GPS_BASE}`
TOTAL_DISTANCE=`distance.sh ${GPS_BASE_VALUE} ${GPS_NOW}`
mail_send "GPS Warning! ${TOTAL_DISTANCE}m moved." "https://maps.google.com/maps?q=${GPS_NOW}"
fi
fi
GPS_SAVE=${GPS_NOW}
else
GPS_LIMIT=100
fi
fi
}
# メイン処理スタート
initialize
trap shutdown_handler 1 2 3 15
bt_check.sh &
BT_CHECK_PID=$!
# motion を daemon モードで起動
if [ ! -e ${MOTION_PID} ]; then
mkdir -p ${MOTION_MOVIE_DIR}
motion -b
fi
# pulseaudo 起動確認
if [ "`ps ux|grep -e \"${USER}.*pulseaudio\"|grep -v grep`" = "" ]; then
pulseaudio --start
sudo systemctl restart bluetooth.service
fi
while :; do
bluetooth_check
# 車載警報装置が発報した時
if [ "`cat ${GPIO_DIR}/gpio${GPIO}/value`" = "0" ]; then
button_pushed
fi
gps_check
sleep 1
done