gpt4 book ai didi

linux - 从收到的 TCP 数据包中打开带有 CEC 的 AMP

转载 作者:可可西里 更新时间:2023-11-01 02:54:29 25 4
gpt4 key购买 nike

首先,我有一个可行的解决方案,但它很容易失败。

我想从 Logitech Squeeze Center 打开我的放大器。

  • 服务器在 192.168.0.30 上运行
  • 玩家在 192.168.0.31 上运行的餐厅
  • 播放器通过 HDMI 连接到放大器

我已经能够从播放器向放大器发送 CEC 命令以将其打开。

我进一步开发了解决方案(在来自网络的代码片段的帮助下),以便在按下电源按钮时,SqueezeCenter 中的界面向播放器发送 TCP 数据包,播放器运行 bash 脚本并在turn 向 AMP 发送 CEC 命令 - 打开它。

Power button for the player

当相关玩家的电源按钮被按下时发送数据包的 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。

最佳答案

我决定改变我的方法,让服务器通过 SSH 连接到播放器并运行相关脚本。

初步测试表明这比 netcat 更可靠。我无法使用 key 授权,所以不得不在脚本中输入密码。

Perl 脚本:

package Plugins::PowerMonitor::Plugin;

use strict;
use warnings;

use IO::Socket;

use Slim::Utils::Log;
use Slim::Control::Request;

use Net::SSH::Any;

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 $host = "192.168.0.31";

my $user = "pi";
my $pass = "myPassword";

my $ssh = Net::SSH::Any->new($host, user => $user, password => $pass);

if ($ssh->error) {
$log->error("whee...something wrong here: " . $ssh->error);
}
else {
my @out = $ssh->capture('nohup /home/pi/ampOn > foo.out 2> foo.err < /dev/null &');
$log->debug("@out");
}

}

修改后的 bash 脚本:

#!/bin/bash

if [ ! -f /tmp/ampIsOn ]
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
touch /tmp/ampIsOn
fi

else
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
rm /tmp/ampIsOn
fi
fi

如果有人有更好的解决方案或提示,我不会标记为正确。

关于linux - 从收到的 TCP 数据包中打开带有 CEC 的 AMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25545371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com