树莓派开机发送ip到钉钉群

时间:2024-03-07 16:21:22

水字数, 此处可略过

在学校偶尔会用ssh登陆树莓派, 由于学校网络环境比较特殊, 不能用树莓派的主机名连接. 于是乎,在过去的日子里, 每次用到树莓派的时候, 我都要打开显示器,查看树莓派ip,然后关掉显示器, 再用笔记本远程登陆树莓派. 天下苦IP久矣, 难道就没有办法让树莓派自动告诉我IP吗? 诶,上网一查,果然已经有前辈提出了解决办法.归纳起来,大概有如下几种:

  1. 树莓派上插一块LCD显示屏,用硬件的办法来解决. (手头没有LCD,果断放弃)
  2. 写脚本让树莓派自动发ip到服务器,再从服务器上查看. (emmm,感觉也没便利多少, 再说我要是有服务器,谁还用树莓派啊)
  3. 写脚本让树莓派自动发邮件. (感觉挺好,也很方便,要不是想到了接下来要谈的方法,我就采用这个了)

浅谈原理

众所皆知, 伟大的钉钉为我们提供了一个开放性的群机器人, 开发者可以通过调用钉钉提供的接口将消息转发到群里. 在树莓派开机的时候,用程序读一下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