利用短信模块配合gammu实现用短信管理树莓派

开门见山吧。

硬件环境:

树莓派2 B+ 一代也可以,但三代的话需要注意串口的针脚位置,因为3代的蓝牙模块使用了二代的串口,新的串口被设置在别的针脚上了。

GSM 800L 一块空白扩展版。接线方式不是本文重点,网上可以查到所有需要的信息。

如果不想这么麻烦也可以使用3G上网卡来代替GSM模块,好处是省去了手工坏处是没办法做的干净利落。

软件环境:

树莓派7 jessie 较老的系统也可以,树莓派8 以上在配合修改ttyAMA0方面与此前的系统可能稍有不同。

gammu gamm-smsd 这两种软件是本文的基础。

先上几张图:

 

gammu需要进行一定的配置,参考如下:

文件:/etc/gammu-smsdrc

# Configuration file for Gammu SMS Daemon
 
# Gammu library configuration, see gammurc(5)
[gammu]
# Please configure this!
port = /dev/ttyAMA0
model = at
connection = at115200
synchronizetime = yes
use_locking = yes
# Debugging
#logformat = textall
 
# SMSD configuration, see gammu-smsdrc(5)
[smsd]
RunOnReceive = /home/pi/smsrecv.sh
 
MaxRetrise = 10
ReceiveFrequency = 5
PIN = 1234
service = files
logfile = syslog
# Increase for debugging information
debuglevel = 0
 
# Paths where messages are stored
inboxpath = /var/spool/gammu/inbox/
outboxpath = /var/spool/gammu/outbox/
sentsmspath = /var/spool/gammu/sent/
errorsmspath = /var/spool/gammu/error/

为了让gammu-smsd能够处理短信需要写一个程序在它收到短信后进行解析和执行。最简单的方法就是写一个脚本,这正是本文准备讲的事。

gammu-smsd的文档里讲了服务会提供的预设变量,本脚本直接写了一个框架用于解析短信,并执行短信的指令。

 

#!/bin/sh
#code xmsg.org
#20151015
#20151018
#20151019 1.0 正式版
#20170204 从现在开始它将被修改成一个短信控制系统
############################################################
#在本次SHELL中我还是学到了不少东西
#一 在if条件中各项内容之间的空格必不可少,不然执行就会出错。
#二 在一个逻辑块中(比如if块)中只有存在错误(比如我在执行脚
#   本时最后少写一个反引号)会引起整个块不被执行。
#三 初始化变量时变量名前一定不能加美元符号,在知道的情况下还
#   是会犯这种错误。
#四 虽然在脚本中使用空格分隔内容可以让内容更清晰,但初始化变
#   量的情况下[变量 等于 数据]这个过程中等于号前号一定不能
#   有空格。
#五 需要eval要小心使用,它在强大的同时可能引起安全问题。
############################################################
# !ip 获取本机的出口IP
# !pt 获取本机开放的端口
# !tcp 获取本机开放的TCP端口
# !ssh 启动SSH
# !sshoff 关闭SSH
# !rt 重启系统
# !so 清除转发
# !so localport localnetip localnetport 设置内网对外转发
 
#FULLMSG=$SMS_1_NUMBER
#FULLMSG="$FULLMSG"#
#手机号需要带国家代码,中国是+86
NUMBER=$SMS_1_NUMBER
#UNKNOWN ERROR
NOTFOUND="Unknown Error"
MASTERPHONE="你的手机号11位别搞错,别不写!"
#############短信白名单###########################################
#正式版需要有一个白名单这可以减少大量恶意攻击
#
########################################################
 
#echo FULLMSG >>;/tmp/all.log
for i in `seq $SMS_MESSAGES` ; do
#echo ---- >>/tmp/all.log
    varname="SMS_"$i"_TEXT"
    #echo $varname >>/tmp/all.log
    smspart=`eval echo '$'$varname`
    #echo $smspart >>/tmp/all.log
    FULLMSG="$FULLMSG$smspart"
done
#echo $FULLMSG >>/tmp/all.log
 
# $NUMBER中存放了手机号码
# $FULLMSG中存了完整短信内容
 
#echo resend a sms from "$NUMBER" >>/tmp/debug.log
#手机号中包含国家代码
if [ "$NUMBER" != "+86$MASTERPHONE" ]; then
#一般短信就转发给我自己吧。
        echo resend a sms "$FULLMSG".from."$NUMBER" >>/tmp/gate.log
        `eval "gammu-smsd-inject EMS $MASTERPHONE -unicode -text \"$FULLMSG.from.$NUMBER\""`
        exit 0
fi
 
if [ "$FULLMSG" = "!ip" ]; then
#获取外网IP
        EVALRET=`curl -k https://xmsg.org/tool/ip.php`
        `gammu-smsd-inject EMS $MASTERPHONE -unicode -text "$EVALRET"`
        exit 0
elif [ "$FULLMSG" = "!pt" ]; then
#获取本机端口
        EVALRET=`netstat -an|grep "^[tu].p .*0:\*.*"`
        `gammu-smsd-inject EMS $MASTERPHONE -unicode -text "$EVALRET"`
        exit 0
elif [ "$FULLMSG" = "!tcp" ]; then
#获取本机端口
        EVALRET=`netstat -an|grep "^tcp .*0:\*.*"`
        `gammu-smsd-inject EMS $MASTERPHONE -unicode -text "$EVALRET"`
        exit 0
elif [ "$FULLMSG" = "!ssh" ]; then
#启动SSH
        EVALRET=`sudo service ssh start`
        `gammu-smsd-inject EMS $MASTERPHONE -unicode -text "ssh start"`
        exit 0
elif [ "$FULLMSG" = "!sshoff" ]; then
#关闭SSH
        EVALRET=`sudo service ssh stop`
        `gammu-smsd-inject EMS $MASTERPHONE -unicode -text "ssh stop"`
        exit 0
elif [ "$FULLMSG" = "!rt" ]; then
#重启本机
        sudo reboot
        exit 0
elif [ "$FULLMSG" = "!so" ]; then
#清除转发
        sudo killall socat
        `gammu-smsd-inject EMS $MASTERPHONE -unicode -text "socat killed"`
        exit 0;
elif [ "`expr substr \"$FULLMSG\" 1 3`" = "so " ]; then
#设置转发
        EVALRET=`eval "sudo /home/pi/bin/$FULLMSG"`
        #echo "sudo /home/pi/bin/$FULLMSG">>/tmp/a.log
        `gammu-smsd-inject EMS $MASTERPHONE -unicode -text "$EVALRET"`
        exit 0;
else
        #echo `expr substr "$FULLMSG" 1 3` >>/tmp/a.log
        #echo "sudo /home/pi/bin/$FULLMSG">>/tmp/a.log
        EVALRET=`eval "$FULLMSG"`
        `gammu-smsd-inject EMS $MASTERPHONE -unicode -text "$EVALRET"`
        echo "$FULLMSG" >> /tmp/gate.log
        echo "$EVALRET" >> /tmp/gate.log
        exit 0
fi
exit 0

这个脚本可以放在/home/pi/smsrecv.sh别忘了给它执行权:
chmod 755 /home/pi/smsrecv.sh
如果要执行高权限操作比如,重启服务,打开小于1024的端口,杀掉进程。那么需要给gammu帐号一个无密码使用sodu的权限。
打开/etc/soduers
添加以下内容
gammu ALL=(ALL) NOPASSWD: ALL
到文件末尾

上面脚本中so指令需要以下支持
apt-get install socat

创建文件/home/pi/bin/so

#!/bin/sh
if [ $# -eq 3 ]; then
        RET=`/usr/bin/socat TCP4-LISTEN:$1,reuseaddr,fork TCP4:$2:$3 >/dev/null 2>&1 &`
        echo "$2:$3->$1"
elif [ $# -eq 2 ]; then
        RET=`/usr/bin/socat TCP4-LISTEN:$1,reuseaddr,fork TCP4:$2:$1 >/dev/null 2>&1 &`
        echo "$2:$1->$1"
else
        echo args error
fi

chmod 755 /home/pi/bin/so

关于xmsg

技术面前人人平等.同时技术也不分高低贵贱.正所谓学无大小,达者为尊.
此条目发表在经验技术分类目录,贴了, , 标签。将固定链接加入收藏夹。