|  |  | 
通过音频接口让树莓派播报自己IP地址
前言
很多玩树莓派的朋友都问牛人技术,树莓派每次启动或者更改了网络环境都不知道IP地址是多少?而如果通过树莓派的HDMI连接显示器又特别麻烦,下面列举以下各种获取树莓派IP地址的常见方法;
1)传统的通过HDMI方式连接外接显示器,来查看IP地址。
2)每次开机后都自动检测IP地址,并把地址通过邮件发送出去。
3)登录浏览器去找树莓派的IP地址。
4)设置成固定IP地址,每次开机后都使用这个固定IP地址。
5)在WIN系统下进行网段扫描,去发现树莓派的IP地址。
上面有那么多方法,那么有没有一种办法让树莓派每次开机后都通过音频接口来播报自己的IP地址了,答案是肯定的。那就是通过树莓派的音频接口自动播报的方式,这样每次树莓派启动后只需通过接上耳机就能知道树莓派的IP地址了。
音频接口播放IP地址的原理
首先我们要通过ifconfig这种命令行的方式获取到树莓的IP地址,然后了去网上下载一批0~9数字的音频发音然后在程序里将其对应起来。
最后在通过树莓派的音频播放器按每次获得的IP数字的循序播放即可!这里的播放器可以采用omxplayer进行播放。最关键的是让树莓派要每次开机的时候都要自动执行,否则不能播报IP地址。
运行脚本代码
通过LINUX的SHELL脚本来安装mpg123音频播放器等
#!/bin/bash
sudo git clone https://github.com/lazydao/speak_raspi_ip.git
sudo apt-get install -y mpg123
sudo rm -rf /var/speak_raspi_ip/
sudo mv speak_raspi_ip /var/
echo "/usr/bin/python /var/speak_raspi_ip/speak_ip.py &" | sudo tee -a /etc/rc.local
echo "install finished!"
 
播报IP地址的PYTHON代码
这里采用PYTHON来控制播放器来播报IP地址。
#!/usr/bin/env python
# coding=utf-8
import os
import sys
import time
import socket
import subprocess
voice_path = os.path.join(sys.path[0], 'voice')
player = ["omxplayer", "mpg123", "mpg321", "mplayer"]
def getLocalIP():
    ip = None
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('114.114.114.114', 0))
        ip = s.getsockname()[0]
    except:
        name = socket.gethostname()
        ip = socket.gethostbyname(name)
    if ip.startswith("127."):
        cmd = '''/sbin/ifconfig | grep "inet " | cut -d: -f2 | awk '{print $1}' | grep -v "^127."'''
        a = subprocess.Popen(
            cmd,
            shell=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE)
        a.wait()
        out = a.communicate()
        ip = out[0].strip().split("\n")  # 所有的列表
        if len(ip) == 1 and ip[0] == "" or len(ip) == 0:
            return False
        ip = "完".join(ip)
    return ip
def getFilePath(filename):
    return os.path.join(voice_path, "%s.mp3" % filename)
def play(voice):
    for i in player:
        cmd = "%s %s" % (i, getFilePath(voice))
        a = subprocess.Popen(
            cmd,
            shell=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE)
        a.wait()
        if a.returncode == 0:
            break
def speak(ip):
    for i in ip:
        if i == ".":
            play("点")
        else:
            play(i)
    play("完")
if __name__ == '__main__':
    count = 0
    while True:
        ip = getLocalIP()
        print ip
        if ip == False:
            play("正在获取网络地址")
        else:
            count += 1
            speak(ip)
        if count == 10:
            break
        time.sleep(1)
 
 
		