Raspberry Pi WiFi无线电脚本问题

时间:2014-08-21 23:43:38

标签: python raspberry-pi pandora

我遇到了问题,因为我对Python并不是很了解,我会感谢别人的帮助,帮助我理解我的问题。

我正在建造便携式无线电台。 Raspberry Pi利用Pianobar前往Pandora服务器,登录我的帐户,获取我的电台,然后开始播放第一个。

我正在关注Adafruit官方指南:https://learn.adafruit.com/pi-wifi-radio/overview

我一直跟着指南一直到Pianobar工作。我可以从命令行运行“pianobar”。它可以在不到10秒的时间内连接并开始播放音乐。

但是,当我启动允许16x2 LCD键盘与pianobar连接的脚本时,它不起作用。

更具体地说,它通过了脚本的前半部分。液晶显示屏显示IP地址并显示“检索电台列表...”。 10秒后,脚本会退出所有这些。

pi@pandora ~/Python-WiFi-Radio $ sudo python PiPhi.py

Spawning pianobar...
Receiving station list...
Traceback (most recent call last):
  File "PiPhi.py", line 288, in <module>
    stationList, stationIDs = getStations()
  File "PiPhi.py", line 190, in getStations
    pianobar.expect('Select station: ', timeout=10)
  File "/usr/local/lib/python2.7/dist-packages/pexpect.py", line 1311, in expect
    return self.expect_list(compiled_pattern_list, timeout, searchwindowsize)
  File "/usr/local/lib/python2.7/dist-packages/pexpect.py", line 1325, in expect_list
    return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize)
  File "/usr/local/lib/python2.7/dist-packages/pexpect.py", line 1409, in expect_loop
    raise TIMEOUT (str(e) + '\n' + str(self))
pexpect.TIMEOUT: Timeout exceeded in read_nonblocking().
<pexpect.spawn object at 0xb6b305b0>
version: 2.3 ($Revision: 399 $)
command: /usr/bin/sudo
args: ['/usr/bin/sudo', '-u', 'pi', 'pianobar']
searcher: searcher_re:
    0: re.compile("Select station: ")
TIME: -03:35/03:43
TIME: -03:35/03:43
after: <class 'pexpect.TIMEOUT'>
match: None
match_index: None
exitstatus: None
flag_eof: False
pid: 2315
child_fd: 5
closed: False
timeout: 30
delimiter: <class 'pexpect.EOF'>
logfile: None
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1

pi@pandora ~/Python-WiFi-Radio $ 

http://pastebin.com/6Lm3dTwx - 这是我试图跑的脚本

从我的基本知识来看,它看起来比检索电台列表的超时时间更长。因为我完全迷失了,请帮助我。谢谢!

4 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,对于低技术修复,我只是在启动脚本中将谷歌搞砸了10次。这使系统足够长,可以使网络连接稳定。

答案 1 :(得分:0)

我发现用户ID“pi”在PiPhi.py中是硬编码的!更改 第33行(PICKLEFILE),286(pepect.spawn('sudo -u pi ... 解决了我的问题..

希望这会有所帮助..

答案 2 :(得分:0)

这里可能存在两个问题。我很难产生这个过程。这在pianobar.excect中显示为EOF错误,用于&#39;获取电台...确定。\ r \ n&#39;。要查看发生了什么,请处理EOF异常并打印pianobar.before:

&#13;
&#13;
# Launch pianobar as pi user (to use same config data, etc.) in background:
print('Spawning pianobar...')
pianobar = pexpect.spawn('sudo -u pi /home/pi/pianobar/pianobar', timeout=60)
print('Receiving station list...')
expectIdx = pianobar.expect(['Get stations... Ok.\r\n', pexpect.EOF, pexpect.TIMEOUT])
if expectIdx == 0:
    stationList, stationIDs = getStations()
    try:    # Use station name from last session
        stationNum = stationList.index(defaultStation)
    except: # Use first station in list
        stationNum = 0
    print 'Selecting station ' + stationIDs[stationNum]
    pianobar.sendline(stationIDs[stationNum])
elif expectIdx == 1: # EOF
    print 'pianobar.expect EOF error'
    print pianobar.before # shows response from pianobar spawn
    pianobar.kill(0)
elif expectIdx == 2: # TIMEOUT
    print 'pianobar.expect TIMEOUT error'
    pianobar.kill(0)
&#13;
&#13;
&#13;

我通过指定pianobar的完整路径来修复我的问题(如上所示)。

第二个问题可能是因为您在pianobar配置中有一个有效的默认工作站。如果是这种情况,启动时不会显示选择站列表,您需要请求它。此错误显示在getStations()中的pianobar.expect上。如果初始请求超时,我通过请求站列表来修复此问题:

&#13;
&#13;
    expectIdx = pianobar.expect(['Select station: ', pexpect.EOF, pexpect.TIMEOUT], timeout=10)
    if expectIdx == 1: # EOF
        print 'pianobar.expect EOF error at getStations'
        print pianobar.before # shows response from pianobar spawn
        pianobar.kill(0)
    elif expectIdx == 2: # TIMEOUT
        # try requesting the station list
        pianobar.send('s')
        pianobar.expect('Select station', timeout=10)
&#13;
&#13;
&#13;   

答案 3 :(得分:0)

我知道这已经过时了,但我刚刚遇到了这个问题。我发现发出以下命令:

pianobar.send('s')

之前

pianobar.expect('Select station: ', timeout=20)

强制pianobar更新电台列表