- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
首先,我有一个可行的解决方案,但它很容易失败。
我想从 Logitech Squeeze Center 打开我的放大器。
我已经能够从播放器向放大器发送 CEC 命令以将其打开。
我进一步开发了解决方案(在来自网络的代码片段的帮助下),以便在按下电源按钮时,SqueezeCenter 中的界面向播放器发送 TCP 数据包,播放器运行 bash 脚本并在turn 向 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。
最佳答案
我决定改变我的方法,让服务器通过 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/
我有一个静态类。 static class AppDirectory { public static string PACSTEMP = Path.Combine(Path.GetTempPa
我已经设置了一个启用了推送通知的 iOS 应用。 我可以将消息推送到应用程序,例如角标(Badge)计数工作并相应更新。 但我从未在锁屏或其他地方看到标准的推送通知弹出窗口,但手机会振动,因此消息会通
我们有一个带有 Web 应用程序和一堆 Windows 服务的系统,它们在做一些后台工作。 每当我们需要对系统进行更实质性的更改时,我们最终不得不发出 IIS 重置,然后手动重新启动所有相关的 Win
我有以下几行 John SMith: A Pedro Smith: B Jonathan B: A John B: B Luis Diaz: A Scarlet Diaz: B 我需要获得所有获得
我正在编写一个 Java 客户端(在 weblogic 10.3 上)来调用一个安全的网络服务。我已获得安装在 cacerts、DemoIdentity.jks 和 DemoTrust,jks 中的客
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
我正在尝试调用void方法addToList,该方法将通过用户传递给它的两个字符串除外。我检查了dataSource类,以确保它确实接受了那些作为参数。问题是我在该方法调用上始终收到标识符>预期错误,
我的任务:使用scanner方法从一行数据中提取字符串、 float 和整数。 数据格式为: Random String, 240.5 51603 Another String, 41.6 59087
这个问题已经有答案了: What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it? (25 个回答)
首先我实例化一个游戏状态 class GameState extends state{ ArrayList levels; int currentLevelID; public GameState()
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我有一个实现为单例的 Controller 对象,它有一个可以随时驱逐对象的缓存。当一个对象即将被删除时,我想通知任何使用此 Controller 的类,以便它们能够做出适当的响应。我对这种行为的第一
因此,我尝试跨集群发送消息,该消息将包含一个 User 对象,该对象是一个可序列化类。 当我发送 String 或 int 时,它工作正常,消息发送没有问题,并且集群上的所有 channel 都收到它
我试图创建的程序是一个基本游戏,用户输入网格大小,选择 block 接收增加分数的奖品、从分数中夺走分数的强盗或结束游戏的炸弹。我收到堆栈流错误,但我不明白为什么? 抱歉,代码量很大,我只是无法找到问
使用此代码我会得到什么ConcurrentModificationException?我有一个同步(监听器)锁。 private void notifyListeners(MediumRenditio
我想在捕获 DeadlineExceededError 后正确退出。我还剩下多少钱来清理? 例如, try: do_some_work() except DeadlineExceededError
我有 2 个 Intranet 站点: http://intranetv1/ http://intranetv2/ v1基于.NET 1.1,v2基于.NET 3.5 在 v1 上,我创建了一个网页,
我有一个在 Linux 3.12 上运行的 C 程序。该程序产生几个子进程。其中一个进程会生成一个线程,该线程运行一段时间然后终止。当该子进程运行时,它会执行 epoll_wait()。 epoll_
我能够将 APNS 集成到我的应用程序中。现在我想在用户点击它或用户在使用应用程序时收到通知时处理通知。我使用下面的代码在收到通知时显示警报对话框: func application(applicat
当我试图在浏览器上运行这段代码时,出现了以下错误。"错误响应错误代码:501消息:不支持的方法(“POST”)。错误码解释:501-服务器不支持该操作。" 浏览器控制台出现以下错误: "1.加载资源失
我是一名优秀的程序员,十分优秀!