讓樹莓派“說”出自己的IP位址,
樹莓派實驗室之前已經介紹了多種方法,來獲得樹莓派的IP位址。有的利用區域網路工具或登入路由器查詢、有的通過OLED小螢幕自動顯示、還有的利用DDNS做域名解析。下面我們再來多介紹一種,讓樹莓派在啟動之後“說”出自己的IP位址。
這裡用到了下面這些東西:
樹莓派主機闆
USB 聲霸卡
音箱或耳機一副
mplayer 播放器
數字語音包,含一組錄制好了的 MP3 音頻
Python 主程式
注意,USB聲霸卡不是必須的,但因無法忍受樹莓派闆載3.5MM的電流聲,這裡加裝了一個USB聲霸卡。軟體部分是在 GitHub @ma6174 的開源項目基礎上修改而來。
https://github.com/spoonysonny/speak_raspi_ip
一、下載下傳主程式和軟體
運作下面的指令。
cd ~
sudo git clone https://github.com/spoonysonny/speak_raspi_ip.git
sudo apt-get install mplayer
sudo apt-get install -y mpg123
二、設定輸出聲霸卡
如果你使用樹莓派闆載的聲霸卡,那麼可以跳過這一步。下面的介紹用于在使用其他聲霸卡的情況下參考(以USB聲霸卡為例)。
筆者所用的這個USB聲霸卡免驅,即插即用。是以直接進行切換聲霸卡的設定就行。
運作 alsamixer 指令進入 alsamixer 畫面。
按 F2 檢視系統資訊,選擇 /proc/asound/cards 檢視可用的聲霸卡裝置。
可以看到裝置名和對應的編号,記下USB聲霸卡的編号(為1)下面會用到。
alsamixer 的其他功能如果有興趣可以順便試試,這裡暫不深入。如果隻需要列出聲霸卡資訊,還可以使用 aplay -l 指令。
編輯檔案 /etc/asound.conf。
sudo nano /etc/asound.conf
填入如下内容,請先確定這個檔案之前是空白的再填入:
pcm.!default {
type hw card 1
}
ctl.!default {
type hw card 1
}
上面的數字 1 代表聲霸卡的裝置編号。
按下 Ctrl+O 儲存,按下 Ctrl+X 退出。并重新開機系統。
sudo reboot
三、測試運作
首先需要确認一下聲霸卡和 mplayer 是否正常工作。
cd ~/speak_raspi_ip
sudo mplayer voice/1.mp3
如果順利的話,接上音箱會聽到報數“一”。
下面就可以測試主程式了。
sudo python speak_ip.py
現在樹莓派應該會“說”出IP位址。
四、設定開機運作
編輯 rc.local 檔案。
sudo nano /etc/rc.local
在 exit 0 之前添加一行:
sudo /usr/bin/python /home/pi/speak_raspi_ip/speak_ip.py &
按下 Ctrl+O 儲存,按下 Ctrl+X 退出。
完成之後,下次重新開機的時候就可以聽到樹莓派的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 = ["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 = "over".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("dot")
else:
play(i)
play("over")
if __name__ == '__main__':
count = 0
while True:
ip = getLocalIP()
print ip
if ip == False:
play("fetching")
else:
count += 1
speak(ip)
if count == 10:
break
time.sleep(1)
文章标題:讓樹莓派“說”出自己的IP位址 - 樹莓派實驗室
固定連結:https://shumeipai.nxez.com/2019/05/29/make-the-raspberry-pi-speak-its-own-ip-address.html