首先,我有一个可行的解决方案,但它容易失败。
我想从 Logitech Squeeze Center 打开我的放大器。
- 服务器在 192.168.0.30 上运行
- 玩家在 192.168.0.31 上运行的餐厅中
- 播放器通过 HDMI 连接到放大器
我已经能够从播放器向 Amp 发送 CEC 命令以将其打开。
我进一步开发了解决方案(借助来自网络的代码片段),以便 SqueezeCenter 中的界面在按下电源按钮时向播放器发送一个 TCP 数据包,播放器运行一个 bash 脚本,然后发送一个向 AMP 发送 CEC 命令 - 将其打开。
当按下相关播放器电源按钮时发送数据包的 Perl 插件注意我已将其设置为仅将数据包发送到特定的餐厅播放器 - 但我希望将来能找到具有其电源的播放器的 IP按下按钮并向其发送数据包。
package Plugins::PowerMonitor::Plugin;
use strict;
use IO::Socket;
use Slim::Utils::Log;
use Slim::Control::Request;
my $log = Slim::Utils::Log->addLogCategory(
{ category => 'plugin.powerMonitor',
defaultLevel => 'ERROR',
description => getDisplayName(),
}
);
sub getFunctions {
return '';
}
sub getDisplayName {
return 'PLUGIN_POWER_MONITOR';
}
sub initPlugin {
$log->debug("initPlugin");
# Subscribe to power events
Slim::Control::Request::subscribe( \&powerCallback, [ ['power'] ] );
}
sub shutdownPlugin {
$log->debug("shutdownPlugin");
Slim::Control::Request::unsubscribe( \&powerCallback );
}
sub powerCallback {
$log->debug("powerCallback");
my $request = shift;
my $client = $request->client() || return;
my $sock = IO::Socket::INET->new(
Proto => 'tcp',
PeerPort => 6500,
PeerAddr => '192.168.0.31',
);
if ( !$sock ) {
$log->error("Could not create socket: $!");
return;
}
my $msg = $client->id() . ':' . $client->name() . ':' . $client->power() . $/;
$log->debug($msg);
my $rc = $sock->send($msg);
if ( !$rc ) {
$log->error("Send error: $!");
}
}
播放器上的 Bash 脚本 - 它作为播放器上的守护程序在端口 6500 上侦听数据包:
#!/bin/bash
netcat -lk 6500 | while read line
do
if echo $line | grep -q 'Dining_Room:1'
then
powerStatus=$(echo "pow 5" | cec-client -s -d 1 |grep "power status" |cut -d ' ' -f 3)
if [ "$powerStatus" = "standby" ]; then
echo "Powering On Amp....."
echo "on 5" | cec-client -s -d 1
fi
elif echo $line | grep -q 'Dining_Room:0'
then
powerStatus=$(echo "pow 5" | cec-client -s -d 1 |grep "power status" |cut -d ' ' -f 3)
if [ "$powerStatus" = "on" ]; then
echo "Powering Off Amp....."
echo "standby 5" | cec-client -s -d 1
fi
fi
done
一个非常复杂的设置,但这是我在 Squeezebox 的 Perl 插件方面必须使用的。
我想知道是否有更稳定的方法来执行此操作,那会是什么-我可以调整当前设置以使其更稳定-我可以更改 Perl 脚本以在播放器上写入文件而不是发送数据包并使用 netcat (这个接缝是它破坏的地方)
我不知道 Perl,但非常精通 Linux 和 bash 脚本
2014 年 8 月 29 日更新: 关于发送到播放器 IP 的主题,它看起来像是实例化了一个 $client 并且有一个名称方法 - 我想知道那里还有什么可用的 - 伙计,我希望我知道 Perl .