水字数, 此处可略过
在学校偶尔会用ssh登陆树莓派, 由于学校网络环境比较特殊, 不能用树莓派的主机名连接. 于是乎,在过去的日子里, 每次用到树莓派的时候, 我都要打开显示器,查看树莓派ip,然后关掉显示器, 再用笔记本远程登陆树莓派. 天下苦IP久矣, 难道就没有办法让树莓派自动告诉我IP吗? 诶,上网一查,果然已经有前辈提出了解决办法.归纳起来,大概有如下几种:
- 树莓派上插一块LCD显示屏,用硬件的办法来解决. (手头没有LCD,果断放弃)
- 写脚本让树莓派自动发ip到服务器,再从服务器上查看. (emmm,感觉也没便利多少, 再说我要是有服务器,谁还用树莓派啊)
- 写脚本让树莓派自动发邮件. (感觉挺好,也很方便,要不是想到了接下来要谈的方法,我就采用这个了)
浅谈原理
众所皆知, 伟大的钉钉为我们提供了一个开放性的群机器人, 开发者可以通过调用钉钉提供的接口将消息转发到群里. 在树莓派开机的时候,用程序读一下IP地址,然后转发到钉钉群, 岂不是实现了ip的自动获取?
说干就干
-
第一步,开通一个钉钉群机器人,实现消息的推送(自己用小号建一个群,或者找一个无关紧要的群)
- 打开钉钉,选择机器人助手,添加自定义机器人
-
对机器人进行简单的配置,具体参照
在这里,我选择的安全设置为"加签",关键词为"树莓派"
-
编写代码, 调用钉钉api发消息到群里
#/home/pi/Whenstart/dingTalk.py import requests #pip install requests import json #pip install simplejson def dingTalk(data): headers={"Content-Type": "application/json"} json_data=json.dumps(data) requests.post(url=\'https://oapi.dingtalk.com/robot/send?access_token=\',data=json_data,headers=headers) #这里的url要改成你自己的钉钉机器人对于的access_token data={"msgtype": "text", "text": { "content": "树莓派:xxxxxxxx" #这里为发到群里的消息内容,如果机器人的安全设置为加签,则消息内容里一定要包含关键词 }, "at":{ "atMobiles": ["17300741128"], "isAtAll": False } } dingTalk(data)
这里为了方便起见,采用的编程语言为python, 其他语言理论上也可,具体参见钉钉官方文档. 到这一步, 我们实现了往钉钉群推送消息,接下来需要实现读取树莓派ip以及开机自启python脚本
-
编写代码, 读取树莓派ip并将ip发送到钉钉群
#/home/pi/Whenstart/ip.py import socket,os,fcntl,struct import time from send_email import mySendEmail from dingTalk import dingTalk def get_ip_address(ifname): s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) return socket.inet_ntoa(fcntl.ioctl( s.fileno(), 0x8915, struct.pack(b\'256s\',b\'wlan0\') )[20:24]) content = "树莓派:\n"+\ "开机时间:"+time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+"\n"+\ "开机时IP:"+get_ip_address("wlan0") data={"msgtype": "text", "text": { "content": content }, "at":{ "atMobiles": ["17300741128"], "isAtAll": False } } dingTalk(data)
运行python3 ip.py就可以将树莓派的ip发送到钉钉群
-
在树莓派中将ip.py设置为开机自启
建立sh脚本
#/home/pi/Whenstart/send_ip.sh #来检查树莓派是否已经自动联网,树莓派不自动联网是无法实现发送ip的 while true do TIMEOUT=5 SITE_TO_CHECK="www.baidu.com" RET_CODE=`curl -I -s --connect-timeout $TIMEOUT $SITE_TO_CHECK -w %{http_code} | tail -n1` if [ "x$RET_CODE" = "x200" ]; then echo "Network OK, will send mail..." break else echo "Network not ready, wait..." sleep 1s fi done python3 /home/pi/Whenstart/ip.py | echo "ip has been send" #这里文件目录最好使用相对根目录的绝对路径,否则可能出错,因为树莓派启动时是以root身份运行的 exit 0
可以在终端中调用sh脚本测试是否生效, 如果生效, 接下来就是开启自启服务,在终端中输入如下命令:
cd /etc/systemd/system sudo touch send_ip.service #创建send_ip服务 sudo vi send_ip.service #编辑send_ip.service的内容 sudo chmod 664 send_ip.servie #赋予权限 sudo systemctl daemon-reload #重新加载服务 sudo systemctl enable send_ip.service #开启发送send_ip服务,只用\'使能\'一次,以后开机时会自动开启服务
send_ip.service的内容如下:
[Unit] Description=cwy_when_start [Service] ExecStart=/bin/sh /home/pi/Whenstart/send_ip.sh [Install] WantedBy=multi-user.target
见证奇迹的时刻
使用sudo reboot
重启树莓派, 发现树莓派已将ip发送到钉钉群.Nice