动态获取家中服务器的外网ip地址
背景:由于在家搭建了一个深度学习服务器。不在家时也想获取家中服务器的地址,家里的服务器DMZ主机设置与端口转发都完成后。由于ip是动态变化的,所以想实现ip变化之后发送到自己的邮箱中,网上已经有很多解决方案了,但是顺带想学下mtqq协议,这次就没有用网上的解决方案。
MTQQ协议的介绍在这:http://dataguild.org/?p=6817
在网上随便找了下公开的免费brocker
https://github.com/mqtt/mqtt.github.io/wiki/public_brokers
于是看中broker.bevywise.com拥有私密加密连接,于是选择了它。照常的注册登陆之后。
打开界面看到这样的感觉,还不错。
Step 1 生成一个密码对供发布者使用
image.png生成钥匙对之后。这里的key跟token就是设备使用的用户名与密码
Step2 进入help界面下载例子
image.png我家中的服务器是linux的,所以下载了linux版本
vi 进入文件之后修改了这两个地方,填入了刚刚生成的key与token
image.png
Step 3 测试
python MQTTClient.py
执行一下
然后他就自动的隔三秒钟发送了一次心跳连接
image.png
此时网页上Devie界面的状态是active
image.png
当我退出执行的程序之后device就消失不见了,状态变成了停止
Step 4 在家中服务器上获取外部ip并发送至brocker
主要使用了ipgetter这个库,在bash里测试一下
python
import ipgetter
print(ipgetter.myip())
获取到了自己的外网ip,那么接下来就是把这个信息在它变化的时候发送出去
image.png
主要做了以下变更:1。注释了订阅者 2.执行脚本时一定先发送一条消息
3.当循环时ip变化了就发送新的ip到服务器,4.增加sleep的时间
好了,测试一下,服务器上应该会出现当前的ip
image.png
嗯 出现了
之后就是设置在后台无限执行了,先注释掉
#raw_input("********->\tPlease see if your confs are correct and Press Enter to connect\t<-*******")
这一行
然后执行 nohup python /home/femi/MQTTClientLinux/MQTTClient.py &
然后用
ps -ef |grep MQTTClient.py
看一看是否执行了
看了下确实一直在执行了
Step 5 更进一步,在脚本被停止的时候重新启动。
新建一个脚本 moniter.sh
# ! /bin/sh
basepath=$(cd `dirname $0`; pwd)
while true
do
procnum=`ps -ef|grep "MQTTClient.py"|grep -v grep|wc -l`
if [ $procnum -eq 0 ]
then
nohup python MQTTClientLinux/MQTTClient.py &
echo `date +%Y-%m-%d` `date +%H:%M:%S` "restart MQTTClient.py服务" >>$basepath/shell.log
fi
sleep 5
done
然后测试一下执行
sudo chmod +x moniter.sh nohup ./moniter.sh &
然后查询下原来的MQTTClient.py进程
看到pid是16456,那么
kill 16456
一下测试结果
看到变化了。证明脚本运行正常。并在
cat shell.log
中看到了一条日志记录
Step 6 设置监控脚本开机自动启动
有很多种方法,我用的修改 vi /etc/rc.local
的方法,在文件打开后在exit 0 的前面添加脚本的绝对路径nohup sh /home/femi/moniter.sh &
放到后台运行
Step 7 远程开机
由于自己家里有一部备用安卓手机,给服务器设置好了wake on lan之后找到了一款开机神器app,远程开机棒,进入之后设置一会就可以实现了qq发送消息自动开机。厉害了
Step 补充
现在家中的服务器就一直发送自己的ip到服务器上了。不知道家里服务器地址的时候上平台调查下就好了。当然你也可以自己写个脚本订阅消息。