Linux-和树莓派智能家庭自动化教程-全-

Linux 和树莓派智能家庭自动化教程(全)

原文:Smart Home Automation with Linux and Raspberry Pi

协议:CC BY-NC-SA 4.0

一、电器控制:让东西做事情

Abstract

对于大多数人来说,家庭自动化始于并止于电器控制原理。当任何家用设备(如视频或电视)由除其前面板上的按钮或其原始遥控器之外的东西控制时,它被认为有点神奇,是进一步研究的主题,特别是如果控制是远程进行的。电灯和烤面包机不需要由墙上的开关控制,你的电视也不需要从 PVR、DVD 播放器或卫星接收器接收信号。每个设备都有自己的特性和控制方法,并且每个设备都有特定的功能,这些功能不容易被抽象成任何通用形式的控制接口。但是,可以使用两种基本方法中的一种来控制其中的大多数:

对于大多数人来说,家庭自动化始于并止于电器控制原理。当任何家用设备(如视频或电视)由除其前面板上的按钮或其原始遥控器之外的东西控制时,它被认为有点神奇,是进一步研究的主题,特别是如果控制是远程进行的。电灯和烤面包机不需要由墙上的开关控制,你的电视也不需要从 PVR、DVD 播放器或卫星接收器接收信号。每个设备都有自己的特性和控制方法,并且每个设备都有特定的功能,这些功能不容易被抽象成任何通用形式的控制接口。但是,可以使用两种基本方法中的一种来控制其中的大多数:

  • 电源线供电控制(灯泡、烤面包机、电茶壶)
  • 红外(IR)遥控器(电视、视频)

虽然现代机顶盒的背面可能有串行、USB 或网络插座,但这些是对前两种方法的补充,并不排斥它们。因此,能够控制 IR 信号和电源线涵盖了现代家庭中的大多数设备。如果你知道如何控制电源,即使是相对简单的电器,如茶壶,也可以远程控制,因为它们的建造并没有任何被其他方式控制的意图。毕竟,如果你确保茶壶装满水并插入墙壁开关插座,茶壶本身也打开了,那么开始烧水的唯一必要任务就是轻触墙壁插座上的开关——这可以通过电源控制来控制。我将首先介绍这些控制电源的方法。

X10

X10 是我将介绍的方法之一,它允许你远程控制任何插入家中标准环形电源的设备的电源。灯、电茶壶和烤面包机都是这类现有设备的例子。此外,我将介绍最初发明的由 X10 控制的设备,如电动窗帘轨道。X10 通过相当便宜和非常容易安装实现了市场渗透。

关于 X10

X10 是一种控制协议,它沿着主电源线发送数据包,并带有诸如“打开设备”或“调暗至 50%”的消息数据包通过计算机接口或定制遥控器等发射器应用于电力线,然后由一个简单得多的接收设备(如灯开关)进行处理,进而控制本地设备的电源。

X10 的工作原理是将数据编码成高频脉冲串(120KHz),并将其添加到现有的电力线上。因为所有国家的市电不是 50Hz 就是 60Hz(其中日本和大溪地两个都用!),这些高频信号通常会被大多数只考虑功耗的器件丢失。另一方面,可以将一种特殊的设备插入对高频脉冲感兴趣的电力线。因此,每当电压从正变到负时,就可以识别出一个二进制数字,反之亦然。

Caution

有几种基于这一原理的设备,大多数 DIY 商店都有自己的变体。但是,如果它们不包含 X10 标志,则它们与 X10 不兼容,因为它们的协议不同。它们也可能相互冲突。

X10 控制的每个设备都必须有一个地址。这个地址由两部分组成:房屋代码和单位代码。房屋代码只是一个字母,从 A 到 P,应该是你的房子所独有的。显然,只有 16 个字母可供选择,房屋代码不会对世界上的每所房子都是唯一的,但它应该对任何与你共用直接电源的房产都是唯一的。这通常包括你的邻居,偶尔也包括两三个门外的房产,因为你所有的电线都汇聚在道路下更大的管道中。因此,任何共享这些线路的房子也将共享 X10 消息,这使得控制你邻居的电器以及(或代替)你自己的电器成为可能。目前,很少有人参与家庭自动化(尤其是 X10)来解决这个实际问题。现在,你可以在电表和家里其他电源之间安装一个过滤器,让自己安心一些。这通常被称为全屋滤波器,有几种品牌和型号,如 PZZ01,允许 200A 的电流。很自然地,考虑到所涉及的电流水平(以及某些国家的法律),许多人雇佣合格的电工来安装这样的设备。

地址的第二部分是单元代码,共有 16 个单元代码,由 0 到 f 之间的十六进制数字表示。虽然这看起来不是很多,但 16 个设备允许您在中等大小的四居室房子的每个房间中拥有两个设备(一个灯和另一个)。大多数房间只有一盏灯,而电视和收音机等电器更有可能通过红外线甚至以太网进行有效控制。

除了地址之外,每个 X10 接收器模块都适合两大类中的一种,要么是灯,要么是电器。这是 X10 模块本身存在的差异,决定了它将如何向插入其中的设备供电以及它将接受哪些消息。电器模块只对插入其中的任何东西提供开/关控制,并且通常具有足够高的额定功率来接受大多数家用电器(烤箱除外)。相比之下,灯模块也将响应亮度控制消息,改变施加到插入其中的灯泡的电压。因此,将烤面包机插入灯模块会有问题,并且有潜在的火灾危险。另一方面,将灯添加到电器模块中可以很好地工作,并且只受到失去调光功能的限制。

Note

一些类型的灯(如荧光灯和节能灯泡)通常不能在灯模块上工作,必须与电器模块一起使用。

每个 X10 消息由三部分组成:

  • 开始消息块(1110 的半字节)
  • 地址(房屋代码和/或单位代码)
  • 命令代码(例如,“打开”)

有几种不同的命令,主要分为两组——针对所有设备的房屋代码信息和针对单个设备的单元代码信息。如前所述,每个 X10 模块都被构建为接受或忽略特定的消息,通常根据它是被指定为灯模块还是电器模块;然而,设备模块也将忽略“所有灯打开”的消息,但尊重“所有单元关闭”,这是由区分灯和单元的命令的微妙措辞所暗示的。有趣的是,它们的相反变体(“所有灯关闭”和“所有单元打开”)并不存在。这是故意的。“所有灯都亮着”的意图之一是作为一种安全特征。意外调用“所有单元开启”命令可能会导致茶壶干烧或类似的危险。相反,“所有单元关闭”为房子提供了一个快速关闭程序。

一旦消息被发送出去,其他什么都不会发生。永远!接收方不会生成消息的确认,发送方也不会查询最近控制的设备的状态来确认其到达。这是因为发射电路比接收器更复杂和昂贵,并且因为增加信息设备会增加最简单的灯开关的成本和体积。一些双向开关确实存在,为您提供了一种查询其状态的方法,但它们更昂贵。

然而,为了确保数据的有效性,消息被发送两次,并且两个消息被比较是否相等,因为电力线上的电噪声可能已经破坏了部分信号。因此,接收一条 X10 消息大约需要 0.64 秒。虽然这是礼仪中被接受的一面,但当客人住在你家时,这并不特别友好,因为当他们试图开灯时,灯似乎没有工作...所以他们再次按下开关,这样就关掉了!为了克服这一点,许多设备都有一个直接影响灯光的本地开关,而无需发送 X10 消息。对于 X10 照明开关来说,这是最真实的,它的作用就像普通的墙壁开关,而不是由现有(即普通)照明开关控制的原位 X10 插座。

X10 可能出现的另一个问题是死角,由于某些设备产生的电噪声,所有的消息都可能(有时确实)被吞噬。已知某些 MacBooks 的电源存在此问题。因此,有时需要将 X10 设备移动到不同的插座上才能工作。当电路中有变压器或有分相系统时,X10 信号也会丢失。同样,您可能需要将发射器和接收器移至问题设备的同一侧。

Note

在进行 X10 安装之前,先用几个设备进行试验,以确保房子中有一个位置能够发出 X10 消息,其他绝大多数区域都可以听到。

总体设计

在购买和安装任何设备之前,你必须首先考虑你想要控制什么设备,以及你想要如何控制它们。这个问题的重要部分不是你将使用多少设备,而是如何控制它们。这可以很简单,也可以很复杂。并且根本不需要涉及计算机。

简单案例

在这种情况下,您的设备将由本地开关或一个或多个插入电源的有线控制器控制。有线控制器在这里是必要的,因为你总是需要某种方式将 X10 信号引入电力线。有些有线控制器(SD7233)包括定时电路,因此它们可以在一天中的特定时间自动开灯或关灯——有时在随机的时间框架内,以迷惑潜在的窃贼。这些工作很好,并提供了一个更便宜的替代运行计算机整天,每天。

除了基本的定时器功能,这种设置只能由与控制器进行物理接触的人来控制。这是探索 X10 最便宜的方式,但是设备不能通过网站、电子邮件或手持控制器无线遥控。

如果美学很重要,有一些控制器(例如,TMD4,如图 1-11 所示)将安装在墙上的插座中,允许您使用现有的灯开关来控制多个灯,而无需在茶几上安装类似于《星际迷航》的控制器。然而,这需要购买一个 X10 开关(发送信息)和一个 X10 灯具(响应信息),对于这种简单的设置来说通常是多余的。

标准案例

在前面显示的简单情况之后,下一步是利用无线控制器。市场上的大多数设备使用无线电频率(RF,433MHz),允许从花园、穿过墙壁、穿过地板和穿过天花板来控制设备。精确的范围根据信号传播的材料、在 433MHz 范围内工作的其他设备(如电视发送器或 RFID 阅读器)以及发射器的强度而变化,一些中等价位的设备在无障碍时具有 25 米的范围。

由于 RF 与电力线没有连接,因此它还需要使用 RF-to-X10 网关,该网关可插入墙上的插座,接收任何合适的控制器发送的 RF 信号,并将数据消息发送到 X10 电力线。尽管这种设备有一个可配置的房屋代码,但是它们的单元代码总是被硬编码为一个,所以如果您计划从一个更简单的环境中迁移,一定要避免对任何设备使用这样的代码。

以这种方式采用 RF-to-X10 网关为自动化提供了更大的空间,因为控制器是无线的,不再需要位于电源插座旁边,使它们能够出现在浴室中,而在许多国家,这种插座与水龙头的距离在 1.5 米以内,这违反了国内住房法规,例如在英国。有贴在墙上,坐在桌子上,甚至可以戴在钥匙圈上的射频控制器!

射频遥控的主要问题是很难过滤掉恶意传输, 1 意味着外面的人可能会控制你的车内灯。

全自动

这与标准自动化示例的最大区别是包含了一个计算机接口,通常是 CM11,这将在本章后面介绍,如图 1-14 所示。它没有 X10 地址,但它被动地监控电源线上的信息,并通过串行或 USB 端口将它们传回计算机。类似地,计算机可以使用该设备将新信息传送到电力线上,这些信息将被您已经拥有的设备接收到。一旦有了计算机,可能性就出现了。我将在本章稍后讨论 X10 设备时讨论这些可能性。

完全有可能使用不使用 RF 无线或遭受其问题的计算机实现全自动解决方案。除了射频,您还可以使用更安全的传输和协议,如 HTTPS,通过 iPod touch、iPhone 或其他适当连接的手持设备(如移动电话)上的网络浏览器将信息发送到电脑,电脑再将合适的数据传输到电力线。

分配地址

因为你家里的每一个自动化设备都需要一个地址,所以在这个过程开始的时候给它们分配一个合理的、容易记忆的地址是有意义的。这里要记住的最重要的事情是,你的 X10 配置可以随着你的预算增加而增加,你更有可能在你的房子里增加几个新设备,而不是增加几个新房间!

确定房屋代码非常简单。如果你的一个或多个邻居有 X10 系统,那么选择他们不用的字母。这听起来可能很明显,但你应该和他们谈谈他们是否有一个,以及他们使用什么代码。仅仅因为你目前没有看到任何非理性行为,并不意味着未来不会有冲突。我也会避免使用 P,因为一些设备(例如,TM13UAH)认为 P 是“接受任何房屋代码上的消息”,这可能会造成混乱和问题。我唯一的其他建议是避免 A,这是大多数设备的默认设置。这有两个好处。首先,它确保了任何在附近“玩”X10 设备的人不会无意中闯入你的网络并造成损害。第二点是,通过改变默认设置,你可以确定系统被成功地重新编程,而不是因为一个幸运的巧合而暂时停止工作。

为单元代码生成赋值是你自己判断的事情,但是你不能通过创建一个模式而走得太远。我从 2 开始给我的设备编号,并以逆时针顺序在我家的房间里工作,从楼上开始,到厨房结束。我假设每个房间有两个设备。我的推理和思考过程如下:

  • 从 2 开始,因为 RF-to-X10 网关使用 1。
  • 每个房间两个设备意味着每个房间从 2,4,6,8 开始,以此类推,这很容易记住。
  • 我唯一需要记住数字的时候是在黑暗中摸索遥控器的时候。这是我在床上找电灯开关的时候。因为主卧在楼上,我开始在楼上数数。当我躺在床上时,我面对着房子的其余部分,第二个卧室在我的正前方,第三个在它的左侧,这使得逆时针运动更加自然。
  • 如果楼上和楼下的分离没有发生在单元代码 8 上,我会留下一个间隙,这样它就发生了。
  • 我把休息室/餐厅分成两个逻辑房间,尽管它是一个空间。这意味着我可以在一个空间中放置多达四个设备,这很可能发生在更大的开放式区域中。
  • 随着时间的推移,厨房更有可能获得设备,所以我把它放在列表的最后。

如果您浏览可用控制器的选择,您会注意到大多数都有一个选择器开关,可以将按钮从 1–4 重新分配到 5–8,或者从 1–8 重新分配到 9–16。另一种方法是让第一组(比如 1-4 个)只控制房子里的灯,第二组(5-8 个)用来控制相同房间里的电器,使它在“灯和电器”之间切换,而不是“楼上楼下”。这确保了尽管选择了第一个存储体,但是当你想要控制灯时,不可能意外地关闭电器,反之亦然。

最后要考虑的是您计划使用的控制器模块的物理大小,因为许多模块只支持八个设备。如果您最方便的编号系统碰巧使用设备 9-16,那么您将不得不重新考虑您的模式或只购买更大的控制器。

使用多个房屋代码

一处房产可能有两个或更多的房屋代码,使家用设备的总数达到最多 256 个。这对最大的豪宅来说已经足够了!这种设置的唯一考虑是诸如“所有灯关闭”的控制消息只能应用于单个房屋代码。对于基于计算机的控制,您可以很容易地修改软件,以发送两个(或更多个)“所有单元关闭”类型的消息,这将影响指定房屋代码上的所有设备。然而,如果你选择只使用独立的遥控器,比如你将在本章后面学习的桌面控制器,当你依次关闭每个房子的代码时,这可能需要一些拨弄。在这种情况下,您可能希望将房屋代码划分为一楼、二楼等,并为每一层设置单独的控制器。

设备模块

我现在将介绍市场上可以通过 X10 控制的众多设备,换句话说,就是那些包含接收器的设备。这些分为三类:

  • 内部:X10 接收机和它控制的东西在同一个物理外形中。电动窗帘轨就是一个例子。
  • 本地控制:X10 接收器处理信息,但控制直接接入其中的电源。电灯开关就是一个例子。
  • 插入式模块:这些模块可以插入标准电源插座,外部设备可以插入其中。X10 逻辑决定是否允许电流在它们之间流动。电器单元就是一个例子。

控制灯光

这是迄今为止最常见的设备类型,因此有几种不同的设备可供选择,在 X10 术语中称为灯模块。然而,应该注意的是,一些灯根本不能附接到灯模块。这些包括在大多数厨房里都能找到的荧光照明带和它们的紧凑型荧光灯(通常被称为节能灯泡)现在正在全国各地的家庭中出现。更糟糕的是,这些灯泡还会在电源线上引入尖峰信号,从而关闭附近的 X10 灯。 2

各种灯模块之间的主要功能差异在于所讨论的设备是否支持调光。当光线变暗时,交流电压的幅度不会减小。相反,功率正弦波的一小部分被移除,这有效地短时间关闭灯。因此,灯泡灯丝每秒钟充电和放电的次数比平常多得多,这就产生了一个不断变化的电磁场。这可能导致灯丝开始振动并产生可听见的嗡嗡声。这通常不是灯泡的问题(你总是可以购买粗糙的维修灯泡,使灯丝更加稳定,以防止这种移动),但对于其他不是为它制造的电器来说,这是危险的。

请注意,与 LED、紧凑型荧光灯和卤素灯等更新的替代品相比,许多国家正在逐步淘汰旧的白炽灯泡,因为它们的效率相对较低。

灯模块(LM12U)

这是一件简单的事情,需要零安装。你只需将它插入一个空闲的墙上插座,使用前面的拨号盘设置地址,然后将灯插入前面的插座,如图 1-1 所示。

A978-1-4302-5888-9_1_Fig1_HTML.jpg

图 1-1。

The LM12U lamp module, 122 × 52 × 42mm

这将支持 60 至 300 瓦之间的任何白炽灯,并且可以通过设置为相同房屋代码的任何 X10 控制器来打开和关闭或调暗。LM12U 有一个姐妹设备,AM12U,在同一作品中工作。主要区别在于,AM12U 适用于设备,因此会忽略任何“暗淡”消息。LM12U 还将响应两个特殊消息,“所有灯打开”和“所有单元关闭”,前提是它们使用匹配的房屋代码发送。这个模块,像这里介绍的许多其他模块一样,与电力线串联放置,起到逻辑与门的作用。也就是说,灯的开关和墙上的电源开关都必须打开,X10“打开”消息才能生效。

Note

这里给出的代码是这些设备的英国版本。由于世界各国使用的电源系统略有不同,但差异很大,因此根据您所在的国家,需要不同的备用模块。例如,意大利的 LM12U 被称为 LM12I。

卡口灯模块(LM15EB)

这也是一个简单的零安装设备,但需要更多的配置。要安装它,你把它插到一个现有的灯座上,然后把灯泡(最高 150 瓦)重新插入它的自由端。然而,荧光灯和低能量灯都不应该使用。通过关闭并再次打开灯来设置地址,然后在灯重新打开后的 30 秒内,按下控制器上所需的房屋/单元代码三次,每秒一次。一旦代码被读入,灯就会亮。该设备还有一个拧入版本(LM15ES,ES 代表爱迪生螺丝),尽管它是图 1-2 中所示的卡口版本(LM15EB)。

A978-1-4302-5888-9_1_Fig2_HTML.jpg

图 1-2。

The LM15EB, 45 × 45 × 95mm

LM15EBs 缺乏较大的 LM12U 的调光功能,但因为它们只比传统配件延伸 62 毫米,所以它们足够小,可以隐藏在大多数灯罩内,使房间保持现有的美学品质。

同样,该模块的作用类似于一个与门,仅当 X10“on”命令已发送且灯开关正常打开时,灯才发光。

墙壁开关(LW10U)

正如你从图 1-3 中看到的,这些是标准灯开关的完全替代品,这意味着你只能使用白色塑料。然而,它们很容易安装到现有的嵌入式开关盒中,仅从墙壁伸出 16 毫米。该装置的地址由翘板开关后面的一对拨号盘设定,用螺丝刀轻轻撬开即可访问。然而,应该小心,因为将开关固定在 Shell 上的塑料接线片非常脆弱,在断裂之前只能承受三四次拆卸。

除了通过“开”、“关”、“暗”和“亮”命令进行远程控制之外,还可以通过开关在本地实现相同的功能。触摸它一次会将灯完全打开或关闭,而按住它会使灯变暗(如果它很亮)或变亮(如果它很暗)。唉,当你关掉它然后再打开时,不能保持最后的亮度,你也不能在没有首先使它完全变暗的情况下稍微增加昏暗灯的亮度,但本地控制意味着灯在按下按钮后立即亮起,以便不混淆任何客人。

A978-1-4302-5888-9_1_Fig3_HTML.jpg

图 1-3。

The LW10U, 85 × 85 × 30mm

该设备还响应“所有灯打开”和“所有单元关闭”消息,以匹配房屋代码。

带调光器的微型模块(LWM1)

该模块是 LM10U 的涡轮增压版本,如图 1-4 所示。它的工作方式与 LM10U 相同,但足够小,可以安装在墙壁插座内,允许您使用任何您喜欢的开关面板。

A978-1-4302-5888-9_1_Fig4_HTML.jpg

图 1-4。

The LWM1, 40 × 40 × 15mm

它支持 LM10U 的所有现有功能,但也可以记住最后的亮度设置,允许灯光在第一次打开时平滑地改变,这有助于延长灯泡的寿命。

Note

较便宜的模块在全亮度下打开,所以如果你喜欢情调照明,那么这是一个值得考虑的变体。

此外,这是本产品中少数支持双向 X10 通信的器件之一。这意味着您可以向设备发送消息,询问其当前的亮度状态,并且设备能够回复。这对于大多数其他设备是不可用的,这意味着您(或者更具体地说,您的控制器设备)必须记住它发送的最后一条消息,希望它到达,以便模拟灯状态的查询。如果亮度被局部改变,甚至这个结果也可能是有缺陷的。然而,在大多数情况下,这种功能是不必要的,因为您很少想知道灯是否亮着。如果你要去睡觉,那么你不感兴趣的是灯是否亮着,只关心你是否能关掉它。除非你有一个非常大的房子,否则你通常可以在一个漆黑的房子里看到一盏灯亮着,因此知道你是否需要重新发送“所有单元关闭”的消息。

这种设备的缺点是它的价格大约是 LM10U 的三倍。但是,LW12 中有一款中端产品具有相同的规格,但没有双向通信功能。

DIN 轨道调光器(LD11)

这是一个(非常)高功率模块,能够控制高达 700W 的设备,因此它适用于主卤素以及传统的主照明。该设备不是用来代替开关(如 LWM11)或与灯泡连接(如 LM15EB),而是远程放置在保险丝盒附近,LD11 输出电缆直接进入灯具。这是 LD11 上的一个开关终端,允许设备打开和关闭,就像在本地一样。然而,由于从设备到 LD11 有四条(潜在的)长电缆(两条用于电源,两条用于控制,如图 1-5 所示),其目的并不那么明显。

A978-1-4302-5888-9_1_Fig5_HTML.jpg

图 1-5。

The LD11, 50 × 80 × 70mm

LD11 的主要用途是情绪照明,因为它支持卤素,以及场景照明,因为它具有柔和的调光和记忆功能。因为它们通常被放置在远离设备本身的地方,所以你会得到一个更干净的安装。令人欣慰的是,模块成本的降低抵消了布线成本。

如果您使用 LD11 为照明插座供电,只有灯具必须使用它们,因为调光功能会损坏许多其他类型的电器。为此,你可以为灯具和 LD11 供电插座使用非常规插头和插座。如果你的国家使用方形插头,请使用圆形插头,反之亦然。

家用电器微型模块(AWM2)

此模块使用前缀 A,因为它主要用于控制设备;然而,它的功能也适用于灯光。如图 1-6 所示,AWM2 位于标准墙壁插座内,支持两个开关。一个开关控制本地连接的灯泡(并将等效的 X10 消息发送到电力线),而另一个开关将 X10“开”或“关”消息依次发送到下一个地址。因此,如果您的 AWM2 配置为 E2,您也可以从同一台交换机控制 E3。通过在楼梯的顶部和底部安装两个相同配置的单元,您可以从任何位置控制楼上和楼下的灯,而无需重新布线。因为这是一个内部模块,你可以使用任何开关面对你的选择。但是,请注意,该设备不支持调光。

A978-1-4302-5888-9_1_Fig6_HTML.jpg

图 1-6。

The AWM2, 46 × 46 × 18mm

控制设备

对于不带 X10 的电器,如茶壶、烤面包机和高保真音响设备,需要第二种类型的设备。这些设备的功能与 LM12U 或 LM15EB/LM15ES 非常相似,即设备插入现有的电源插座,相关设备插入 X10 模块。如前所述,这些要求墙上插座上的开关以及电器本身上的任何开关都必须保持永久开启。这进一步意味着任何插入这种模块的可以远程控制的设备在任何时候都必须是安全的。以茶壶为例,它必须含有足够的水,这样它就不会烧干。

设备模块(AM12U)

像它的姐妹模块 LM12U 一样,这是一个非常简单的“即插即用”设备,尽管它看起来相同(见图 1-7 ),但有三个非常重要的区别:

  • 它没有调光器支持
  • 它可以控制荧光灯
  • 它可以在更高的负载下工作(白炽灯高达 500W,电风扇等感性 3 电器为 1A,加热器等电阻性负载 4 为 16A)

因此,它的预期目的是实现风扇和茶壶等设备的自动化。然而,真空吸尘器和风扇加热器等高功率设备很少在这些模块上工作,因为当电机打开或关闭时,电机周围的磁场崩溃会产生反电动势。这种反电动势会产生一个很大的电压尖峰,可能会烧断 AM12U 中的保险丝(如果你幸运的话)或该设备(如果你不幸运的话)。

A978-1-4302-5888-9_1_Fig7_HTML.jpg

图 1-7。

The AM12U, 52 × 122 × 33mm

有一个嵌入式版本,称为 AW12U,具有类似的规格。

Note

当互联网连接不可用时,通常是由于路由器被阻塞或崩溃,您可以经常使用这些设备来自动重启路由器和调制解调器。

家用电器微型模块(AWM2)

这是之前(以及图 1-6 中)作为灯光控制合适候选的同一模块,因为它也可以用于控制电器。除了尺寸更小(46×46×18 毫米)之外,与 AM12U 相比,它的主要优势是额定功率更高,可以为风扇加热器等设备供电。该装置的给定功率规格为白炽灯 2kW,感应设备 3A,电阻负载 16A。

如前所述,这种设备安装在墙上的插座,使其更难规避。因此,该模块可让您在夜间关闭儿童的电视或立体声系统,而无需像 AM12U 那样拔掉插头。

表 1-1 给出了之前提到的设备的分类。

表 1-1。

Basic X10 Modules

| 装置 | 名字 | | --- | --- | | AM12U | 设备模块(插头) | | AWM2 | 家用电器微型模块(墙内) | | LD11 | DIN 导轨调光器 | | LM10U | 墙壁开关 | | LM12U | 灯模块 | | LM15EB | 卡口灯模块 | | lm15 是 | 拧入式灯模块 | | LWM1 | 带调光器的微型模块 | | LW12 | 带调光器的墙内模块(类似 LWM1,但无双向通信) | | TMD4 | 微型模块发射器调光器(四开关,墙内,无电源处理器) |

内部设备

这些设备很少见,通常属于新奇类。一个很好的例子是 REX-10,一个犬吠报警系统!在接收到合适的 X10 消息(例如,来自运动检测器)时,该设备播放狗吠声,片刻之后,发送 X10 消息以打开灯。作为一个想法,这是好的,但很难配置这些硬连线设备,因为你可以用一个简短的计算机程序或简单的脚本有效。

组合设备

我将简要介绍一些设备,尽管它们没有附带 X10 控制,但总是与 X10 控制一起使用。还应该注意,电源控制同样可以来自替代的功率控制方法(例如,C-Bus)。

电子窗帘轨:改装

只需将 U 形拉绳缠绕在电动马达上,就可以实现多种窗帘的自动化。当然,细节是关键,所以市场上有一些预装的电机和滑轮系统,可以打开和关闭窗帘,安装在顶部导轨上。它们包括 Regency PowerMotion、通用窗帘电机(UCM)和 Add-a-Motor 80 (CM80)。

使用翻新解决方案需要您有一个良好的现有顶部导轨,因为这决定了电机能够处理的窗帘的最大重量——如果卡住,电机可能会烧毁。具体重量会因设备而异,但一个很好的指南是,带有滚珠轴承的顶部导轨将管理高达 30 公斤的窗帘,而没有滚珠轴承的顶部导轨可能会停止在 10 公斤。

所有这些设备都需要手动安装,以将电线固定到电机上,配置窗帘的打开和关闭位置,并调整电子设备以结合单独的 X10 接收器。根据设备的不同,这可能涉及一个简单的 AWM2 或 AM12U 单元,也可能是一个串联模块。

一旦安装好,控制窗帘是一件简单的开/关事情,例如,需要一些额外的控制逻辑来自动将它们定位在“50%打开”的位置;但是,您可以随时手动发出“off”命令来阻止它们进一步打开。有专门为窗帘控制设计的开关,如 Marmitek X10 电机驱动开关(SW10),它将标准 X10 信息“开”、“关”和“亮”分别转换为“完全打开”、“完全关闭”和“部分打开”。

Tip

在安装后的最初几天,你不应该让控制帘无人看管,因为电机可能会试图将它们移动得太远而烧坏。

电子窗帘轨:预建

一个这样的解决方案是无声的 Gliss AutoGlide。这就提供了一个带有预装电机和遥控装置的定制窗帘轨道。因为窗帘轨道是定制的,你必须事先知道你的窗户的尺寸和形状,因为 DIY 改装是不可能的,只有制造商才能弯曲它(以适合凸窗)。电机可以由 X10 设备模块控制,使用的 DIY 量与改造版本相似。

独立控制器

除非你有办法控制它们,否则拥有大量遥控灯具和电器没有多大用处。本节所述的所有设备都包含某种形式的 X10 发射器,可将 X10 数据信息发送到电力线,然后由前面所述的任何 X10 模块接收。

桌面发射器模块

这些模块都提供了从基本键盘向特定设备发送 X10 消息的方式。由于它们由市电供电,信号可以直接放在电力线上,从而无需 RF-to-X10 网关。该组支持最大的设备选择,每个设备都添加了自己独特的卖点。这里我只介绍一小部分。

迷你控制器(MC460)

这是一个标准但实用的有线设备,支持八个单元,可在两个组(1–4,5–8)中切换,以及标准的“所有灯打开”/“所有单元关闭”选项和亮度控制。为了减少按钮数量,亮度控制只影响最近一次打开或关闭的灯。这在大多数发射器模块中是相当标准的。

日落/黎明控制器(SD7233/SD533)

从表面上看,这就像早期的标准迷你控制器,连接到电源,控制八个设备,以及“所有灯打开”/“所有单元关闭”和亮度控制。然而,它还包括一个光线传感器,当天黑时,它会打开预定的一组灯,当它再次亮时,它会关闭它们。这些亮度设置可以通过一点点试错来调整,尽管黄昏和黎明在一年中不断变化,但这不一定能用作自然的唤醒电话。

迷你计时器(MT10U)

如图 1-8 所示,这种装置通过使用计时器而不是传感器来解决黄昏到黎明的问题。这允许您控制多达八个照明或电器模块,但只允许您预编程其中的四个,使它们一天打开或关闭(最多)两次。这可以让你模仿一个“住在”房子里的感觉。此外,它还包括一个随机选项,将改变 30 分钟的编程时间,给人一种“人类居住”的感觉。这个装置也可以兼作闹钟。

这种设备和以前的设备都减少了对计算机服务器的需求,因为它们可以根据(简单的)逻辑发送预定的消息。

A978-1-4302-5888-9_1_Fig8_HTML.jpg

图 1-8。

The MT10U, 55 × 150 × 110mm

Maxi 控制器(SC2800)

虽然该设备是作为安全系统(MS9780)的一部分设计的,但它也可以提供对房屋中所有 X10 设备的完全有线控制,如图 1-9 所示。虽然它没有任何计时功能,但它有一个电话插座,可以让你从外面拨号和开关灯(通过使用按键式电话输入单元代码,然后分别按*或#键)。

A978-1-4302-5888-9_1_Fig9_HTML.jpg

图 1-9。

The SC2800 provides easy access to your light switches via telephone

表 1-2 总结了这些桌面设备。

表 1-2。

Desktop Controller X10 Modules

| 桌面控制器 | 名字 | | --- | --- | | MC460 | 迷你控制器(4 × 2) | | MT10U | 迷你小时 | | SC2800 | Maxi 控制器 | | SD7233/SD533 | 日落/黎明控制器(8) |

手持式发射器模块

这些模块以无线方式工作,因此需要一个 RF-to-X10 网关。除此之外,它们执行与桌面发射机模块相同的任务,只是它们需要电池供电。

手持式射频遥控器(HR10U)

这些是相对便宜的设备,能够控制任何给定房屋代码中的所有 16 个设备。它们支持亮度控制,但不支持“所有灯打开”/“所有单元关闭”,并且它们以开/关的顺序排列按钮,而不是更符合极客逻辑的开/关。

这种设备的一个有用的特点是,它的左侧有一张纸条,你可以在上面写下每个按钮控制的设备的名称。除此之外,这是一个相当简单的设备,“做它在锡说。”

还有一个更小的版本,只包含三个设备按钮,称为操纵杆开关(SS13E,如图 1-10 所示),它也是无线的,因此可以放置在任何墙上。这使得你可以在浴室里控制设备,而在浴室里,电源供电的控制器是非法的。

A978-1-4302-5888-9_1_Fig10_HTML.jpg

图 1-10。

The SS13E Stick-a-Switch

遥控钥匙(KR22E)

这个几乎是新奇的设备允许你从你的钥匙圈使用“开”、“关”、“亮”和“暗”信息控制四个连续编号的设备。它没有很大的范围,电池也不会持续很长时间。

EasyTouch 面板 10 RF

这种 Marmitek 设备是最接近廉价触摸屏的设备之一。这是一个电池驱动的 RF-to-X10 发射机(就像 HR10U 一样),但通过触摸屏幕来操作。然而,屏幕仅仅是玻璃面板后面的图像。这就是它比其他解决方案便宜的原因。虽然这确实会阻止您从设备接收任何视觉反馈,但是您可以自定义图像(通过用 GIMP 和您的打印机制作一个图像)并控制按钮在触摸屏上的显示位置;因此,您可以让这看起来像一个更昂贵的单位。与 HR10U 不同的是,HR10U 有一组固定的 16 个按钮,它可以操作多达 30 个按钮,提供足够的空间来通过 Minerva 系统的一部分 Cosmic 控制所有的灯和其他设备(参见第七章),该系统允许您仅使用基本的 X10 消息集来设置定时器、收听新闻和播放 MP3 收藏。

EasyTouch35 通用遥控器

这种设备的外观是传统的“一体化”红外遥控器,具有八个 AV 设备的独立菜单,并能够从其他遥控器学习代码。然而,除了红外功能之外,它还包括一个 RF 发射器,用于通过 TM13 等 RF-to-X10 网关控制 X10 设备。

作为一个标准的红外遥控器,它工作得足够好,尽管背光时屏幕略有嗡嗡声。触摸屏很好用,你可以使用每个功能的预定义图标自己设计菜单。

我将在本章后面更详细地介绍通用遥控器。对于标准 X10 无线控制器,请参考表 1-3 。

表 1-3。

Wireless Controllers for X10

| 无线控制器 | 名字 | | --- | --- | | EasyTouch35 | 通用遥控器 | | KR22E 号 | 遥控钥匙 | | 断续器 10U | 手持式射频遥控器 | | SS13E | 操纵杆开关 |

墙内发射器模块

这些看起来像我前面提到的墙壁开关,因为它们隐藏在现有的墙壁插座中。但是,这些并不直接控制任何设备。相反,它们只向特定设备(如灯或电器模块)发送 X10 消息,依靠它来控制与之相连的硬件。因此,要将它们用作自动照明开关,你需要两个设备:墙内发射器和电器接收器。

一种类型的墙内模块是微型模块发射器调光器(TMD4,如图 1-11 所示),它可以通过连接到其中的四个开关控制多达四个不同的 X10 单元。如果您想要控制灯光或电器的简单开/关,这些信息包括调光控制。拥有大客厅的人和喜欢情调照明和多光源的人可能在一个房间里有四盏灯,这是少数几个让你从一个简单的面板控制所有灯的设备之一。然而,注意,每个灯仍然需要它自己的灯模块。当然,没有必要每个交换机命令一个 X10 设备;它可以简单地把信息放在电源线上,让 PC 控制器做一些事情,比如改变立体声的音量。

A978-1-4302-5888-9_1_Fig11_HTML.jpg

图 1-11。

The TMD4

运动传感器

市场上的大多数传感器是无源红外传感器(PIR ),有室内和室外两种,后者通常用作安装在传感器所在区域的安全灯。PIRs 与 EagleEye 运动传感器(MS14)一样,每当检测到运动时,会向特定但用户可选择的 X10 模块发送“on”消息。大多数型号还可以配置为分别在黄昏和黎明时发送“开”和“关”信息。尽管一些设备可以将消息发送到多个设备(PR511 和 PSH01 跃然脑海,两者都包含内置泛光灯),但大多数设备只能与单个设备通信,需要 X10 设置中的计算机在需要时将此消息转发到其他设备。稍后你会发现如何!

网关和其他外来设备

网关是允许通信数据流过的任何设备,尽管对话的每一方有不同的协议。在大多数技术中,网关执行双向功能,在任一方向上转换协议。在 X10 网关中,一般只有一个方向,即进入 X10。

这一类别的主要器件是 TM13U,这是我已经提到过的 RF 至 X10 网关。如图 1-12 所示,其中一种设备允许无线射频遥控器将信息放在电力线上,供 X10 设备处理。它永远不会反过来。该设备将监听来自其前部拨号盘上设置的相同房屋代码的所有射频信息,并将它们(使用相同的房屋代码)转发到电源线(假设插座已打开)。但是,如果将拨号盘设置为 P,它将对所有房屋代码的射频信号做出响应,但会根据原始房屋代码转发这些信号。该设备的硬连线地址通常为 1。

A978-1-4302-5888-9_1_Fig12_HTML.jpg

图 1-12。

The TM13U, 122 × 52 × 33mm, or 224 × 52 × 22mm with aerial extended

要在两个或多个相位上传输,您需要一个耦合器。这将在电源的一个相位上监听 X10 信号,并在另一个相位上复制它。这既可以在单个单元中发生(如 TF678),也可以为需要耦合的每相需要一个单独的器件(FD10,如图 1-13 所示)。

事实上,这两种耦合器设备都被称为过滤器/耦合器,这意味着它们可以完全过滤掉 X10 消息,而不是复制 X10 消息,从而防止消息泄露到邻居的房子里。通过扩展,它们可以防止您邻居的 X10 设备控制您的设备。

A978-1-4302-5888-9_1_Fig13_HTML.jpg

图 1-13。

The FD10, an interesting filter/coupler module, looking very uninteresting

网桥是一种充当两种不同协议之间媒介的设备。在这种情况下,总是存在桥接家庭自动化系统的协议,例如从 X10 到 C-Bus 或从 X10 到 UPB pulse work x。此类设备对于逐段升级系统或控制系统中不存在的和/或没有合适的软件驱动程序的特定设备非常有用。然而,在大多数情况下,桥接设备和原始模块的成本必须非常特殊,才能物有所值。

表 1-4 中涵盖了这一设备以及许多其他外来设备。

表 1-4。

Miscellaneous X10 Controllers

| 杂项设备 | 名字 | | --- | --- | | FD10 | DIN 滤波器和耦合器 | | MS14 | PIR-鹰眼运动传感器 | | PR511 | 带泛光灯的 PIR | | PSH01 | 电动喇叭警报器 | | TF678 | 全屋过滤器 | | TM13UAH | RF-X10 网关,适用于所有房屋代码 |

计算机控制

但是目前最强大和最有创意的设备是电脑界面,比如 CM11,如图 1-14 所示。这是一个收发器,它能够将信息从电力线传输到计算机,并将信息从计算机发送回电力线。与大多数 X10 设备不同,CM11 上的电源插座不由 X10 控制,而是一个简单的直通端口。因此,如果你想用 X10 控制你的电脑,你有两个选择。

Caution

小心不要把计算机的电源加到正常的房子代码上,因为你可能会在发出“所有单元关闭”的信息时不小心关掉它。

首先,您可以为计算机分配一个未使用的单元代码,并配置计算机在电源线上看到它时发出关机命令。(我将很快向您展示如何操作。)其次,你可以使用一个单独的设备模块,只需将计算机插入其中。这是一个可行但不太好的解决方案,因为您可能会将机器插入不间断电源(UPS)中。

A978-1-4302-5888-9_1_Fig14_HTML.jpg

图 1-14。

The CM11EFL

除了作为一个控制器,这个设备还可以作为一个事件调度和信息中继系统,即使没有连接到计算机。因此,您可以使用软件(即提供的 Microsoft Windows 版本或 Linux 等效版本,如何裕)对设备进行编程,并让它独立运行,因为这些编程信息现在存储在它自己的 EEPROM 中,即使没有电源,它也能保留数据,允许它从一个地方移动到另一个地方,而无需重新编程。(这也意味着有可能拥有一个没有一台电脑的稍微自动化的房子!)但是,您必须保留上传到 CM11 的文件和数据的副本,因为无法从设备下载。

Caution

从电源或计算机上拔下 CM11U 时,请务必先从设备上拔下串行电缆,因为电缆的杂散噪音会影响内部存储器及其设置。

事件调度程序允许您在一天中的任何时间、一周中的任何一天、一年中的任何日期发送任何 X10 消息。就其本身而言,该设备没有随机改变时间的能力,但它有一个黄昏和黎明设置,在你以经度和纬度的形式向它提供你的物理位置细节后,它就会工作。你可以从地图上找到你的经度/纬度,或者(如果我们现在是认真的)从网上的许多地理网站中找到。对于这些计算,您的 IP 地址通常足够准确,并且可以从以下网站获得:

http://api.hostip.info/get_html.php?position=true

http://whatismyipaddress.com

按照 CM11 的说法,消息中继系统被称为宏。这允许一个 X10 消息(例如“卧室灯亮了”)向您的任何或所有其他设备产生额外的自定义消息。一个典型的宏可能包括“着陆灯到 50%”,“浴室灯亮”等等。这些消息可以在时间上分开,允许一个单独的“浴室灯亮着”消息变成这样的短程序:

Bathroom light on

Stairs light to 50%

Wait 5 minutes

Bathroom light off

Wait 2 minutes

Stairs light off

因此,简而言之,CM11 可以提供自动化房屋可能需要的大部分功能,尽管是以非常静态的方式。为了让您的 CM11 动态处理 X10 消息,您需要电脑永久开机并安装一些软件。不幸的是,CM11 目前随附的软件仅适用于 Microsoft Windows。因此,相反,你可以呼吁社区软件,如何裕,作为一个替代品。

和宇

何裕是一个简单的命令行工具,可用于大多数*nix 系统(包括大多数 Linux 发行版、BSD 和 Mac OS X),能够与 X10 计算机模块进行双向通信,以及用宏和预定事件对 EEPROM 进行编程。也可以在 www.heyu.org 首页下载。这不是 OSI 认为的自由软件或开放源码,但是源码是免费的,可以免费使用。

安装后,软件会在首次运行时自动配置。这需要几秒钟的时间,包括打开串行端口(默认为/dev/ttyS0)并验证 CM11 是否真正插入并正常工作。最好的方法是通过运行以下命令将何裕包括在启动序列中:

heyu engine

这确保了何裕后台进程正在运行,从而允许接收传入的消息,触发外部脚本。engine 参数还启动何裕内部的状态机,允许它记住每个灯和设备的最后设置,这很有用,因为许多设备(尤其是较便宜的设备)不允许您查询它们的状态。在非计算机化的环境中,这种反馈循环是不必要的,因为作为一个人,你可以看到当你按下按钮时灯是否亮了,所以你可以看到你是否需要再试一次。电脑没那么有天赋。对于任何计算机界面来说,指示模块的当前状态也是一个很好的设计实践,这使得这个特性更加重要。如果您可能在家中使用大量基于计算机的界面(比如,通过网页),那么升级到前面介绍的双向灯和电器模块是值得的。

配置

配置保存在/etc/heyu内的各种文件中,特别是x10.conf,其中保存了串行设备、默认房屋代码、别名、场景和脚本。默认情况下,所有日志信息都被写入/var/log/heyu

顾名思义,别名为您想要在x10.conf文件中设置的每个设备提供了一种人性化的房屋和单元代码,以及该设备是灯具模块(StdLM)还是电器模块(StdAM):

ALIAS lounge e5  StdLM

ALIAS stereo e6  StdAM

一旦指定了别名,就可以在配置文件和对其发出的命令中使用它。这种抽象减少了当你需要对你的家用电器重新编号时所需要的改变的数量。

场景是何裕描述中继消息或宏的方式。每一行都包含一个标签名和一列分号分隔的命令:

SCENE movie_mode on tv; on stereo; dimb lounge 10;

何裕的调光范围在 1 到 22 之间,由相对和绝对亮度变化命令支持(分别为dimdimb)。请注意,如果在何裕配置文件运行时对其进行更改,则必须发出以下命令来刷新参数:

heyu restart

发送消息

这可以通过如下命令简单地完成:

heyu turn studio on

heyu onstate studio

heyu bright lounge 5

heyu lightsoff _ # the underscore means current house code

它可以放在更大的 shell 脚本中,从其他语言调用,或者通过带有 CGI 的网站触发。注意,这些都是阻塞命令,所以在 X10 消息被发送之前,脚本的其余部分不会执行——当然,除非您在后台模式下开始该任务:

heyu turn studio on &

这些命令也可以放在 crontab 中,这样就不需要将更改上传到 CM11U 的内部 EEPROM:

export EDITOR=vi

crontab -e

然后,作为示例行,添加以下内容:

30 9 * * 1-5   /usr/bin/play /usr/share/sounds/alsa/Noise.wav

这就增加了一个早上 9:30 的闹铃(还能是什么时候!?)在一年中每个月的每一天(第一个通配符)(第二个通配符),同时也是工作日(星期一=1,星期五=5)。

如果您想添加一个随机元素,比如说在 9:30 的半小时内,那么您可以使用一些简单的bash来代替调用这个:

00 9 * * 1-5 sleep echo $((RANDOM%60))m; /usr/bin/play

/usr/share/sounds/alsa/Noise.wav

请注意,我已经提前 30 分钟开始延迟,但是创建了一个持续 60 分钟的随机值。

接收消息

无论何时收到命令,何裕都能启动配置文件中指定的外部脚本。在许多情况下,这可能是打开额外的灯光,就像场景或微距一样:

SCRIPT bedroom on :: /usr/local/bin/heyu turn bedside_light1_mine on

SCRIPT bedroom on :: /usr/local/bin/heyu turn bedside_light2_theirs on

它可以运行外部脚本,而不是只控制灯光。这有一个好处,除了 root 用户之外,其他用户也可以编辑它,它不需要heyu restart,并且它提供了很大的灵活性,不能压缩到一行中。类似如下的代码:

SCRIPT bedroom off :: ∼steev/bin/housenight

将运行一个私人脚本,关闭家中所有重要的灯和电器(请记住,没有“关闭所有设备”的命令),在您的 Twitter feed 上发布一些内容,并播放“晚安”音效:

#!/bin/bash

wavplayer default play ∼steev/media/good-night-gorgeous.wav

tweet Good night all

/usr/local/bin/heyu turn studio_light off

/usr/local/bin/heyu turn kitchen_light off

/usr/local/bin/heyu turn lounge_light off

shutdown –h now

或者,它可以检测传感器发射器发送的信息,该信息根本不发送到任何设备,而是被转发到其他几个设备:

SCRIPT pir_detect_msg on :: /usr/local/bin/heyu lightson _

除了控制 X10 设备,还可以控制 PC 本身。此示例截取来自单个交换机的消息,以控制 CM11 所连接的 PC 的音量:

SCRIPT E6 on :: /usr/local/minerva/bin/mixer default dec master 10

SCRIPT E6 off :: /usr/local/minerva/bin/mixer default inc master 10

运行这些命令的用户权限与发出初始命令的用户权限相同:

heyu engine

这确保了该用户可以使用命令和设备(如/dev/dsp)。仅仅使用 X10 消息就可以构建复杂的脚本和交互。在第七章中,我将讨论宇宙。

EEPROM 编程

CM11 的 EEPROM 的所有功能都可以通过何裕进行编程。连接 CM11U 时,您只需创建一个名为/etc/heyu/x10.sched的文本文件(此目录中也有一个示例文件),其中包含合适的命令和类型列表:

heyu upload

该过程会将该文本文件转换为合适的二进制图像,并通过现有的串行电缆将其上传到设备。因为不可能从 CM11 中检索该数据,所以您会希望确保保留一份x10.sched文件或结果图像的备份以备后用:

/etc/heyu/x10image

文件格式的全部细节可以在手册中找到,包括如何将日期格式从默认的 YMD 切换到 DMY。现在,我将通过一个例子来包括我自己的时间表的一些片断:

macro movies_on 0 dimb lounge 22; 0 on tv; 0 on stereo;

macro lounge_off 0 off lounge; 0 off lounge_table; 0 off tv; 0 off stereo;

timer ...wt..  01/01-12/31 21:00 00:02 movies_on lounge_off

trigger e1 on movies_on

z 波

Z-Wave 是由成立于 1999 年的 Zen-Sys 创建的,作为家庭自动化领域无线控制产品的专有协议。2008 年,公司和技术被西格玛设计公司接管,该公司仍然生产和供应大部分芯片。这意味着所有生产 Z-Wave 品牌设备的制造商都必须从适马(或其附属公司,三美)购买,并且都必须经过测试和验证程序,才能获准将其产品标记为“Z-Wave”这些供应商是 Z-Wave 联盟的一部分,目前共有 200 家制造商,提供大约 600 种不同的产品。

系统设计

Z-Wave 使用的通信信道是 900MHz 射频信号(根据您的地理位置略有不同),传输速度约为 40 千比特/秒。(尽管采用 400 系列芯片的较新设备可以支持高达 100kbs。)虽然信号强度通常会受到墙壁和地板的影响,但每个设备的覆盖范围可达 20-30 米,并且可以以网状形式连接,这样一个设备可以向下一个设备重复消息,从而扩展覆盖范围。除了在它们之间发送消息,这些设备还与集线器或主控制器通信,集线器或主控制器用于通过以太网路由器或计算机将它们连接到更大的网络。典型的控制器包括 Tricklestar 和 Z Wave Aeon USB 适配器,这需要一台 PC,以及不需要的 VeraLitz Z Wave 控制器。还有一个 RaZberry Z Wave 控制器,可以直接连接到您的 Raspberry Pi 的 GPIO 控制器,如果您希望采用该路径的话。

当每个新的 Z-Wave 设备添加到系统中时,它会与附近的控制器配对,确定它们之间的信号强度,然后在路由算法中使用。这使得向放置在地下和车库中的设备发送信号成为可能,只要至少有一个设备在它和网络的其余部分的范围内。然而,在如此低的数据速率下,如果试图强迫节点像中继器一样工作,很容易使节点过载。

为了安全起见,Z-Wave 依赖于这种配对安排,因为每个单元上的按钮都是以类似于蓝牙配对的方式按下的,以确保每个单元都可以与另一个单元通话。这远非理想,但考虑到相对较低的使用率,中间人攻击的可能性相当低。

像 X10 一样,Z-Wave 有一个房屋代码(称为网络 ID)和一个用于寻址的单元代码(其节点 ID)。这些允许在单个网络上有 232 个不同的节点,虽然略少于 X10 的可用数量,但对于大多数房屋来说已经足够了,尽管如果需要的话,在网络之间桥接并不困难。

Z-Wave 的最大优势一直是兼容性,因为 Z-Wave 联盟的互操作性实验室确保了几乎所有设备都可以相互通信。然而,这种封闭的商店确保了任何开源软件都无法工作。但是现在这种情况已经改变了...

绕过 NDA

因为 Z-Wave alliance 的每个成员都必须签署一份 NDA 和保密协议才能访问正式的规范和白皮书,所以开源开发者不可能构建一个真正的 Z-Wave 设备——直到黑客开始对协议进行逆向工程!现在有几个选择。

开放式 Z 波

有了这样一个直接且典型的开源名称,这个项目获得了很多关注也就不足为奇了。它有两个主要部分,库和基于 web 的配置界面,后者带有自己的迷你 web 服务器。该库依赖于 libudev,根据您的系统,可能需要显式安装 libudev。例如:

apt-get install libudev-dev

然后,您可以通过传统方式从源构建开放的 Z-Wave:

svn checkouthttp://open-zwave.googlecode.com/svn/trunk/

cd open-zwave/cpp/build/linux/

make

由于 web 服务器的原因,控制面板需要最新版本的 httpd 库,因此通常最好从源代码安装。大多数问题都发生在省略这一步的时候:

wget``ftp://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.9.19.tar.gz

tar zxvf libmicrohttpd-0.9.19.tar.gz

cd libmicrohttpd-0.9.19

./configure

make

sudo make install

然后,您可以获取控制面板的信号源:

svn checkouthttp://openzwave-control-panel.googlecode.com/svn/trunk/

并通过取消注释第 36 行周围的三个特定于 Linux 的配置条目来修改配置。然后使用 make 正常构建,将 web 配置目录链接到开放的 Z-Wave 库:

ln –s../open-zwave/config/

并运行它,指定端口:

./ozwcp -d -p 13112

然后,您可以浏览到该页面,输入您的设备名称(或勾选 USB 框,对于以这种方式连接的控制器),并单击“初始化”。通过使用–d标志,您将在控制台上看到调试信息,这在这种情况下总是很有帮助的。你现在可以和你的房子说话了!

linuxmce,你好吗

LinuxMCE 项目已经收集了免费的 Z-Wave 信息有一段时间了,并在他们的 wiki 中专门描述了它:

http://wiki.linuxmce.org/index.php/ZWave

更重要的是,他们已经成功实现了该协议的一个版本:

http://svn.linuxmce.org/svn/branches/LinuxMCE-0810/src/ZWave/

虽然这主要是一个媒体中心项目,但您可能会发现它引入了更多您通常想要的依赖项,特别是如果将它安装在较小的 PC 上,如 Raspberry Pi。但是,如果您的控制器不被 Open Z-Wave 支持,而 LinuxMCE 能够使用它,那么您应该微笑着接受开销!

网络

有时(不公平地)被称为“其他 Z 协议”,ZigBee ( http://www.zigbee.org )是一种使用射频在 10 到 100 米范围内的设备之间进行通信的协议。与大多数其他系统不同,不需要单独的控制器,所有设备都可以成为网络的协调器(ZC)、路由器(ZR)或终端设备(ZED)。 5 通过这种方式,它们被连接成一个网状结构,让范围自然延伸到房子的其他部分。它还支持 128 位密钥的安全性,而且由于许多供应商都提供芯片,它们相对便宜。

从政治上来说,ZigBee 有一个联盟(不出所料,称为 ZigBee 联盟),它为来自 400 多家不同公司的 600 多种产品的规范、标准和细节提供了一个焦点。由于会员资格对所有人开放,低准入门槛提供了一些创新产品,如 AlertMe、LG 的空调和能源监控器,以及常见的按钮、灯、调光器和传感器。

Linux 软件

由于比 Z-Wave 更开放,规范可以免费获得,软件的范围应该已经超过了 Z-Wave。但是没有!这是因为 ZigBee 联盟包括一个单一的条款,要求所有使用 ZigBee 标志的被许可方成为联盟的成员。加入联盟需要花钱。很多钱!GPL 的第 2c 条(Linux 内核就是根据它编写的)规定:

您必须根据本许可证的条款将整个作品免费许可给所有第三方。

因此,不能在内核中包含 ZigBee。一些项目试图称自己为 Xbee 以避免这种情况,并且寿命很短。其他的( http://sourceforge.net/apps/trac/linux-zigbee )已经从 ZigBee 转向其他基于无线电的协议,比如 IPSO 和 6LoWPAN。

自然,没有什么可以阻止开发人员开发最终用户集成到内核中的库,但是这在某种程度上增加了入门的障碍。其中一个项目是:

http://support.robotis.com/en/software/zigbee_sdk/zig2serial/linux.htm

这是一项勇敢的努力,但和其他努力一样,注定要被否决,除非联盟引入零成本层(像蓝牙那样),允许代码包含在主线内核中,从而实现大规模采用。

与 Z-Wave 的区别

似乎编码者只需要一个普通的字母就可以开始问这个问题,就好像它可能是一个叉子或者有一些与发展政治相关的有趣的八卦。事实上,ZigBee 是一种类似的协议,只是因为它使用 RF 从集线器到一组类似目的的设备进行通信。(而且都是“Z”开头的!但是说一个比另一个好是错误的,因为它们的目的不同。在考虑是否使用 X10 照明或色调时应该问的相同问题,应该在这里作为一个更大的问题来问“哪个是对我来说最好的解决方案?”

在大多数情况下,Z-Wave 设备之间具有更好的兼容性。虽然关门可能会令人懊恼,但它确保了一系列设备能够愉快地相互交谈——作为硬件,似乎人们不能轻易改变固件。鉴于我们能够与 Z-Wave 和 ZigBee 设备自由通信,这样的哲学观点是没有实际意义的。相反,它归结于用例。如果你想要来自不同制造商的设备,而你没有能力预测它们的兼容性,那么 Z-Wave 可能是更好的选择。另一方面,如果只有一部分设备,或者你计划建造自己的设备,那么 Zigbee 更有可能吸引人。尤其是考虑到 Arduino XBee 盾( http://arduino.cc/en/Main/ArduinoXbeeShield )及其继任者( http://arduino.cc/en/Main/ArduinoWirelessShield )依然可用。

接下来,看看你家的物理空间。例如,如果您有大量的地下室空间或类似的情况,需要多个单元来允许 RF“查看角落”,那么 ZigBee 是一个更好的选择,因为它更好的带宽可以促进更多的消息被重复,以便将信号发送到目的地。这里的警告是,如果你的传统 WiFi 信号无法穿透墙壁,那么 ZigBee 也不会,因为它们工作在相同的频率上,当两个设备试图共存时,会有更多的带宽损失。

c 总线

虽然有几个众所周知的电器控制协议,但 X10 和 Z-Wave 更为人所知,有知识的公众成员知道它们,主要是因为它们的准入门槛普遍较低。然而,在 HA 社区中,Clipsal C-Bus 系统的所有权成为了目标。 6

关于中巴

C-Bus 系统由澳大利亚公司 Clipsal 开发,作为远程控制各种照明系统的一种手段。Clipsal 的初衷不是在 HA 领域,而是在体育场照明设备、商业舞台和会议中心。这意味着系统必须支持比家庭设置更长的电缆线路和更大的地址空间。它在两个方面都取得了成功,一个子网中的 100 个设备可以使用 1 公里长的电缆,每个子网可以通过基本网桥连接到另外 6 个设备,或者通过现在可用的以太网网桥连接到更多设备。

X10 和 C 总线的区别

C-Bus 的主要区别在于它的安装。虽然 X10 通过现有的电力电缆传输数据,但 C-Bus 设备是通过利用一种专有协议来控制的,该协议通过一根单独的 Cat-5 电缆传输。因此,这种安装只能由合格的 Clipsal 批准的工作人员进行,从而增加了初始成本。然而,一旦所有电缆铺设完毕,由于互连将始终存在,并且不会过时,因此维护水平几乎为零。它还提供了开关和计算机之间的双向通信,使查询调光器或电器的状态变得很简单。此外,由于信号速度不受电力线中过零事件的限制,所有光线变化都是瞬间发生的,只有拥有多年 X10 系统经验的人才能真正体会到这一优势。

为了降低这种初始开销,Clipsal 最近推出了一种无线版本的 C-Bus,它消除了昂贵的安装需求,因此我将集中讨论这部分设备。这可选地支持其数据流的 128 位加密,使其比(未过滤的)X10 无线解决方案更安全,尽管它仍然可以被确定的黑客攻击。其无线范围并不比之前介绍的 RF-X10 组合更好,根据材料不同,范围为 5 至 20 米。不幸的是,一个 C-Bus 无线子网上最多有 30 个设备,这使得它的功能不如使用两个房屋代码的 X10 系统。通常采用的 C-Bus 安装方法是,有线版本用于初始房屋配置,无线版本作为一种廉价的升级途径添加进来。

对于极客来说,主要的区别在于软件,因为协议是封闭的,使得 Linux 工具无法使用。为了重新占领这个市场,Clipsal 发布了一个包含二进制驱动程序的 RPM,并在其网站上免费提供。

Note

Red Hat package manager (RPM)可以在 SUSE 等非 Red Hat 平台上使用,也可以使用 Alien 等工具进行转换。然而,以这种方式打包的驱动程序的最大问题是它与 Linux 内核的兼容性。驱动程序 API 的任何变化,或者内核版本号之间的类似中断,都会使驱动程序(以及您的 C-Bus 系统)变得无用。在这些情况下,当没有更多开放的解决方案可用时,最好是保留一个低级的遗留系统,并准备在必要时将其他软件从机器中迁移出来。

与 X10 不同,每个 C-Bus 设备都包含一个微处理器,可以在没有计算机的情况下远程控制其他设备。这是通过将设备切换到五种模式之一来实现的,大致分为以下几种:

  • 普通、独立、开关
  • 基本对等交换控制
  • 网络化开关控制
  • 网络开关控制,带远程
  • 与有线 C-Bus 安装接口

附加的计算机对较小的 HA 装置和那些关心复杂照明 UI 的人是有益的。但对于我们这些打算控制其他设备的人来说,包含 PC 不是问题。

设备

像 X10 设备一样,C-Bus 具有调光和控制连接到它的电器的能力。它们的不同之处在于,C-Bus 灯开关能够直接控制一个或多个其他设备,并且只需最少的设备上配置。

Note

由于前面给出的原因,这里我只考虑无线设备。

控制灯光

灯光开关有两种设计,Neo 和 Saturn,分别属于 5850 和 5880 产品系列,仅装饰风格不同,但在每组中,您都可以选择两个、四个、六个和八个按钮的版本。它们总是成对的,前两个按钮控制相连灯泡的调光功能。要求每个后续对将按钮按压信息(无线)传输到另一个设备、7、或设备。由于内置微控制器,这些开关可以配置为调光开关、开/关对、远程触发器或场景触发器(后者是宏编程的 C 总线术语,其中几个器件可以同时发生几种状态变化)。场景编程也可以通过 C-Bus Toolkit 软件进行,尽管这目前仅适用于 Microsoft Windows。

每个系列都有几个设备,能够支持各种负载和特性,但一般来说,C-Bus 调光器将支持 25W 至 500W 之间的白炽灯和卤素灯(高达 2A),以及风扇电机(高达 2A)。

这两个系列还提供基本的开关单元。除了缺少调光功能之外,它们看起来与它们的灯控制对应物相同。作为补偿,它们可以支持更大范围的设备(最高 2KW,有些地方 8A),包括荧光灯。

Note

似乎没有墙内单元出售,这意味着你不能使用你自己风格的面板无线 C-Bus 电子设备。

控制设备

像 X10 一样,C-Bus 提供了一个插入墙壁并控制电流流向相应插座的电器模块。这些被称为 5812 系列插头适配器,看起来像它们的 X10 对应物,除了它们也支持调光和开关版本。

因为每个 C-Bus 设备都包括一个微控制器,并且 C-Bus 协议支持其他设备的远程编程,所以通过对开关上的“关联”进行编程(相当于 Linux 符号链接),前面提到的任何灯开关也可以用于控制电器开关。

控制器

5888 系列无线遥控器是这里的主要设备。它是一个 RF 发射器(工作频率为 433.92 MHz),支持 10 台设备,最远可达 70 米(尽管在一栋建筑内更有可能支持 25 台设备)。由于所有 C-Bus 模块的统一设计,通过使用遥控器控制一个开关,进而通过使用场景控制另外两个开关,在技术上可以控制超过分配的十个设备。此外,使用此遥控器不需要射频网关,因为 C-Bus 无线网络已经在射频上运行。这也意味着多个遥控器可以控制任何单个设备,任何单个按钮可以控制多个设备。

像 X10 一样,它也支持“全部关闭”消息。

方法

由于对无线网络的重视,有时有必要回归到有线网络。这就是无线网关 C-Bus 5800 系列的用武之地。这是一个必要的特性,也是有线和无线版本的 C-Bus 能够连接在一起的唯一方式。此外,通过使用 C-Bus Toolkit 等软件,它可以连接到计算机进行远程、顺序和智能控制。因此,该设备对于需要 PC 控制的纯无线网络也是必要的,因为商用路由器使用的 802.11 无线协议不适合作为 C-Bus 无线网关。

照明控制

除了我已经讨论过的通用电器控制器之外,还有许多用于照明的专用控制器。这是最近的发展,但并不令人惊讶,因为照明是家庭自动化发展的主要因素之一。毕竟,我们大多数人都是从控制灯开关开始的。鉴于灯是一种特殊的情况,因此有可能向通信协议添加额外的功能,如果它是一种传统的设备,如颜色,这将是没有意义的。

Note

虽然许多灯泡将自己归类为 WiFi,但这种情况很少发生,因为它们与集线器通信,集线器又与网络对话。

顺化(越南城市)

由电子巨头飞利浦设计,这是目前最突出的照明解决方案。基本的初学者工具包提供了一个控制中心和三个灯泡,虽然该单位可以支持多达 50 个。该集线器连接到有线以太网端口和电源插座。然后,它使用 ZigBee 光链路(无线)协议直接与灯泡对话。

Hue 最大的卖点是色彩;或者说,它的颜色范围。每个螺旋灯泡支持动态范围的颜色,可从应用程序上的色轮中选择。这些颜色可以从照片中选取,并编程到场景中,这样三种灯光就可以反映出你房间的配色方案,例如,可以通过增强壁炉架照片中的颜色来实现。

配置是自动的(正如您对消费设备的期望),集线器从您的 DHCP 服务器获取其 IP,该服务器提供一个网页,该网页重定向到 Hue online 服务,您可以在该服务中注册您的设备,并在(在线)帐户和您的网桥之间建立连接。一旦发生这种情况,您可以通过网站远程操作它。这通过轮询协议工作,由此 Hue 桥每半秒向 Hue 服务器发出请求任何新命令的呼叫,并更新桥的 IP 的服务器。你可以通过浏览 http://www.meethue.com/api/nupnp. 来验证 Hue 网站是否能看到你的桥

或者,你可以通过手机控制 Hue,目前 iOS 和 Android 设备都支持。

对于我们这些从事开源工作的人来说,对应用程序的依赖是一种偶然的束缚,尽管 Phillips 刚刚推出了他们的 API,允许你直接与中枢对话来控制灯光。这在 http://developers.meethue.com/coreconcepts.html 都有。获得网桥的 IP 后,您必须通过按网桥顶部的“link”按钮来设置用户,然后在 30 秒内发出命令:

$ curl -H "Content-Type: application/json" -X POST -d '{"devicetype":"myhome"}'http://192.168.0.27/api/

它返回一个带有用户名的 JSON 对象,比如 d 7 AE 8 b 2151d 50 df 1 e 61 f 380289 f 33 BF,这个用户名应该在所有将来的请求中使用。

然后,您可以要求网桥使用以下命令搜索系统上的灯:

$ curlhttp://192.168.0.27/api/d7ae8b2151d50df1e61f380289f33bf/lights

扫描需要一些时间,然后您才能重新发出命令以获取可用的,以下列形式返回:

{"1":{"name": "Hue Lamp 1"}}

从这里开始,您可以查询状态:

$ curlhttp://192.168.0.27/api/d7ae8b2151d50df1e61f380289f33bf/lights/1

{

"state": {

"on": true,

"bri": 254,

"hue": 14922,

"sat": 144,

"xy": [

0.4595,

0.4105

],

"ct": 369,

"alert": "none",

"effect": "none",

"colormode": "ct",

"reachable": true

},

"type": "Extended color light",

"name": "Hue Lamp 1",

"modelid": "LCT001",

"swversion": "65003148",

"pointsymbol": {

"1": "none",

"2": "none",

"3": "none",

"4": "none",

"5": "none",

"6": "none",

"7": "none",

"8": "none"

}

}

更改颜色和亮度:

$ curl -X PUT -d '{"transitiontime":0, "bri":255, "hue":28000, "sat":200}'http://192.168.0.27/api/d7ae8b2151d50df1e61f380289f33bf/lights/1/state

除此之外还有很多。你应该知道,顾名思义,色调使用 HSB 颜色空间,即色调、饱和度和亮度,这使它能够发出更自然的白色和更好的柔和色调。它还支持通过 CIE 模型(在色度图上绘制颜色,详见 http://developers.meethue.com/coreconcepts.html#color_gets_more_complicated )进行编程控制,这意味着如果你习惯于更传统的 RGB 符号,你将需要调整你的思维或代码。

有几个网站可以提供颜色转换的可视化表示,比如 http://www.workwithcolor.com/color-converter-01.htm 。要将 HSB 值转换为色调参数,您必须:

  • 色相乘以 200(技术上是乘以 182.04!)
  • 将亮度和饱和度的百分比重新调整为 0 到 255 之间的值

Tip

色调在每个状态改变操作之间有一个过渡时间。这提供了一个比你在代码中能管理的更平滑的过程,并且推荐在长渐强或渐弱中使用它。

网桥上还有一个开放端口 30000,您可以telnet到这个端口并直接发出命令,比如[Link,Touchlink]不管结果有多有趣,它们都不提供 API 中已经没有的任何功能,因此无需进一步讨论。同样,更多非官方的好消息,你应该去参观一下everyhue.com

Note

当 Hue 灯泡关闭时,您不能改变它们的颜色,尽管您仍然可以向灯泡发出“警报”,让它们暂时亮起,以指示邮件的到达或门铃的按下。

英斯特朗

虽然 Insteon 能够控制的不仅仅是灯泡,但它已经在照明领域找到了自己的位置。它采用了 X10 的理念,通过电力线传递所有信息,但通过其射频网络提供了第二个“网格”,从而扩展了这一理念。它还改进了 X10 型号,允许每台设备接收和发送信息,这意味着每台设备也是一个中继器,确保更好地覆盖整个房子。

Note

虽然 X10 和 Insteon 可以在相同的电力线上工作,但 Insteon 不会像它自己那样重复 X10 信号。

事实上,在大多数情况下,Insteon 是比 X10 更好的选择——它的反应速度更快,数据吞吐量更高,在所有情况下都可以查询设备状态,并且所有地址在工厂都是唯一分配的,因此不存在房屋代码或邻居纠纷的问题。缺少的是可用设备的范围(正在弥补)和 Linux 软件。

与 X10 一样,你将需要一个特殊的单元,比如一个 PowerLinc 调制解调器 8 ,以允许你的 Linux 机器或 Raspberry Pi 与 Insteon 设备进行通信。您还需要合适的 USB 驱动程序(iplcd)和控制软件。这就是问题所在!这个领域唯一真正的竞争者是在 http://www.bobsplace.com/ilinks ,但即使这样也已经停止了开发工作。幸运的是,这些代码保留了下来,并在大多数旧设备上运行。否则,你应该看看名仕屋(misterhouse.sourceforge.net),因为它包含一个 Insteon 驱动程序,比其他可用的驱动程序更新。虽然这意味着安装比必要的更多的代码,但它确实有比平均水平更好的工作机会!

利夫

最初是在 2012 年作为 kickstarter 项目开始的,它被列在“值得一看”的标题下。根据供应情况,灯泡可以设置为主灯泡或从灯泡。主灯泡被赋予一个 IP 地址,连接到 Wi-Fi 网络,并能够以网状形式向从灯泡分发命令。目前的说法表明,每个主机可以连接 9 个从机。智能手机控制应用程序和黑客软件开发工具包预计将与灯泡同时上市,并将于 2013 年底前上市。

夜灯

这是你能找到的最便宜、最简单的自动灯。这些智能为零,由一个插头、一个灯泡和一个光传感器组成。天黑时,它们会亮起来。天一亮,他们就关掉。就这么简单。然而,尽管简单,人们不能忽视他们的好处。毕竟,它们非常便宜。因此,如果你想为着陆提供低水平的照明,这是最划算的方法。对于那些坚持要进行一些黑客活动的人,你可以考虑用一圈电致发光线(EL-wire)代替灯泡,这将为房子提供一种 Tron 式的感觉,引导你在卧室和浴室之间移动。

射灯

对大多数人来说,自动灯是一个很好的方式,让房子看起来有人居住,更重要的是,当你不在的时候有人居住。然而,有了控制它们颜色的能力,你可以做的不仅仅是在早上淡化它们,模仿日出,或者在晚上淡化它们。你可以在整个晚上改变灯光的色调。这里的关键术语是“蓝光”

平板电脑或个人电脑上明亮的屏幕是一件坏事,因为它会欺骗大脑认为现在还是白天,因此更难入睡。通过在晚上逐渐降低亮度,它可以帮助一个宁静的睡眠。或者更具体地说,降低蓝色分量的亮度会有所帮助。这是因为蓝色提醒我们百万年的进化过程,蓝天依然可见,我们应该警惕。

有几个选项可以自动改变你的 Linux 显示器的颜色设置,f.lux 和 Redshift,它们都在 X Window 下工作。

Note

随着变色灯泡(如 Hue)的出现,预计在不久的将来会有实现蓝光解决方案的脚本。

f .拉克斯

这是来自 Stereopsis 的免费软件(如啤酒),可从以下网址获得:

http://stereopsis.com/flux

在 Windows、OS X 和 Linux 的可执行版本中。然而,与大多数免费啤酒软件不同的是,它也可以作为源代码获得,当与 Linux 一起工作时,它更容易安装,也可以从以下网站获得:

wgethttp://secure.herf.org/flux/xflux.tgz

tar -xvzf xflux.tgz

sudo cp xflux /usr/local/bin

sudo chmod 755 /usr/local/bin/xflux

通过指定您的经度(-g)和纬度(-l),它可以作为用户应用程序运行:

./xflux -l 51 -g 0

如果你不确定这些参数,你可以用众多在线工具中的一个来确定你的位置,比如 http://itouchmap.com/latlong.html

该程序将在后台运行,并使用您的地理位置来确定日落,然后根据需要重新着色您的窗口管理器。它还有一个选项,可以禁用自己一个小时,这样你就可以做任何依赖颜色的工作,如照片处理,甚至游戏。

红移

有一个相当于 f.lux 的完全开放的源代码,称为 RedShift,大多数存储库中都有。例如,在 Debian 中,你可以把 apt 和:

apt-get install redshift

这与 f.lux 的工作方式完全相同,作为一个 userland 应用程序,它接受经度和纬度参数,并以相同的方式影响显示器的颜色(尽管使用的特定颜色略有不同,所以您可能希望两种颜色都进行试验,看看使用其中一种是否会获得更好的睡眠模式)。

因为它不作为守护进程运行,所以您应该这样调用它:

redshift -l 51:0 &

如果您需要暂时禁用它,那么您需要发送一个 USR1 信号:

kill –USR1 1195

其中 1195 是进程 ID,当然,可以通过执行以下命令来检索:

echo $!

紧跟在redshift命令之后,或在进程列表中搜索:

ps ax | grep redshift

联网设备

虽然 X10、Z-Wave 和 C-Bus 都是向简单设备发送简单控制的好方法,但更复杂的通信需要更好的方法。更具体地说,它需要更大的带宽。当命令是“播放这首歌”时,它需要明显更多的带宽。最容易实现的方式是通过本地以太网,因为它可以高速发送命令和数据,而没有 USB、RS-232 或并行电缆的距离限制。而且,与 X10 不同,双向通信作为规范的一部分是免费提供的。

以太网设备

有许多设备支持通过以太网进行通信,或者是控制它,或者是向它提供数据。有些可以独立工作,无需额外的硬件,如个人录像机(PVR)和媒体 Shell。两者都包括存储媒体的方法和播放技术。另一些则需要服务器为其提供数据。该设备的功能及其在自动化家庭中的使用总是通过利用联网能力来改进。这意味着您将需要某种服务器,用于大多数未来的设备。这引出了由局域网连接的两个必要部分——前端和后端——的区别,无论它是有线的还是无线的。

前端或头单元通常由连接到附近的 HiFi 或电视的设备组成,以便播放位于物理上远程的机器上的媒体。因为这样的单元放在客厅或卧室,应该是小巧、静音、有吸引力的。优选地,它还应该相当便宜,因为想要参与流媒体的房子中的每个房间都需要一个前端单元。

相比之下,后端存储在远离主生活区的地方(因为它通常是一台带有噪音风扇的大型 PC),但能够通过网络向室内的所有主机提供媒体流。

我将在第三章中介绍各种面向媒体的主机,尽管大多数显示的主机可以用运行适当软件的 Linux 机器重新创建。然而,功耗、噪音和成本通常会比定制的嵌入式设备大,即使这些设备中的许多本身可能运行 Linux!然而,要连接这些单元,您需要知道如何设置网络。

网络入门

为了最好地利用这里的设备,您需要将一台 Linux 机器配置为合适的服务器。大多数计算机科学书籍将从描述 OSI 七层网络模型开始其网络部分...我不会!相反,您将只学习提供和配置适合自动化的家庭网络的必要、实用的步骤。

Note

这里以及整本书中的每个 Linux 例子都是基于 Debian 和其中的包。这不是我的主张,仅仅是实用性,因为这是我所使用的。一些发行版可能会将文件放在稍微不同的地方,或者有稍微不同的名称,但是原则总是相同的,并且很容易找到等价的文件。

概念

家庭网络是家中每台计算机共享一组公共资源(如打印机、扫描仪和存储空间)的一种方式。从这个意义上说,它非常像一个办公网络。这种住宅的不同之处在于技术水平,因此也在于运行它所需的专业知识。办公 IT 系统中的一个主要问题是安全问题。有了家庭网络,使用家庭网络的人之间的关系就大不相同了,社会习俗也受到了影响。

标准网络配置有两部分—内部和外部。内部部分是一个网络,它将所有的家用计算机及其外围设备连接在一起,使它们对外界不可见。这些设备可以通过电缆或无线网络连接在一起。

外网就是一切!家里的电脑通常无法使用大而宽的互联网;只有通过调制解调器、宽带连接、3G 卡或类似设备连接到 ISP,才能使用该功能。

要将网络的这两端连接在一起,您需要一台路由器。有时路由器是一个小盒子,作为 DSL/电缆/宽带包的一部分,自动分离内部和外部流量。有时候你需要买一个。它们有一个承载外部网络流量的 RJ-45 插座,您可以将宽带调制解调器的网线插入其中,还有一个或多个通向内部网络的输出。

或者,您可以使用带有两个网卡的 PC—一个配置为与外部网络通信,另一个配置为与内部网络通信。如果你有一个 3G 卡,那么这就像你的外部配置的网卡。

由于路由器同时存在于内部和外部网络中,它能够自动将两组流量分开,并阻止任何您不希望在两者之间传输的数据或软件。默认情况下,大多数路由器配置为允许所有传出流量,但阻止所有传入流量,特定端口上的流量除外。端口是流量协议流经的路由,由一个数字来表示。例如,所有网页都在端口 80 上被请求。因此,如果您的路由器阻止了端口 80 上的传入流量,您将无法从家庭内部网络之外访问您的内部 web 服务器。

根据网络上的计算机数量,您可能还需要一个提供额外网络插座的交换机,以便您可以插入更多的计算机。虽然不太可能有很多人会用计算机填满八个插座,但非计算机设备也使用以太网传输数据,从而耗尽可用插座的情况并不少见。

访问

网络上的每台设备都必须有唯一的地址。目前有两种寻址形式,IPv4 和 IPv6。IPv4 最初是通过点状四元组(如 89.16.172.66)来描述地址的形式,几乎被地球上的每一台机器和家庭设备所使用。IPv6 于 1998 年由互联网工程任务组引入,旨在克服 IPv4 的各种问题,如地址耗尽。然而,它的采用并不普遍,许多小型的面向家庭的设备并不使用它,所以我将集中讨论 IPv4。

一台机器要有一个地址,必须由人或适当配置的计算机给它一个地址。它不能随机生成一个地址,以防地址与网络上的另一台机器冲突,或者是保留地址之一,如 127.0.0.1。家庭中所有联网的机器都应该存在于一个特定的地址范围(称为子网)内,并且应该被分配给 IPv4 规范提供的私有地址范围之一。这不仅停止了与 Internet 上其他现有站点的冲突,还确保了这些网络内的数据是安全的,并且对于网络外的机器是不可见的,因为所有路由器、交换机和网关都不会使用本地网络外的私有地址范围重新传输任何流量。这些私有地址范围是 10.x.x.x, 9 172.16-31.x.x 和 192.168.x.x,其中 x 可以表示 0 到 255 之间的任何值。出于演示的目的,我将把我的子网分配到 192.168.1.x 范围,给我 254 个 10 可能的网络设备。大多数人将此用于私有网络,因为几乎所有家用路由器都在此范围内分配地址。此外,在各种互联网论坛上发现的大多数问题可能会有详细的答案,使用相同的地址,因为你有。

现在知道了网络的地址范围,您必须考虑各个地址。第一个要分配的是路由器,它通常获得 192.168.1.1 的名称, 11 ,然后是 Linux 服务器,我将分配 192.168.1.2。

Caution

配置 IP 地址等属性需要您以 root 用户身份登录,因此要小心行事!

您可以通过使用桌面 GUI 中的工具或者直接配置/etc/network/interfaces文件来为 Linux 机器提供一个静态地址:

auto eth1

iface eth1 inet static

address 192.168.1.2

netmask 255.255.0.0

broadcast 192.168.1.255

network 192.168.1.0

这告诉系统使用分配为 eth1 12 的网卡作为静态 IPv4 地址 192.168.1.2,带有所有标准参数。

您可以使用这种方法为网络上的每台机器分配静态 IPv4 地址,只需记下哪台机器分配了哪个号码。然而,过一段时间后,这可能会变得令人厌倦,许多嵌入式设备不允许对配置进行这样的控制。这两种情况都要求您升级到 DHCP。

DHCP 代表动态主机配置协议,是一种配置网络上每台客户机网络设施的方式。该软件由两部分组成,客户端和服务器。客户简单地说,“我是一台机器;网络在哪里?”通过电缆向所有机器传送信息。服务器侦听所有这些消息,并通过返回发送方用于联网的所有配置数据(如其 IPv4 地址、域名等)进行响应。

在 Linux 中配置 DHCP 客户机很容易,只需用以下内容替换前面的/etc/network/interfaces文件:

auto eth1

iface eth1 inet dhcp

创建 DHCP 服务器需要更多的工作,但通常可以避免,因为许多网络路由器都包含一个 DHCP 服务器,尽管有时默认情况下它是禁用的。

要在 Linux 中准备一个,您应该首先使用如下命令安装 DHCP 服务器软件:

apt-get install dhcp3-server

然后,您可以编辑/etc/dhcpd.conf文件,为每台机器分配地址。在编辑之前,您可能需要运行以下命令:

ln -s /etc/dhcp3/dhcpd.conf /etc/dhcpd.conf

ln -s /usr/sbin/dhcpd3 /usr/sbin/dhcpd

可以按照以下步骤分配每台机器的地址:

Giving it the next free number in a series, say 100–254. These are pooled addresses.   Looking at the MAC address of the network card that sent the message (all MACs are unique) and giving it a specific address based on that number.   Doing any combination of 1 and 2.

因为这些汇集的地址在数量上是有限的,所以它们永远不会被分配给机器。相反,它们是租用的,每台机器的 DHCP 客户机必须重新请求地址,如果它在一段时间后仍在使用它。软件在后台自动完成这项工作。如果你家有很多访客(谁愿意用互联网而不是和你聊天!),那么租用地址是最简单的方法,因为每个朋友都不需要静态地址,而静态地址需要配置。

汇集地址的配置如下:

subnet 192.168.1.0 netmask 255.255.255.0 {

option routers    192.168.1.1;

range 192.168.1.5 192.168.1.115;

}

否则,您家中的机器数量可能是有限的,因此静态地址几乎不会增加什么工作,并且可以更快地排除故障,因为您预先知道每台计算机应该有什么 IP 地址。典型的配置如下所示:

host teddyspc {

hardware ethernet 00:A1:68:8E:9E:AA;

fixed-address 192.168.1.4;

}

此主机部分可以包含在前面显示的子网部分中,以便在池规则中创建例外。

您可以通过键入以下命令来确定已经授予了哪些租约:

more /var/lib/dhcp3/dhcpd.leases

DHCP 服务器中还有许多其他选项,但这些选项足以让一切正常工作。我将在适当的时候介绍特定的额外案例。

电脑游戏

我叫史蒂文,通常简称为斯蒂夫。我电脑的名字是 192.168.1.110,对于非极客来说不太好记。很可能你的房子里会有比极客更多的非极客,极客会用诸如“霍利的电脑”或“安吉拉的笔记本电脑”这样的名字来称呼每台电脑这里有两类问题:让房子里的计算机有可用的名称,让它们知道房子外面互联网上每台计算机的名称。

计算机名通常会自动分布在本地网络中,所以它们不是问题,尽管有时信息传播到所有机器可能需要 30 秒。如果出现问题,您可以通过添加如下一行来强制提供 IP 地址和计算机名称之间的映射:

192.168.1.110  mediapc

到位于/etc/hostsC:\WINDOWS\SYSTEM32\DRIVERS\etc\hosts的文件,这分别取决于您使用的是 Linux 还是 Windows。

将互联网域名转换成数字是通过一种称为域名系统(DNS)的服务器来完成的。这是一个简单的客户机/服务器过程,其中客户机提供一个域名,如google.com,服务器返回计算机的全局可访问 IPv4 地址。世界上有许多这样的服务器,按层次排列。因此,如果您的本地 DNS 服务器不知道某个特定的域,它会询问其父 DNS 服务器,依此类推,一直到主根区域服务器。您所需要做的就是配置您的家庭机器使用这个链中的第一个 DNS 服务器,搜索将会自动发生。如果您的 ISP 为您提供了 DNS 服务器地址,您可以直接使用它。或者,如果您使用的是路由器,那么它通常会通过在网络的外部(只有它能看到)寻找 DNS 服务器来自动配置自己,然后充当 DNS 中继,它假装是内部网络的 DNS 服务器,而是在将结果返回给您之前传递 ISP 的 DNS 的所有请求。

有了 DNS 服务器的 IP 地址(在这个例子中,您将使用路由器的 192.168.1.1),当它也请求自己的 IP 地址时,您可以使用 DHCP 服务器将这个信息分发给每台机器。因为相同的 DNS 服务器用于所有本地机器,这可以通过在/etc/dhcpd.conf文件的顶部设置全局选项来实现:

option domain-name-servers 192.168.1.1;

或者,如果您不使用 DHCP 来提供网络凭证,那么您必须恢复到您指定其静态地址的同一个/etc/network/interfaces文件,并添加以下内容:

dns-nameservers 192.168.1.1

网络服务

在工作网络中拥有一台机器并不足以让一台机器与另一台机器一起做某些事情。需要进行交流。您已经看到了两个正在运行的服务(DHCP 和 DNS),您可能还知道其他服务,比如访问网站的 HTTP 和传输文件的 FTP。为了让你的机器像这样工作,你需要安装某种服务器。诀窍在于知道任何特定的任务需要什么样的服务器。我将根据需要介绍这些服务器。我要展示第一件事是如何设置一个文件共享服务器,它能够通过本地网络提供文件,允许音乐收藏位于一台机器上,但可以由子网中的任何其他机器播放。

Note

让内部网络的文件对外部可用是可能的,但是我将在本书的后面讨论这个问题。

使文件可用的服务称为 Samba,它允许文件(和打印机)在机器之间共享。因为它基于一种广为人知的协议(称为 SMB/CIFS)运行,所以它可以在不同的操作系统(包括 Linux、Windows 和 Mac OS X)之间共享这些资源。 13

它以通常的方式作为您的发行版安装,如下所示:

apt-get install samba

它是通过编辑以下文件来配置的:

/etc/samba/smb.conf

这用于指定本地计算机上的哪些文件夹对其他计算机可用,以及在什么条件下可用,例如密码或读/写权限。因为有问题的机器位于私有地址范围内,所以文件只能由本地机器访问,所以通常可以将所有这些文件夹设置为公共可访问,因为在这个上下文中“公共”指的是家中的每个人。与企业网络不同,在家庭环境中滥用网络设施(通常是孩子们!)可以通过不给他们提供任何晚餐来掩盖!

有许多方法可以配置 Samba 来提供文件,但是默认方法适合家庭环境。我个人通过三种特定方式添加共享各种文件的部分。第一个提供对我的媒体服务器上的音乐和视频文件的完全访问,比如//mediapc。它们安装在如下所示的目录结构中:

/media/mp3

/media/tv

/media/movies

并提供了配置部分,就像这样:

[media]

comment = Media Server

path = /media

browseable = yes

public = yes

writable = no

read only = yes

guest ok = yes

这让在家的任何人,包括游客,都有机会听我一直热衷的任何乐队。它是公开的(意味着我的访问者不需要我的电脑上的用户帐户)和可浏览的(所以它可以在网络上找到,没有人知道它的确切名称)。然而,它是只读的,防止访问者意外地(或恶意地,也许是流氓病毒)删除文件。

他们可以从他们的 Windows 网上邻居(或通过键入\\mediapc\media)或从 Linux(通过桌面或命令行,用smbmount //mediapc/media local_media_folder -o guest 14 )看到它。

接下来,我将第二个共享到同一个位置。这有一个密码,这意味着只有我可以添加最新的 DVD 或音乐购买到系统中。

[media_incoming]

comment = Media Incoming

path = /media

browseable = no

public = no

writable = yes

read only = no

guest ok = no

最后一个共享是我电脑的 DVD 光驱。这在我家里几乎没有使用过,因为我有时间把我所有的 CD 和 DVD 翻录到本地机器上的文件中,但它偶尔还是有用的。默认安装提供了一个关于此方法的合适示例:

[cdrom]

comment = Media server's DVD

writable = no

locking = no

path = /dvd

public = yes

preexec = /bin/mount /dvd

postexec = /bin/umount /dvd

最后两行将在请求时自动挂载磁盘,并在磁盘短期闲置后卸载它。系统被告知如何处理/media/dvd的安装(拆卸),在/etc/fstab中有适当的描述:

/dev/scd0    /dvd  udf,iso9660 user,noauto   0    0

根据网络上的范围和登录配置,您可能需要设置特定的 Samba 用户。如果您是一名系统管理员,为所有机器(Windows/Linux/Mac)设置一个集中的登录数据库可能看起来是一项简单的任务。但是对于我们其他人来说,每台机器都有自己的用户名和密码。因此,Samba 服务器无法知道这些其他机器,也无法知道它们各自的用户何时决定更改密码。这使得 Samba 无法知道它应该从另一台机器接受什么样的用户名/密码组合。因此,它使用单独的设置密码表。

您只需以 root 用户身份为每个拥有特定 Samba 共享文件夹密码访问权限的用户键入以下内容:

smbpasswd -a steev

对于每个用户,您将被要求提供以下信息:

New SMB password:

Retype new SMB password:

此时,您可以向家庭成员询问密码,或者给他们分配一个密码,因为只有这台机器上的 root 用户才能更改密码。但是,一旦用户从特定的机器登录,操作系统通常会记住凭证,因此不会不断地提示任何人输入这些信息。

然后,您应该重新启动 Samba 服务,使这些更改对全世界可见。

/etc/init.d/samba restart

这是使文件在您的网络中可用所必需的。这允许您使用目前可用的各种媒体流设备或主机。

闭路电视摄像机

尽管人们对 CCTV 的印象是贴在小电视屏幕上的颗粒状黑白镜头,但现实却相去甚远,特别是因为彩色 CCTV 现在非常便宜,图像通常通过以太网传输。虽然网络摄像头和闭路电视摄像头背后的技术相似,但使用廉价的网络摄像头作为更昂贵的闭路电视摄像头的合适替代品并不是特别容易:

  • 网络摄像头使用 USB 传输数据,这将电缆长度限制在 5 米左右,无需特殊的延长线
  • 网络摄像头在弱光环境下工作不太好
  • 网络摄像头在物理上不够坚固或防水,不足以在户外使用

所以,虽然你可以在白天通过电脑旁边的摄像头窥视窗外,但你不会走得更远。相反,你需要一个特别设计的相机,通常通过无线网络传输图像,这样你就可以将相机放在需要的地方——而不是你是否可以用电缆连接它。

Note

几个版本的闭路电视摄像机可用于有线室内只。与传统网络摄像头相比,这些摄像头的主要优势在于它们通过 IP 网络传输数据,这意味着它们不需要直接连接到 PC。

事实上,市场上的每台 CCTV 摄像机都需要一根电源线(尽管以太网供电通常就足够了),因此无论您选择有线还是无线网络,都必须至少有一根电缆连接到摄像机的位置。除此之外,主要选择是室内或室外安装,后者更能适应天气。如果您购买了室内设备(如 Y-cam ),但后来又改变了主意,您通常可以将它放在壁挂式装置(Y-cam Shell)中,并将其安装在拱腹下方。

对于可能用作婴儿监控器的室内闭路电视,有像松下无线 IP 摄像机(BLC-20)这样的摄像机,它具有运动检测和内置网络服务器,因此它不需要 PC 来操作,只要在路由器上打开适当的网络端口,就可以远程查看。它的哥哥(BLC-131)也提供了摇摄和俯仰功能的摄像机遥控。

当一个摄像头位于内部但指向外部时,那么最好是寻找那些支持某种形式的“夜视模式”的摄像头使用 CMOS 传感器的传感器在这方面更好,因为它们可以在低至 0.2 勒克斯的光照水平下工作,而传统的 CCD(如网络摄像头中使用的)仅为 3 勒克斯。大多数声称具有夜间模式的 CCD 相机通常都是通过软件实现的,不会做任何好的 GIMP 会话无法解决的事情,所以尽可能选择 CMOS。

在很大程度上,所有的闭路电视都以同样的方式工作;这是在你的预算内平衡规格和价格的问题。考虑图像的大小、FTP 上传、网络访问、是否收到关于移动侦测的电子邮件通知等等。

不是的无线摄像头

市场上的许多 CCTV 摄像机在并非指 WiFi 的上下文中使用“无线”一词。XCAM2 无线摄像机系统就是这样一种设备。他们实际上使用工业、科学和医疗(ICM)无线电波段将信号传输到定制的接收器,通常用于在连接的监控器上显示。因此,它们不适合集成式家庭自动化解决方案,因为需要远程查看闭路电视输出。

但是,如果特定的接收器向 RCA 复合视频提供输出,您可以将这些接收器插入电视卡并从中进行录制,或者使用 Emprex ME-1 等硬件媒体录像机。这将限制您只能使用一台摄像机,并防止您在 CCTV 处于活动状态时使用电视卡(用于录制或观看)。其中,第二个问题很容易通过购买第二张电视卡来解决。前者更难。

如果您需要多个摄像机,那么您将需要使用一些额外的控制硬件,这可能会使成本超过一体式 IPCCTV 摄像机。这个问题有两种解决方法。

第一种涉及使用几个摄像机,但只有一个接收器。然后,您可以使用 X10 根据需要打开和关闭特定的摄像机。接收器将拾取现在存在的(唯一的)信号,并像以前一样将其传递给电视卡。这是为 XCAM2 建议的方法,但这意味着您无法一目了然地查看所有摄像机。

第二种解决方案使用多个接收器(因此成本更高)和一个电视切换器来选择不同的输入。有些甚至会把所有的图像合成一张。切换这些单元需要使用基于计算机的红外发射器并对其进行编程,因为大多数都不是 IP 可控的。(我们稍后将了解 IR 控制。)

定制硬件

在许多情况下,没有必要构建自己的 CCTV 配置,因为这是一个已知的问题,制造商已经提供了自己的解决方案。一个这样的单元是 CCTV 记录器/DVR,它通常带有 CD 重写器和视频输出。这个盒子将捕获来自多个摄像机的信号,并通过 S-video 或 composite 提供它们的输出,然后可以像以前一样输入到电视卡中,用于远程观看和录制。有些型号还配有红外遥控器和网络端口。

另一种选择是,如果你想让一切都基于 PC,那么可以使用 PCI 卡进行实时监控,这样就可以从一个卡上监控四个或更多的输入通道,比如 RW-1240R。然而,大多数软件和驱动程序目前都是基于 Windows 的,所以我们不再赘述。

Caution

许多独立的闭路电视设备接受来自 BNC 视频连接器的摄像头输入,而基于网络摄像头的设备使用 RCA。

Linux 软件

一旦网络摄像头图像以数字格式提供,无论是通过 USB 驱动器还是连接到电视卡的复合输入,图像都可以随意处理或传输。通常,处理将通过 Linux 驱动程序的标准视频(V4L)进行,现在是第二个主要版本。这使得数据可以被任何兼容的软件处理。以下是一些例子:

  • xawtv:一个 X window 实用程序,用于回放和录制视频流,包括复合输入和电视台。它有一些一次预览许多视频流的功能,但因为大多数(模拟)卡必须在设备之间重新调谐,结果不是实时的
  • camserv:它提供了自己的网络服务器,你可以通过任何网络浏览器实时观看视频输入,支持 motion JPEG 格式。然而,这里没有声音支持
  • mencoder:mplayer包的一部分,它提供了一个命令行接口来记录来自 V4L 通道的 AV 信号
  • motion:一个集成了运动检测的小工具,这样你只需要在有东西在外面移动的时候记录 feed(并因此耗尽硬盘空间)。具体的移动量是用户可配置的,以防止它浪费在风中摇摆的树木或你的猫走过视图的空间

独立 BitTorrent 客户端

这是近年来兴起的众多“Linux in-a-box”设备之一,毫无疑问还会有更多。这些,如 Emprex NDS-100,取代了全功能 PC,并提供 BitTorrent 和文件及打印机共享功能。本质上,它是您希望从一台永远在线的机器上获得的低功耗功能,而无需运行它的高功耗硬件。如果你已经有了自己的家庭服务器,或者打算用它来做其他事情,那么根据你所用的服务器类型,这并不能为你节省太多。例如,迷你 ITX 盒将具有类似的功耗,并提供更好的功能。

红外遥控

对于坐在沙发上看电视的人来说,没有什么比红外遥控器更方便的了。手机中的一个小红外 LED 按预定的顺序闪烁,接收设备上的“眼睛”可以对其进行解码,以改变频道、提高音量等。红外遥控器非常便宜,每个设备都有一次。这是第一个问题,因为随着设备数量的增加,沙发上的可用空间成比例地减少!

第二个问题是视线,所有的红外遥控器都是靠视线工作的。这意味着您必须在适度的容差范围内将遥控器指向设备,以便接收信号。但是把设备放在你面前并不总是很方便;例如,投影仪通常会在你身后。如果电视音频连接到 HiFi,由于空间或电源插座不足,它们可能位于房间的不同位置。或者,您可能希望将 DVD 播放机的电缆连接到卧室或厨房,以便不间断地继续播放电影。在每种情况下,如果不移动自己或设备,您可能无法远程控制设备。

红外遥控器偶尔会出现的第三个问题是接收眼,它并不总是能看到信号。第三个问题通常可以通过在“眼睛”上放置一块磨砂玻璃或透明胶带 15 来解决这将从更大的角度范围衍射入射光,使其更加敏感。前两个问题需要更多的硬件。

多功能遥控器

有这么多组合一体式遥控器,不试一下很难知道该买哪个。不幸的是,这是您通常必须做的事情,因为每一个都有这样或那样的怪癖,使得它不适合您的特定设备。

尽管存在多种多样的“一体化”遥控器,但它们的设计并不相同。您需要考虑您想要控制的每个设备的具体情况,因为在英国和爱尔兰,例如,Sky Plus 使用的红外协议与正常情况略有不同,因此除非您的遥控器专门设计来处理它,否则您的设备将显示为静音。

现在有很多学习遥控器,这些都是很好的投资。另一个有用的特性是宏,它将按顺序存储许多命令。例如,电影模式宏可以将电视切换到 DVD 输入,打开并弹出 DVD 托盘,并将 HiFi 设置为接受 DVD 输入。

红外继电器

这些设备通过将红外信号从一个地方转发到另一个地方来克服视线问题。它们由一个发射机(监控红外信号并通过无线电转播)和一个匹配的接收机(向设备回放相同的红外信息)组成。有了合适的传输范围,就可以从楼上遥控楼下的电视。

有时可能会有多个发射器,一个在厨房,一个在卧室,两者都将信号发送到一个地方,让您可以从任何地方遥控电视。

同样,有时也可能有多个接收器,使多功能遥控器能够从卧室向楼下的电视和隔壁房间的 HiFi 发送命令。然而,这种配置不太常见,因为如果你已经安装了一个红外继电器,设备的位置并不重要,所以它通常在同一物理位置;因此,您只需要安装一个红外接收器,它会将中继信号一次发送到所有设备。如果设备彼此相当接近,但接收器看不到两个设备,则通常使用 Y 形分离器和两个 IR LEDs,而不是购买另一个接收器单元。

两个发射器和接收器之间的通信是通过下面概述的方式之一完成的。

通过架空电缆

如果您的主要目的是中继电视的红外控制,那么您可以获得将红外数据嵌入现有同轴天线电缆的设备,隐藏它的结果与 X10 类似。例如,Labgear MRX120 HandyLink 就提供了这样的解决方案。当然,这种方法需要在每个房间都有一根天线,如果你的重点是电视控制,就会有。如果空中电缆已经存在,那么扩大规模就很容易,因为增加额外的放大器相当便宜,而且是一件简单的即插即用的事情。然而,如果没有现有的电缆,考虑到 IR-RF-IR 的可能性,这可能会更加麻烦,但它可以在 RF 接收特别差的情况下提供解决方案。

在这两种情况下,不可能在每个房间观看不同的频道,即使有 Sky,因为它从调谐器分发单一信号。

Note

当通过同轴电缆传递红外信号时,您可能需要一个红外旁路套件,因为信息在通过分配放大器时会变得混乱。

红外-射频-红外网关

这些设备在重播之前,以如此多的无线设备使用的 433MHz 无线电频率,通过空气中继红外数据。对于这些设备,您可以选择仅红外传输或电视发送器。

仅红外发射器,如 Powermid XL,是这些设备中最简单的一种,它允许您远程控制设备,而无需安装电缆或插座。它们相当便宜,但只传递红外数据,所以当你在另一个房间时,受控设备必须能够对你产生影响。

电视发送器是无线版本的空中电缆或旧的电视分配系统,其中涉及到一个天线放大器和一个单独的天线电缆进入家中的每台电视。电视发送器接收一个输入信号,然后将其发送给任何正在收听的接收器,对它看到的任何红外信号进行编码。市场上有许多变体,包括那些带有 SCART 插座(而不是老式的同轴天线插座)和 RCA 复合视频。即使是更便宜的型号也经常有一个“频道”开关,允许在同一栋房子里使用多个接收器-发射器对,而不会混淆信号。随着这些设备变得越来越主流,一些设备几乎与仅红外发射器一样便宜,电视功能成为免费的附加功能。

IP 上的 IR

也可以使用诸如 KIRA Keene IR Anywhere over IP 这样的设备,通过现有的以太网电缆发送数据。这消除了其他方法可能带来的任何距离或干扰问题,还提供了一种从电脑远程控制红外设备的方法,而无需将电脑及其红外发射器置于设备的物理范围内。

受 IP 控制也意味着红外信号可以通过互联网发送。虽然这本身毫无意义(因为当你不坐着看电视时,你不能从更换电视频道中获得任何好处),但它确实提供了一种从远程计算机控制基于红外的设备的现成方法。如果某样东西可以从电脑上控制,那么它就可以从任何连接到电脑的东西上控制,比如网页或 cron 作业。

使用 KIRA 转发红外代码首先需要你教它这些代码。这是通过使用图 1-15 所示的软件生成文本文件来完成的。

A978-1-4302-5888-9_1_Fig15_HTML.jpg

图 1-15。

Configuring KIRA

该软件可从基恩网站 16 获得,并且已经用 Java 精心编写,使其对 Linux 友好。将 KIRA 连接到您的网络并使用您的 DHCP 服务器为其提供 IP 地址后,您可以添加新命令。首先,您请求将所有红外信息发送到这台机器,然后在按遥控器上的第一个键之前按“Learn”。这将显示如下代码,然后可以复制并粘贴到一个文本文件中供以后使用:

K 240C 037F 0369 03AC 034D 0624 035A 0378 0382 0378 0381 0396 0366 0377

0382 0396 0365 0396 06E0 03AF 034C 072C 0353 0378 2000

我为每个设备使用了一个目录层次结构,这样我的电视的开/关按钮就在目录ir/tv/codes/on中。由于同一个按钮执行两种功能,我在offon之间创建了一个符号链接。那些拥有更大房子和更多电视的人可能会喜欢用一个比电视更具描述性的名字。

虽然 KIRA 有一个网页,但它不是很容易配置,并且限制你只能使用四个预存的红外代码。幸运的是,它还监听 UDP 端口 30303 和 65432 上发送的命令。前者用于设备发现和配置,因此无法更改端口。后者是红外控制端口,它处理所有基本命令来控制范围内的各种红外设备。对这些命令的所有响应也由 UDP 返回,因此您需要运行网络实用工具的两个实例瑞士军刀netcat来处理它。

首先创建两个终端窗口,并通过键入以下命令在其中一个窗口中启动 UDP 服务器:

nc -u -l -p 30303

现在,它将在端口 30303 上侦听发送给它的任何 UDP 消息。现在,在另一个窗口中,在同一个端口上向 KIRA(其 IP 地址已被 DHCP 服务器确定为 192.168.1.111)发送一条消息:

echo disD | nc -q 0 -u 192.168.1.111 30303

您应该看到另一个窗口活跃起来,并报告有关设备的各种统计信息。如果没有,检查端口是否打开,并且正在使用(网络的另一把瑞士军刀)netstat:

netstat -ntpl

通过一些普通聪明的bash编码,您可以使用如下脚本获得相同的结果:

#!/bin/bash

TEMPFILE=mktemp``

nc -u -l -p 30303 >$TEMPFILE &

PROCESS=$!

echo disD | nc -q 0 -u 192.168.1.111 30303

# Wait for a second so the output has finished writing

sleep 1

kill $PROCESS

cat $TEMPFILE

rm $TEMPFILE

发送红外信息的过程是相同的,只是您需要切换到红外端口。这里有一个例子:

cat ir/codes/tv/off | nc -q 0 -u 192.168.1.111 65432

发送到端口 65432 的唯一响应是 ACK,可以安全地忽略它。但是,如果您决定监听端口 65432(并且您已经请求将所有 IR 消息转发到您的 PC),那么您将会看到键码出现。这些可以从终端窗口(而不是使用 web 界面)复制到您自己的配置文件中。有一个提供的 API 文档详细说明了每个端口处理的每个命令。注意,通过使用您的 Linux 机器来维护 IR 代码,您不需要将 keycode 文件上传到它的 web 服务器上的四个插槽之一。

Note

您的网络上可以有几个 KIRA 设备,每个设备向不同的设备发送消息,尽管 KIRA 要接收消息并将它们发送回 PC,您必须从其 web 界面显式启用该功能,并给它一个 IP 地址,在那里netcat或类似的设备将被监听。

红外控制

如果您的电脑离您想要控制的红外设备很近,则很容易为其添加合适的基于 USB 的发射器或接收器。这些可以从 RedRat 这样的地方买到,也可以根据 LIRC (Linux 红外线遥控)提供的电路图制作,该公司也提供了软件。

Caution

大多数个人电脑将 USB 端口直接连接到主板上,如果你在构建自己的设备时出错,你可能会毁掉它。购买一个单独的带有 USB 插座的 PCI 板应该可以提供一些保护,防止意外事故的发生。

对于红外传输,您需要知道您想要控制的设备的特定控制代码。如果你有一台标准的电视机或录像机,这些数据通常可以在网上获得(http://lirc.sourceforge.net/remotes/);否则,你也需要购买或建立一个红外接收器来教 LIRC 现有的代码。幸运的是,如果你接受了早期的提示,买了一个 RedRat,你将有一个内置的接收器,与提供的 Windows 软件或 LIRC 一起,可以直接用于编程代码。

LIRC 17 是读取和传输红外数据的 Linux 标准方法。它由一个标准的守护进程lircd和一组工具组成,这些工具记录输入的消息并把它们再次传送回来。它采用模块化方法来支持各种可用的 LIRC 设备。在这里复制安装指南可能有些鲁莽,但可以说有三种主要类型的支持控件:

  • GPIO 设备:这些设备通常与电视卡一起提供,例如 Hauppauge 的电视卡。这些模块通常被编译成标准的守护程序版本
  • 串行端口设备:这涵盖了各种不同的设备,包括自制的发射器,因为它们直接处理串行数据,所以不需要任何特定的驱动程序代码。典型电路可从 LIRC 网站获得。如果你不确定要不要把自己的电子设备连接到你的电脑主板上,你可以买串行 PCI 卡,它可以提供一定程度的保护,防止流氓电子设备
  • 内核驱动程序:这些驱动程序,比如 RedRat3 设备,要求您从源代码构建 LIRC,并且(在某些情况下)将新的驱动程序代码复制到 LIRC 目录中。从这里,您可以重新构建安装(data2setup.sh)文件,并正常构建。这些设备将使用/dev/lircd设备,该设备应该拥有ugo+rw权限

一旦构建完成,就可以根据 LIRC、 18 的表格配置和准备驱动程序,该表格还提供了各种设备的示例配置文件,这些文件用人性化的名称描述了每个按钮以及要发送的红外信号的详细信息。从这里,您可以在.lircrc文件中添加在各种按钮按下时触发的特定命令,其格式如下:

begin

prog = mythtv

button = Rew

config = Left

end

遥控器上的每个按钮都以这种方式映射到软件的一个功能(prog)。

一般来说,使用 RedRat 和 LIRC 的最大好处之一是它可以包含在许多标准媒体播放器、混音器和电视应用中。因此,如果这是您的 IR 的主要目的,那么您已经完成了您的媒体安装,因为这些命令可以触发现有软件中的一些有用的东西!

LIRC 也有一个网络模式,您可以通过网络套接字与 LIRC 守护程序通信,允许外部应用程序像本地红外遥控器一样工作。这对于测试是有用的,并且作为一种远程基于 PC 的媒体播放器的方法,无需编写新的代码。

对于更具体的应用,您将需要使用irexec,如下所示:

begin

prog = irexec

button = ok

config = /usr/bin/someprogram with arguments here

end

通过这种方式,您可以使用 IR 遥控器与其他任意应用程序进行交互,包括其他机器上的媒体播放器。此外,你可以采用与 Cosmic 相同的想法(本章前面提到过,在第七章中有更详细的介绍)来开发一个基于状态的控制机制,使用非常便宜的红外发射器。

结论

您家中的每个设备都应该能够被远程控制,或者通过电源线(X10 或 C-Bus),以太网插座,或者通过基本的红外线。这是两阶段过程的第一步。第二种是当你有一台计算机能够向这些设备发出控制信息。届时,这些设备可以在世界任何地方无缝使用。当设备不支持这样的功能时,你就得黑它。这就是极客乐趣的开始!

Footnotes 1

法拉第笼可以工作,但在家庭环境中通常不实用!

2

您可以通过观察 http://jvde.us/x10/x10_cfls.htm 处显示的示波器轨迹来见证引入的噪声。

3

感性负载使用磁场,通常以电机或螺线管为特征。

4

阻性负载将电流转换成其他形式的能量,如热能。

5

一些标有 ZED 的设备可能无法作为 ZC 或 ZR 使用,因为需要的功能较少,所以可能是故意这样设计的。价格可能是一个指南。

6

C-Bus 主要在英国和澳大利亚使用,在美国相当于 SquareD Clipsal。这是为了避免与利用消费电子总线(CEBus)的类似技术 CEBus/EIA-600 相混淆。

7

只要它们是以网络模式配置的。

8

旧的电力线控制器与新的 Insteon 设备不兼容。

9

您可能还会看到它被列为 10.0.0.0/8,其中 8 表示地址中 32 位二进制数字的前 8 位是固定的,因此在 10.0.0.0 到 10.255.255.255 之间有超过 1600 万个地址。类似地,您可能还会看到以下使用中的地址:172.16.0.0/12(在 172.16.0.0 到 172.31.255.255 之间提供超过一百万个地址的范围)和 192.168.0.0/16(在 192.168.0.0 到 192.168.255.255 之间提供 65,536 个地址的范围)。

10

有两个地址保留给子网(0)和广播(255),因此总数从 256 减少到 254。

11

有些路由器不能离开 192.168.1.1 进行配置,因此最好避免将此号码用于其他用途。

12

通过检查dmesg | grep eth的输出或将别名eth1 mynetcarddevice添加到/etc/modules来确定这是 eth0 还是 eth1。

13

10.2 及更低版本。

14

除非挂载在/etc/fstab中,否则只能通过使用 umount 目录作为根目录来卸载。

15

www.cleverandeasy.com/Multimedia/increase-operating-angle-of-infrared-remote-control.html

16

www.keene.co.uk/electronics/multi.php?mycode=KIRA

17

lirc.org

18

www.lirc.org/html/table.html

二、设备黑客:转换现有技术

Abstract

黑客行为有三种经典形式:软件、硬件和湿件(也称为社会工程)。最近,固件黑客攻击变得突出,因为利用嵌入式 Linux 的低成本硬件为无法构建硬件的软件黑客打开了大门。我将在本章中讨论硬件黑客及其相关软件。

黑客行为有三种经典形式:软件、硬件和湿件(也称为社会工程)。最近,固件黑客攻击变得突出,因为利用嵌入式 Linux 的低成本硬件为无法构建硬件的软件黑客打开了大门。我将在本章中讨论硬件黑客及其相关软件。

软件黑客

对于大多数开发人员来说,软件是一个更容易的黑客,因为与入侵硬件相比,不可挽回地破坏某些东西的机会大大减少了。事实上,当史蒂夫·沃兹尼亚克和史蒂夫·乔布斯在家酿电脑俱乐部制造机器时,他们推断,每一个对硬件感兴趣的黑客,就有 100 个对软件感兴趣的黑客,所以他们专注于苹果电脑的软件功能。当 Acorn 在 1981 年建立 BBC A 和 BBC B 时,一个类似的主题是真实的,因为他们努力开发软件,使其适合学校的学习。

历史肯定会重演,Raspberry Pi 利用这些理念提供了一台小型机器,其中的软件是最容易破解的部分。他们甚至通过将树莓 Pi 模型的前两次迭代命名为 A 和 B,向最初的 Acorn 机器致敬!树莓派如此成功,以至于很难保证供应能满足需求。因此,有时有必要在易贝寻找旧的二手设备来完成更适合树莓派的任务!

Linksys NSLU2

这种旧设备也被亲切地称为“Slug”,是一种小型的嵌入式 Linux 设备,旨在用作网络可寻址存储(n as)设备。你插上电源,一根网线,和(最多)两个 USB 硬盘,你就可以使用 Samba 协议从同一网络子网上的任何机器上检索存储在上面的数据。

该机器本身是无声的,由 Intel XScale IXP420 驱动,并包含 32MB 的 SDRAM 和 8MB 的闪存,用于存储软件。它的低价位和固件的开放性对想要添加或改变机器上的软件的黑客来说很有吸引力。该机已于 2008 年正式停产,但仍可在各种商店和网上买到。

就其预期形式而言,当只需要文件服务器时,Slug 是一种合适的机器,既可以作为桌面工作的远程备份(可能位于楼梯下或阁楼上),也可以为家中的媒体播放器提供音乐。但是,通过更改其固件,它可以变成以下形式:

  • Web 服务器(Apache、PHP、Perl 和 Python 都受支持)
  • 电子邮件服务器
  • 打印机服务器(Slug 的成本可能低于 USB 打印机与其联网的同类产品之间的差异,尽管这种差异不如以前大)
  • 媒体服务器(通过 Squeezebox 服务器、iTunes 或 Samba 共享)

在任何软件更改发生之前,您必须首先将一个不受限制的 Linux 版本安装到设备的固件中,这是通过其内置的 web 界面进行的。这里有两个主要的变体:Unslung(使用 Optware 包)和基于 OpenEmbedded 的 SlugOS(正式名称为 OpenSlug)。

从悬挂处取下

对于基本的改进和最少的麻烦,Unslung ( www.nslu2-linux.org/wiki/Unslung/HomePage )是首选,因为它安装在现有固件之上,看起来与最终用户非常相似,因为它基于原始 Linksys 代码。该固件提供了额外的功能,例如使用 FAT 格式化磁盘的能力,如果您想使用现有的硬盘驱动器,这是必要的,因为 Slug 中使用的任何磁盘都需要在使用前进行特殊格式化(到 ext3)。

还可以使用如下命令通过 Optware 安装额外的软件包:

ipkg install apache

但是,您需要小心,因为它们被安装到内部闪存,这可能会很快耗尽,从而导致设备无法启动。为了防止这种情况发生,您需要将操作系统移动到其中一个外部驱动器上(USB 记忆棒或整个硬盘驱动器,具体取决于您打算添加的内容的范围和大小),这一过程称为“解除您的 Slug”或者,您可以执行硬件破解来增加内存。

数百种包装可用于非悬挂式废料浆,包括:

  • BitTorrent 客户端
  • Xbox 媒体服务器的流媒体工具
  • Apache web 服务器
  • 星号 VoIP
  • 杯子
  • 饭桶
  • 关系型数据库

正如你所看到的,大多数主要的软件包都是可用的,这使得这是一个非常低功耗的机器,能够提供大多数家庭任务。但是,它们都受到 2.4 内核的限制,所以对于更奇特的硬件(如蓝牙),您将需要采用 SlugOS。

斯拉格洛斯

SlugOS 是一个更大的努力,它像对待任何其他硬件一样对待 Slug,它有一个基本的操作系统和用于主要功能的独立包,符合传统的 Unix 思想“做一件事并把它做好”。这也删除了特定于 Slug 的功能,如基于 web 的配置工具和基本服务,如 Samba,因此您必须显式安装。

如果您使用 Slug 作为一个更大的家庭自动化服务器的基础,那么这在升级路径中提供了更大的范围,因为它让您可以访问 SlugOS 所基于的 OpenEmbedded 项目提供的数千个包。但这样做需要您将一个连接的硬盘驱动器的一部分或全部专用于操作系统,这是一个需要您将一个小系统安装到闪存中,然后将操作系统引导到硬盘驱动器上的过程。这样,SlugOS 允许使用基于 2.6 的内核以及 RAID 和 NFS 功能。

当使用外部 USB 驱动器保存操作系统时,请始终使用硬盘驱动器(而不是记忆棒)。这是因为一些应用程序(如 MySQL)会向交换文件中写入大量内存,并且因为闪存在大约 100,000 次写入后变得不可用,所以这种情况迟早会发生。或者,您可以将交换文件分配到第二个(硬盘)驱动器,允许操作系统从只读记忆棒启动和运行。

在弹头上发展

要为 Slug 编写您自己的软件,您应该从 SlugOS 开始,因为这使您可以访问标准开发工具,这些工具运行在允许在 Slug 上编写、编译和测试代码的设备上。这就是所谓的本地开发。首先,您需要运行以下命令,以及其他标准构建包(详见 www.nslu2-linux.org/wiki/HowTo/SlugOSNativeCompileEnvironment ),然后再正常开发您的代码:

ipkg install slugos-native

然而,如果没有屏幕,你将无法使用 GUI 调试器,比如kdbg,这对一些人来说可能是一个可怕的降级。然而,无头运行机器是完全可能的,因为你可以通过sshtelnet远程连接。这是优选的,因为机器的速度使得 GUI 方法对于大型应用不切实际。您更有可能为您的桌面机编写和测试您的应用程序,然后,当它准备好了,为 Slug 进行交叉编译。

交叉编译是一个过程,通过这个过程,运行在机器 A 上的编译器能够生成适合于机器 b 的代码。为此,您需要一套新的编译器、工具、头文件和库(统称为工具链),它们是专门为另一种体系结构构建的。这些文件与您现有的开发文件分开存储,因为它们会与运行您机器的文件冲突。然后,编译过程照常进行(通过makegcc的变体,如armeb-linux-gnu-gcc)以产生合适的可执行文件,或者 Linux 术语中的 elf。

安装这些工具的最佳介绍在 www.nslu2-linux.org/wiki/DebianSlug/CrossCompiling

请注意,如果您只使用现有的包,那么任何形式的编译工具都是不必要的,您可以完全依赖预构建的包。

黑客入侵游戏机

游戏机非常适合玩游戏。旧游戏机非常适合玩旧游戏——也适合入侵 Linux 机器!随着上一代机器变得便宜并且技术过时,旧的游戏控制台为媒体播放器、网络服务器、控制单元等提供了良好的嵌入式平台,因为它们总是具有适合于电视的连接器,并且在客厅中看起来很自然。在这一节中,你将学习如何让这些机器按照你的意愿运转,而不是它们的具体用途。

唉,这并不是一帆风顺的,因为制造商没有向计算机游戏行业以外的任何人提供编译器或开发环境,即使这样,也只有严格的保密协议(NDAs)才能实现。虽然这应该足以满足过分热心的法律部门,但他们随后建立了安全措施,通过加密光盘格式、BIOS 或可执行文件来使在其上运行自制代码变得困难。对于黑客来说,这本身就是一个有趣的问题。因为大多数制造商在游戏机上赔钱(知道他们会在游戏上收回),颠覆性的黑客更喜欢这个过程。

尽管成本不断下降,但不值得为了将一台新主机黑进 Linux 机器而购买它,但慈善商店和在线拍卖可以为黑客提供上一代硬件,其成本使时间和 geek-cred 值回票价。(尽管这是一个更简单的命题,只需使用一个树莓派!)然而,面对所有的技术挑战,随着更新更强大的机器的出现,或者随着时间效益超过替代设备的成本,领导这些控制台黑客项目的人的兴趣往往会减弱。所以,很可能是部分(或者全部!)在你读到这篇文章的时候,这些项目可能已经失宠了,因为 Xbox 360 已经过时了,而 PlayStation 4 是当前的游戏机。

"梦幻女郎"

Dreamcast 是 1998 年在命运多舛的世嘉土星之后发布的一款游戏机。它是由 IBM 研究员 Tatsuo Yamamoto 和世嘉硬件工程师 Hideki Sato 领导的两个工程师团队在世嘉内部竞争中的获胜者。最终的控制台采用了两种设计的元素,并基于 200MHz 日立 SH4 RISC 处理器和 VideoLogic 的 PowerVR2 图形芯片,对于视频播放来说速度足够快。

它还配备了一个光学 GD-ROM 驱动器,支持标准的 CD-ROM 分区(包括操作系统),以及游戏的专有格式部分。这款游戏机也标志着微软首次将 Windows CE 操作系统与其 DirectX 技术相结合,进军硬件领域。

该控制台还包括一个视觉内存单元(VMU),除了是一个基本的内存盒外,还具有 8 位处理,48 ×32 像素 LCD 屏幕,D-pad 和四个基本按钮。它原本是用来作为一个辅助游戏设备,而不是一个掌上游戏机本身,需要插入控制器才能发挥作用。这是一个好主意(几年后,索尼在其 PocketStation 设备中再次使用了这一想法,该设备也具有红外控制功能),但与当时的同等技术相比,它对于任何重要的工作来说都不够强大。

世嘉还通过为 Dreamcast 提供鼠标、键盘和以太网(俗称宽带适配器,或 BBA)等外围设备走在了前列。后两者被认为是安装和使用 Linux 的基础。

LinuxDC ( http://linuxdc.sourceforge.net )是一个古老的——几乎已经不存在了——的项目,最近已经看到了一点新的生机。这是一个相当完整的发行版,适合 web 浏览(带 BBA)、电影回放和仿真。这本身是一个很好的技巧,但也有电缆提供双向串行通信,要么在 Dreamcast 和 PC 之间,要么在红外(IR)发射器和接收器等外围设备之间。您可以使用 http://mc.pp.se/dc/serifc.html 所示电路中的一个芯片和三个电容器自己构建这种电缆,或者购买类似的兼容电缆,即众所周知的 DC 编码电缆。

还有一种用于 Linux 的 Dreamcast 仿真软件叫做 LXDream,它提供了一种快速的方法来验证各种 Dreamcast 软件黑客是否工作。你可以在 www.lxdream.org 找到这个,它还提供了从 www.lxdream.org/wiki/index.php?title=Dreamcast_Linux 到 LinuxDC 的预建磁盘映像 iso 的所有重要链接。

Note

像 LXDream 这样的模拟器需要机器原始 BIOS 的映像。因为这些通常仍受版权保护,所以它们不与模拟器打包在一起,必须从一台机器(您合法拥有的机器)中提取。

除此之外,还有各种独立软件可以交叉编译,并通过串行 DC 编码电缆上传到 Dreamcast。其中一些显示在 http://mc.pp.se/dc 的页面上。这包括文本、图形、声音和串行通信的示例源代码。通过避免操作系统,您可以更好地利用相对较小的 16MB 内存和 200MHz 处理器,但这是以降低开发难度为代价的。

索尼游戏机

索尼现在正在推广其第三代游戏机,富有想象力地命名为 PS3。把整台机器变成一个家庭自动化设备(因为它已经是一个非常强大的媒体播放设备)仍然太新,在经济上不可行,但如果你想的话,你可以在上面安装 Linux,前提是你使用 3.15 或更早版本的固件,或者使用其他 OS++。 2 (注意,Slimline 版 PS3 不支持这个。)对于软件工程师来说,这是一个学习 CELL 架构的好平台,但因为内核不是为这种芯片优化的,所以操作系统相对较慢,这意味着同样的钱和电可以更好地用于标准 PC。然而,这台机器的新颖意味着有两个旧的游戏机被忽视了,可以用很少的钱买到。

游戏机 1

1994 年发布的第一款 PlayStation(现在称为 PlayStation 1,以区别于 PlayStation 品牌)只有 2MB 的 RAM,33.8MHz 的 CPU,没有内存管理单元(MMU),这意味着只有 uClinux 内核适合移植,但即使在那时,转换系统的其余部分也很困难。似乎只存在一个安装,Runix(最初称为 PSXLinux),尽管现在几乎不可能找到。这并不是很大的损失,因为与现代游戏机不同,它没有硬盘,这限制了它作为 Linux 机器的使用。

不使用现有的 Linux 软件,仍然有可能使用 Net Yaroze 和利用 128KB 存储卡进行临时存储来从头开发应用程序。它包括一个黑色的 PlayStation、控制器、电缆、软件和软件开发手册,旨在通过提供一种在 PC 上编译软件并通过串行电缆(也用于调试)上传到 PlayStation 的方法,让爱好者进入该领域。这台机器是通过邮购和向大学出售的,但并不成功。最终,这些设备并不多,所以它们主要是在发烧友之间进行交易,以获得额外的金钱。然而,该机的速度使其不适合视频播放, 3 以及缺乏通信端口进一步限制了其潜力。

PlayStation 1 更好的用途不是作为电脑,而是作为 CD 播放器,尤其是第一版。这是因为与后来的版本相比,最初的控制台内部有一个大大改进的 DAC,在播放 CD 时,它可以提供专业的音频质量输出。该型号可以通过型号 SCPH 100x 和独立的音频和视频 RCA 输出来区分。

PlayStation 2

索尼的第二台机器于 2000 年发布,名为 PlayStation 2(你可能会在这里发现一个命名模式!),并且它提供了比其前身更大的功率。它有 32MB 的内存,包含独立的 I/O、声音和图形芯片,还有一个名为 Emotion Engine 的主 CPU(运行频率为 294.9MHz 或 299MHz,取决于它是原始设备还是后来的设备)。这使得它成为 Linux 的一个更现实的规范。此外,索尼公司提供了一条简单的途径,它出售自己的补充套件,名为 PS2 Linux。它为最终用户提供了硬盘、键盘、鼠标、以太网适配器以及开发软件所需的软件和手册。这些套件不再出售或支持,但有些可以从旧库存和二手经销商处获得。如果你忽略电视输出而使用显示器,开发起来会更容易——你需要一个绿色同步的显示器。所提供的发行版最终是基于带有 2.2.x 内核的 Red Hat 的旧版本,尽管现在存在更新的版本,以及 Mozilla、XChat 和各种轻量级 GUI 应用程序;使用 USB 端口的实用程序,如打印机和照相机;和网络端口。虽然工具包和软件磁盘偶尔还会出现在易贝,但这个网站已经被关闭了。在 http://web.archive.org/web/20130303202328/http://playstation2-linux.com .仍然有一些网页内容可以通过返程机获得

除了官方的 Linux 发行版之外,还有大量的自制软件可供选择,比如媒体播放器和模拟器。你可以从像 http://sksapps.com 或者旧的 exploitstation.com site (now languishing at http://web.archive.org/web/20100712044012/http://www.exploitstation.com 这样的网站下载它们作为 elf,或者你可以在 PC 上使用一套交叉编译工具自己构建它们,并从光盘、存储卡、网络或者 USB 记忆棒上运行。

说服 PS2 运行未经许可的软件不再困难,因为已经发现了几个纯软件漏洞,以及所谓的 modchip 被物理焊接到计算机本身的硬件黑客。

一种软黑客被称为 PS2 独立漏洞,其中一个 PlayStation 1 游戏的光盘被用来从存储卡加载一个特殊的文件,这反过来会触发缓冲区溢出,允许未签名的代码运行。这在 http://sksapps.com/index.php?page=exploitinstaller.html 有详细解释。

免费的 McBoot ( http://freemcboot.psx-scene.com )是一个较新的软黑客,它还允许你通过安装捆绑在特定存储卡上的特殊软件来运行自制软件。它还可以在超薄 PS2 和大多数新机器上工作(不同于独立漏洞),目前已知的唯一例外是日期代码为 8c 和 8d 的机器(BIOS 版本 2.30)。

最近的黑客攻击和解放努力导致了一个名为 kernelloader ( http://kernelloader.sourceforge.net/ )的项目,该项目利用这些方法在您的 PS2 上创建一个完整的 Linux 发行版(一个苗条的 PS2 需要从直播 DVD 而不是网络启动),此时您可以正常使用机器。

除了列出的站点之外,一些视频共享网站还包括描述该过程的可视教程。而且,一如既往,你也许能找到合适的 modchips 进行硬件黑客攻击。

便携式游戏机

还有一个最终的 PlayStation 产品需要提及,因为 PS3 太新了,PS Vita 也没有得到充分利用,所以我们不会关注它!PlayStationPortable (PSP)于 2004 年发布,基于 PS2。这是一个手持设备,通过 802.11b WiFi 连接为 HA 黑客带来好处。IrDA 也是老的 PSP-1000 型号的特色,新版本(PSP Go)支持蓝牙。所有这些都有双 MIPS R4000 芯片,运行频率为 333MHz 4 和 32MB 的 RAM,使它们成为功能强大的设备。

然而,像大多数游戏机一样,PSP 被设计成只能运行索尼创造的签名代码,因此在任何真正意义上它都不能成为一台可编程计算机。而且,像大多数游戏机一样,黑客们通过利用最初 1.5 固件中的一个问题找到了规避这一问题的方法。这最终导致索尼公司进行了一场猫捉老鼠的固件升级游戏,以堵塞这些漏洞(并通过包括网络浏览器等新功能来贿赂用户进行升级),因为黑客试图重新打开这些漏洞,或想办法降级到 1.5(不触发索尼公司在固件中放置的木马代码,这将“砖化”你的机器)以利用旧的漏洞。

PSP 有各种各样的自制软件,包括 YouTube viewer PSPTube 和 Xbox Media Center 的控制应用程序;好的出处是 http://dl.qj.net/PSP/catid/106 。然而,这款设备的一个真正好处是,你甚至不需要侵入它就可以安装一个网络浏览器,因为(从 2.0 版本开始)NetFront 浏览器已经默认包含在内,从 3.90 版本开始,它已经包含了用于 VoIP 通话的 Skype。因为大多数家庭自动化设备都带有 web 服务器,或者可以很容易地编写一个 web 服务器,所以 web 浏览器足以实现相当高水平的家庭控制。

Note

如果你打算使用定制的或破解的固件来运行自制软件,那么一定要在设备的生命周期中尽早这样做。这样,如果固件更新过程中出现问题,您不会丢失任何个人数据。

游戏机种

像索尼 PlayStation 3 一样,微软目前的游戏主机 Xbox 360 太新太贵,不值得黑进其他东西,尽管许多人都致力于解决这个问题,并为此创建了 www.free60.org 项目,该项目现在能够运行自制代码。

Xbox 游戏机于 2001 年推出,这可能是许多人第一次考虑使用(接近)标准的 PC 连接到标准电视的可能性。这无疑得益于微软在该部门使用了 Windows 和 DirectX 技术,这两种技术都是众所周知的,从而为黑客提供了非常低的准入门槛。

作为一个单元,Xbox 基于 733MHz Pentium III 芯片,64MB 内存,以及 DVD-ROM 和 10GB 硬盘驱动器——默认情况下,这是唯一的上一代游戏机。它还支持以太网和 USB 端口,但具有专有的外形和布线。这种抗议性的疏忽导致许多公司仅仅围绕 Xbox USB 转换器的销售制定商业计划,这种转换器有很多!

作为一个物理单元,它非常大(320×100×260 毫米),并且有一个相当嘈杂的风扇,尽管硬件黑客可能能够将它压缩到笔记本电脑的大小,并用一个安静的风扇代替风扇。在任何情况下,您肯定希望机器远离您的耳朵和正在使用的扬声器系统。

运行 Linux

在微软的首款旗舰游戏机上运行 Linux 有一种反常的极客乐趣。此外,由于我们正处于其生命周期的末期,任何损坏、无效保修或机器损坏对我们来说都没有几年前那么重要了。此外,黑客社区有足够的时间来改进黑客攻击过程,以便即使那些害怕烙铁的人也可以毫无畏惧地进行攻击。主站点是 www.xbox-linux.org

Note

虽然所有的 Xboxes 都能够运行 Linux,但 1.6 版存在许多问题,因为 BIOS 不再存储在可以(重新)刷新的芯片中。这种芯片被称为薄小外形封装(TSOP),而是硬连线的,需要使用加载了克伦威尔 Linux BIOS 的额外硬件修改芯片,即使这样,由于使用不同的图形硬件,可能的输出分辨率也大大降低(只有复合和 S-video 以及过扫描,以及高达 480p HDTV)。您可以通过 www.xbox-linux.org/wiki/Xbox_Versions_HOWTO (处的图表确定版本号,可能需要通过 http://web.archive.org/web/20100728124622/ http://www.xbox-linux.org/wiki/Xbox_Versions_HOWTO 处的存档版本进行访问。

和通常的控制台黑客一样,有硬件和软件两种方式。硬件方式包括购买和焊接 modchip 尽管使用它们的合法性值得怀疑,但这为黑客攻击提供了最广阔的空间,因为您可以执行以下操作:

  • 增加硬盘大小(但仍建议小于 137GB)
  • 用另一个硬盘或 DVD-RW 更换 DVD
  • 使用 Linux 下的所有磁盘空间

安装芯片后,你需要欺骗 Xbox 运行允许你使用它的代码。这是通过漏洞利用来实现的,例如 MechAssault 漏洞利用,它使用游戏中的破损代码和精心制作的保存游戏文件,此时你可以将任意数据传输到 Xbox 上(通过网络)并运行应用程序来用它刷新 BIOS。这个过程很简单,但很复杂,因为你需要适配器电缆、正确版本的游戏和一台单独的机器。如前所述,这是将 Xbox Linux 引入 1.6 版机器的唯一(相对)安全的方式。

硬件黑客的缺点是 Xbox 游戏(换句话说,Xbox Live)的在线组件不可用,因为微软将禁止任何人在其机器上使用 Linux。

软件破解包括大部分相同的步骤,在 www.xbox-linux.org/wiki/Software_Method_HOWTO (或 http://web.archive.org/web/20100728124622/http://www.xbox-linux.org/wiki/Xbox_Versions_HOWTO 如果网站离线)详细解释了一些额外的复杂情况。自然地,作为软件,Linux 安装会在每次重启时消失——您的数据会保留,但您必须恢复启动 Linux 的黑客程序才能访问它。

曾经有一个 Xbox 巧克力项目,Xbox Linux 用户将帮助潜在用户修改他们的机器。它仍在进行,但志愿者越来越少。询问您当地的 Linux 用户组(又名 LUG 见 www.linux.org/groups 为你的本地组)可能是另一种想法。

黑一个 Xbox 的原因,看你自己了。如果你只是想让它播放 DVD,那么微软 DVD 播放套件是一个更好的选择,它自带 IR 遥控器。作为一个机顶盒,按照今天的标准,与我已经提到(并将提到)的其他解决方案相比,它可能有点嘈杂。但是作为一个次要的(甚至主要的)文件服务器,web 服务器,甚至桌面机,它有着非常积极的极客凭证。

播放器

尽管名为 Xbox Media Center (XBMC ),但在非 Xbox 平台上运行的版本比 Xbox 平台上的多,包括 Raspberry Pi 和 Live CD 的版本,所有这些都可以从 www.xbmc.org 获得!这是因为该软件只能使用 Xbox 开发工具包(XDK)进行编译,该工具包只提供给获得许可的开发人员。因为微软不喜欢 Linux 开发者在它的控制台上编写开源软件,所以爱好者不能以任何形式使用它。因此,在野外运行的 XBMC 的唯一本地版本是那些由授权开发者编译的版本和那些开发者泄露的版本。这种版本的合法性受到严重质疑。在这两种情况下,你仍然需要一个修改过的 Xbox 来运行代码,就像在 Xbox Linux 上一样。

Note

如果您可以使用 Xbox 软件,那么您可以使用 XBMC 的 Microsoft DVD 播放套件附带的红外遥控器。

作为软件,XBMC 包含许多高端功能,仍在积极开发中。这包括一项减少启动时间的倡议,使它看起来更像一个机顶盒,而不像一台运行软件的计算机——这是所有家庭自动化设备都应该追求的目标。

它的功能包括播放几乎所有格式的媒体(来自硬盘、光学媒体、网络共享、在线流和源,以及 iTunes 的 DAAP),显示照片,运行 Python 编写的插件(用于天气预报等),以及玩游戏。它还能够通过 IMDb(亚马逊拥有的互联网电影数据库)和 FreeDB(用于 CD 曲目列表)的数据服务来支持媒体。对许多人来说,XBMC 最大的乐趣在于它的可剥除性,它允许任何一个只有最低限度知识的人为软件创建定制界面。

尽管它很突出,但 XBMC 有几个分支:Boxee,集成到社交网络应用程序中;MediaPortal,一个具有 PVR 处理的以 Windows 为中心的版本;Plex,专注于 Mac OS X 和相关的面向苹果平台的功能(如 iTunes 应用商店);以及支持来自其(商业)视频点播网站的媒体流的 Voddler。

硬件黑客

这类攻击包括对现有硬件或新硬件的更改,您可以轻松构建新硬件来控制现有计算机或受现有计算机控制。

Linksys NSLU2

现有的 NSLU2 单元(又名 Slug)不需要任何硬件改造就可以运行前面提到的任何定制的 Linux 固件。然而,你可以用各种方法来改进这个单元。

永远在线

像大多数消费类硬件一样,Slug 有一个开/关按钮。对于正常操作,这是可以的。但是对于家庭自动化系统来说,它通常是 24/7 工作的(像房子的其他部分一样),这可能会在短暂停电时引起问题,因为机器需要手动重新打开。此外,如果你正在远程控制 Slug 的电源,可能是通过一个定时 X10 设备模块或独立的定时器,它不会完全打开,因为它需要按下按钮。

在第一种情况下,这里有显而易见的解决方案,例如将 Slug 放在 UPS 上或保持其可访问性,以便您可以手动控制它。然而,这些都否定了它便宜、隐蔽、可控(对 HA 来说很重要)的优势。

您可以通过执行几个硬件破解中的一个来使您的保修无效,以确保机器在通电时始终开机,从而解决这个问题。从在各种配置中使用 USB Y 形电缆到将元件焊接到电路板上,不一而足。皆详之,以其优劣在线( www.nslu2-linux.org/wiki/HowTo/ForcePowerAlwaysOn )。

超频

在 2006 年之前,尽管芯片被设计为以 266MHz 运行,但所有 Slugs 的运行速度都低于必要的速度,因为它们的 CPU 主频为 133MHz。这在技术上意味着原始版本是欠频的,这意味着下面的黑客被称为去欠频,而不是超频。如果您登录到您的 Slug(通过telnetssh,取决于您的固件)并键入以下内容:

cat /proc/cpuinfo

你会看到一个 BogoMIPS 值,表示当前的速度。如果这在 133 值的 10%以内,那么您可以通过移除图 2-1 中所示的电阻器来提高速度。

A978-1-4302-5888-9_2_Fig1_HTML.jpg

图 2-1。

The de-underclocking resistor (second from the bottom in the R84 stack). Image from http://www.nslu2-linux.org/gallery/hardware released under cc-by-sa

你可以用指甲钳、烙铁、锯子或以上任何方法的组合来移除它。请确保不要损坏任何其他组件。

串行端口

你可以使用一个标准的串行端口在许多旧技术之间进行双向通信,例如游戏杆、LCD 文本显示器和其他形式的自制电子设备。它还提供了一种在网络等其他路径出现故障时通过getty控制阻塞的方法。

已经有一个串行端口隐藏在 J2 的 Slug 主板上。唉,它的控制电压为 0/+3.3v,而不是标准 RS-232 串行端口所需的+/-12V,这意味着您需要一个功率电平转换器。(然而,严格来说,该标准要求硬件区分+/-3–15V 范围内的电压。)一些转换器可以作为单个芯片购买(如 MAX3232),或者已经包含在一些移动电话数据线中。你可以在网站上找到全部细节( www.nslu2-linux.org/wiki/HowTo/AddASerialPort )。

还有一些电路可以让您轻松地将 LCD 字符显示器(如 HD44780)连接到 Slug,提供基本的(非常低功耗的)显示器来报告当前的媒体播放或机器状态。然而,这也需要打开您的 Slug 进行硬件调整。

乐高 Mindstorms

乐高 Mindstorms 于 1998 年首次发布,最初被称为 Mindstorms 机器人发明系统(RIS)套件,包含一个名为 RCX 的控制砖块,您可以向其上传红外程序。然后,该软件将运行,控制连接到 RCX 砖的各种电机和传感器,并通过红外与其他人通信。这自然会产生与 IR 相关的常见问题,如第一章所述(主要是视线)。有两个版本的 RCX 发布,都在不同的载波频率操作红外(虽然两个 RCX 模块可以在任一频率上传输),但功能相同。

编程可以用多种语言完成,包括 Java、C/C++、Lisp 等的精简版本,只要将其编译成适合内部微控制器(Renesas H8/300)的代码。由于年代久远,它现在相当便宜,尽管提供的红外发射器不支持任何 64 位操作系统,并且正在失去对较新的 32 位操作系统的支持。

2006 年,乐高从 RCX 搬到 Mindstorms NXT。这通过改进处理器(现在是 32 位 ARM7/TDMI 芯片)和通信设备(现在包括 USB、蓝牙和板载 100 × 64 像素 LCD 矩阵)提高了主模块的规格。处理器的升级使得控制软件的改变成为必要,但这是意料之中的,大部分 RIS 代码现在已经移植到 NXT 上。乐高组件也有所改进,如表 2-1 所示。

表 2-1。

LEGO Mindstorms Specifications

| 装备 | 发动机 | 触摸传感器 | 光传感器 | 超声波传感器 | 声音传感器 | 颜色传感器 | | --- | --- | --- | --- | --- | --- | --- | | 远端软体安装服务(Remote Installation Service) | Two | - | Two | one | - | - | | NXT | 3* | one | one | one | one | - | | NXT 2.0 | 3* | Two | one | one | - | one | | NXT 教育 | 3* | Two | one | one | one | - |
  • These are servo motors, which internally monitor their position for greater positional accuracy.

自 2009 年以来,Mindstorms 已经进行了第三次迭代(NXT 2.0),包括与 NXT 2.0 版本相同的 RCX 砖块,一些替代的乐高技术砖块,以及从声音到颜色的传感器变化。这是一个奇怪的变化,因为现在所有的 NXT 2.0 机器人默认都是聋的!这可能是销售更多附加传感器的一种策略,但是对于狡猾的黑客来说,使用网络上或各种书籍中的说明,例如 Extreme NXT,使用标准电子元件可以更便宜地制造这些传感器。 6

乐高 Mindstorms 的优势在于它能够快速制作出可以由电脑控制的硬件原型,以及可以将信息反馈给电脑的远程传感器。这提供了一种方法,通过这种方法,计算机的状态可以由现实世界中的某些东西来演示。同样,它允许计算机在某种程度上理解现实世界。

家庭自动化充满了创意,一旦新鲜感消失,并不是所有的创意都有持久力来改善你的生活。这使得乐高成为一种完美的手段,可以在投入时间和金钱购买 PIC 芯片、电机和仅用于一个项目的机箱之前,构建概念验证硬件。以下是一些想法:

  • 创建一个机器人,当收到电子邮件、私人即时消息或电话时,它会挥手或做手势
  • 使用 NXT 处理器模块上的 LCD 来传递信息,例如天气
  • 创造一个机器人打开冰箱,把啤酒带进客厅 7
  • 为房子周围的传感器和设备创建一个蓝牙网关(用于猫的皮瓣或压力垫)

每个传感器和电机的处理都非常简单,因为这只是一个编程问题,使用一个可用的 Linux 环境,如 leJOS NXJ(LEGO Mindstorms 的 Java)或 NXC(不完全是 C)。关于这个主题的书籍和网络文章比比皆是,包括这个有用的起点: http://www.eggwall.com/2011/08/lego-nxt-mindstorm-with-linux.html

Arduino 作为 I/O 设备

Arduino 及其许多克隆和变体是微控制器板,您可以将其视为成熟的乐高——它提供了一种简单的方式来将现实世界与计算机进行交互,在芯片上(而不是在软件中)处理基本处理任务,并与硬件电机和传感器一起工作。

基于简单的微控制器,目前有 16 种形式的 Arduino,但现在最流行的开发版本是基于 ATmega168 芯片的 Arduino Diecimilanove,尽管它正被使用 ATmega328 的 Arduino Uno 取代。它支持 14 个可配置为输入或输出的数字引脚和 6 个模拟输入。这里缺少的部分是模拟输出,可以通过在 14 个现有数字输出中的 6 个上使用脉宽调制(PWM 8 )或使用额外的电子设备来提供。电源可以通过 USB 端口、电源插座或连接电池夹和电路板的电线来提供。板载跳线用于在 USB 和外部电源之间切换。

对于那些习惯于大型机器的人来说,Arduino 芯片组的规格显得相当小:

  • 14KB 可用闪存(ATMega328 版本为 30KB),用于软件
  • 2KB 闪存,由引导加载程序使用
  • 1KB SRAM 存储器(ATMega328 版本为 2KB ),用于存储数据
  • 512 字节的 EEPROM(atmega 328 版本为 1KB),用于永久数据;相当于一个迷你硬盘
  • 16MHz 时钟速度

即使是内存容量翻倍的 ATMega328,甚至是 256KB 的 ATMega2561,似乎也不够用,尤其是与 Raspberry Pi 相比。然而,Arduino 通常执行的任务非常简单,通常是在比较各种输入和执行简单逻辑的领域,所以这个规范已经足够大了。操作系统中的复杂任务,如 TCP/IP 堆栈,通常是不必要的,因为您可以将这些任务的请求传输到连接的 PC。当它们不匹配时,问题通常通过构建适当的电路并为该硬件组件包含必要的驱动软件在硬件中解决。

如果你有使用其他微控制器或 PIC 芯片的经验,Arduino 在技术上与它们没有任何不同,所以你可以继续使用你以前用过的任何芯片。然而,Arduino 为那些对电子产品缺乏经验的人提供了许多好处:

  • 一个基于 C 语言的开发环境,代替汇编程序
  • 标准 USB 输入/输出控制
  • 一个庞大的黑客社区,发布项目设计并分享技巧
  • 强大的开发板,不太可能在错误连接时爆炸
  • 各种预建的兼容电路板(称为屏蔽板)可提供更复杂的功能,如无线通信。在本章后面的“Arduino 硬件”一节中,你会看到一些例子
  • 对于纯粹主义者来说,开源硬件和架构。这是一个经常被忽视的点。硬件开源使得像 Seeeduino 这样的克隆人制造者得以存在。克隆可以更便宜、更耐用,并且可以使用表面贴装元件,同时仍然保持与 Arduino 及其配套屏蔽的引脚兼容

可能的项目范围类似于 LEGO Mindstorms,尽管现在电路可以小得多,包含更多的分立元件,并通过上述防护罩实现更广泛的功能。LEGO 设备可能会发出嘟嘟声或播放简短的声音来指示电子邮件的到达,而 Arduino 可以使用语音合成或完整的音频回放。

安装和设置

所有 Arduino 软件都写在 PC 上,通过 USB 传输到板卡。这也用于接收 Arduino 选择传输的任何数据,默认情况下通过/dev/ttyUSB0。(记得将您的用户添加到dialout组,以便可以访问/dev/ttyUSB0。)开发可以按照您希望的任何方式进行,但是使用基于 Java 的 IDE 是最简单的。即使您采用命令行方式,代码也需要使用avr-gcc工具链进行编译,该工具链可以安装在 Debian 下,如下所示:

apt-get install gcc-avr avr-libc avrdude

Java,如果卸载,将需要一个额外的行,像这样:

apt-get install openjdk-6-jre

从这里开始,安装 IDE 就很简单了。这是从位于 http://arduino.cc/en/Main/Software 的网站上作为单个档案提供的。将它解压到一个适当的目录(这些步骤都不需要 root 访问权限),并从该目录运行./arduino。然后,在使用之前,您应该设置适当的 USB 设备和 Arduino 类型(分别为工具➤串行端口和工具➤板)。

您可以通过从菜单中选择文件➤新建来开始项目。这就创建了 Arduino IDE 所称的草图。这包括 Arduino 工作文件夹中的一个子目录和一个主源文件。其他源文件可以添加到草图中(通过草图➤添加文件),并将自动包含到项目构建中。这里没有Makefile等价,每一个添加到草图的文件,即使是另一个目录下的库文件,都被复制到草图目录下。注意,尽管在视觉上与 C 代码相似,但为了清楚起见,所有文件都被赋予了扩展名.pde

Note

不能创建给定名称的草图。相反,您必须创建一个空白的新草图,然后选择另存为单独的步骤。

构建过程本身使用avr-gcc在幕后处理,这是一个用于 Atmel AVR RISC 处理器的交叉编译工具链,ATmega168 就是其中之一。它在 sketch 文件夹中创建一个单独的 applet 目录,并将所有头文件和所有源文件的连接复制到其中(以.pde结尾)。正是这个(.cpp)源文件被交叉编译成十六进制,然后上传到 Arduino。

Arduino 软体

大多数人为了测试他们的设置而建立的最简单的电路是闪光灯。Arduino Diecimila 板上的第 13 号引脚有一个内置电阻,允许您将 LED 直接连接到它和 0v 电源,而不会损坏它。一些主板也有表面贴装 LED,所以你甚至不需要它!眨眼教程代码,可以从 IDE 中加载(文件➤例子➤ 01。基本),简单来说就是这样:

int ledPin = 13;        // LED connected to digital pin 13

void setup()          // run once, when the sketch starts

{

pinMode(ledPin, OUTPUT);   // sets the digital pin as output

}

void loop()           // run over and over again

{

digitalWrite(ledPin, HIGH);  // sets the LED on

delay(1000);         // waits for a second

digitalWrite(ledPin, LOW);  // sets the LED off

delay(1000);         // waits for a second

}

这段代码很容易理解,因为许多常见的 C/C++/Java-ism 是不必要的:

  • 不需要头文件
  • Main 已被两个功能取代:设置和循环
  • 没有事件循环或回调。每次循环时都必须读取引脚状态

如果你是一个受过传统训练的开发人员,强烈反对这里使用的阻塞函数delay,那么有一些例子演示如何使用millis函数来推断没有阻塞的时间。

对于大多数复杂的软件和库,您当然可以引用头文件,但是请记住,添加到项目中的任何其他源文件都将被复制。当然,创建自己的库是可能的,但是在这样的小规模项目中,这通常会耗费更多的时间。

读取数字输入

这些是最简单的电路,因为它们由单个电阻和开关组合而成,如图 2-2 所示。

A978-1-4302-5888-9_2_Fig2_HTML.jpg

图 2-2。

Reading a digital switch on the Arduino

在此配置中,引脚 2 用作示例,并在开关断开的所有时间向 Arduino 报告 1(高)电压。这是因为“上拉”电阻 R1。没有它,引脚实际上是断开的,因此其电压可能会波动到 0 到 5v 之间的任何值,从而导致错误读数。(然而,大多数时候,它会浮动到 1。)当开关闭合时,引脚直接连接到 0v 接地轨,导致读取 0。Arduino 代码随后会观察这种变化,如下所示:

int inputSwitchPin = 2;

int lastState = HIGH;

void setup() {

Serial.begin(9600);

pinMode(inputSwitchPin, INPUT);

}

void loop() {

int pinState = digitalRead(inputSwitchPin);

if (pinState != lastState) {

Serial.println(pinState?"released":"pressed");

lastState = pinState;

}

}

这将在某些情况下工作,但不是所有的,因为硬件不是那么简单!开关是机械怪兽,当它们被按下时,往往会在开和关之间“弹跳”几次。然而,如果这个开关连接到一盏灯上,你可能看不到它的开关,因为所涉及的时间是以毫秒来计量的。但是计算机足够快来发现它,所以你需要编写代码来忽略任何状态变化,比如说,在 100 毫秒内发生的变化。

int inputSwitchPin = 2;

int lastState;

long timeLastPressed;

long debouncePeriod = 100;

void setup() {

Serial.begin(9600);

pinMode(inputSwitchPin, INPUT);

lastState = digitalRead(inputSwitchPin);

timeLastPressed = millis();

}

void loop() {

int pinState = digitalRead(inputSwitchPin);

if (pinState != lastState && millis() - timeLastPressed > debouncePeriod) {

Serial.println(pinState?"released":"pressed");

timeLastPressed = millis();

lastState = pinState;

}

}

我在这里使用的开关通常是打开的,顾名思义,在正常情况下保持打开(因此没有电流在触点之间流动),当按下开关时关闭。有些开关标记为常闭,在这种情况下,只需反转示例中的输出即可。

当您不关心所涉及的数量时,也可以使用模拟设备(如光传感器)来报告数字开/关输入。在本例中,您可能对外面是否有光感兴趣,而不是光有多亮。您可以修改电路,如图 2-3 所示。

A978-1-4302-5888-9_2_Fig3_HTML.jpg

图 2-3。

Reading the light on the Arduino

这种电路称为分压器电路,因为电压(正式名称为电位)是由供电轨两端的电阻按比例分压的。R2 是一种光敏电阻(LDR),它在黑暗中具有非常高的电阻(像一个打开的开关),但在亮时几乎像一个闭合的开关(即低电阻)。(这是对过程的过度简化,但足以让事情运转起来。)LDR 在这些条件下的确切电阻取决于具体的 LDR,并非所有制造商或供应商都提供此信息,因此您可能需要进行实验。

这个基本电路可以用来在天黑时开灯(记住要让 LDR 远离有问题的灯!)并可用于监控经过传感器的人,因为他们的影子通常足以关闭 LDR。你也可以得到以类似方式工作的红外发射器和接收器,它们可以放置在门口或前门的任何一侧,这样当有人接近你的房子时,你可以得到预警。

Note

当您对从关到开的状态变化感兴趣时,这就是所谓的上升沿触发。从开到关的变化称为下降沿触发。

读取模拟输入

这些检测连续范围的值。与可用作输入或输出的数字引脚不同,Arduino 上的模拟引脚是硬连线的,因此不需要进行初始配置。这使您除了读取它们的值之外什么也做不了:

int analogInputPin = 2;

int value = analogRead(analogInputPin);

value的结果将在 0 到 1023 的范围内,代表管脚上的电压,在 0 到 5v 之间。

如果您重复使用图 2-3 中的电路,将输入馈送到模拟引脚而不是数字引脚,您可以通过以下方式观察输出值的范围:

Serial.print("LDR brightness = ");

Serial.println(value);

这使您可以凭经验确定灯光的精确亮度。你会注意到这个数据有很多波动,所以最好的方法是通过两个极限和中间的死区来确定它是否足够亮或足够暗以控制光线。也就是说,如果数字从大于 X 下降到小于 X,那么就认为是光,如果从小于 X+N 上升到大于 X+N,那么就是暗。

然后,您可以在电路中添加一个可变电阻来微调亮度,如图 2-4 所示。

A978-1-4302-5888-9_2_Fig4_HTML.jpg

图 2-4。

Controlling the brightness at which the Arduino is controlled

除了光之外,你还可以测量温度(热敏电阻)、距离(超声波测距仪)和旋转位置(通过将手柄或轮子连接到电位计的主轴上)。

Note

你可能听说过 Arduino 内置了一个温度传感器——这部分是真的!它包含在 328 系列(带有“8P”零件号的芯片)及其克隆产品(ATmega16P 和 ATmega168PA)中,但是,唉,没有其他的了。如果你有幸拥有这个版本,那么你可以在 https://code.google.com/p/tinkerit/wiki/SecretThermometer 找到合适的代码。

如果使用不同类型的传感器,读取模拟输入的方法不会改变。事实上,有一个 QM-NG1 气体传感器可以被替换到上述电路中,如果在厨房检测到泄漏,就会发出声音警告。类似地,MQ2 烟雾探测器也可以用于类似的目的。这两种情况传统上都仅限于当地警告。但是通过短信提醒将警告发送到你的手机(关于如何发送此类信息的详细信息,请参见第五章)你可以打电话给朋友或邻居为你检查,特别是当警报在住宅外可能听不到的时候。

发送数字输出

这听起来很简单,包括那些你只想发送简单的开/关信号给电灯开关或小马达的情况。代码需要一个简单的设置和调用,如下所示:

int outputLightPin = 2;

pinMode(outputLightPin, OUTPUT);

//

digitalWrite(outputLightPin, bState ? TRUE : FALSE);

从这里开始,一切都与赛道有关。

Arduino 上的每个引脚都能够提供高达约 40 毫安的电流。这对于大多数小负载来说是足够的,比如灯、缓冲器和一些小马达。如果您的设备使用的电流不超过 300 毫安,那么您可以使用 Arduino 作为开关,仅使用类似于图 2-5 中的电路,从电路板本身提取电流。

A978-1-4302-5888-9_2_Fig5_HTML.jpg

图 2-5。

A transistor switch circuit, allowing you to draw up to 300mA

对于更大的东西,你需要使用一个继电器和单独的电源,如图 2-6 所示。

A978-1-4302-5888-9_2_Fig6_HTML.jpg

图 2-6。

Using a relay to control high power loads Note

实际上,Arduino 适用于高达 800 mA 的高功率负载。但对于脏负载,如电机,300 毫安可能是更保守的明智。

发送模拟输出

如前所述,模拟输出仅在使用 PWM 时在基本 Arduino 上可用。这仅在引脚 3、5、6、9、10、11 和 21 上受支持。 9

analogWrite(analogWritePin, value); // value is between 0 and 255, inclusive

这将允许你改变发光二极管的亮度和压电蜂鸣器和扬声器的音量,但没有太多其他的。实际上,在家庭自动化环境中,你不需要很多其他东西。例如,将电机移动到特定位置,最好使用伺服或步进电机,许多其他形式的定位应该通过使用反馈回路来完成——打开电机开始移动,当传感器显示它已经移动足够远时关闭电机。

创建音频输出

这是 Arduino 可以提供的最简单的人性化反馈形式之一,因为电路只需要一个连接到数字输出引脚的蜂鸣器。该代码是一个简单的循环,每秒在开和关之间改变输出状态 440 次,例如,产生高于中音 c 的 A 音符。

Arduino 主站点上的示例提供了必要的代码,使它发出嘟嘟声并播放简短的音乐。对于那些寻求更高级音乐控制的人来说,有阿姆斯壮( www.bluedust.dontexist.com/armstrong ),Arduino 音乐系统,它提供了一个小型旋律处理器,允许你用这样的代码演奏大本钟的钟声:

ancInitialize(OUTPUT_LOCAL);

ancAssignChannelToPin(CHANNEL_OUTPUT_PIEZO_SPEAKER, piezoPin);

char *pChimesPhrase1 = "L32O4edcL64O3g";

char *pChimesPhrase2 = "L32O4cedL64O3g";

char *pChimesPhrase3 = "L32O4cdeL64c";

char *pChimesPhrase4 = "L32O4ecdL64O3g";

char *pChimesPhrase5 = "L32O3gO4deL64c";

// a quarter past

ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase1);

// half past

ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase2);

ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase3);

// a quarter to

ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase4);

ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase5);

ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase1);

// top of the hour

ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase2);

ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase3);

ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase4);

ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase5);

使用各种屏蔽提供更复杂的音频输出,包括样本回放。

与 PC 的通信

基本的 Arduino 允许通过其内置的 USB 端口与 PC 进行双向通信。这使用了最初用来上传程序的同一串行端口。在发送或接收数据之前,必须先对其进行设置,这两者都受此方法支持:

Serial.begin(9600);

Arduino 只能逐个字节地从 PC 读取数据,因此您需要使用如下代码在循环中读取数据:

int incomingData = Serial.read();

但是,请注意,这个函数是阻塞的。也就是说,在串行端口上有数据之前,它不会从read函数返回。如果你的设备只对信息作出反应,那么这就很好了。然而,更常见的是将它放在循环的开始,用下面的语句包围:

if (Serial.available() > 0) { /* ... */ }

然而,将数据从 Arduino 写回到 PC 更容易,因为数据的大小是已知的。这可以通过Serial.printSerial.println函数来处理,以便快速轻松地获取字符串消息。或者可以使用Serial.write写入单个字节:

Serial.write(byteData);

这对于希望传输大量数据的应用程序非常有用。但是对于测试和开发,我发现简单的基于 ASCII 的协议更容易使用,因为简单的串行终端允许我以人类可读的文本发送和接收消息。Minerva 特性 MINX (Minerva 输入传输)使用分隔符<||>包围控制消息,允许 Arduino 将消息传回 PC,以便进行进一步处理,而不会影响任何其他调试或跟踪消息。我会在第七章的中详细介绍这一点。

Note

某些型号的 Arduino,如 Mega,有三个额外的串行端口,可寻址为 Serial1、Serial2 和 Serial3。

在这个收发等式的 PC 端,你有一个简单得多的工作,因为 Linux 中的一切都被当作一个文件。因此,您可以发出以下命令:

tail -f /dev/ttyUSB0

要查看从 Arduino 发回的所有数据并向电路板引入命令,请使用以下命令:

echo -n send data > /dev/ttyUSB0

正是从这一点上证明了基于 ASCII 的协议的好处。在最简单的情况下,您可以发出这样的命令:

Serial.print("1");

从 Arduino 将 PC 控制程序切换到打开状态,相当于关闭状态。这使得 C 程序非常简单:

// USB script trigger

#include <stdio.h>

char *szUSBDevice = "/dev/ttyUSB0";

int main() {

char v;

FILE *fp = fopen(szUSBDevice, "r");

if (!fp) {

printf("Failed to open USB...");

return 1;

}

while(1) {

if (fread(&v, 1, 1, fp)) {

if (v == '1') {

// button pressed

} else if (v == '0') {

// button released

} else {

printf("%c", v);

fflush(stdout);

}

}

}

return 0;

}

这也包括将非控制代码写入stdout的功能,该代码可被重定向至日志文件。如果您用 g++作为arduino_read来编译前面的程序,那么您可以在后台将其作为一个进程来启动,只需很少的努力就可以使它像守护进程一样:

./arduino_read > logfile 2>&1 &

硬件烧坏

对于一些复杂的应用程序,Arduino 板上的 ATmega168 芯片不够强大,无法处理这项任务。因此,与其他计算机一样,需要额外的芯片来减轻负担。为了与 Arduino 的模块化设计保持一致,这些芯片被构建到具有必要接口电路的独立电路板中,以便它们可以直接安装在现有 Arduino 电路板的顶部。由于这个原因,他们被称为盾牌。大多数屏蔽还包括一个通道,以便其他屏蔽可以放置在它的顶部。然后有一个单独的软件库,用于控制设备,并被复制到Arduino/hardware/libraries目录中。

Note

并非所有的屏蔽都与 Arduino 的所有型号兼容。

市场上有许多 Arduino 屏蔽,大多数都有免费提供的规格和电路图。每个防护都有特定的任务,包括以下问题领域。

以太网网络

Arduino Ethernet Shield 支持四个并发连接,使用 TCP 或 UDP 数据包在客户端或服务器模式下工作。它基于 Wiznet W5100 芯片组,使用数字引脚 10–13 进行通信。

无线电控制

由于 Arduino 黑客的出色工作,现在有一个 WiFi 盾可用,能够使用 802.11b 和 802.11g 协议。 http://arduino.cc/en/Main/ArduinoWiFiShield 处的代码,连同 WiFi 盾库,提供 WEP 和 WPA2 加密,以及板载 SD 微插槽。也有一些例子把这个单元变成一个网络服务器。

为了符合它的身份,WiFi 盾使用许多 pin 码在它自己和 Arduino 之间进行通信。因此,如果您有一个输入/输出繁重的应用,那么期待 4051 芯片( http://playground.arduino.cc/learning/4051 )多路输出和扩展其能力。

Tip

如果 shield 和 Arduino 拒绝对话,那么短路引脚 3 和 7 可能会有所帮助。

在 802.11 之外,主要的替代方案是 Xbee shield,它使用 ZigBee 无线协议,这意味着它不能直接与现有的 WiFi 连接兼容,但可以作为基本场景的无线电发射器和接收器,并具有大约 30 米的室内范围。对于基本的安全措施来说,这通常是一个更好的选择。

发动机

LadyAda 的电机屏蔽支持 DC、伺服和步进电机的中等功率控制。支持的电机总数和总功耗由特定的电机本身决定,但引用的规格允许您使用两个 DC 伺服系统(5V)和最多四个 DC 电机,两个步进电机,或一个步进电机和最多两个 DC 电机。这个护盾确实使用了很多针来控制,也使用了很多能量,但是可以用来锁住猫的翅膀或者建造一个机器人。

例如:Arduino 迎宾垫

有了这些知识,您可以构建一个简单的电路,编写一些 Arduino 软件,并添加一个 Linux 端脚本,以便在有人进出房间时触发一段语音。

我将展示如何使用 Arduino 来监控放置在地毯下的压力垫(使用常开开关)的状态,并将消息传输到 PC。Arduino 还会记住当前状态,因此一旦踩下压力垫内的开关,房屋状态就会被认为是“空置”,因为人们已经离开了房屋,当开关再次关闭时,状态就会变为“有人居住”电路是一个简单的开关,如图 2-2 所示。当然,您可以在 Raspberry Pi 上编写相同的代码,但是没有理由浪费这么多 CPU 周期,除非您还打算添加一个前门摄像头或其他类似的功能。

Note

你也可以使用压力垫来确定你是否在闹钟响起后起床,你可以使用离开卧室的行为作为阻止闹钟响起的手段。

Arduino 软件稍微复杂一些,因为您正在寻找开关从闭合状态变为打开状态的情况,因为人们可能会在穿外套时站在垫子上一分钟或更长时间。我还在这里包括了一个定时器,这样如果在第一个上升沿的两秒内检测到第二个上升沿(由其他人踩在垫子上引起),house 状态不会改变。这是为了让几个人同时离开房子,而不会造成混乱。自然,这并没有解决只有部分居住者离开房子的问题,但这是一个开始!

int inputSwitchPin = 2;

int lastState;

long timeLastPressed;

long debouncePeriod = 100;

int houseState;

long doormatUnblockAt;

long doormatDelayPeriod = 2000;

int blockSteps;

void setup() {

Serial.begin(9600);

pinMode(inputSwitchPin, INPUT);   // declare pushbutton as input

lastState = digitalRead(inputSwitchPin);

timeLastPressed = millis();

blockSteps = 0;

houseState = 0;

}

void loop() {

int pinState = digitalRead(inputSwitchPin);

if (pinState != lastState && millis() - timeLastPressed > debouncePeriod) {

if (pinState == 0) { // i.e., pressed

if (!blockSteps) {

houseState = 1-houseState;

blockSteps = 1;

Serial.print(houseState?"1":"0");

}

doormatUnblockAt = millis() + doormatDelayPeriod;

}

timeLastPressed = millis();

lastState = pinState;

}

if (millis() > doormatUnblockAt) {

blockSteps = 0;

}

}

最后,前面显示的 USB 脚本触发代码适用于监控 0 和 1 的串行消息:

if (v == '1') {

system("enter_house.sh");

} else if (v == '0') {

system("leave_house.sh");

... as before ...

它运行enter_house.sh脚本来输入:

say default welcome home

x10control default on lounge_light

或者根据情况选择离开的leave_house.sh脚本:

say default Goodbye

RAIN=weatherstatus | head -n 1 | grep -i "[rain|shower]"``

if [ "$?" -eq 0 ]; then

say default Remember your umbrella it might rain today.

say default $RAIN

fi

在这些代码示例中,我使用了不带路径的简化命令来演示这个过程。这些命令本身是出现在 Minerva 系统中的抽象,在第七章中有所介绍。

例如,这种“住宅状态”信息可以扩展到打开安全灯或者将个人电子邮件重定向到工作帐户。要将 Arduino 输出连接到系统的其余部分,您要么需要使用网络屏蔽(有线或无线,取决于您的连接点),要么需要一台配有网络屏蔽的本地 PC。PC(如 Fit-PC2、笔记本或类似的小型机器)的优势在于它可以作为显示和控制面板重复使用。在这个例子中,在门边有一个显示当天任务和打印天气提醒的面板可以为额外费用提供一个合适的借口。

通过使用你和你家人的习惯的个人知识,该代码可以进一步扩展。例如,考虑一下离开你的房子,10 秒钟后回来拿你的手套的行为。一方面(没有双关语),您可以向语音合成模块添加一个低温警告。另一方面,你可以确定任何在 20 秒内激活压力垫的人正在回家(而不是其他人离开它),因此忽略通常的消息。

此外,你可以延长这一宽限期,让你上了车,却发现忘了带钥匙。在这一点上,你可以自动触发一个报警装置,当它连接到钥匙上时,会发出蜂鸣声,这样当压力垫检测到你回来时,你就可以很容易地找到它。

Note

稍加修改,您可以使用两个压力垫(一个在内侧,一个在外侧)来更准确地确定行进方向。

根据所用压力垫的类型,你也可以在猫扑旁边的地毯下放置一个,因为你的宠物的重量通常足以触发它。这将允许你把它和一个乐高机器人连接起来,当他们从惯常的闲逛中回来时,这个机器人可以给猫喂食。

Caution

大多数压力垫由于其内部的电子设备而不能被切割成合适的尺寸。

例如:Arduino 录音机

大多数人在火车票和购物清单的背面做笔记,因为打开电脑或找到手机的记事本应用程序太费力了。通过结合 Arduino 的无界面环境和无监控器 PC 的音频功能,您可以创建一个非常简单的录音机。

你从基本的开关电路开始,然后复制三次——录音、播放和擦除按钮各一次,如图 2-7 所示。

A978-1-4302-5888-9_2_Fig7_HTML.jpg

图 2-7。

Using three switches and inputs to control a voice recorder

然后,您可以修改同样平庸的 Arduino 控制程序来检查三个按钮,而不是一个,记住要对每个按钮进行去抖。这里也有一点小小的变化。因为您使用 record 按钮来控制记录的长度,所以当按钮被按下时,它会发送一条开始消息,当释放时,它会发送一条停止消息。

int pinStates[3];

int lastStates[3];

long timesLastPressed[3];

int inputSwitchPins[3] = {2,3,4};

void setup() {

Serial.begin(9600);

for(int i=0;i<3;++i) {

pinMode(inputSwitchPins[i], INPUT);

lastState = digitalRead(inputSwitchPins[i]);

timesLastPressed[i] = millis();

}

}

void loop() {

for(int i=0;i<3;++i) {

int pinState = digitalRead(inputSwitchPins[i]);

if (pinState != lastStates[i] &&

millis() - timesLastPressed[i] > debouncePeriod) {

switch(i) {

case 0: // record

Serial.print(pinState==0?"B":"E");

break;

case 1: // play

if (pinState == 0) {

Serial.print("P");

}

break;

case 2: // delete

if (pinState == 0) {

Serial.print("D");

}

break;

}

timesLastPressed[i] = millis();

lastStates[i] = pinState;

}

}

}

请注意,我还扩展了控制代码。我现在用 B 和 E 来开始和结束录音,用 P 来播放声音,用 D 来删除所有声音,而不是简单的 0 和 1。然后,您可以像对门垫一样修改基于 PC 的 C 代码,以运行您在 PC 上编写的三个脚本中的一个来控制声卡:

if (v == 'B') {

system("vox_record.sh start");

} else if (v == 'E') {

system("vox_record.sh stop");

} else if (v == 'P') {

system("vox_play.sh");

} else if (v == 'D') {

system("vox_delete.sh");

... as before ...

这可能是用vox_record.sh录制声音:

#!/bin/bash

LOGFILE=/var/log/voxrecordpid

DIR_INCOMING=/usr/local/media/voxrecord

if [ "$1" == "start" ]; then

FILENAME=mktemp -p $DIR_INCOMING.wav

arecord -f cd -t wav $FILENAME >/dev/null >/dev/null 2>&1 &

PID=$!

echo $PID >$LOGFILE

fi

if [ "$1" == "stop" ]; then

PID=cat $LOGFILE``

kill $PID

rm $LOGFILE

fi

或者用vox_play.sh播放目录中的每个声音:

#!/bin/bash

DIR_INCOMING=/usr/local/media/voxrecord

for F in "$DIR_INCOMING"/*.wav

do

play $F

done

甚至可以通过vox_delete.sh全部删除:

#!/bin/bash

DIR_INCOMING=/usr/local/media/voxrecord

rm -f $DIR_INCOMING/*

自然,这里有更多的空间来支持删除单个记录等等。但这代表了这个想法。

Note

Minerva 系统将这些想法抽象成 Minx,这样就不需要为每个 Arduino 应用程序提供单独的可执行文件。密涅瓦将在第七章中讲述。

示例:Arduino 接口

在大多数情况下,Arduino 只能通过 LED 或小型 LCD 文本显示器来指示其状态。大多数友好的家庭界面需要更大的屏幕或语音输出。对于这些,Arduino 通常会向房子里其他地方的更大的机器发出请求。然而,随着越来越多的屏蔽提供,更快的芯片和更多的时间投入到更多的定制编程的引入,其他方式的接口现在可以从一个不起眼的 Arduino。

Note

许多高级软件要求通过使用快速 PWM 来实现精确定时,快速 PWM 通过将波形产生模式位设为 011 来激活。请注意,如果你的代码的其余部分在正常操作中使用它,你将需要重新获得对该库的控制,这可能包括禁用其他使用它的盾牌。类似地,在某些情况下,您可能还需要避免正常的轮询-测试-输出循环。

语音合成

演讲的使用是一把双刃剑,在第五章中有更全面的介绍。一方面,这是最自然的交流方式,我们人类已经完善了几千年。另一方面,计算机化的语音听起来仍然像一部糟糕的 60 年代 B 级电影,当一个人说话时,无法传达语言中存在的细微差别。

但是很酷!

Arduino 说出任意文本字符串最自然的方式是使用屏蔽,如 GinSing ( http://www.ginsingsound.com )或 Voicebox ( http://www.sparkfun.com/short/9799 )。就能力和成本而言,两者相当,GinSing 因其更高额定功率放大器和改进的 16 Khz 回放速率而略胜一筹。对于那些想要一个预制盾牌的人来说,它也胜过 Sparkfun 产品。但是,您需要运行的唯一测试与输出有关,也就是说,您更喜欢哪种声音。这两个网站都是老派的,所以听听这两个网站的例子,然后做出相应的选择。

Note

有一个著名的例子是用不安全的 Arduino, https://code.google.com/p/tinkerit/wiki/Cantarino 进行语音合成,但这主要是一个技术演示,要转换成其他东西需要合理的工作。

声音制作

范围从简单的哔哔声到样本回放。然而,它不能支持多个声源,因为没有足够的处理能力来管理声音的实时混合。如果您愿意,也有一些使用多个扬声器的概念验证,但它们很少足够好。或者,你可以买两个 Arduinos,但在这种情况下,最好买一个树莓派!

单独的哔哔声可以用作简单的确认音,表明系统已经执行了特定的任务——高音表示“正常”,低音表示“错误”——或者发出警报声(想想 80 年代的电脑游戏在类似技术水平下的声音范围!)它最大也是最明显的好处是声音只需要很少的处理能力,你可以在芯片上运行复杂的操作。我们早些时候在软件领先的 Armstrong 的操作中看到了这一点,但您也可以依赖硬件,并使用语音合成芯片来生成多声道音频。

对于音频反馈,样本回放显然是更好的解决方案。虽然哔哔声是可以忍受的,但它们仅仅是可以忍受的!如果你听任何电视节目或电影,高科技设备的哔哔声和唧唧声总是比简单的方波声音更有色彩(或音色)。《星球大战》中 R2D2 的哔哔声可能听起来很简单,但如果你分析它们,你会发现它们很有质感。因此,用样本代替哔哔声是一个明显的进步。

此外,声音样本可以用来表示任何东西。包括预先录制的语音。这(正如我们将在第五章中看到的)可以用来代替语音合成来创造一个更自然的室内声音。有人拿《星际迷航》里的电脑 Majel Barrett 的声音,在这方面!所以,只要你只需要预先录制的短语,这就提供了一个非常好的界面。

Tip

除了新闻报道之外,大多数反馈系统都可以用预先确定的错误代码和消息来量化。您可能需要将消息从“您在/dev/sda1 上只有 N 兆字节的可用空间”改为“您的服务器磁盘空间不足”,但这通常是更可取的。

样本回放的方法比发出简单的哔哔声稍微复杂一些。这是因为要制作可识别的样本,您必须更频繁地更改输出 pin。通常是一个数量级。例如,要播放 440Hz 的方波(中 C 以上的“A”),必须每秒钟将引脚的输出电平从高变到低 440 次。(这是 880 操作。)对于一个样本,通常每秒需要至少 11050 次变化,每一次电平变化都需要额外的存储器访问时间,并使用模拟输出。奈奎斯特定理表明,要表现 1000 赫兹的声音,你需要至少两倍于此的采样频率,即 2000 赫兹。作为指南,CD 的播放频率为 44,100 赫兹。

但是,有可能!

有两种纯软件解决方案可供您选择,它们都源于 http://playground.arduino.cc/Code/PCMAudio 处的基本代码,这提供了一种操作引脚 11 上的 PWM 信号的相当低级的解决方案。该库的扩展(即高级)版本位于 http://hlt.media.mit.edu/?p=1963 ,并允许您使用以下代码启动回放:

#include <PCM.h>

const unsigned char sampleData[] PROGMEM = {

126, 127, 128, 128, 128, 128, 128, 127, 128, 128, 128, 129, 129, 128, 127,

... lots more data here...

};

void setup()

{

startPlayback(sampleData, sizeof(sampleData));

}

void loop()

{

}

您会注意到回放总是采用样本数据的数组,而不是文件名。如果你有一个能让你用 SD 卡或 USB 记忆棒工作的保护罩,那么你就可以从一个文件开始播放。但是,如果没有它,您就需要将它作为原始数据直接访问,这涉及到离线处理音频文件,并生成一个可以读取的大数组。

生成这个数组的问题有各种代码解决方案,虽然输出不过是声音中每个样本的 8 位输出电平。典型的包有 EncodeAudio ( https://github.com/damellis/EncodeAudio )和 wav2c、mplayer、sox。

这种方法的局限性很多,但是,在一个无屏蔽的 Arduino 上,你还能指望什么呢!?首先,您需要将数据存储在它的闪存(不是 RAM)中,这样会占用您的程序空间。但是,你仍然被限制在 4 秒左右的音频,8 位,采样频率为 8Khz。

要超越这些限制,你需要两样东西:更大的内存和能够更快播放的定制芯片。幸运的是,这些问题是相伴而生的,因为你需要一个支持外部闪存的屏蔽来处理前者,所以后者的制造商已经免费提供了它。这方面的两个主力是 Sparkfun MP3 播放器 shield ( https://www.sparkfun.com/products/10628 )和 Lady Ada 的 wave shield ( http://www.ladyada.net/make/waveshield ),它为.wav文件提供回放支持,最高可达 16 位单声道 22KHz 样本,这是对我们之前看到的 PCM 示例的显著改进。它还提供了一个小功率放大器,能够驱动 1/8W 8 欧姆的扬声器。这可以用于一个会说话的时钟,一个厨房用的秒表,或者一个虚拟的宠物。

然而,在规划任何项目之前,您需要仔细查阅硬件规格,因为这项任务所需的软件库可能非常大(因为它们包括 Flash 访问和样本回放,例如 wave shield 使用 10KB 的内存),因此您可能没有空间来容纳所有自动化控制逻辑。或者你可能需要升级到更好的芯片。

Note

Arduino 可访问的闪存上的文件系统通常使用 8.3 文件名,因此如果没有额外的查找表,不可能从字典中预先录制每个单词的语音。

显示系统

如果你需要一个完整的显示器,或者高分辨率的图形,那么你的 Arduino 可能不得不承认输给了 Raspberry Pi。然而,对于许多应用程序来说,这是不必要的。

最简单的连接显示器形式是 LCD,例如 SparkFun SerLCD ( https://www.sparkfun.com/products/9393 ),它提供两行 16 个字符,以及一个背光。这种设备不需要额外的驱动硬件,LCD 库作为标准提供。字体也保存在设备中,因此消息可以简单地用

// initialize the library with the numbers of the interface pins

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

lcd.begin(16, 2);

lcd.print("hello, world!");

对于警告和基本消息来说,这通常就足够了,尽管如果需要的话,您可以随时缓冲和滚动消息。

如果你对布线更感兴趣,那么也可以用一个 Arduino 驱动几个 LED 矩阵设备,比如这个例子 http://g33k.blogspot.co.uk/2010/02/arduino-56x8-scrolling-led-matrix.html 。这具有每个 LED 控制的优点,并且仍然是相当低的功率。下一步是使用电视显示器,Arduino 能够通过复合插座直接驱动它!

TVout 项目( https://code.google.com/p/arduino-tvout )使用两个电阻和一根电线来控制标准电视机上的 128 x 96 像素显示器。它只支持黑白渲染,但已经用于小游戏,以及更传统的应用程序。生成图像的处理开销自然很高,因此控制逻辑需要相当严密,但仍然很有可能制作出有用的报告应用程序。

输入操纵杆

操纵杆,尤其是老式的操纵杆,是极好的输入设备,因为它们与大多数标准声卡上的并行端口相连接,而且物理上很坚固。这使得按钮可以重复使用,特别是作为脚踏板来控制软件。事实上,这提供了一种非常便宜的方式来给你的机器添加听写模块,而不需要 Arduino 提供输入。除了触发 Linux 机器上的单个事件,比如请求天气报告或机器状态,它还可以向其他应用程序提供消息。例如,mplayer可以在从模式下运行,允许从标准输入或命名管道向其输入命令。类似地,X Window 电视观看软件xawtv带有xawtv-remote来改变频道和音量(根据大多数遥控器),给你开/关捕捉和截图功能。这使得定格魔术表演成为可能,看看他们是怎么做到的!

你可以直接从/dev/js0中读取操纵杆,但是使用抽象通常更好,比如简单的 DirectMedia 层(SDL)。这允许您在必要时将代码移植到其他地方,避免依赖设备层次结构带来的不可预测性,并使其他人更容易添加和修改您的代码。

读取和处理操纵杆的代码是一个非常简单的 C 代码循环:

#include <SDL/SDL.h>

int main() {

if (SDL_Init(SDL_INIT_JOYSTICK) < 0) {

fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());

exit(1);

}

SDL_JoystickEventState(SDL_ENABLE);

SDL_Joystick *pJoystick = SDL_JoystickOpen(0);

SDL_Event event;

while(SDL_PollEvent(&event)) {

switch(event.type) {

case SDL_JOYBUTTONDOWN:

// Use event.jbutton.which, event.jbutton.button, event.jbutton.state

break;

}

}

SDL_JoystickClose(pJoystick);

return 0;

}

按下按钮可以自然地在内部触发软件,或者利用我前面提到的 Minerva Minx 系统来执行单独的外部脚本(Minerva 在第七章中有详细介绍)。

通过一种被称为力反馈的技术,一些操纵杆也可以被用作输出设备,这种技术可以在 Linux 下使用libff。这种功能是通过两个驱动器中的一个来提供的,HID 驱动器(hid-lg2ff)或 I-Force 驱动器(iforce.ko),它们覆盖了市场上的许多力反馈设备。唉,没有全部收录,所以最好先查兼容性( http://sourceforge.net/apps/mediawiki/libff/index.php?title=SupportedDevices )。力反馈主要用于游戏,因为当玩家受到攻击或死亡时,游戏会通过操纵杆中的一个小电机引起设备的轻微震动。移动电话和传呼机上的振动选项以同样的方式工作。以任何先进或有意义的方式塑造振动的空间非常小,并且 Linux 中很少(如果有的话)游戏支持该库。然而,fftest(来自 http://sourceforge.net/projects/libff/files/ffutils 的 ffutils 项目)可能会被黑客攻击,以在电子邮件到达时提供一个小的隆隆声。

其他输入控制器

游戏开发从来都不是 Linux 社区的强大卖点;因此,可用的库(以及由此产生的游戏质量)数量很少。这导致了解决设备控制问题的零星方法。这方面的一个很好的例子是 SDL(用于良好的固体操纵杆处理,但力反馈目前仅在不稳定的 SVN 分公司可用)和 fflib(用于力反馈)之间的分离。目前只有一个项目试图弥合这一鸿沟,它被称为面向对象输入系统(OIS);你可以在 http://sourceforge.net/projects/wgois/ 找到它。

OIS 正计划抽象出用户输入设备(包括键盘、鼠标和操纵杆)的所有设备(和驱动程序)特定元素,并为它们提供一个统一的 API。虽然这对游戏开发者来说是令人钦佩的,但它对我们没有太大的帮助...除了最近推出的代码支持任天堂 Wii 的远程棒(又名 Wiimote)。这种外设通过蓝牙进行操作,并可以通过将红外 led 成像到其传感器来确定它所指向的屏幕区域,这些 led 固定在屏幕顶部或底部的一根杆上。这也可以确定它的方向和加速度。这使得它非常适合在电视屏幕上运行的复杂应用程序,在这种情况下,鼠标不适合,但需要等效的控制手段。

还有 CWiid 工具,默认情况下在一些发行版中可用,它提供了一个鼠标驱动包装器,允许 Wiimote 控制未移植的基于鼠标的应用程序。

入侵笔记本电脑

带有固态存储和预装 Linux 软件的上网本价格现在非常低,其成本并不比顶级的独立相框高多少。另外,你还会得到更好的处理器、视频播放、网络连接(通常是无线的)和 VoIP 软件。这使得上网本成为理想的家庭自动化面板,具有多种用途。

显然,较旧的笔记本电脑也可以用于黑客攻击。任何缺少硬盘、电池没电或键盘损坏的笔记本电脑都是特别划算的,因为新零件的成本使它们太昂贵而无法重建,而且拥有一台依赖有线电源线的笔记本电脑对家庭自动化用户来说并不像对其他人那样是个问题。

它们作为控制面板的用途是显而易见的,因为屏幕和键盘可以折叠起来,很容易安装在任何墙壁或表面上。或者,键盘底座(大部分电子产品)可以藏在桌子或工作台下面,只露出屏幕。然后,它可以通过操纵杆输入或更令人印象深刻的触摸屏来控制。

大多数笔记本电脑都可以加装触摸屏。它们是一种安装在屏幕上的透明膜,以及一个 PS/2 插座,模仿鼠标传递 X 和 Y 坐标以及左键上下信息的行为。应当注意,软件接口必须被适当地编程,因为膜不能检测鼠标位置,除非其上有压力(即,鼠标悬停或悬停事件将不存在),并且没有鼠标右键的输入。幸运的是,大多数 web 界面通常是合适的。

Note

触摸屏薄膜无法切割成笔记本电脑的尺寸;它们必须预先定好尺寸,所以在购买前要仔细检查,记住屏幕尺寸是在 LCD 屏幕的对角线上测量的,而不是可视区域。

您自己的电动设备

甚至一些顽固的极客也不愿意用市电来创造黑客。但是只要稍加注意,你就可以控制任何电源供电的设备,比如热水器、取暖器、车库门电机等等。这样做需要一个可控的继电器系统,接受控制信号并关闭或打开一组触点,使电流从插头流向您的设备。您甚至可以将它们直接连接到标准消费设备(如调制解调器和打印机)上,以重新启动或重启它们。这方面有几个选择。

X10 控制

例如,建造一个完整的 X10 单元来控制一个电机,这远远超出了本书的范围,尝试一下是不公平的。相反,我将展示一个嵌入式设备模块,如 AM12W,它处理 X10 协议的脏工作,并在其两个连接之间产生一组闭合触点。它的工作方式与你在第一章中看到的 AM12 相同(虽然稍微便宜一些),但它不是控制流向插头插座的电流,而是控制电源和 X10 单元之间以及单元和设备之间的电流。图 2-8 显示了该接线。

A978-1-4302-5888-9_2_Fig8_HTML.jpg

图 2-8。

Connecting an AM12W to a mains-powered device

这适用于任何只能通过 X10 遥控的装置。为了支持本地开关(开/关或瞬时按钮),AD10 是更好的选择。这也支持设备上的手动超控,如图 2-9 中的蓝色按钮所示。

A978-1-4302-5888-9_2_Fig9_HTML.jpg

图 2-9。

The AD10 module

图 2-10 所示为接线;尽管这两种类型的按钮在这里都有介绍,但实际上只有一种会用到。

A978-1-4302-5888-9_2_Fig10_HTML.jpg

图 2-10。

Wiring an AD10 to a mains-powered device

与 AM12W 相比,该模块的主要优势在于使用的开关是标准电气开关,而不是(更昂贵的)X10 开关。

Note

所有设备都应相应地接地,而不是为了清晰起见而如图所示。

无线网络控制

通过合适的电子设备,您可以将 Raspberry Pi 或 Arduino 连接到 WiFi 板,并添加一些继电器来控制外部设备。然而,这种黑客攻击并不总是必要的,因为一些预建的设备已经存在,这消除了使用主电源工作的需要和担忧。

一个这样的设备是 DIN Relay III(来自 http://www.digital-loggers.com/din.html ),它支持 WiFi,允许你同时控制多达 8 个设备,由交流或 DC 供电。举例来说,如果你在楼梯下的橱柜里有几个设备,这就有了自然的规模效益。即使你目前的房屋布线不是本地的(到一个单独的位置),这种设备也使这样的任务更有吸引力,因为它提供了一个费用很少的集中控制系统。

尽管它有一种脚本语言(完全可以忽略不计!)它确实具有调度和可控制的内置状态 LCD,并且不需要显示关于单元状态的信息。

低压控制

对于许多应用来说,没有必要控制 115/240V 电源线。这是因为几乎所有的家用设备都工作在低得多的电压下,通常为 24V 或更低。这包括一些更现代的 24V 灯泡。因此,你可以绕过它,在电源出口和电路板入口之间切换电流,而不是在插头处控制器件。

Note

一些设备具有双电源线路,例如 3.3V 和 5V 轨道。在这种情况下,您将需要一个“双掷”继电器,以便两个电源电路可以同时打开或关闭。

这种切换动作可以用任何合适的继电器来进行。决定“合适”继电器的是“触点额定值”这是在特定电压下,继电器能够安全切换的电流量。如果超过这个值,继电器可能会一直保持打开或关闭状态,而不会发出任何警告。这些总是在继电器或使用它们的开关单元上指定。美国国家电气制造商协会,或 NEMA,已经为交流和 DC 引入了一系列的名称,表示电流的类型和最大电压。

您可以使用 Arduino、继电器和上述 Arduino 数字输出控制指南来构建您的 WiFi 继电器开关。对于那些寻找预建解决方案的人来说, http://www.relaypros.com/Relay/Relay/Wi-Fi_Relayhttp://www.relaycontrollers.com (以及许多其他软件)都提供了合适的功能。

当然,它不必是控制继电器的 Arduino,因为 Raspberry Pi 或任何形式的微控制器都可以很好地处理这项任务。一个著名的例子是纳特·莫里斯( http://www.natmorris.co.uk/feedtoby )的《喂养托比》,他通过推特用微型控制器给他的宠物狗喂食。在这种情况下,用电动机代替继电器。

结论

同样,您可以使用几个精心挑选的硬件来构建复杂且引人入胜的系统,同样,您也可以用最少的努力来构建智能自动化工具。通过使用替代输入设备,如压力垫和操纵杆,您可以改变与您的家庭互动的方式。通过添加替代的输出设备,也许是由旧的游戏控制台驱动的,你可以向以前全尺寸台式电脑无法到达的区域提供视觉效果。机器人和电脑化迎宾垫的引入给你的家增添了一种前所未有的凉爽。

Footnotes 1

NDA 是公司制定的法律文件,旨在防止您与他人谈论他们的技术或想法。

2

http://www.ps3devwiki.com

3

现在使用的编解码器比当时游戏中使用的格式需要更多的 CPU 能力。

4

3.50 之前的固件会在 222MHz 下欠频。

5

有些援引违反 DMCA/EUCD,有些案件被驳回。

6

正式名称为 Extreme NXT:将 LEGO MINDSTORMS NXT 扩展到下一个级别(ISBN 978-1590598184)。

7

顺便说一句,这是一个很难建造的,因为大多数冰箱门上的吸力比乐高马达更强大。

8

PWM 是指数字输出电压在高电平和低电平之间切换,使得平均电压在一段时间内介于两者之间。然而,并不是所有的硬件都可以这样供电,但这是一种廉价的折衷方案。

9

使用 ATmega8 的旧主板仅支持第 9、10 和 11 针,而较新的 Arduino Mega 可以支持 12 针的 PWM。

10

自 2005 年 1 月 1 日起,在英格兰和威尔士,《建筑条例》P 部分规定,只有经过认证的工程师才能进行这种特殊的电气安装工作。如果不是由这样的人进行,那么工作必须在完成时得到认证。其他国家可能有类似的法律。

三、媒体系统:整合电视和高保真音响

Abstract

任何家庭环境中最明显的部分是媒体系统。自从真正的壁炉不再流行,电视或立体声系统已经成为大多数客厅的焦点。电视和立体声系统也是我们花费最多时间与之互动的设备。因此,你必须了解这些设备的可能性。

任何家庭环境中最明显的部分是媒体系统。自从真正的壁炉不再流行,电视或立体声系统已经成为大多数客厅的焦点。电视和立体声系统也是我们花费最多时间与之互动的设备。因此,你必须了解这些设备的可能性。

与所有消费电子产品一样,功能集和价格每天都在变化。因此,我将主要关注这些机器的必要特征和内部工作原理,而不详述具体的品牌和型号,因为当你读到这篇文章时,其他的机器已经上市了。

数据链

简单的“播放专辑”行为在家庭自动化领域发生了重大变化。不仅媒体本身的位置不受限制,而且它还是你可以听它的地方。最近的例子是 iTunes,它允许你在几台不同的电脑上播放音乐,还有 Spotify,它提供音乐流媒体服务,允许你从家用电脑或手机上访问各种音乐曲目。 1 如果你对音乐的兴趣是随意的,或者是基于图表的,那么这些服务往往就足够了。但是许多人收藏的专辑要么很稀有,要么很模糊,不会出现在任何商业网站上。有些人可能更喜欢将他们的音乐数据存储在自己的电脑上,以免公司倒闭、改变服务条款或以其他方式失去连接。在这种情况下,我们需要提供一种方法将音乐从硬盘传到人耳中。这是数据链。

这个链条有四个步骤。第一步是数据本身。这是代表你收藏的音乐(或其他媒体)的 wav、MP3 或 ogg 的目录结构。该数据然后由服务器读取(这是第二步),然后被分发给(第三步)室内的一个或多个扬声器。第四步也是最后一步是当人类听到(或看到)媒体时。在便携式音乐播放器或台式电脑上播放音乐时,这种模式仍然适用,尽管对于台式电脑来说,所有的逻辑单元都放在一个物理盒中。

提取数据

通常称为翻录,这是将通常存储在 DVD 或 CD 上的媒体转换为计算机友好的数据格式,以备回放的过程。许多软件都是可用的,所以我将用一个例子来介绍它们。

光盘

到目前为止,CD 是最简单快捷的格式,因为大多数组成部分都可以在 Linux 中找到。一个工具,如abcde,可以自动执行以下操作:

  • 将音频提取为 WAV 文件
  • 把它转换成 OGG·沃尔比斯
  • 确定艺术家和专辑
  • 自动下载并应用标签
  • 相应地命名文件

接下来需要做的就是将文件复制到您的文件系统中。出于速度原因,我个人总是将我的 CD 解压到一个单独的(本地)文件夹中——在本地写入,然后一起复制会更快,因为这意味着当我可能想要传输其他内容时,我的服务器不会处理大量的小写入请求。这也给了我一个手动更改文件的机会,以防出现问题,因为有时专辑会超过标准的 74 分钟。 2

对于批量翻录,您可以编写一个简短的脚本,通过自动打开和关闭 CD 抽屉来节省时间。这听起来可能不多,但提取你的音乐收藏的最初障碍是心理上的;交换数百张 CD 并给每个文件重新命名和标记的想法令人望而生畏。因为音频是以 CD 或 DVD 驱动器的速度进行翻录的(与专辑的时间长度无关),所以您可以在大约 5 到 10 分钟内提取整张光盘。通过在线曲目列表数据库(CDDB,它将每个曲目的开始时间和持续时间组合成一个整体的光盘 ID),标记过程也是自动的。有时会有重复的 id,这需要手动干预,但大多数光盘可以使用-N标志自动处理,如下面的脚本所示。abcde脚本还支持参数,允许您指定文件名的格式(如果这对您很重要),以及用于处理多位艺术家的专辑的布局信息。

#!/bin/bash

while :

do

echo Insert next disc...

read x

cdcd close

abcde -N

cdcd eject

done

数字影碟

随着 DVD 格式越来越复杂,业界一直坚持加密是必要的,DVD 的翻录有了额外的要求, 3libdvdcss2。这是一个绕过加密光盘复制保护的库,大多数商业电影都使用加密光盘。它的合法性是不确定的,所以主要的 Linux 发行版在谨慎方面犯了错误,没有包含这个包。相反,该库必须单独下载,要么从另一个存储库下载,要么从编译源下载。当然,我必须采取同样的“安全”方法,并且只能告诉你如何安装它,如果你在某个网站上找到这些文件的话。

例如,在 Debian 上,通过在/etc/apt/sources.list文件中放置一行代码来添加一个额外的存储库:

debhttp://www.debian-multimedia.org

接下来是以下传统流程:

apt-get update

apt-get install libdvdcss2

有时你必须手动下载并安装软件包。命令行调用如下所示:

dpkg -i libdvdcss2_1.2.10-1_i386.deb

或者,源安装将按照INSTALL文件进行,可能类似于以下三位一体:

./configure

make

make install # as root

一旦您可以使用 VLC 播放 DVD,您就知道该库已成功安装,因此可用于所有主要的媒体播放器应用程序,如mplayertotemxine等。

当翻录 DVD 时,您必须考虑您要用于收藏的硬盘空间量,您是否想要(或需要)DVD 菜单,以及它们在什么设备上播放。最终,有两个选择。

按 ISO 格式翻录

Rip As ISO 制作整个光盘的原始副本,并将其存储为文件。这是最容易启动的过程,因为您只需调用以下内容:

dd if=/dev/dvd of=TheOffice-series1.iso bs=1024

这通常需要 4GB 到 8GB 的空间,包括所有的 DVD 菜单、标题、章节和字幕。像 VLC 这样的电影播放器将能够处理像菜单这样的交互式组件,但其他的则不行。对于不支持 DVD 徽标的设备尤其如此,因为它们没有 CSS 代码,对于较小的低功耗设备(如 MediaMVP)也是如此。在后一种情况下,您可以通过使用 VLC 远程转码电影来部分解决问题,但它仍然无法处理 DVD 菜单。

与所有磁盘映像一样,Linux 能够将它们挂载到一个目录中,这样就可以读取它们,也可以正常查询它们的文件。这可以通过桌面或以下方式自动完成:

mount -t udf –o loop TheOffice-series1.iso dvdimage

请注意,您不能将映像挂载到您通常的 DVD 位置(如/dev/dvd),因为那是一个块设备,您只能将映像挂载到一个目录。

翻录为电影文件

这种方法占据了“DVD 抓轨”软件的大部分,命令行和 GUI 都有许多可用的版本。尽管 GUI 版本提供了标题和章节的截图以及一系列可配置的选项,但它们(几乎毫无例外)只是一组标准后端工具的前端,比如mencoder。你可以通过直接找到金属来去除这个中间人所利用的资源和时间。

UnDVD ( http://sourceforge.net/projects/undvd/ )是一个 Perl 脚本,它提供了一个简单的命令行方法来将 DVD 拆分成它们的组件标题,同时采用您想要的任何语言或字幕。使用英语音频翻录前三首曲目的典型调用可能如下:

undvd -t 1,2,3 -a en

可用轨迹的数量可通过相关工具scandvd确定。因为大多数家庭会说一种共同的语言,所以减少了完全 ISO 的必要性,使这成为一个一致的过程。以下脚本将光盘完整地翻录到它自己的子目录中。例如,它甚至可以通过家庭网页上的链接来触发。

#!/usr/bin/perl

my $language = "en";

my $subtitles = "off";

my $output = lsdvd;

$output =∼ /Disc Title\:\s+(.*?)\n/s;

my $title = lc $1;

$title =∼ s/\b(\w)/\U$1/g;

$title =∼ s/_(\w)/ \U$1/g;

my $cmd = "undvd -t 1";

my $count = $output=∼s/\nTitle\://g;

foreach(2..$count) {

$cmd .= ",$_";

}

mkdir($title);

chdir($title);

$cmd .= " -a $language -s $subtitles -e 2";

system($cmd);

chdir("..");

电影的问题

有这么多可用的编解码器和播放器,您不可避免地会偶尔发现其中一个有问题,例如无法播放电影、中途崩溃、视频和音频之间失去同步、无法快进等等。即使是商业产品也有这些问题,所以它们不是开源社区独有的。事实上,因为我们主要使用基于软件的解决方案,我们有一个更好的交易,因为问题可以很快得到解决。以下是一些建议:

  • 有时,您可以通过暂停和取消暂停视频来解决同步问题。
  • 不会快进的电影往往没有组块索引,可以在用mplayer -idx开始电影的时候建立。
  • 其他问题通常需要重新编码(或代码转换)。这可以通过较大的工具来处理,比如 VLC。

蓝光(Blu-ray)

自 2006 年发布以来,蓝光一直是 Linux 的眼中钉,最近又是树莓派用户的眼中钉。这是因为没有官方的软件播放工具发布,使用的加密方法也比较苛刻。第一种情况之所以存在,是因为适用专利的许可由 One-Blue 控制,One-Blue 不能(不会?)许可给 Linux 开发者。因此,播放蓝光光盘(BD)的唯一方法是分离解码和回放部分,并将原始光盘转码为另一种格式。我们将很快找到解决方案。

第二种情况更麻烦,尤其是因为蓝光设计的一部分允许加密密钥在被破解时被更改。到目前为止,已经有几个密钥在网上发布了,但是不久之后,一系列新的密钥被引入以保持格式的封闭。这表明这个行业还没有从女权运动中吸取同样的教训,因此在可预见的未来,我们将陷入这种无休止的猫捉老鼠的游戏。

最简单的答案是完全放弃蓝光。但是,尽管很容易认为将 DVD 电影升级为蓝光电影没有什么意义,但新电影通常具有高质量和额外功能,值得购买。而且,对许多人来说,忽视所有面向 DRM 的媒体的基本观点是不切实际的(特别是因为这也包括许多在线音乐和 DVD)。因此,实用的观点是对所有 BD 进行代码转换,并将物理副本归档到某个安全的地方。

翻录为 ISO 文件

一句话——不要!因为没有东西播放它们,所以它们只对创建一个稍后可以被翻录的 ISO 有用。因为你无论如何都要阅读光盘内容,所以你现在没有节省时间。由于单层 BD 大约需要 25GB(双层需要 50GB),存储成本明显高于 DVD。如果你想知道有多少,一个 1TB 的驱动器可以容纳 40 个单层图像。如果驱动器成本为 100 美元,则该映像的成本为 2.50 美元。与价格约为 5 美分的转码版本相比,差异非常明显。

翻录为电影文件

最直接的方法是利用“模拟洞”(但在数字意义上,即“数字洞”)。这需要一个带 HDMI 输出的播放器和一个带 HDMI 的显卡。第一个的输出被输入到第二个的输入中,并进行实时记录。尽管这种方法肯定有效,但我们知道更好的解决方案。

这里的首选是“MakeMKV”,可从 http://www.makemkv.com 的论坛部分下载,这是一个实用的抓轨软件选择。也就是说,它既不自由,也不开放。但鉴于选择有限,我们将使用它。幸运的是,当它处于测试阶段时,如果你使用 http://www.makemkv.com/forum2/viewtopic.php?f=5&t=1053 的下载密钥,费用已经被移除。幸运的是,它自 2010 年以来一直处于测试阶段,尽管在这本书的制作期间将发布一个新的密钥副本,但人们希望新的测试密钥将允许该程序免费使用(如在啤酒中)。

按照论坛下载页面上的说明,你可以像翻录其他光盘一样翻录你的光盘。有些人注意到如果你打字

touch tmp/eula_accepted

在运行 make 程序之前,您可以安装软件,而不必阅读并同意 EULA。

一旦进入 MKV 格式,你可以自由地转换成任何其他格式。这可能是必要的,因为高清视频需要高清播放器,而一些(旧的)媒体流盒可能不支持它。然而,请注意,高清视频需要高清转码器,所以你需要最新的工具(如手刹),因为许多旧的重型程序尚未升级以应对它。

盒式磁带和乙烯基

是的,真的!有许多人拥有这些心爱的技术遗物,他们希望用电子方式保存它们。这些是速度最慢的媒体形式,因为它们必须实时完成。最显而易见的方法是将你的走带设备(磁带或唱片)的唱机输出连接到你声卡的线路输入。信号链中的元件应该尽可能少,如果你的转盘有前置放大器,那就更好了。否则,考虑你的声卡和走带设备的相对优点,让高质量的单元执行前置放大阶段。乙烯特别需要一个前置级 RIAA 均衡,以避免微小的声音。

一旦你连接了走带设备,找到音乐中最响的部分,在录音程序中监控音量,比如 Audacity。应该尽量大声,不削波。这可确保您充分利用 16 位分辨率,即最大可能的动态范围。然而,如果可能的话,这个音量应该来自前置放大器,因为功率放大器会引入噪声。

为了确保录制期间的最高质量,您还需要注意外部硬件元件。因此,不要在录音时使用微波炉,因为这会引入可能影响它的电噪声,不要摆弄连接器,等等。这也是一个好主意,将甲板插入高质量的 UPS 或电源平滑器,以限制电源电压波动引起的 wow 和颤振的数量。

同样的方法也适用于磁带,尽管大多数磁带播放器都有内置前置放大器,所以你别无选择。

目前市场上有一些一体化设备,它们将磁带或录音座与所有必要的放大器和转换器结合在一起,通过 USB 电缆为您提供数字输入。这些对于临时用户来说是理想的,但是因为它们是按价格制作的,而不是按质量制作的,所以你不会得到和手动设置一样好的结果。

一旦你将录音数字化,接下来的事情就是从名为side_1.wav的文件中提取单个的音轨,并对它们进行相应的编码。有一些工具可以自动做到这一点。Audacity 有自己的静音查找功能(在“分析”菜单中),它会在录音中寻找合适的长间隔,并在它们旁边放置标记。然后,您可以根据需要调整这些标记,并选择“导出多个”以将这些标记之间的数据保存为单个文件。

然后,您可以对它们进行适当的编码。这里有一个例子:

#!/bin/bash

LIST="$(ls *.wav)"

for FILE in "$LIST"; do

flac $FILE

done

或使用以下内容:

oggenc $FILE

根据音乐和您对高保真音频的个人意见,您可以选择以一种或多种格式保存该音乐。最直接的方法是只保留 OGG 的文件,因为它们适合于随意的室内监听和一些相当复杂的批判性监听。对于更有眼光的发烧友来说,免费无损音频编解码器(FLAC)提供了与 WAV 相同的质量,但占用空间更小。有些人会将 FLAC 版本存储在单独的(离线)硬盘上,而日常使用 OGG 文件。这允许在以后有更好质量的编解码器可用时重新编码高质量的录音,而不需要重新剪辑数据。

真正的音响发烧友永远不会对电脑声卡感到满意,也不应该一开始就翻录音乐!

仓库

所有数据都必须存储在某个地方。在桌面计算中,这是一个内部硬盘。在家庭自动化领域,我们希望该硬盘在其他任何地方都可以使用。这通常意味着它必须在网络上,并由 Samba 之类的网络服务控制。

独立的 NAS 系统

实际上,网络可寻址存储(NAS)是一种通过网络电缆和 IP 地址而不是 ide、SCSI 或 SATA 电缆连接到外部世界的硬盘驱动器。这种方法有两个主要优点。首先,通过天生的网络感知能力,您可以在世界上任何地方使用这些文件,只需很少甚至不需要额外的配置。这包括你的办公室、你伴侣的办公室、卧室,甚至是花园里或火车上无线连接的笔记本电脑。第二,通过与主计算机分离,您可以将 NAS 驱动器藏在橱柜或阁楼中,从而整理您的主要工作区域。这有一个安全上的好处:任何偷你电脑的窃贼也没有偷你的数据。

自然,如果没有计算机来控制硬盘驱动器,就必须在数据链的某个地方有一个驱动程序来决定光盘格式、容量和网络连接。这可以存在于 NAS 单元本身中,也可以来自想要读取驱动器的服务器。有许多不同的版本可供选择。

硬盘注意事项

任何 NAS 的主要卖点都是其存储能力。目前,少于 1TB 的硬盘很少见,幸运的是,由于逻辑块寻址(LBA)的 28 位寻址模式,许多老式 IDE 硬盘的容量限制为 137.4GB。如果制造商正在使用旧硬件,即使它支持外部 USB 驱动器,也要避免小于 137.4GB 的容量,因为这总是受到相同的限制。

伴随着磁盘空间的争论的是磁盘格式的概念。这通常以 FAT、FAT32、NTFS 或 ext2 给出,并限制可能的最大文件大小(如表 3-1 所示)。如果您需要在另一台机器上安装驱动器,该格式还决定了您能够恢复它的可能性。

表 3-1。

Filesystem Functionality

| 文件系统 | 最大文件大小 | 最大卷大小 | | --- | --- | --- | | FAT16 | 2GB | 2GB | | FAT32 | 4GB | 2tb 或 8TiB * | | Windows NT 文件系统(NT File System) | 16EiB | 16EiB | | ext2/ext3 | 16GB 至 2tb | 2tb 至 32TiB * | | ZFS | 16EiB | 16EiB |
  • Variation depends on cluster size when formatted.

因此,很明显,如果您希望 NAS 存储 DVD 映像,您将需要一个能够支持 4.7GB 文件的文件系统。这通常意味着基于 FAT 的系统是不够的,或者你将不得不删除 DVD 菜单,并将电影重新编码成另一种(更小的)格式。

恢复问题稍微复杂一些。如果您必须从 NAS 安装中取出硬盘,并将其放入标准 PC 中以恢复数据,您将需要一台能够读取 NAS 使用的任何文件系统的 PC。

NTFS 在 Linux 兼容性方面稍微好一点,但也差不了多少。虽然在 Linux 下可以读取 NTFS 分区,但是写回它们被认为是危险的,尽管有两个开源驱动程序(强制 NTFS 和 NTFS-3G)支持它。此外,有一个商业驱动程序(NTFS for Linux,Paragon)可以解决同样的问题。对于基本恢复,只读光盘就可以了,尽管在大多数情况下,不重新格式化就无法修复光盘。

自然的解决方案是对任何和所有 NAS 驱动器使用 ext2,因为这在 Linux 世界中得到最广泛的支持。许多 NAS 设备现在都支持这一点,所以多花一点钱买一个还是值得的,因为它符合所有的条件。如果你家里的主要台式机是 Windows,那么甚至还有 Windows 的 ext2 恢复工具比如 Linux Recovery from DiskInternals。

您存储的数据类型将决定您需要的备份计划的类型。如果是个人数据,如信件或照片,那么可以考虑内置 RAID 功能的 NAS。当插入第二个驱动器时,它们通常会自动配置自己,所以如果你插入一个用过的驱动器,以为会获得额外的空间,就要小心了!有几种类型的 RAID 配置可用,但在这种情况下最常见的是 RAID-1,它使用第二个驱动器来制作写入第一个驱动器的任何内容的相同副本。它自动且对用户透明地执行此操作,因此如果其中一个驱动器出现故障,另一个可以用来恢复数据。但是,您应该始终记住,RAID 不是备份!这只是降低了因磁盘故障而丢失数据的可能性。它不能防止控制器故障、火灾、洪水或盗窃造成的损坏。

Note

对于一些系统管理员来说,使用硬件 RAID 解决方案是一把双刃剑。它们无缝地工作,不需要任何设置和维护工作。但是,如果 RAID 系统出现问题并使用自定义磁盘格式,则可能无法恢复磁盘上的数据。您可以通过购买两个硬件来解决这个问题,并在将磁盘投入使用之前验证您可以交换磁盘而不会出现问题。或者,您可以向制造商核实所使用的磁盘格式是已知的还是附带了合适的软件恢复工具。

备份数据,如 DVD 或音乐片段,不需要(也不应该)RAID 尽管有一个没有坏处。因为这种类型的数据更改频率较低,所以您可以将外部 USB 硬盘插入您的台式机。然后,您可以运行您选择的备份软件(参见第六章了解此处的一些可能性),仅复制那些已更改的文件,然后拔出并存储驱动器。这延长了驱动器的寿命,值得付出额外的努力。

与所有备份一样,除非定期测试,否则它们毫无用处,所以请确保您确实测试了它们。有些人会每隔 6 到 12 个月将他们的备份拷贝到一个新的驱动器来测试它们。与花在抓取和组织数据上的大量时间相比,成本可以忽略不计。此外,每千兆字节的价格每年都在下降,使您可以在更小的尺寸中存储更多的数据。如果您迫切需要额外的空间,那么您可以在系统的其他地方重用旧的驱动器。虽然磁带备份系统是大多数企业的最爱,但 USB 硬盘驱动器的成本和便利性使它们在家庭市场上没有必要。

Note

硬盘要么在头几周出现故障,要么在你记得备份的前一天出现故障。所以买盘的时候,一定要在不同的厂家,不同的时间买,所以如果你拿到一个不良批次的盘(IBM 死星,挂你头!),你就最小化了自己得到两个的机会。

网络注意事项

在大多数情况下,NAS 的网络设置非常简单。通常,它会通过 DHCP 获得自己的 IP,并通过 CIFS/桑巴的服务提供对磁盘的访问。有时您需要一台 Microsoft Windows 机器来运行安装软件,但这种情况越来越少,因为配置是通过在 n as 上运行的网页来完成的。这里的主要警告是要注意那些没有 Samba 服务,而是依赖于诸如 ZFS 之类的东西的机器。

ZFS 是一个起源于 Sun Microsystems 的文件系统,是 Netgear SC-101 等 NAS 系统的特色。但是,尽管 ZFS 规范及其在大型商业系统中的使用,它还没有一个合适的内核驱动程序(因为许可证不兼容)。目前它只能与用户空间中的文件系统(FUSE)项目或提供的封闭 Windows 驱动程序一起运行。因此,如果只提供 ZFS 服务(例如前面提到的 SC-101),则需要在每个想要从 NAS 读取数据的设备上安装特定的驱动程序。这使得它对 PC 用户来说很烦人,对 Squeezebox 等其他硬件来说是不可能的。

通过 Windows Vista 5 控制 NAS 可能会有问题,因为一些 NAS 系统使用备用身份验证系统。这个问题可以通过以下注册表修改来解决:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa

通过设置此选项:

LmCompatibilityLevel = 1

额外功能

由于许多 NAS 驱动器比嵌入式 Linux 机器大不了多少,所以添加额外的软件是微不足道的...对于制造商来说。典型应用包括以下内容:

  • 打印机服务器
  • BitTorrent 客户端
  • 备份支持
  • iTunes 服务器

如果你想添加自己的软件,那么你通常是不走运的,除非你有一个已经被黑客攻击的变种,如 NSLU2,或者你有很多时间自己发现黑客!当计划一个大得多的家庭安装时,您可能只需要一个非常基本的 NAS 驱动器,因为您很可能很快就会升级到一个定制的 Linux 服务器,该服务器将支持您可能向它提供的所有额外功能,并且 NAS 服务是免费的。

当您购买第一个 NAS 时,不要担心额外的功能,而是担心它支持的存储空间,因为您可能没有足够的可用空间来保证在其上运行 BitTorrent 客户端。如此多的 NAS 机器以相当便宜的价格提供,以至于您不需要担心将所有东西都放在一个盒子里。将一个具有数 TB 空间的 NAS 用作 DVD 和 CD rips 的主要媒体存储区域,而将另一个用作辅助存储和功能服务器,这种情况并不少见。然后,第二个 NAS 充当您的台式 PC 和打印机服务器的每日备份。这些角色允许您在不需要时关闭一个 NAS(也许通过 X10)。

带媒体播放的 NAS

对某些人来说,这只是一个背面带有电视输出插座的 NAS。对其他人来说,它构成了一个范式的转变,因为它允许你把这个单元当作一个便携式录像机和视频库。和所有东西一样,它的价值取决于你打算如何使用它。

这些设备的一大卖点是它们可以从一个房间移动到另一个房间,甚至从一个房子移动到另一个房子,而不需要网络。这使得向您的家人和朋友展示您的照片和家庭视频变得更加容易,因为您只需将支持媒体的 NAS 设备插入任何电视,它就会工作。这也是一种引入(小级别)控制孩子们能看什么的方式,因为他们将被限制在硬件的内容上。

Note

有许多应用程序会阻止儿童安全观看内容。但正如育儿书籍告诉你的(或者,任何父母都知道的),你不能完全靠技术来解决这些问题,因为这不是真正的技术问题。

如果您想将您的媒体扩展到一个房间之外,您需要一个支持以太网的版本,如 Freecom 的 MediaPlayer II 或 cineDISK NAS。这些是组合的 NAS 驱动器,通过 Samba 支持文件共享,以及向电视或 HiFi 播放文件的媒体流。它们的优势在于能够从本地磁盘进行流式传输,从而消除了任何网络延迟,并限制了独立媒体单元(如 MediaMVP)的成本。此外,通过在这些设备之间分发您的媒体,如果一个未备份的硬盘出现故障,您不会丢失所有东西。只需很少的努力,你就可以将文件分发到那些更有可能播放它们的机器上,比如客厅里的电影、卧室里的电视剧、书房里的 MP3,以及孩子房间里的动画片。如果您以这种方式分离介质,请注意潜在的存储升级。一些设备为外部硬盘驱动器或记忆棒提供了 USB 端口(尽管一些较便宜的机器只打算为记忆棒提供 USB 端口,不支持大磁盘大小),因此请将这些机器放置在最有可能增加其磁盘占用空间的房间中。从个人经验来看,存储电视节目的磁盘填充得最快。

与所有嵌入式硬件一样,这类设备的问题来自于它们的升级路径,并非所有公司都会添加或发布带有最新编解码器的新固件或对旧固件的修复;许多设备太新,没有黑客社区来帮助。此外,与 MVPMC 不同,在这种情况下通常没有办法使用外部代码转换器。

此外,请仔细检查每个设备的规格,因为尽管包装盒上有“NAS”的名称,但并非所有设备都提供网络插座。一些制造商将声称它是“高清就绪”,而他们的意思是它将解码文件...但是只能以标准清晰度观看。此外,许多播放器没有硬盘,但需要硬盘,即使您只想通过网络传输媒体,如 Emprex 多媒体播放器。

然而,关注这些设备的市场总是值得的,它们通常会提供可以在软件中实现的新想法,例如“在电视上观看 YouTube”功能。

配置 Linux 机器

到目前为止,最灵活的 NAS 服务器是您为自己构建的服务器。任何机器都是合适的,因为处理能力不需要很大,所以它可以是一台旧的笔记本电脑,迷你 ITX 盒,或 NSLU2。唯一的要求就是要有网络兼容性。可选功能包括 USB 端口(用于附加驱动器)和带有 48 位 LBA 的现代 BIOS,因此它支持大于 137.4GB 的磁盘。这不仅仅适用于内部磁盘;如果您使用外部 USB 硬件,这也是必要的,因为它们通常依赖于机器来控制磁盘。

与以往一样,没有必要将所有媒体存储在一台机器上,也没有必要将一台机器仅用作文件服务器。如果您要将媒体分布在不同的物理磁盘上,那么最好将需要较高比特率的媒体(如电影)存储在内部驱动器上,将低比特率的媒体(如卡通或音乐)存储在外部驱动器或较慢的服务器上。

每台机器都需要按照你在第一章中看到的那样进行设置,但是如果有多台服务器或者你可能要移动这些单元,你需要注意你的命名约定。

准备机器

由于每台机器都是基于 Linux 的,它们已经有了自己的文件系统(包括基于文件系统的商业设备),所以这里您唯一的任务就是为您的文件提供一个位置。

对于内部硬盘,总是为您的媒体创建一个单独的 ext3 分区。使用了一个单独的分区,这样就可以单独安装它(这样在崩溃或断电的情况下更容易恢复),ext3 提供了一个日志文件系统。此外,因为媒体分区很可能是第一个被填满的分区,所以如果您的 Linux 机器发现没有剩余的磁盘空间,它也不会遇到问题。通过向/etc/fstab添加一个文件来提供一个挂载点:

/dev/sda7 /mnt/mediadisk auto user,noauto  0    0

并从更方便的地方创建硬链接;我在服务器上使用一个名为/media的根文件夹:

ln /mnt/mediadisk/media/tv /media/tv

请注意,我没有将文件存储在sda7分区的根目录中,而是存储在media/tv文件夹中。如果磁盘的用途扩展到包括额外的功能,如备份,这种传统的目录结构将使我受益。

外部 USB 硬盘的工作方式相同,但在/etc/fstab中使用了不同的线路:

/dev/sdb1    /mnt/usbdisk0 auto user,noauto   0    0

在这两种情况下,磁盘都不会自动装载。这是个人偏好,因为它要求——也要求我——在重大电源故障或崩溃后检查磁盘,其他人可能会忽略或跳过这一步,从而损害文件系统。

外部 USB 设备的另一个变化是,由于目录位于不同的物理磁盘上,因此需要使用符号链接:

ln -s /mnt/usbdisk0/media/tv /media/tv

这些驱动器的一个额外功能是记录哪个物理硬盘用于存储内容。这是在驱动器损坏或即将损坏,并且您需要移除正确的驱动器时使用的。在以相反顺序安装两个 USB 驱动器的情况下,这也很有帮助。

为此,我只需切换到相关驱动器的根目录,并键入以下内容:

touch THIS_IS_THE_SILVER_LACIE_500G_DRIVE

touch THIS_SHOULD_BE_MOUNTED_UNDER_SDB1

这证明了不污染根部的另一个原因。如果你遵循了从不同制造商购买硬盘的建议,这些名字很容易挑选。

准备文件系统

一旦机器准备就绪,就必须考虑媒体文件系统;你必须从全局的角度来考虑这个问题,包括每台服务器和整个房子。存储链有三个要素需要考虑:

  • 机器名称
  • 机器的物理位置
  • 存储在该计算机上的媒体的共享文件夹名称

把这些整理一下,机器名称往往会由厂商提供,比如cineDISK。如果你有能力,将其重命名为cineDISK1,并在设备背面添加一个粘性标签来表明这一点。如果可能,请始终为设备添加一个递增的数字,因为这将使扫描、备份和维护脚本更容易编写,因为每个名称都是按逻辑创建的,没有任意的限制。

您可能想在不提及制造商的情况下命名设备,如media_nas1所示。这也很好,但是建议您注意这指的是哪个设备。我在家里的内部 wiki 上使用一个页面,其中包含所有连接到我的网络的硬件的设备、型号、MAC 地址、固件版本、网络论坛等等。我还用它来记录每台机器的物理位置。

共享文件夹的名称应该都遵循一个约定,比如media_moviesmedia_tv等等。如果你有孩子,并为他们提供网络访问,那么提供单独的文件夹,如media_kids可能是个好主意。将所有介质拆分到单独的共享文件夹中的原因是,每个介质都可以有不同的 Samba 访问权限(每个介质都有或没有密码),并且可以自行卸载,而不会影响系统的其余部分。如果只有根media文件夹是共享的,那么控制一个media/movies目录将会更加困难。

准备主服务器

到目前为止,我们有许多服务器,有大量的技术信息和元数据。这些名字都是出于维护的目的。没有用户会想要或者需要知道这些卡通片在备用卧室的media_children下面的media_nas2上。家庭成员也不应该对你将movies文件夹分割成两个独立的磁盘 6 感兴趣,因为对于旧的驱动器来说太多了。为此,您应该指定一个主服务器。它可以是媒体服务器之一,也可以是完全不同的机器。建议这台主服务器运行家中最重要的服务,也是 24/7 全天候运行的服务。这允许它被用作 Node0,你将在第四章中了解到。

然后,这个 Node0 机器将每个共享文件夹从每个服务器挂载到它自己的目录结构中。正是这种共享的目录结构使得每个媒体流设备都可以访问媒体。

Note

乍一看,NAS1 连接到 Node0,然后再连接回 NAS1 似乎有些浪费,但要有效地向上扩展,在统一的环境中提供所有媒体,并支持媒体架构的动态变化,这是最好的方法。

我使用的目录结构将所有 Samba 共享放在一起,如下所示:

/net/homenet/slug1/media_tv

像这样的本地磁盘:

/net/homenet/mediapc1/usb2/media/movies

/net/homenet下面的层次结构中,作为一些链接或 Samba 挂载。这将成为一份关于家庭媒体服务器布局的自记录报告。然后,我在/net/media目录下创建一系列链接来隐藏结构:

ln -s /net/homenet/mediapc1/usb1/media/tv   /net/media/tv

ln -s /net/homenet/mediapc1/usb2/media/movies /net/media/movies

ln -s /net/homenet/itx1/usb1/media/mp3    /net/media/music

ln -s /net/homenet/slug1/usb1/media/videos  /net/media/videos

然后,为每个目录添加 Samba 共享就很简单了:

[media_tv]

comment = Media (TV)

path = /net/media/tv

browseable = yes

public = yes

writable = no

read only = yes

guest ok = yes

如第一章中的所示,我为家庭创建了只读的基本 Samba 共享,并为我创建了单独的受密码保护的读写共享。

还要注意,我使用了我家的子域(homenet)作为与目录其余部分的分隔符,而不是将所有内容都放在/net中。作为一名软件开发人员,它允许我创建自己的子网,它不是一般家庭自动化网络的一部分,以防我需要做一些冒险或实验!

媒体扩展器

一旦你有了一个文件服务器来提供对你的媒体的访问,你就需要某种方式来将媒体以听觉或视觉的方式呈现给世界。这可能涉及独立的硬件、基于 Linux 的机器或两者的组合。

独立硬件

要符合这一类别,硬件必须连接网络,使用 DHCP 来确定其 IP 地址,然后将数据从文件服务器传输到物理连接的电视或扬声器。这些设备总是使用 Samba 作为文件服务器,因为安装特定的驱动程序(比如 ZFS)在现实世界中是不可能的。

Hauppauge MediaMVP

尽管该设备可追溯到 2002 年,但它可以通过网络传输音乐、标清视频和图片,并在电视上显示。零售单元相当便宜、小巧、安静,是理想的主机单元。它只有三个插座:电源、RJ-45 以太网和 SCART。(美国版本将最后一个插座扩展到 S-Video、复合视频和立体声音频。)

为了工作,MediaMVP 需要三个独立的服务: 7 DHCP,用于启动过程的 TFTP,以及用于数据的 Samba,因为它没有自己的存储设备。开箱即用,这些服务是由一个 Windows 软件提供的,该软件有许多限制,如缓慢的菜单系统。这台机器还会阻止你观看任何非 MPEG1 或 MPEG2 编码的视频。这是因为视频信号是由 MediaMVP 内部的自定义芯片解码的,该芯片仅支持这些早期的编解码器。幸运的是,MediaMVP 启动时使用的协议是标准的,这使得您可以将 Linux 用作服务器。然后,你可以通过替换在实际设备上运行的固件,让它连接到 VLC,将你的文件实时转码为 MPEG2,从而更进一步。

创建服务器

MediaMVP 的启动过程是双重的。首先,它发送一个 DHCP 请求,请求它自己的 IP 地址和 TFTP 服务器的地址。其次,它使用这个 TFTP 服务器下载固件,固件最终在 MediaMVP 上运行,成为媒体设备。

首先将配置添加到/etc/dhcpd.conf:

group {

next-server 192.168.1.2;     # IP address of your TFTP server

host mvp {

hardware ethernet 00:0d:fe:00:15:8D; # of the MediaMVP

fixed-address 192.168.1.98;

filename "dongle.bin";

}

}

地址不必是固定的;然而,我在我的网络上采用了一种约定,表明我的子网上地址小于 100 的任何机器都是“内部设备”,如服务器或嵌入式硬件,不容易改变或移动,因此总是可用的。所有 100 或更大的都是一台随时可能从网络中移除或关闭的计算机。

从这里,控制被传递到 TFTP 服务器,以便 MediaMVP 可以请求固件,由文件名dongle.bin给出。

TFTP 代表普通文件传输协议,它是通常用于在机器之间复制文件的 FTP 的一个非常简化的版本。它按正常方式安装:

apt-get install atftpd

这将在/etc/inetd.conf/etc/default/atftp中添加适当的行,指示文件传输的目录(通常是/var/lib/tftpboot)。在我看来,与 TFTP 的主要区别在于 TFTP 不能使用用户名和密码。虽然这可能会使程序员的原始工作变得非常简单,但这是以安全性为代价的,这意味着您不应该向世界开放 TFTP 端口(UDP 69)。

然后,您可以将dongle.bin文件复制到/tftpboot文件夹,并打开 MediaMVP。从这里开始,将dongle.bin替换为 MediaMVP 可用的其他固件(如 MVPMC)是一件简单的事情,以提供改进的功能,如实时视频代码转换或与 MythTV 连接。

MediaMVP 媒体中心

这可能是目前可用的功能最全的替代固件;可以从 http://www.mvpmc.org 下载。它包括一个替换文件dongle.bin和一个配置文件。因为 MediaMVP 本身运行的是一个小版本的 Linux,所以这个配置文件只是一个包含 shell 命令的脚本,这使得修改固件映像而不重新构建它变得非常简单。至少,它应该包含将目录装入文件系统并调用主mvpmc程序的命令:

mkdir /media

mount.cifs "//192.168.1.110/media" /media -o user=mvp,pass=mvppass,rsize=34000;

mvpmc &

然后,您可以根据想要引入的额外功能向该命令添加参数。我现在将介绍其中的一些。

Note

在 MediaMVP 中也不能使用来自mount.cifs命令的匿名登录,所以在运行文件服务器的计算机上创建一个单独的 Linux 帐户(在本例中为 192.168.1.110)。因为此用户名/密码在配置文件中可见,并且此配置文件对任何具有 TFTP 访问权限的人都可见,所以您应该加倍确保它在您的网络之外不可见。

天气预报

这些数据是从 Yahoo!天气服务,并通过图形从屏幕上的一个菜单选项中呈现。它需要知道你在世界上的什么地方,并且你可以访问互联网。对我来说,在伦敦,这需要以下替代路线:

mvpmc --weather-location UKXX0085 &

您可以通过访问 http://weather.yahoo.com ,搜索您所在的城镇或城市,并抓取 RSS 提要来确定此代码。这将引导您进入如下 URL:

http://weather.yahooapis.com/forecastrss?p=UKXX0085&u=c

您会注意到城市代码(p=UKXX0085)和单位(u=c),允许您以摄氏度或华氏度来表示数据。

视频转码

硬件解决方案的最大问题是缺乏升级途径。虽然 MediaMVP 提供了一种改变固件的方法,但是 MVP 硬件没有使用足够强大的处理器来允许固件实时解压缩视频。不要将您过去的所有 DVD 片段转换成合适的格式,而是可以在您观看它们时即时转换格式(称为转码)。这需要配置 MediaMVPMC 和运行 VLC 的代码转换服务器。

首先,您需要添加适当的参数,告诉 MVPMC 代码转换服务器的地址。

mvpmc --vlc 192.168.1.110 --vlc-vopts dvd &

自然,就像我们见过的其他服务器一样,服务器只涉及软件,可以与 DHCP 或 TFTP 服务器存在于同一台物理机器上。但是,由于需要增加处理能力,您可能希望在单独的机器或桌面上运行转码软件。这允许你有一个小的,低功耗的服务器来运行你家的主要系统,只有在必要的时候才使用“大铁”。

Tip

代码转换服务器只需要一个具有合理规格的 CPU,这意味着一个旧的精简版 P3 或 P4 就足够快了。利用你的桌面通常是一个好主意,因为转码不会降低你的工作速度,因为那时你正在看电影!

根据转码服务器的速度,您可能无法管理最高质量的图像。通过将–vlc-vopts修改为 SVCD 或 VCD,您可以将合成质量分别降低到超级视频 CD 格式或标准视频 CD 格式。

Note

MediaMVP 设备本身只有输出标清图像的硬件。如果你一直将蓝光光盘翻录为高清文件,那么你需要使用 VLC 将它们转码为标清格式。

还建议您使用--use-mplayer命令行开关,如果 VLC 不能正确理解文件格式,它将切换到mplayer转码。

使用代码转换服务器的最大注意事项是,MVPMC 客户端软件播放的文件名必须与 VLC 在服务器上看到的完全相同。这可以通过小心使用符号链接来安排,因为我的媒体安装在磁盘的其他地方,我不想改变它。因此,我在我的服务器根目录下创建了一个特殊的文件夹,其中包含适当的链接:

mkdir /mvpmc_media

ln -s /media/mp3 /mvpmc_media/mp3

ln -s /media/movies /mvpmc_media/movies

ln -s /media/videos /mvpmc_media/videos

然后,我在 MediaMVPMC 上复制了这些文件,创建了自己的mvpmc_media目录,并通过网络挂载这些文件夹:

mkdir /mediamount

mkdir /mvpmc_media

mount.cifs "//192.168.1.110/media" /mediamount -o user=mvp,pass=mvppass,rsize=34000;

ln -s /mediamount/videos /mvpmc_media/mp3

ln -s /mediamount/videos /mvpmc_media/movies

ln -s /mediamount/videos /mvpmc_media/videos

如果您愿意,您可以在 MVPMC 运行时通过动态应用挂载指令来测试它们,因为您可以telnet进入 MediaMVP 硬件(用户名:root,无密码)并直接发出命令。

这个过程还有另一个好处,因为 MVPMC 上的文件系统浏览器非常简单;一个名为vids的目录对于创建它的极客来说可能已经足够好了,但一个更具描述性的标题,比如充满大写字母和空格的Music Videos,会受到其他家庭成员的欢迎。因此,您可以使用全名重复前面的过程来实现这个目标,而不违背您的 Linux 命名约定。

Note

虽然 DVD VOB 文件可以在此系统上播放,但不支持 DVD 菜单。

其他功能

MVPMC 中可用的其他功能包括:

  • 从 MythTV 或 ReplayTV 获取数据
  • VNC 观察报
  • 流媒体直播网络电台

它们的设置要求非常简单,在线文档中也有介绍,所以我不会在这里介绍。

极端

这是通过电视或 HiFi 系统播放媒体文件的几种设备之一。它的低价位和包含的 HDMI 使它成为进军媒体流的好机会。它是一个很好的测试单元,因为它支持从其内部磁盘、外部驱动器或网络(有线和无线)播放媒体。这使得它适合尝试不同的配置,而无需购买额外的盒子。除了音乐和电影,它还支持图像预览、天气预报以及来自 YouTube、Picasa 和 Flickr 的直播。

手风琴

该设备于 2003 年推出,是 MediaMVP 的纯音频版本之一,具有类似的“黑客能力”它也适用于客户机/服务器结构。本例中的服务器是一组运行在 Linux、Mac OS X 和 Windows 上的开源 Perl 脚本,名为 SqueezeCenter(以前的 SlimServer)。这为客户端提供了本地存储音乐的音频数据,并提供了一种连接到外部源(如互联网收音机或 MP3tunes music locker)的方式。它还能够通过向客户机发送命令来控制它们。服务器本身不播放音频,尽管您可以在同一台物理机器上运行软件客户端来透明地实现相同的结果。

然后,您需要一台或多台客户机(即主机)在远程房间播放音乐,通过有线或无线网络连接。该头单元可以如下:

  • Squeezebox Classic,带显示和输出到 HiFi 放大器
  • Squeezebox 接收器,无显示器,遥控
  • Squeezebox 吊杆,带显示器、内置放大器和扬声器
  • Transporter,据报道是一个更高质量的播放引擎
  • 软件客户端

使用适当的遥控器,您可以将 Squeezebox 实例链接在一起,以便它们都能播放相同的音乐,从而提供完整的全屋音频系统。

服务器软件

Linux 下的安装非常简单,通过使用软件客户端,您可以测试环境,而无需购买任何硬件。首先,转到/etc/apt/sources.list,在文件的任意位置添加以下内容:

debhttp://debian.slimdevices.com

接下来,执行以下操作:

apt-get update

apt-get remove --purge slimserver  # in case of an old install

apt-get install squeezeboxserver

并且,在确保您的音乐收藏为(新)SqueezeCenter 用户设置了适当的读取和执行权限后,您可以连接到它的 web 服务器(在端口 9000 上)并配置服务器。

其他软件

SoftSqueeze 是 Squeezebox 硬件的软件仿真,可从 http://softsqueeze.sourceforge.net 获得;它支持 Linux、Mac OS X、Windows 和大多数具有良好 Java 实现的平台。这对于测试新服务器和用作标准媒体播放器来说是很好的;但是,由于过分热衷于模拟双线 LCD 仿真,导航有点令人厌倦。然而,如果你愿意,你可以使用 SqueezeCenter 软件——通过其网络界面——来控制播放列表。当然,通过打开适当的端口,您可以远程完成这项工作。

Videobox ( http://videobox.sf.net )是一种使用(硬件)Squeezebox 将其红外信号传回服务器的方法,因此它可以触发外部脚本和代码。给出的一个例子是在服务器上开始电影回放,以便可以在屏幕上观看。

霸王龙 ME1

这款现代设备诞生于 2007 年,是目前可用的几种媒体播放设备之一。它声称支持高清输出,但缺少 HDMI 端口;因此,它通过 720 便士或 1080 英镑的高档 via YPbPr 提供其最高品质。它也可以作为一个 AV 记录器,但只能通过复合输入。该单元使大多数用户受益的地方在于它的低成本和本地存储支持。这可以通过 IDE 硬盘(或 SATA 硬盘,最新版本也可以将存储空间从 500GB 增加到 750GB)或 USB 进行,无论是记忆棒还是 USB 硬盘。

与许多技术一样,建议使用最新的固件;它现在支持 NTFS(默认文件系统是选择不当的 FAT32,它限制了最大文件大小),并且内部硬盘也存在稳定性问题。幸运的是,在后来的固件上,内置磁盘是可选的,允许你使用一个连接到 USB 的磁盘。

当然,该设备也可以从网络上读取电影文件,你也可以用它来删除 ME1 的本地存储上录制的电影,以便在其他地方存档。这个方法在(非常)低流量的网页 http://emprex-me1.blogspot.com 上有详细介绍,还有他们的谷歌群列表。

只有 Linux

这些年来,GNU/Linux 操作系统出现在如此多的发行版中,很难跟上它们的步伐。许多人在职业生涯早期就接受了一个,并且从未改变。当使用 Linux 机器作为媒体播放器的基础时,这些规则需要重新考虑,因为对桌面有好处的不一定对媒体播放有好处。因此,我将考虑一个合适的 Linux 发行版的必要的好处和特性,并且只提到细节作为例子,因为在硬件的情况下,这个领域发展得太快,不能给出明确的“最佳”答案。

操作系统

从真正的意义上来说,操作系统由内核、驱动程序、模块和相关软件组成。这些组件打包在发行版中,以便于安装。因此,在选择合适的分布时,需要考虑的变量很少。

首先,也是最显而易见的,您需要获得为所提供的内核构建的健康的驱动程序。硬件,尤其是图形等高端领域,需要高性能和特定的驱动程序来确保其得到有效利用。虽然大多数显卡没有加速板载视频解压缩,但它们有许多其他功能的硬件加速,这将显示视频性能的显著改善。

第二,你应该考虑启动时间。例如,xPUD 需要大约 10 秒钟,使它看起来像一个真正的机顶盒,而不是一台小型计算机。XBMC,正如你在第二章中看到的,也在这个范围内。

最后,需要确定分布的总大小。这总是最后一个考虑因素,因为它可以不费吹灰之力解决,也就是说,在更大的硬盘或固态存储卡上多花几分钱。后者对于大多数媒体流机器来说是更好的,因为你可以更快地从它们启动,它们持续更长时间(因为更多的操作是内存读取,而不是内存写入,并且没有移动部件),并且它们允许更小的外形尺寸。如果您正在构建自己的专门用于媒体流的 Linux 机器,那么请确保它能够支持从压缩闪存或 USB 记忆棒启动。

软件

一个好的媒体播放器发行版主要不是取决于操作系统,而是取决于软件。毕竟,它是你将要与之互动的软件。大多数媒体流开始时都是媒体播放器。这些对于一个流光来说是完全错误的。考虑这样一个基本场景:你坐在椅子上看着 2 到 3 英尺外的显示器,桌面上有一个由鼠标和键盘控制的媒体播放器。唉,大多数软件都是在台式电脑上开发和测试的,细微的差别可能会被忽略。请记住考虑以下几点:

  • 视觉效果:你通常会坐在舒适的椅子上从很远的地方使用这个界面。因此,按钮和字体需要大而清晰,放在一个整洁的屏幕上,对比度适中,有抗锯齿功能。
  • 屏幕:除非你的客厅里有最新的 LCD 技术,否则你的电视质量通常会比你的显示器低得多,所以小细节(尤其是细水平线)会丢失或在屏幕上无法分辨。
  • 控制:毫无例外,任何没有远程控制选项的家庭影院电脑都会失败。没有人会离开舒适的椅子去按机器上的按钮,或者想要一个键盘或鼠标放在他们的腿上。
  • 可导航的界面:与控件一起,必须有一个清晰的方式在菜单选项之间移动。只有在初始化期间,才可以用键盘输入服务器 IP。

所有这些点都被归类为一种被称为“10 英尺用户界面”的方法这并不是说这些规则是金科玉律或不可改变的,但是在一个软件中发现几个违背这些规则的地方可能是一个线索,表明这个项目还不是特别成熟,在现实世界中很少使用。

神话电视

在所有的 Linux PVRs 中,最著名的可能是 MythTV ( http://www.mythtv.org )。这由两部分组成——后端(mythback)允许你将电视卡上的节目录制到本地硬盘上,前端从mythback服务器上播放媒体文件。通过这种方式,您可以拥有一个功能强大的单一服务器,其中包含许多电视卡和软件,这些软件可以协调用这些电视卡录制频道的最佳方式,还有许多放置在房间各个角落的小型前端设备,它们都从服务器获取数据。这也提供了一种在房子周围流式直播电视的方式。

除了媒体播放,MythTV 还支持替代皮肤和插件模块,允许前端单元显示天气、显示照片库、玩游戏和上网冲浪。

如果你正在寻找一个 PVR 独立的外形,你可以将mythbackmythfront整合到同一台机器中,只要它足够强大。带有硬件编码的电视卡(如较新的 Hauppauges)有助于减小该机器的尺寸和功耗,让您可以使用无风扇系统。

PVR 的软件方法总是胜过硬件,因为可以更有效地添加新功能,并且可以迎合编解码器的变化。我现在将简要介绍一些例子。

弗利普

Freevo ( http://freevo.sourceforge.net )是一款以恶名昭彰的硬件 PVR 的名字命名的名为 TiVo 的游戏。 8 它是一种一体化的方法,在同一个软件中实现视频捕捉、录制和回放。(但在引擎盖下,它有一个单独的电视服务器部分。)这使得它更接近于 Xtreamer 类型的设备,尤其适合于更受控制的安装。

像 MythTV(和大多数软件 PVR,如果我诚实的话)一样,它也可以支持皮肤界面和插件,尽管大多数已经被折叠到软件的稳定版本freevo1中,所以任何改变都需要比平时更大的重新编译。这使得临时开发人员更难做出更改。这些插件包括常见的天气预报、X10 控制(通过heyu)、Skype 和 Flickr。

它也有 LiveCD 版本的图像(老实说,和大多数软件 PVR 一样),所以你不用在你的硬件上安装就可以测试它。

播放器

这是提醒跳过第二章的人回去看一下!XBMC 支持和运行的非 Xbox 平台比 Xbox 平台多。它支持常见的插件阵列,并有一个 LiveCD 版本。

视频磁盘记录器项目

http://www.tvdr.de 的项目是为大多数动手开发者准备的,因为它还包括一个建议的硬件组件。这个硬件是这个项目的主要吸引力,因为它基于 DVB-S 卫星接收器(它的主要关注点,因为模拟和数字电视是由插件提供的)和使用 PIC 芯片的定制遥控器。尽管在当今世界,这种级别的定制硬件很大程度上是不必要的,但它工作得很好,给了用户一个额外的理由来对他们的 VDR 充满热情。它使用的规格也低于当前大多数系统。软件方面,它有一个像样的(如果稍微有点小)界面,看起来像星际迷航:下一代 LCARS 系统和比大多数 PVR 更广泛的插件,包括游戏,电子邮件和网页浏览。

远程控制和 UPnP

在很大程度上,媒体流及其类似物是非常本地化的服务。您可以通过网络传输数据,但是控制器和显示器的物理位置很近。即使你有一个应用程序来控制设备(如 WDRemote 应用程序,或许多 VLC 变种之一),它也只是取代了你通常使用的红外遥控器。你还在把流光和它的遥控器绑在一起。进化的下一步是正式分离这些单元,并建立允许它们通信的开放协议,以及可以随意替换的单个组件。正如你可能猜到的,从标题到这一节,这是可用的 UPnP。

UPnP 简史

通用即插即用(UPnP)于 2008 年 12 月随着覆盖网络设备的 ISO/IEC 29341 标准的发布而正式开始。主导原则是,支持 UpnP 的设备可以在没有任何人工干预的情况下进行连接——更重要的是,进行配置。通过消除对设备驱动程序的需求,将逻辑转移到协议中,然后将这些协议视为阶段,每个阶段都有围绕每个阶段的限制的规则,这才成为可能。基本堆栈分为六个区域。

网络寻址

正如在第一章的寻址部分所述,网络最好使用由 DHCP 分配的动态 IP 地址。所有的 UPnP 设备都使用 DHCP 来确定其本地地址,因此准备这样一个网络的(短)时间投资被认为是非常值得的。在这种服务不可用的情况下,UPnP 应该退回到链接本地地址,这可能不在您的预期范围内。(它将始终位于一个私有的内部网地址上,但可以与您设置的其他地址不同,因为 169.254/16 范围是首选,这意味着设备将不可见。)

有了路由器提供的开箱即用功能,即使是偶尔涉猎 HA 的人也可以确保轻松的 UPnP 体验。自然,当 UPnP 设备是软件设备时,IP 由主机提供。

发现

与其他服务(如蓝牙)能够发现其网络上的兼容设备一样,它通过简单服务发现协议(SSDP)工作,其行为类似于 DHCP 或 DNS。因此,端口 1900 充满了寻找这些设备的流量。您不太可能想要(或需要)本地 intranet 之外的发现服务,因此没有必要向外界开放这个端口。此外,由于这是一个多播请求,您将无法通过 wifi 使用它,因为默认情况下,大多数 wifi 路由器禁用多播。

描述

这是一个 XML 文件,通过 HTTP 返回,描述整个设备。它不控制设备本身,但它解释了如何这样做。该文件的一个示例如下:

<?xml version="1.0" encoding="utf-8"?>

<root >

<specVersion>

<major>1</major>

<minor>0</minor>

</specVersion>

<device>

<deviceType>urn:schemas-upnp-org:device:BinaryLight:1</deviceType>

<friendlyName>Kitchen Lights</friendlyName>

<manufacturer>OpenedHand</manufacturer>

<modelName>Virtual Light</modelName>

<UDN>uuid:cc93d8e6-6b8b-4f60-87ca-228c36b5b0e8</UDN>

<serviceList>

<service>

<serviceType>urn:schemas-upnp-org:service:SwitchPower:1</serviceType>

<serviceId>urn:upnp-org:serviceId:SwitchPower:1</serviceId>

<SCPDURL>/SwitchPower1.xml</SCPDURL>

<controlURL>/SwitchPower/Control</controlURL>

<eventSubURL>/SwitchPower/Event</eventSubURL>

</service>

</serviceList>

</device>

</root>

(来自 http://developer.gnome.org/gupnp/unstable/server-tutorial.html )

控制

描述了该设备将响应的控制之后,远程控制应用程序就有可能向该设备发送消息。这些都用简单对象访问协议(SOAP)包装,这意味着您将看到大量的 XML!

事件通知

控制层用于接收传入的消息,只有 even notify 层能够发送它们才有意义。当设备上的状态改变时,就会发生这种情况。这些事件的细节因设备而异,因此当“控制点”第一次订阅设备时,会发回一个列表(同样是 XML 格式的),其中详细列出了控制点可以监听的事件。然后,它请求订阅这些事件,从而启动设备和控制器之间的推送机制。

陈述

最终,有一个层,其中两个设备同意在特定 URL 的媒体想要被播放,并且它应该在特定设备上被播放。在规范中没有给出表示层应该支持哪些媒体格式,因此哪些文件是兼容的。这是“有意为之”,这是数字生活网络联盟已经解决的问题。(有关这方面的更多信息,请参阅本书后面的内容。)

因为表示层与控件和服务器是分离的,所以该架构为我们提供了一个非常巧妙的内置优势!也就是说,很容易将一个信号流式传输到两个不同的表示组件。从表面上看,这提供了一个基本的“全屋音频”系统,或者说是一种在客厅观看同一节目并在厨房继续观看的手段。的确,这是可能的。但是由于演示组件在功能上不需要匹配,这意味着您可以在休息室拥有一台支持 UPnP 的电视,但在厨房只有一组合适的扬声器。通过这种方式,你可以继续听节目,而不会被画面分散注意力——如果你在厨房工作,这可能是有益的。

证明

这是我们六层堆栈中的第七层。即...没有认证!尽管这说明了我们不开放端口和使用本地网络地址的决定,但它确实引入了一个问题。在这种情况下,这不是一个技术问题,而是一个管理问题。如果本地网络上的任何人都可以访问您的媒体,您能信任网络上的人吗?在大多数情况下,这些是你的家庭成员,他们(应该)遵守必要的社会规范和强制措施,以阻止他们滥用这种权利。但是,您只有一个大的粒度控制机制,也就是说,如果这个机制失败,就完全删除他们的网络访问。

有对 UPnP 的扩展(例如设备安全服务和 UPnP-UP(用户配置文件))和协议仍然没有得到广泛支持。

但是,如果您需要身份验证,并且您不能确定您的小孩是否会对您的证书 15/18/X 级电影感兴趣,那么您可能需要借助 Samba,在您的媒体分发中使用密码保护区。与 UPnP 相比,它没有得到很好的支持,也没有那么灵活,但它会让人安心。

UPnP 的高级分离

鉴于内部协议基于堆栈的安排,最终用户也了解这一概念也就不足为奇了,因为系统各部分的功能是分离的。这种分离非常自然,包括:

  • 服务器—向网络上的其他设备提供媒体
  • 控制器—在任何给定设备上启动/停止媒体
  • 渲染器—显示媒体,可以是视频、图片或音频流

这种分离意味着您可以在任何给定的设备上实现任何(或所有)功能层。如果他们生活在一个单一的设备,你有一个标准的媒体播放器。当服务器分离时,典型的媒体流设置是 NAS 扮演服务器的角色,而流媒体工具是控制器和呈现器的组合。当它们都独立时,您可以从任何地方使用任何媒体控制任何设备。这进一步扩展,以便您可以在一个设备(或渲染器)上开始观看节目,使用控制器,并向不同的渲染器发送命令以继续观看。

这也意味着你需要安装三个软件。

计算机网络服务器

这里有几个选项,选择哪一个取决于运行它的机器的大小。

迷你 DNA

对于微型需求,如树莓派,我们有恰当命名的 minidlna。这是一个微型的尺寸和外观,但是它提供了标准的音频、视频、字幕和图片功能。最大的缺点是缺乏代码转换,但是对于基于 Linux 的 HA 解决方案,媒体呈现器能够处理几乎任何格式,这是对 CPU 周期的不必要消耗。

它可以从 http://sourceforge.net/projects/minidlna/ 下载,或者,对于那些使用 ArchLinux 的用户,在 https://www.archlinux.org/packages/?name=minidlna .作为一个包检索。大多数其他发行版还没有包含它,所以你通常需要编译它。您将始终需要包含它所依赖的 AV 库的开发版本:

  • libavcodec 公司
  • libavformat
  • 滑鹌
  • 利贝西夫

此外,根据版本的不同,您可能需要修改 metadata.c 来处理 AV 头文件中的更改。具体来说,转到第 715 行附近,显式添加:

#define AV_DICT_IGNORE_SUFFIX 2

因此它在函数定义之前:

#define AV_DICT_IGNORE_SUFFIX 2

sqlite_int64

GetVideoMetadata(const char * path, char * name)

{

配置服务器需要您编辑基本配置文件,以指示端口、媒体文件的适当位置以及日志文件。该文件为 minidlna.conf,应修改为:

# port for HTTP (descriptions, SOAP, media transfer) traffic

port=8200

# set this to the directory you want scanned.

media_dir=A,/net/media/mp3

media_dir=/net/media/movies

# set this if you would like to specify the directory where you want MiniDLNA to store its log file

log_dir=/var/log

多行 media_dir 是完全可以接受的,“A”标志确保只包含音频文件。这很方便,因为一些较新的专辑包括数字曲目和音乐视频以及它们的音频对应物。

在这里,您可以使用以下用户帐户将服务器作为守护程序启动:

minidlna -f minidlna.conf

此时,它将扫描所有文件的指定媒体目录,尽管服务器将在扫描完成前开始。因此,随着扫描过程的继续,一些媒体播放器将需要刷新(或者,在最坏的情况下,重新启动)来拾取文件。它还将在内核中安装一个 inode 通知程序,以自动在媒体目录中查找新文件,尽管为引入新媒体而对配置文件进行的任何更改都需要您重新启动守护程序。有一个命令可以强制进行这样的刷新:

minidlna -R

尽管这种选择的成功程度变化很大。

如果您打算在/etc/init.d中的启动脚本中包含 minidlna(或任何其他 UPnP 服务器),那么在序列的末尾包含它,以确保 RAID 等文件系统服务完全启动。

默认情况下,媒体文件的缓存存储在/tmp中。如果您希望这种情况更持久,例如,在重新引导之间,则在配置文件中添加一行以实现这种效果:

db_dir=/var/cache/minidlna

虽然没有 web 管理工具,但您可以通过将 web 浏览器指向端口 8200 或安装 webmin 来检索基本统计信息。然而,在现实中,几乎不需要管理,因为它旨在通过像 VLC 这样的控制者来实现无头运行。

格里利

作为一个媒体服务器,Rygel ( https://live.gnome.org/Rygel )在 minidlna 概念功能的基础上加入了它的主要遗漏——代码转换。自然,这需要一台比 minidlna 性能更高的机器,但该软件仍然保留了其在无头机器上使用的重点。

与 minidlna 一样,Rygel 可以由本地用户运行,并通过指定媒体的 URL 进行配置:

# In ∼/.config/rygel.conf

uris=/net/media/movies,/net/media/mp3

然而,与 minidlna 不同,Rygel 似乎要等到扫描完整个目录后才开始。所以在执行之后:

rygel

有的是时间去喝杯咖啡!

XBMC(外部网路)

自然,像 XBMC 这样的巨型媒体系统既可以作为服务器,也可以作为呈现器。如果您有一个主媒体盒,而其他媒体盒被视为不能同时访问的从属(或从属)单元,这是一个理想的解决方案。当 XBMC 服务器为其他渲染器提供数据时,它可能没有足够的处理能力来支持自己的本地渲染器以及其他请求,因此使用单独的从服务器是一个可行的解决方案。

向其他设备共享 XBMC 内容非常简单,只需要在“通过 UPnP 共享视频和音乐库”标题下启用它根据 XBMC 的版本,这是在设置➤网络➤服务(版本 11,又名伊甸园),或设置➤服务➤ UPnP(版本 12,又名弗罗多)。然后,您可以像往常一样从控制器中发现媒体。

Note

XBMC 是一个非免费的包,所以一些发行版(比如 Debian)的用户需要添加额外的库来通过他们的标准包管理器使用它。

在 Raspberry Pi 上,XMBC 可以通过使用自定义安装(目前有三个)或将其添加为 Raspbian 发行版的标准包( www.raspbian.org/RaspbianXBMC )来安装。

安装程序可在:找到,更多信息见第九章。尽管 XBMC 和 Raspberry Pi 的这种组合在与任何连接到 USB 的设备(例如,外部驱动器,尤其是 DVD)配合时并不是最完美的匹配,但在这一领域已经做了很多工作,因此人们期待着改进!

with more information given in

渲染器

几乎所有的传统媒体播放器都可以被认为是渲染。虽然最初它们仅限于从本地驱动器重放媒体,但这慢慢扩展到通过网络(通过 Samba)处理文件,现在扩展到 UPnP。由于篇幅有限,我有机会简要介绍其中的几个。

可见光通讯

作为媒体播放的坚定支持者,VLC 几乎拥抱了每一项新技术。UPnP 也不例外,在验证新配置的 UPnP 服务器时,它是最容易使用的。

首先,打开工具➤首选项菜单。从这里,选择“全部”以获得配置选项的完整树形视图。然后,您可以打开播放列表分支,并勾选“服务和发现”部分中的“通用播放”选项。您现在已经在 VLC 上启用了 UPnP。

要播放 UPnP 内容,您需要选择本地网络分支,然后它会显示包含 UPnP 的网络上的各种可用服务。过一会儿,就会收到发现消息,您可以像平常一样浏览树。

图腾

Totem 是许多 Linux 发行版的默认媒体,由于 Coherence 插件和控制器的缘故,它在大多数发行版上提供没有配置的 UPnP。要确保可以找到 UPnP 服务器,只需使用“编辑➤Plugins”菜单项,并确保 Coherence DLNA/UPnP 客户端已启用。然后可以从包含“播放列表”的同一个下拉列表中使用它

Note

Coherence 也可以作为一个独立的应用程序,能够充当媒体服务器。

XBMC(外部网路)

当作为一个媒体渲染器时,XBMC 按照最初的设想,播放音乐和视频。XBMC 不需要特定的配置,所以你可以直接进入视频➤文件➤添加视频并浏览到相关的 UPnP 服务器。

真实硬件

由于 UpnP 支持 DLNA(见本书后面),并且 DLNA 得到许多现实生活中的制造商的支持,找到支持 UPnP 的硬件相对容易。这包括索尼、三星和其他公司的电视、Playstation 3、Xbox 360 以及各种智能手机。

此外,大多数配备 Windows 7 或 Windows 8 的电脑将自动运行 UPnP 服务器,提供对用户媒体和一般机器媒体的访问。

控制点

非正式地称为控制器,控制点浏览服务器上的数据,并命令渲染器显示数据。与 UPnP 控制器采用的“一刀切”的方法不同,通过控制点访问媒体具有自动解析元数据的优势,因此您可以按流派、专辑、艺术家或播放列表自动浏览您的收藏。

控制点分为两大类:

  • 与现有玩家或控制器通信的那些
  • 需要中间服务器的应用程序

在第一个类别中,你有一系列 iOS 和 Android 控制应用程序,如 XBMC 命令、VLC 远程等等。这些有时需要您在服务器上打开特定的 HTTP 端口。

其他的,比如 jfcontrol ( www.digitalsirup.com/jfcontrol/index.html )和 Minerva 应用,都需要一个连接 wifi 的机器上的中介服务器。然后,控制点连接到服务器,服务器在传递消息之前对消息进行适当的格式化。虽然严格来说不是 UPnP 控制点,但它们经常被用来控制它们,因此在这里值得一提。

对于命令行爱好者来说,可以通过以下请求来控制 XBMC:

curl -i -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0", "method": "Player.GetActivePlayers", "id": 1}' http://xbmc:www@192.168.0.21:8080/jsonrpc

这将返回正在播放的媒体流(音频、视频、图片)列表。URL 照常分解为[用户名]:www @[IP 地址]:[端口]。更多命令可在 http://wiki.xbmc.org 找到,强烈推荐,因为 XBMC 的 v11 和 v12 之间的结构已经改变。

开发新的 UPnP 应用

由于 UPnP 是一个影响如此深远的标准,人们很想转换现有的应用程序来利用它的功能,并将其扩展到当前可用的许多设备中。编写这种应用程序的范围超出了本书的范围,所以我将把您引向一些使任务变得更容易的资源。

GUPnP 是一个构建 UPnP 应用程序的框架。它的意图很简单,只提供框架元素,排除任何 DLNA 细节,并要求您实现任何类似高级媒体服务器的功能( http://gitorious.org/gupnp/pages/Home )。

dLeyna 是一个相对较新的项目,旨在为 UPnP 应用提供伞式服务,在 https://01.org/dleyna 中有详细介绍。

如果你有兴趣从头开始编写自己的 UPnP 设备,而不使用中间件或助手库,那么前往 http://upnp.org 并从 http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf 访问基本规范。

www.upnp-hacks.org/upnp.html 也可以找到好的信息。

UPnP—封闭版本

自然,对于任何好的技术,一个(或多个)公司都会在其上构建自己的专有版本。两个著名的是 DLNA(数字生活网络联盟)和 AirPlay。

dlna!dlna!dlna

作为索尼 2003 年的一项倡议,它已经被纳入一个非盈利的贸易组织,现在有 200 多家不同的成员公司,每个公司都加入了自己的观点。因此,有超过 9000 种不同的设备符合 DLNA,使其成为可用的最普遍的媒体分发技术之一,特别是在计算对资深技术极客和 SWMBO 都有吸引力的硬件设备数量时。

尽管 DLNA 和 UPnP 的协议非常接近,但当涉及到内容呈现时,它们的规范是分开的,因为 DLNA 对可以分发的媒体进行了限制。这些限制以文件格式、编码和屏幕分辨率的形式出现。尽管这确保了任何 DLNA 将“正常工作”,并真正实现 UpnP 的“零配置”梦想,但是,因为 DLNA 是许多年前开始的,并且电影编解码器(相对而言)经常改变和升级,这意味着 DLNA 不支持今天广泛使用的许多格式(如 MKV)。要解决这个问题,您可以在服务器或渲染器上解决问题。在服务器端,您可以在流式传输之前将电影转码为可接受的 DLNA 格式。尽管这很昂贵,但在大多数相当强大的桌面系统上实时完成是可能的。(但是,如果涉及多个流和/或一个 Raspberry Pi,您还不如将文件复制到 USB 记忆棒,然后带着它走到您的设备上!)从呈现器方面来说,许多现成的媒体流将支持规范中没有包括的格式,以消除兼容性和代码转换的问题。

根据你的观点,DLNA 要么是“UPnP 做错了”,要么是“UPnP 做对了”我将把争论留给你去决定!

DLNA 遵循 UPnP 的理念,将不同的媒体功能分成不同的类型。就 DLNA 而言,它们是:

  • 数字媒体服务器。DMS 的作用类似于 NAS,它存储内容并使网络上的其他设备可以使用这些内容。
  • 数字媒体播放器。DMP 从 DMS 中提取内容,以便回放和显示。
  • 数字媒体控制器。DMC 列举 DMS 上的内容,并向媒体呈现器发送“播放”请求。
  • 数字媒体呈现器。DMR 按照控制器(DMC)的指示,接受由 DMS 推送给它的内容。
  • 数字媒体打印机。DMPr 在 DLNA 相当于一台自我标榜的网络打印机。它可以被认为是一个“只写”DMR,工作到 DMC 或 DMP 的控制。

与 UPnP 一样,一些设备将两个或多个功能组合在同一个物理盒中。

大多数基于软件的 UPnP 设备也是 DLNA 兼容的,但还没有支付许可费来获得正式许可。

空中播放

最初在 2004 年被称为 AirTunes,这是苹果公司开发的 UPnP 和 DLNA 的等价物,允许所有兼容设备之间的媒体流。然而,作为苹果公司,只有当你拥有苹果设备和软件或者进入市场的少数第三方授权产品之一时,这样的流媒体才有可能。因此,它在开源世界中很少被采用,甚至像 ShairPort 这样试图模仿机场快线的项目也失败了。

在基于 Linux 的家庭中使用 AirPlay 的唯一好处是为孩子们提供了一个访问媒体的封闭网络。你可以为主卧室和客厅提供一个开放的 UPnP 环境(观看习惯可以受到社会监督),为孩子们提供一个 AirPlay 环境。

分配

这是我们数据链的第三步。一旦我们提供并解码了媒体数据,我们就剩下一个 AV 信号,可以随时插入电视或高保真音响。但是我们还有选择。

本地处理与远程处理

前面提到的设备都是本地加工的。也就是说,我们在与电视或 HiFi 物理连接的位置解码数据。这种情况很常见,因为它为我们提供了更高的保真度,并意味着控制该单元更容易,但在某些情况下,远程处理更好,只发送合成的 AV 信号。

AV 发行

几乎所有媒体播放设备的输出都是我们的第一站。这通常包括用于立体声音频或复合视频、S-Video、EIA 接口、SCART 等的 RCA 唱机插座。这可以将低功耗的模拟信号短距离传输到放大器,无论是电视还是高保真音响。因为这些信号总是需要一个功率放大器,我们称之为主动分配。

以这种方式提供分布需要各种互连和许多电缆。这些电缆的长度没有上限,因此扩展和配电箱是可能的,允许在多个地方观看同一图像。自然地,作为一个模拟信号,音频(或图像)会随着远离信号源而变得更柔和。只有你能决定什么样的质量损失是你可以接受的。

如果你想在你的房子周围分发高清图像,那么你目前必须考虑更昂贵的选择,如矩阵切换器,因为目前的作物主要集中在 RCA 插座上。

转换

最便宜的必要设备是一个 AV 开关盒,或 AV 源选择盒。这为您的各种设备(DVD、PVR、VCR 等)提供了多个输入,并将其中一个路由到电视输出。大多数设备让你选择使用 S-Video、RCA 或 SCART 输入。这自然要求电视始终设置为接收来自机顶盒的输入,而不是其内部调谐器。有许多开关盒可用,因此需要考虑的特性包括:

  • 红外遥控:这是必需品,真的。因为这个盒子代替了你的电视频道转换器,它必须具有你所期望的电视功能...它至少是一个遥控器。
  • 有源或无源设备:有源设备中有一个小放大器,因此需要电源。这些确保了强信号,但代价是廉价机型的质量较低,因为它们的内部放大器不如 DVD 播放器或电视上的放大器好。无源设备没有这种放大功能,更有可能缺少红外遥控器。
  • 输入连接:虽然有些盒子为每个输入提供 S-Video、RCA 和 SCART,但它们可能不会互连。也就是说,RCA 输入插座可能只连接到 RCA 输出插座,而不连接到 S-Video 或 SCART。因为您只有一个输出到电视,所以这需要您进行补偿,以使您的互连适应最常见的外形,并将所有其他输入转换为相同类型的插头(大多数电子商店都有转换器)。然后使用等效的输出。规范的这一部分通常没有很好的记录,所以先检查商店的退货政策。
  • 输入的数量:数一数你拥有的设备,加上你想购买的设备的数量,再加两个更好的衡量!一旦超过这个限制,你就别无选择,只能买一个更大的开关盒。您可以将它们链接起来,这很麻烦,会降低质量,或者您可以在电视上为每个开关盒使用单独的 EXT 输入,这同样很烦人,但信号链中的电子元件较少。

入门级开关盒上最大的遗漏是在立体声音频和 5.1 环绕声之间切换的功能。因此,您需要一套单独的电缆,将 DVD 的 5.1 输出(控制 5.1 扬声器)和 DVD 的立体声输出连接到您的开关盒。

拆分和合并

一旦您准备好 AV 信号,您可能需要将其分离,以便信号的视频部分进入电视,而音频进入 HiFi 的线路输入。有两种主要方法可以实现这一点。第一种是简单的方法,如果您的电视有自己的立体声输出插座,就可以使用,因为它们可以从电视直接连接到 HiFi,没有任何问题。另一种方法是将开关盒输出的信号分成两路(或更多路)输出,一路用于电视,一路用于高保真音响。这种方法意味着您将无法使用 HiFi 来放大使用电视内置调谐器选择的任何电台,但这可以通过仅通过接收器(如有线调谐器或 digibox)或 VCR 观看电视来纠正,该接收器已插入开关盒。这可以通过多种方式实现。最便宜的是使用两根 Y 形电缆(也称为 Y 形适配器),左右音频信号各一根。这些从一个输入提供两个相同的输出,不需要电源。这些在分离音频信号时工作良好,但在用于视频信号时由于阻抗问题可能不太令人满意。如果质量不够好,那么你需要一个更复杂的分线盒。

分线盒的作用类似于 Y 形电缆,但通常有一个放大器来阻止信号衰减。这也使它能够以很少的额外成本提供更多的输出,允许您将一对单独的电缆接入厨房和餐厅。

如果这两种方法都不适用,您可以通过布设多条扬声器电缆,在放大级之后分离输出。

布线织机

布线织机携带强大的信号(双关语!)通过电缆来驱动你房子周围的各种无源扬声器。因此,我们称之为被动分配。您应该为房子中可能听到相同音频内容的每个区域创建一个织布机,因为这里的本地控制更困难(除非您有带音量控制的扬声器或想要自己黑一个)。在如图 3-1 所示的房间布局中,你在客厅和餐厅之间几乎没有隐私,所以它们会和厨房在同一个织布机上,因为你可能想在不错过音乐或电视输出的情况下进出。相比之下,如果像阳光房或书房这样的扩展被添加到房子的后部,它会被认为是一个具有不同生活方式目的的独立区域,不会在同一个织机上。相反,任何音乐都应该通过 IP 提供。

A978-1-4302-5888-9_3_Fig1_HTML.jpg

图 3-1。

A standard downstairs plan

布线机中的第一个组件是主功率放大器,它的输入来自我们之前讨论过的配电盘。通常,这将驱动一组扬声器,尽管一些放大器为其他组提供额外的输出。在同一台织布机上很少有两个以上的房间,甚至更少有两个以上的房间,所以你通常不需要更多的设备。

在需要更多输出的情况下,您可以在链中添加扬声器控制盒。这需要一个单一的扬声器输出,并分成许多。这些额外的扬声器电缆可以延伸到其他房间,并直接连接到其他扬声器,无需电源。这是这种方法的主要优点;也就是说,电缆更容易铺设(孔更小,因为末端没有笨重的插头),附近也不需要电源插座,使你能够在媒体播放器不实用或不可能的浴室中添加音乐。

Note

浴室使用的特殊防水扬声器是必要的,它们有密封的锥体和篮子,因此可以应对水和湿度。有各种型号,包括可以安装在天花板上的嵌入式。

如果您使用质量合理的扬声器电缆,信号将不会在所涉及的距离上消散。

Note

如果您的放大器有两个输出,但想要控制三组扬声器,那么将控制盒连接到第二个输出,将主扬声器(您更有可能在第一个输出上进行挑剔聆听)连接到第二个输出。如果你不需要这样做,那么在链条中增加一个步骤是没有意义的。

无线 AV 分发

铺设电缆并不困难,但应小心操作,避免钻穿电力电缆、水管和煤气管。考虑到这一点,现在有一些硬件可用,比如你在第一章中看到的 AV 视频发送器,用于无线分发音频信号。

在很大程度上,它们提供了一个方便的解决方案,但景观扬声器,这是建立在外面,看起来像岩石(例如),提供了唯一实用的解决方案。它们也必须由电池供电。

矩阵开关

对于大多数家庭应用,一个标准的开关盒足以控制您的 AV 设置。如果您有蓝光播放器或其他高清设备,您通常会使用 HDMI 将其直接插入电视,因为这消除了信号链中的所有其他组件。唉,我见过的价格合理的开关盒都不支持 HDMI。 9

此外,如果你想把你的两个输入设备(如 PVR 或 DVD)分配到两个不同的地方,那么你会发现你不能,因为交换机只提供单一输出。

这两种限制都可以用矩阵开关来克服。它们具有更宽的输入范围(通常包括 VGA ),可以将输入信号从(比如)八个输入中的任何一个发送到任何(或所有)输出,输出通常为四个或更多。这使得最强大的 AV 控制方法成为可能,所有的硬件都位于一个地方,结果通过电缆传送到房子的每个房间。还有,因为这是专业级的设备,一般都自带串口,便于电脑直接控制。

在您的设置中使用矩阵切换器是一个巨大的进步,不仅仅是经济上的。为了充分利用设备,您需要将您的 AV 设备放在切换器附近。此外,你不仅会有通常的混乱的电缆进入切换器,而且你还会有额外的混乱的电缆离开它——每个房间一套。而且,在大多数情况下,矩阵开关并不小。因此,把它们放在客厅是不切实际的。相反,你需要考虑一个房间或一个隐藏的橱柜,可以放置切换器和 AV 设备。现在设备被隐藏起来,购买一个红外继电器或网关来转发红外信号到机柜内的设备是必不可少的。这将是矩阵切换器所需要的,并可能成为软件包的一部分,所以第二次购买!

矩阵开关的输出连接器各不相同。有些以 AV 信号的形式提供输出,如 S-Video 或其他家用格式,使将其他接收器连接到您的家庭并使其工作变得非常简单。另一些则是为酒店和会议中心设计的,将每个输入编码成专有协议,以便输出可以通过以太网传输。在这种情况下,每个房间都需要一个额外的接收器单元,从而节省了在您的房子周围铺设特定 AV 电缆的工作量。由于数据通过现有的 Cat5 电缆传输,您通常可以用同样的方式发送红外线控制数据,从而节省了经常需要的红外线继电器。

Note

如果您的大部分源媒体存储在硬盘上,那么您可能根本不需要矩阵切换器,因为它可以通过 Cat5 传输到使用软件流解决方案(如 VLC)的小型 Linux 主机。

对于那些生活在地下火山的邪恶天才来说,矩阵切换器提供了一个任务控制室的场景,只需要很少的额外费用!毕竟,你可以将一组输出连接到一排小型廉价的电视机上,同时观看多个信号源。

控制

拥有在每个房间播放音乐的能力是一回事。能够控制每个房间的音乐是另一回事。这是链条中的下一步,但并不总是必要的。再看图 3-1 中的房屋布局。这不需要复杂的控制系统,因为客厅是本地控制的,厨房音频流通常在你开始准备晚餐时打开,在你吃完后关闭。因此,被迫从客厅控制 AV 不成问题。

用扬声器控制盒将几个房间(例如,主卧室、浴室和书房)连接在一起并让它们一直开着也不是什么难事。在这种情况下,很可能尽管三个房间中的两个在一天的大部分时间里可能是空闲的,但是当其中一个房间被使用时,其他房间被排除在外,使得没有必要花费成本或精力来为每个房间提供单独的控制。

本地控制

能够从设备本身控制设备(如扬声器或立体声放大器)是最合理的解决方案,幸运的是,大多数主机都自动提供了这一功能。例如,一个本地放大器或一组有源扬声器的前面有一个音量控制和一个改变源输入的装置。因此,任何使用 AV 或 Cat5 电缆的配电系统都将内置控制。

为了影响无源扬声器(可能是从远程扬声器控制盒馈电的扬声器)的音量,您需要一个与扬声器串联的衰减器。对于低功率解决方案,可以将双对数电位计直接安装到扬声器支架上。(您需要对数,因为这是音量的工作方式,并且您需要双对数来控制立体声音量。)这不会给你特别好的保真度,因为设备内部的两个轨道不会很好地相互匹配,并且产生的一些频率会丢失,但它会很便宜。一个更好的解决方案是,在一个基本的墙壁单元中提供定制的衰减器,并提供一个更好看的质量更好的控制机制。如果您的扬声器不是壁挂式的,那么您将不得不在墙壁空腔内或外部轨道中布设一套额外的电缆。因此,电缆从扬声器控制箱连接到开关,然后连接到扬声器。最好在铺设其他电缆之前考虑这种方法。除了浴室(这种衰减器需要防水),这种控制方法通常是不切实际的,最好使用主动式头部装置或根本没有任何形式的局部控制。

遥控方法

你的房子会随着音乐的声音而活跃起来。除非你生活在每个房间都有音乐的环境中,否则你无法想象这有什么不同。能够改变音量很好,但不是必须的,因为每张专辑都被标准化为内部一致。然而,如果你随机播放音轨,音量会有很大的变化,这就需要本地音量控制。如果你要引入这样的功能,你通常会想要更多的本地控制来跳过那些你不想听的随机音轨。这样的功能需要更多的硬件。

直接控制

标准 HiFi 设备总是配有红外遥控器,因此可以在每个房间放置一个红外中继接收器,并将其发射器与设备上的接收器眼对齐。小型接收器可以安装在墙内,与电灯开关并排,或者代替电灯开关,由电池供电。富有冒险精神的开发人员可以利用廉价的一体化遥控器,将其工作原理与红外继电器和替换开关一起集成到他们自己的墙壁单元中。

继电器控制

虽然很少有消费类产品不附带 IR,但这并不意味着你必须用 IR 来控制它,只要在两者之间有某种东西理解这两种协议。

例如,蓝牙在所有当前的移动电话上都可以找到,尽管它有点耗电,但有许多免费或几乎免费的应用程序可以与适当配置的 PC 接口。因为许多人总是随身携带手机,这提供了一种非常容易实现的控制方式。

所有蓝牙通信都需要蓝牙地址。这看起来像传统网络场景中的 MAC 地址,可以通过以下方式发现:

hcitool scan

请注意,在扫描该区域的设备时会有轻微的延迟,当它消失时,会有进一步的延迟!因此,虽然这个程序可以用来确定蓝牙信号何时回到范围内(因此当你回家时),但最好使用bluemon对单个手机进行定向扫描。

蓝牙控制应用分为两部分,一部分用于 PC,一部分用于移动设备。移动端通常是基于 Java 的,但是,尽管有“写一次就可以在任何地方运行”的口号,由于移动开发的不确定性,通常需要一个特定于你的手机的版本。发送的消息通常采用接收 PC 应用程序可以处理的协议。然后将其配置为向相关设备发送合适的红外信号,该信号可能用于控制当前在 PC 上运行的媒体播放器,或者在蓝牙信号超出范围时锁定桌面屏幕。 10 Vectir 为 Windows 用户提供了这样的功能,而 Linux 社区的用户可以选择软件包 11 如 Remuco、Amarok 或 RemoteJ。还有其他允许在手机和 PC 之间传输文件的包,比如obexftp,但是这些包适合同步应用程序,因此不在本书的讨论范围之内。

X10 为中继控制提供了类似的机制。利用手持发射机模块(如 HR10U),您可以向 RF-to-X10 网关发送 X10 消息(如灯 E10 打开),该网关将数据放在电力线上。然后,您的电脑可以通过重新发送红外信号或影响基于电脑的软件来监听此特定消息并控制媒体播放器。我将在第七章中讲述 Cosmic 的具体机制,它支持所有的附加功能。

服务器控件

涵盖的所有中继方法也可用于控制运行软件的服务器,如媒体播放器。事实上,这通常是更可取的,因为它限制了可能出现问题的地方的数量,并且通常在大多数媒体以数字形式存储在硬盘上的情况下使用。

当服务器向外部位置提供介质时,所有设备都应配置为客户端/服务器。这提供了比以前更明显的分离,以前播放的音乐由远程放大器控制,但扬声器音量由本地控制。采用完整的客户机/服务器方法有许多好处,尤其是因为它统一了系统。这里,每条消息(如“暂停音轨”或“提高音量”)都是由客户端使用任何合适的协议(X10 或蓝牙)发送的。然后,服务器监听所有这些消息,并将它们翻译成正确的 Linux 命令。无论其输出连接到哪里,都可以听到这些命令的效果。此外,当全尺寸 PC 可用于服务器处理时,可以使用更复杂的协议。

网络界面

传统的 LAMP (Linux、Apache、MySQL、PHP/Perl)安装提供了一种很好的方法,通过现代最普遍的界面 web 浏览器来控制你的房子。几乎每个设备,包括游戏机、手机和嵌入式触摸屏,都内置了某种网络浏览器。

构建或破解自己的触摸屏也不再是问题。您可以从当前包含触摸屏的笔记本电脑和笔记本电脑系列(如 Eee PC T91)开始,或者对旧笔记本电脑进行改造(如 Acer Aspire 或 Dell Inspiron Mini)。这些套件包括一个触摸屏膜,从外部连接到显示器屏幕和一个 USB 插头,使屏幕像外部鼠标一样工作。

这些机器体积小,功能强大,可以放在任何地方,包括冰箱上,但你可以通过使用一部旧手机(如诺基亚 7710)并自己安装它来进一步减少占地面积。

软件自然是 Linux。一些精简的发行版提供了浏览器作为其唯一的软件,如 Webconverger。这些是可以形成压缩闪存的实时系统,被称为 kiosk 系统。由于零安装和非常短的启动时间,这些非常适合偶尔使用的家庭终端。

短信

SMS 是所有手机都可以使用的短消息系统,是标准基础设施的一部分。智能家居可以通过两种方式利用它。第一种是将移动电话连接到 Linux 机器上,并使用 Gnokii、SMS 服务器工具或一些类似的软件与之接口。这个软件现在支持很多手机,尽管最初它只支持诺基亚手机。Gnokii 为 SMS 消息提供双向通信,允许您的 PC 阅读和解释它们,或者发送提醒或状态更新。

Note

如果可能的话,当大部分通信是向外的时候,使用预付费电话,以免软件错误或黑客造成大量的发送消息和非常大的电话账单。然而,这并不总是入站通信的最佳选择,因为一些运营商(特别是在北美)也对预付费手机上的入站短信收费!

第二种方法是订阅 SMS 服务提供商,比如 mBlox,它会为您提供电话号码、登录凭证和 API 这允许与任何机器进行双向通信,就像它是移动电话一样。你应该向服务提供商咨询是否有可能在出现问题时限制账户上的花费金额。

随着 G3 网络接入成本的下降,SMS 解决方案最近已经失宠,但它仍然为那些将旧手机传给孩子的家庭提供了一种相当廉价的控制手段。

结论

尽管家庭自动化系统有许多组件,但您已经看到它们都不是特别复杂或者超出了标准 Linux 机器的范围。只有你的极客欲望需要(不,要求!)更多设备。但即使这样,一个稳定的服务器也是一个基础,尽管随着家庭自动化系统的发展,包含更多的定制硬件变得不太合适。尽管 DVD 播放器和 PVR 的成本正在下降,但在每个房间更换每件套件的体积/费用是很麻烦的。此外,你不能在家里分享媒体,还会不断地问,“谁最后拿到了星球大战的 DVD?”大多数系统的目标是将一台非常强大的计算机藏在某个地方,并在不同的房间里安装许多较小的(低功率、低成本)主机,能够播放所有类型的媒体。包含这台功能强大的计算机的区域被称为节点零,我将在下一篇文章中介绍它。

Footnotes 1

通过手机访问需要付费的高级服务。

2

您必须终止挂起的进程并手动标记文件。

3

您可能还需要 Win32 编解码器包(w32codecs)。

4

从技术上来说,以更高的速度播放磁带和唱片是可能的(使用高速配音磁带播放器或将录音机切换到 45 rpm),并通过软件中的音高变换来补偿。但是不值得为此付出努力或损失质量。

5

这同样适用于 Windows XP SP3、Windows 7、Windows 2003 Server 和 Windows 2008 Server。

6

如果您是一个热心的系统管理员,可以使用逻辑卷管理(LVM) 2 来动态增加 Linux 系统上分区的大小。

7

在此上下文中,服务器一词用于表示一个物理硬件,而服务则是指提供对服务器上的数据或资源的访问的软件元素。令人困惑的是,这些服务最常见的名称是电子邮件服务器、web 服务器等等。

8

它甚至创造了自己的术语“tivoization ”,来涵盖任何使用自由软件运行的设备,但阻止你通过硬件欺骗来行使修改和重用它的权利。

9

现在市场上出现了一些 HDMI 开关盒,但这些开关盒只包含 HDMI 开关,如在 http: / / www。电视电缆。co . uk/CGI-bin/TV cables/HDMI-matrix-switch-4x 2html 。它们仍然非常昂贵,所以现在现实的选择是要么在本地处理数据,要么只在家里分发标准清晰度的照片。

10

这是bluemon一揽子计划的预定目标之一。

11

这里不可能列出一个完整的清单,但备选方案包括 http://tuxmobil.org/bluetooth_cell_apps.html.

四、家就是家:物理实用性

Abstract

经营自己的家是一种很棒的感觉。让它在您自己的 Linux 服务器上运行就更好了。仅仅是能够告诉人们你的主页就是你的主页,就能让你的极客证书更上一层楼。但是让一台机器 24/7 全天候运行会带来来自风扇和硬盘驱动器的永久噪音、闪烁的灯和额外的热量。能够从一台机器控制另一台机器需要布线。在这一章中,我将讲述家庭自动化设置的一些基础知识。

经营自己的家是一种很棒的感觉。让它在您自己的 Linux 服务器上运行就更好了。仅仅是能够告诉人们你的主页就是你的主页,就能让你的极客证书更上一层楼。但是让一台机器 24/7 全天候运行会带来来自风扇和硬盘驱动器的永久噪音、闪烁的灯和额外的热量。能够从一台机器控制另一台机器需要布线。在这一章中,我将讲述家庭自动化设置的一些基础知识。

节点 0

节点 0 是房子中所有电缆的终点,或者说是“本垒打”这意味着 Cat5 以太网、AV 电缆、IR 继电器,甚至 X10 无线收发器都可能位于同一个位置。也是外界的入口,所以调制解调器和路由器也会住在这里。

功能和目的

使用单一节点 0 的想法是让一切都远离日常生活。这意味着,无论服务器有多大、多吵,都可以将其放置在对试图睡觉或学习的人影响最小的地方。它还允许将大量电缆和昂贵的硬件放在某个地方,也许用一把钥匙锁起来,以最大限度地减少涉及洒出饮料和年幼儿童的不小心事故。

尽管这引入了单点故障(一般系统管理中的大忌),但在家中涉及的风险要小得多,并且不会影响已经存在的单点故障,即进出房屋的唯一调制解调器电缆。

服务器本身还提供所有与房屋相关的数据和信息的中央存储库,包括主网站和电子邮件服务,以及可能存在于其他机器上的各种媒体存储库的抽象。通过这种方式,每个非技术人员都可以连接到//server/media,并透明地连接到任何硬盘(在任何机器上)。这样就可以在磁盘变满时进行升级和移动,而无需您的家人打来支持电话!

拥有一台主服务器通常要求它保持全天候开启。将任务集中到一个位置,并将所有服务统一到一台机器上,这意味着只有 Node0 机器需要断电保护(通过 UPS)或防盗保护(通过强锁)。事实上,风险最大的数据通常在独立的笔记本电脑上,所以我稍后也会介绍它们的备份计划。

确定最佳房间

即使是最简陋的住所也有几个适合作为节点 0 的位置。大多数人选择楼梯下的壁橱(因为它在中央,因此需要较少的布线),但不止于此!事实上,在阅读下一部分时,当每个问题或解决方案出现时,您应该在心里将服务器从一个房间移到另一个房间。此外,在某些情况下,实际上不可能找到一个房间来解决所有特定问题,在这种情况下,您可能必须放弃令人不快的功能或在单独的位置使用第二台服务器。

合法的考虑

法律因国家而异,并随着时间的推移而变化,因此在开始工作之前听取必要的建议并获得任何许可是很重要的。实际上,这只会影响极少数人,比如那些在自己的土地上建造新建筑(如阳光房)或改造已获得“评级”或“上市”资格的建筑的人。

必要的考虑

本节中的必要考虑涵盖了特定硬件及其互连的限制。因为主服务器需要完全不受限制地访问您的所有设备,所以这些考虑是最重要的。

X10 信号可能会消散,并被放置在房子周围的各种设备完全吞噬,如第一章中提到的。将 Computer-X10 网关(CM11)移动到另一个插座会大大改变其覆盖范围,因此需要进行大量测试。唉,也许不可能把这种装置放在任何一个地方,让信息在房子里双向传递。这将随后需要两台服务器或两台网关。

电力以太网(EoP 不要与以太网供电混淆)是使用现有电力线增加双向网络功能的一种方式,与 X10 引入电器控制的方式相同。像 X10 一样,它也受电力线上其他设备的支配,所以如果你家里的部分地方无法接入 WiFi,这种方法也应该进行测试。

宽带和电缆调制解调器通常只能在一些预先确定的点进入室内,从而限制了可用的房间。然而,除非你的 Linux 机器是你家其他地方的网关,否则很少需要把你的服务器本地连接到调制解调器。在大多数情况下,一个好的路由器可以有效地隔离内部和外部网络流量,并具有足够的控制能力,从而不必使用成熟的 PC。

WiFi 信号和 X10 一样,会消散。此外,由于所使用的频带是许多其他协议所共有的,这可能会导致连接质量显著下降或完全消失。这些设备包括一些无线接入点(如英国的 BT Homehub)、无线电话、电视发送器和微波炉。此外,因为它们通过空气传播,它们更容易受到你控制之外的外部影响,比如邻居。您可以通过执行以下操作来限制这些其他设备的影响:

  • 切换 WiFi 频道。根据国家的不同,WiFi 被分为 14 个(日本)或 13 个(其他地方)不同的频段,每个频道占用其中的 4 或 5 个频段。这将频道置于频道 1、6 和 11(美国)的中点,而在大多数其他地方则置于频道 1、5、9 和 13 的中点。
  • 添加更多的 WiFi 基站,以最大限度地缩短每个信号传输所需的距离。设置时,将所有单元设置为相同的 SSID,并连接到有线以太网的相同部分。
  • 切换到违规设备的有线版本。要确定违规设备,只需按顺序关闭它们,和/或在每个方向指向一个频谱分析仪,以确定传输源。
  • 干扰违规设备的信号(特别是如果它来自其他人)。
  • 使用定向发射器。

当使用 AV 分配引入全屋音频时,从主服务器为扬声器或放大器供电的电缆会影响服务器的位置,因为每米电缆都会增加外部噪声影响音频质量的机会。此外,由于这是一个模拟信号,如果它必须传播更远,它的功率会变得更小。高质量的电缆可以最大限度地减少这种情况。

Cat5 电缆是在整个房子中实现快速以太网的最佳方法,因为它不受 WiFi 或 EoP 等外部因素的影响。但是,您需要确保您可以从 Node0 位置有效地到达房子的大部分地方。必须考虑混凝土和结构墙,因为电缆可能无法穿过它们。您还希望服务器和客户端之间的网络交换机尽可能少,因此阁楼可能不是最佳解决方案,尤其是如果您计划将大量视频传输到楼下的电视室。

电力是系统中不可或缺的一部分,因此任何房间都必须有足够的电力(并连接到合适的保险丝),以允许台式电脑、笔记本电脑、电灯和电视消耗数百瓦的电力。对于老房子来说,这更是一个问题。

消极效果

电脑,即使是基于 Linux 的电脑,也不能对一切免疫,有些房间自然比其他房间对电子设备更不友好。

厨房、温室、地窖和杂物间比其他地方更容易受潮。湿气会对机器造成不可估量的损害。)它进入电脑机箱并与电子设备发生反应。应该注意的是,虽然湿度对机器本身来说不是一个特别的问题,但它会使它变得很粘,导致它成为灰尘颗粒的磁铁,这些灰尘颗粒反过来会堵塞 PC 的一个风扇(大多数台式机通常有三个风扇:CPU、PSU 和显卡)。灰尘还会沉积在电路板之间的各种间隙中,如 PCI/AGP 卡,使它们无法工作。

此外,灰尘会携带水分,与水蒸气中存在的水分结合,会导致各种部件生锈和退化,从而导致短路和一般损坏。45%到 60%的相对湿度通常被认为是一个合适的范围,可以用湿度计测量。

Note

当温度突然变化时,也会出现湿度问题,例如当机器从寒冷的地方搬来时。在这种情况下,让它自然达到室温后再打开。

温度对电脑的影响和湿气一样严重,但方式不同。虽然大多数机器可以在低温下生存(当然比大多数人类乐于生活的温度还要冷!),他们不喜欢炎热的温度——在场的风扇数量将证明这一点——如果板载温度传感器超过限制,计算机通常会自动关闭。这通常可以消除杂物间,有时阁楼或阁楼,作为一个合适的位置。

因为电脑中唯一的活动部件(除了风扇)是硬盘,所以有必要考虑它们的工作温度。这可能因驱动器而异,但大约在 5 到 55 摄氏度的范围内。

人的考虑

计算机正在进入你的生活空间,而不是相反,所以一旦你知道你选择的位置的物理限制,你就可以考虑生活在那里的机器对生活方式的影响。电脑行为的反社会因素包括噪音、光线和热量。

标准台式电脑的噪音来自各种风扇以及硬盘的咔哒声和呼呼声。虽然风扇产生持续的嗡嗡声,很快就消失在你家周围的背景噪音中,但磁盘偶尔会发出噪音,可能会更烦人。如果你习惯了和电脑睡在同一个房间,那么你会发现风扇经常成为一个舒适的床伴,没有它的陪伴你很难入睡。

硬盘发出的噪音虽然轻微,但却有着有趣的双重属性。虽然你(或你的伴侣)可能会被房子里某个地方的硬盘发出的噪音干扰,但如果你突然听到(通常)安静的硬盘在半夜突然着火,它可以提供一个非常好的声音警报系统。

正如您稍后在查看服务器类型时将看到的那样,一些机器是无风扇的(从而消除了大部分噪音),一些机器可以通过固态设备而不是硬盘工作(消除了所有噪音)。自然,Node0 的定位和/或隔音可能会使噪音的概念变得没有实际意义(静音?)点!

大多数电脑上的灯是最简单的输出接口。标准的前面板包含用于电源和硬盘活动的灯,而背面具有用于网络活动的等效灯,以及主板上通过后部冷却孔发光的其他可见光源。外置硬盘、调制解调器和路由器上也有类似的指示灯。以前的灯给 Node0 一种独特的网络酷的光芒(通常是因为现在更多的技术采用蓝色 led!),而后者产生令人讨厌的闪烁,在夜深人静时,在隔壁房间也能看到。虽然所有这些灯都可以用黑色胶带隐藏起来,但通常最好将这些设备藏在盒子、橱柜或抽屉中,以便在需要时可以查看诊断灯。

除了受到热量的影响,计算机(尤其是台式计算机)也会产生热量。一周 7 天 24 小时开一次空调可以让室温提高 1 到 2 度。因此,你将不得不考虑其他的家庭取暖设备,并考虑将节点 0 放在你房子的底层,让热量上升 1 是否能为你的账单提供合理的节省。这种多余热量的负面影响是,如果在一个每秒钟都在升温的封闭空间中,在 Node0 中的机器上工作可能会非常不舒服。因此,在这里只安装低能灯或荧光灯,以防止它在你工作时进一步升温。

确定最佳房间

鉴于前面的可能性,大多数人会考虑以下房间之一:

  • 客厅:由于靠近电视和主立体声系统,客厅为 HA 安装的所有媒体元素提供了良好的通道。这消除了对红外发射器和大量额外电缆的需要。如果您计划使用实体 DVD,它很容易访问,如果服务器直接连接到电视和立体声系统,您可以获得最高质量的 AV。然而,不利的一面是,将您的服务器放在这里会干扰家庭生活(尤其是当您调整物理连接器时),并且您不能使用任何需要风扇的服务器,因为噪音通常会掩盖电影和电视剧中较安静的音乐和对话。
  • 卧室:这是你每天呆的第一个也是最后一个地方,所以把机器放在手边,显示新闻、视频、电子邮件等等,可能是非常理想的,尽管有时会有点令人不安。它也有客厅的许多好处,因为(主)卧室通常是家中第二重要的电视。因此,除了那些与夜间随机闪烁的灯光和增加的热量相关的问题之外,它还会遭受同样的噪音问题。 2
  • 楼梯下:这是很好的隐藏视线和封闭,这意味着大多数噪音和光污染是隐藏的,因此可以接受。它也是房子的中心,这意味着有线协议(Cat5、X10、音频等)的电缆更短,无线协议受到干扰的可能性更小。然而,在大多数情况下,在不明显的情况下,很难看出如何以及在哪里将电缆(尤其是电源)进出楼梯下的橱柜。此外,它通常是一个非常小的空间,这使得它容易温度上升,并且很难在其中工作——对于机器和进行节点 0 维护时的您来说都是如此。
  • 阁楼:这是一个很好的、隐蔽的、安全的地方,不太可能被盗。将线缆引入上层的所有房间也非常容易。(但反过来,对于一楼的房间来说就不那么容易了,除非你决定在一楼的天花板上铺设一条大型线槽。)如前所述,为阁楼提供适量的电力可能很棘手,温度控制也是如此。

构建机架

家庭自动化机架中的设备种类繁多,因此通常不具备适合机架的正确外形(披萨盒大小的单元)。尽管您可能不会使用传统意义上的机架,但您应该为您的设备考虑某种堆叠机制。毕竟,您应该能够单独访问每一个套件,因为您不会想要拔下并滑出路由器、调制解调器和交换机,只是为了将一些新玩具插入 PC 背面的 USB 插座中!

Note

您可以通过不使用技术填充整个 Node0 空间来确保良好的访问。这也确保了在你获得新装备时有足够的空间来放置它们。

如果你有机会去附近的厨房 DIY 商店,你有时会发现抽屉和橱柜可以在门打开时旋转 90 度,这可以被挪用为一个很好的机架安装。或者,如果 Node0 房间和下一个房间之间有一堵隔墙,您可以在这两个房间之间安装一个出入舱口(类似于厨房服务舱口)。对于戏剧读者来说,你可以用一个秘密铰链把它藏在一幅画后面!

节点 0 机架中常见的设备可能包括:

  • 调制解调器
  • 路由器
  • 无线路由器
  • 家庭报警系统
  • iphone 交换
  • 网络交换机
  • 主服务器 PC 或 Raspberry Pi(低功耗 24/7)
  • 媒体服务器 PC(装有电视采集卡)
  • 显示器、键盘和鼠标(通过 KVM 交换机连接到服务器)
  • 外置硬盘(比内置硬盘更容易更换/升级,不太可能发生磁头崩溃)
  • 音频功率放大器
  • 电视天线放大器

它通过 Cat5 以太网电缆、电力线通信、WiFi 和 AV 电缆的组合连接到房屋的其他部分,其中数据由以下设备拾取:

  • 媒体播放头盒
  • 附加扬声器
  • 辅助音频放大器
  • 个人笔记本电脑和台式电脑
  • 辅助电视,使用天线输入

服务器

要成为一个真正有效的智能自动化家庭,你需要一台全天候的服务器。虽然你见过的许多设备(如第一章第一章中的 CM11U)可以被编程为离线工作,但只有当有东西准备好、愿意并且能够在白天或晚上的任何时间做出决定时,你才会感受到权力。定时灯开关不算。

在家庭环境中有如此多的酷和有趣的技术,很容易让想法脱离自己,让你开始订购你负担不起的最大和最强大的服务器!实际上,如果总费用只有一台服务器,就没有必要只有一台服务器。

服务器容量

服务器的容量分为三个部分:

  • CPU 处理能力
  • 磁盘空间
  • 带宽能力

我将按顺序介绍这些。

CPU 能力

除了少数例外,家庭自动化软件耗电很少。所有的标准任务,如网络服务器、电子邮件、闹钟、短信处理、信息例行程序和音乐播放几乎不需要任何处理,最低的迷你 ITX 能够处理一切,而不需要一点硅汗。

将媒体从一种格式(如储存在服务器上的高清晰度 DVD rip)转码为另一种格式(适用于低端硬件(如 MVP)或在便携式设备上回放的较小版本)会大大增加处理器的负担。因此,拥有两个主服务器并不罕见,每个主服务器都专用于这两个主要任务。

磁盘空间

同样,大多数 HA 任务不需要大量的硬盘空间,所以如果您的操作系统合适的话(最近它们的大小接近 1 GB),那么控制软件所需的额外 25 MB 不会倾家荡产。只有媒体服务器需要额外的空间,为此,您需要尽可能多的空间。外置 USB 驱动器是一种廉价(方便)增加磁盘空间的好方法,而且它们足够快,可以将电影传输到服务器,然后通过网络传输。

你可以考虑一个单独的文件服务器,它唯一的工作就是为房子的其他部分提供文件。通过这种方式,它可以存储在物理上安全的位置(隐藏在看不见的地方,可能在阁楼或阁楼),以防止珍贵的数据被意外破坏或窃取。将服务器固定在坚固的机架中也有助于防止被盗,因为没有人可以轻易拿走 Backblaze Pod ( http://blog.backblaze.com/2009/09/01/petabytes-on-a-budget-how-to-build-cheap-cloud-storage/ )!

带宽能力

这通常是毫无疑问的,因为目前的网卡都支持至少 100 Mbs(大多数都支持 1000 Mbps,毫不费力),这足以在家里分发几个电影流。调制解调器速度通常会限制您的外部流能力,但许多其他因素也会限制您的能力,例如您所在区域的宽带争用、当前的网络流量以及目标计算机及其局域网。

与公司服务器不同,大多数家庭服务器只需要一个网络端口就足够了,因为一个像样的独立路由器可以执行大多数必要的过滤和配置任务,这些任务通常需要两个以太网插槽。但是,将来对您的机器进行任何升级(例如将防火墙软件移到服务器上)或家庭变化(为孩子引入单独的受限内部网)都需要第二个端口。

还要注意,购买集线器而不是网络交换机不再有任何成本优势,因此交换机应该是唯一的选择,因为它允许网络上的每个端口、每台机器都有 100 Mb 的带宽。您应该将所有网络电缆布线回位于 Node0 服务器旁边的单个交换机,以最大限度地减少维护。在一个标准的三居室或四居室的房子里,这种交换机应该至少有 16 个端口。

服务器扩展性

在企业界,改善服务器的设施通常意味着更多的内存或更多的磁盘空间。对我们来说,它还包括新的硬件。虽然不是所有的 HA 应用程序或服务器都需要新的硬件,但是最好考虑一下服务器还能处理什么。

电视卡是显而易见的,因为一个高性能的服务器可以同时录制几个电视台的节目,或者将一个频道转换成适合流媒体播放的格式。PromiseTV ( www.promise.tv )等项目将这一点发挥到了极致,但这是一个可行的选择。

同样,额外的声卡可以提供额外的功能。虽然在 Linux 中的设置可能有点痛苦,但有两个声卡可以让你直接控制其他房间的音频。这可以消除本地控制面板的必要性,因为您可以使用任何连接到计算机的设备,如网络浏览器、电话或通过 Cosmic 连接的 HR10U。此外,记住每个声卡都有输入和输出。这允许你为房子里的每个房间建立一个大规模的婴儿监控器。如果你有一个语音识别系统(在第五章中有所介绍),那么你就可以在每个房间进行即时控制。过去曾有项目将支持 6.1 的声卡引入三个独立的立体声声卡,但最近它们并没有得到很好的维护。

服务器的类型

很自然,根据这本书的标题,服务器将运行 Linux。Linux 能够在几乎任何设备上运行并非偶然,因此这不再是硬件兼容性的问题,而是物理大小、功耗和 CPU 能力之间的折衷问题。硬件没有什么特别的。现成的机器很好。您将熟悉这里列出的大多数(如果不是全部)设备。我们需要考虑它们在 HA 领域的具体相对优势。在大多数情况下,服务器总是连接有鼠标、键盘和显示器(不像商务中心中的那些),以允许更简单的软件维护,并且如果服务器位于可访问的地方,显示器可以显示网页,呈现当前的“房屋报告状态”,几乎实现零处理周期。当这些外围设备不是永久连接时,您可能需要调整 BIOS 以允许机器在没有它们的情况下启动。对于台式机来说尤其如此,当没有显示器时,它们会发出三声哔哔声,并经常发出臭名昭著的“没有连接键盘-按 F1 继续”错误。

机架固定件

这些产品有多种型号,包括配备冗余或双电源以及标准四核处理器的产品。因此,这些强大的处理能力可以同时处理几个用户的代码转换需求,并有足够的周期来处理所有其他服务(web、电子邮件等),而不会影响任何其他用户。它们是商业应用程序的行业标准是有原因的,因为它们可以处理任何负载,任何时间长度,并且可以愉快地运行许多年而没有变化。

不幸的是,只有当你能把它们放在远离生活区的地方,它们才适合家庭使用,因为它们通常有很大的噪音风扇,并散发大量热量。虽然可以通过将机器放在橱柜中来降低噪音,但通常情况下,用低噪音的等效部件替换组件无法达到相同的效果,因为它们通常不是标准的 PC 设计。

热量也是你需要有效处理的东西。空调是办公室的标准配置,但在家里却不是,在家里通常打开窗户就能达到同样的效果。在家里运行机架式服务器通常至少需要某种排风扇。

当考虑其升级状态时,非 PC-ness 也将击中要害。您将无法将 PCI TV 卡安装到许多机架式机器上,因为连接形式和尺寸会受到限制。您还需要购买一个物理机架或半机架来安装设备。这些都是为商业安装而设计和定价的,尽管你总是需要为前面提到的所有设备安装一些支架,但有更便宜的 DIY 搁架方式。

桌上型电脑

这是最受欢迎的选择,因为所有显而易见的原因:它们是可以理解的,常见的,便宜的,并且是为家庭使用而建造的。它们也可以通过额外的卡轻松升级,磨损(或噪音过大)部件的替代品可以在当地的实体店买到。目前的机器速度足够快,可以为家里的几个媒体主机执行代码转换,以及处理所有其他标准任务。

遗憾的是,家用机是打算当家用机用的,也就是晚上几个小时查邮件,玩游戏。将它用作服务器,24/7 全天候运行,会使机器的物理组件(主要是风扇和磁盘)紧张,并增加破坏机器完整性的风险。与机架不同,这些机器是根据价格而不是质量因素制造的,因此将使用允许价格达到神奇的 299 数字或其他数字的组件。因此,这些组件可能对温度变化的容忍度较低(如果机器全天工作,就会出现这种情况),或者平均无故障时间(MTBF)较短。当机器不断访问数据时,无论是从内存还是从硬盘,发生这种情况的几率自然会增加。

我的个人设置使用台式 PC 作为媒体转码服务器,大部分时间都在运行。我买了比传统台式机更高的价格,比标准的风扇更安静,部件更好。我还同时为风扇买了备件,这样如果我需要更换机器的运动部件,我就有一些可用的。RAM 芯片(诚然,随着时间的推移,也可能变坏)通常在机器发布后的许多年内都可用,而特定尺寸的 CPU 风扇则不可用。这是因为任何持续几年的服务器都将比当前设计的处理器和主板寿命长,因此很难获得这些组件的备件。我也承认,当(而不是如果)这些组件最终报废时,我可能无法购买替代品,因此将不得不忍受安装全新机器的痛苦。

迷你 ITX

迷你 ITX 是基于 170×170 毫米 ITX 主板的一系列机器。在该规格中,有许多不同的选项,包括不同的处理器、图形芯片和冷却方法。这包括许多没有风扇的机器,仅依靠散热器进行冷却。这使得它们比台式机更加节能,并且适合放置在更多的公共区域,例如它们经常被用作媒体播放器的客厅。

像台式机一样,ITX 机器有许多可配置的选项,包括电视(S-Video)和 DVI 输出、用于无盘操作的紧凑型闪存(CF)适配器、无线网络等等。它们还有用于其他卡的标准 PCI 端口。这种可配置性既是他们的桎梏,也是恶魔的魅力,因为当你购买机器时,并不一定知道任何特定设备的可使用性。尽管任何 ITX 都足够强大,可以运行 HA 设置的所有基本服务,但大多数机器都不能足够快地转码媒体,并且旧的机器不能播放现代格式(如 DivX,它对 CPU 的要求相当高)。此外,除了 SVGA 之外,Linux 驱动程序支持的输出也有一些问题,这使得将它们用作投影仪之外的任何设备的头箱都有问题。ITX 的新组合会定期发布,同时还会更新驱动程序,因此请随时向您的经销商寻求支持,以及最新的网络论坛。

ITX 机器的另一个配置考虑是这样的,因为它不是机器附带的,你必须单独购买。此外,由于空间是如此珍贵,你应该购买任何和所有的外围设备,你打算保持在这个时候的情况下。您不应该期望能够更新或添加组件,并且仍然让它适合同一个案例。即使组件之间有 3 毫米的间隙,也可能是一个良好的工作系统和一个过热的系统之间的差异。所以,考虑一下你是想要一个硬盘还是 CF 卡,以及一开始是否需要一个(超薄的)DVD 播放器。

Note

请始终从机器的同一经销商处购买机箱,这样您就可以确保它们能够装配在一起。这些机箱比台式机机箱贵得多,因此是一个代价高昂的错误。

当然,有这么多的箱子可供选择,你完全有机会得到你想要的尺寸。它们有四种基本类型,大多数高可用性服务器是立方体或机架,而媒体设备中使用的 ITX 主板通常选择 book。

  • Book,70 × 270 × 320mm 左右,最多两个驱动器托架;并非所有都支持 PCI 卡
  • 立方体,大约 180×220×280 毫米,最多有四个驱动器托架,通常有一个 PCI 卡
  • 机架,1U (482.6 × 44.45 × 381),最多四个驱动器托架和最多两个 PCI 卡
  • 车辆,大小在 210×254×56 毫米左右,有一个或两个驱动器托架,偶尔有一个 PCI 卡

车辆安装箱用于安装在诸如汽车或车库的恶劣环境中,在那里它可以用作儿童娱乐中心或网络终端。所有四种型号都有不同的尺寸,驱动器托架有 2.5 英寸和 3.5 英寸两种。应该注意,不是所有 ITX Shell 都与所有类型的主板兼容。在 ITX 世界,一种尺寸肯定不能适合所有人。所以,检查和再检查你的规格。

ITX 已经生了两个弟弟,一个是配有 100×72 毫米主板的微型 ITX,另一个是配有 120×120 毫米主板的纳米 ITX。虽然如果你仍然必须购买一个更大的 Shell 来安装 DVD 驱动器,那么尺寸的减小不值得价格的增加,但这种尺寸的机器几乎可以藏在任何地方,这使得它非常适合媒体主机或厨房中的控制面板。

迷你电脑

迷你电脑是一种高功率、预构建的电脑,外形非常小(通常约为 80×50×30 毫米),通常功耗也很低。这导致它们有时被称为绿色 PC,但尽管迷你 PC 通常具有低功耗,绿色 PC 必须具有低功耗,其制造过程也是如此。这种类型的典型机器包括 Zonbu、Intense PC 和 Fit-PC3。

在功能上,它们是笔记本电脑(因为它们是预建的,因此不能升级,并且操作系统确实需要预装以确保一套完整的驱动程序)、台式机(具有高机器规格和单个网络端口)和迷你 ITX 机(当放在电视下时,作为主机使用时看起来很好)的混合体。因此,许多人将把它们作为更加以客户为中心的机器,用于网页浏览和媒体播放。但是,正如我前面提到的,大多数 HA 任务所需的 CPU 非常少,非常适合它。在建筑物本身不允许 Node0 中的单台机器到达整个房子的情况下,它们也是很好的辅助服务器,例如 X10 消息和无线通信。此外,因为这些设备的功率使用通常为 10 瓦或更少,所以它们是高效的,并且对现有设置增加非常少的开销。

这些机器的规格大相径庭,因为许多都包括定制的硬件来改善表面上的功能。例如,Fit-PC2 只包含一个低功耗的 Atom 处理器,但能够通过集成硬件加速来播放 HD 1080p H.264 视频。 3

然而,这些机器最大的缺点是在向朋友演示您的 HA 设置时缺乏勇气。在展示了如何给你的电灯开关发电子邮件、给你的视频发短信、拥有自己的家庭网络服务器之后,打开橱柜展示一个可以放在你手里的小盒子通常会让男性自我失望!

定制嵌入式

这一组既有片上系统(SoC)机器,也有单板计算机(SBC),其中有很多,包括你之前看到的迷你 ITX 机器和第二章中的 NSLU2。设备的组合和机器的用途一样多,所以每种组合都需要根据其自身的优点来考虑,因为人们通常认为是 PC 标准的各种组件,如键盘、鼠标和显示器,并不是所有的 SBC 都有,如 Gumstick。 4

此外,一些机器,如 NSLU2,看似正常的外围设备,如 USB 集线器,可能会出现问题,并拒绝使用它们。因此,这些类型的设备通常更适合室内有限区域的客户机,而不是服务器,因为服务器将运行各种软件,硬件不兼容的烦恼通常会超过尺寸的好处。

树莓派

尽管 Raspberry Pi 在概念上与您可能从上一节中发现的任何定制嵌入式设备没有什么不同,但它并不完全相同。首先,Pi 的知名度和市场接受度确保了其他平台无法管理的坚实用户基础。现在已经在市场上达到临界质量,这意味着你可能发现的任何问题都将由不止一个人来解决,并且将有(至少)一个网页或论坛线程专门用于解决问题。

如此大规模的用户也意味着使用 Pi 作为服务器的主要物理问题已经解决了——就是这样!这是可能的购买几种不同类型和风格的情况下从不同的网站在互联网上。这包括在 http://elinux.org/RPi_Cases 的列表,也详细列出了一些你可以用乐高、木头和 3D 打印机建造的东西。

功率消耗

对于许多人来说,家庭自动化可能是你第一次需要考虑机器的总拥有成本(TCO ),将它的功耗考虑在内。这可以通过使用一个用电量监控器来进行经验计算,比如 Kill-A-Watt ( www.p3international.com/products/special/P4400/P4400-CE.html )。这种设备可以一端插入墙上,另一端插入电脑,以确定它在任何特定时间使用的电量。这将取决于它是否处于以下状态:

  • 闲置的
  • 播放光学媒体
  • 处理媒体(回放、录制和转码都不同)
  • 被用作台式机

了解这些信息可以帮助您计算其运行成本,方法是将显示的瓦特数乘以 8.76(一年中的小时数除以 1,000),得出千瓦时数。然后乘以每千瓦时的成本(通常显示在您的电费账单上),得出总拥有成本。

Note

你甚至可以通过一个简单的名为 Tweet-a-Watt 的软件,从 www.ladyada.net/make/tweetawatt 发布你家的电力使用情况。也有替代解决方案,如 Owl、AlertMe、Wattson 和 Enistic。

除非服务器制造商向您提供完整的功耗数据(请记住,这因任务而异),否则您只能猜测其 TCO。表 4-1 显示了一些大概的数字。它们是从各种经验测试中挑选出来的,尽管只有它们的相对值应该被考虑,并且只有在那时才作为指导。

表 4-1。

Approximate Power Consumption

| 设备 | 使用的大致瓦特数 | | --- | --- | | 台式机器 | 60–250 | | 台式计算机(睡眠) | 1–5 | | 笔记本电脑 | 15–50 | | 迷你电脑 | 6–10 | | 迷你 ITX5 | 8–20 | | 树莓派(B 型) | One point six five | | 树莓派(A 型) | Zero point seven one five | | 带 HDMI 和 USB 驱动器的 RPi (B) | 2.0–2.45 | | 带 HDMI 和 WiFi 的 RPi (B) | 2.175–2.4 | | 阴极射线管监控器 | Eighty | | 液晶监控器 | Thirty-five | | DVD/CD-ROM(台式机) | Twenty | | DVD/CD-ROM(笔记本电脑) | five | | 硬盘(桌面) | Fourteen | | 硬盘(笔记本电脑) | four | | USB 供电设备 | 2 个(每个) |

要计算每台设备的成本,您需要知道您的公用事业公司向您收取的每千瓦时的成本,并将其代入公式:

Total_cost = (Wattage_of_device × hours_used × kilowatt_hour_charge) ÷ 1000

为了降低消费成本,您可以为电脑和其他连接到电脑的家庭硬件做几件小事。

首先,关掉它。这主要适用于显示器和电视等消费电子产品,它们在待机模式下的功耗几乎与正常模式下一样高,有时据说你每年 16%的能源账单都花在待机模式下的电器上。市场上的各种产品通过监控用电量的下降或通过捕捉红外信号来关闭电视并因此隔离设备的所有电源来检测待机模式。然而,在这种模式下,不可能自动将其重新打开。您可以使用 X10 或 C-Bus 自动管理这一点。请记住,重新打开设备时,如果设备返回待机模式,而不是完全打开,您可能还需要发送红外信号。

第二,停止硬盘旋转。这将它们的功耗从 7W 降低到 1W 左右,具体取决于设备。您可以通过如下配置使用hdparm工具来实现这一点:

# /etc/hdparm.conf

/dev/sda {

spindown_time = 60 # this means 5 minutes, since each spindown unit is 5 seconds

}

Note

据报道,这只有在 BIOS 支持 AHCI 时才有效。在所有其他情况下,应使用sg3-utils包控制 SATA 驱动器。

然而,从寿命的角度来看,硬盘不应该不停地旋转,因为滚珠轴承会磨损更多,最终会磨损。此外,让它们重新旋转起来的成本非常高,所以你真的需要让它们旋转 20 分钟左右,这样节省的成本才是值得的。

切换到待机、挂起到 RAM 或休眠到磁盘模式,每种模式都比前一种模式更省电。高级电源管理(APM)守护程序和工具处理进程本身,而sleepd守护程序可用于在特定条件下自动触发 APM 工具,例如缺少活动或输入。

使用替代部件。随着绿色游说团体影响大多数公司,你可以买到比以往任何时候都更节能的设备。更好的电源 6 可以在中等负载(90W)下提供超过 80%的效率,一般来说,功能较弱的显卡耗电较少(通常不需要风扇),LCD 显示器比 CRT 显示器更高效,CPU 的功耗差异很大,因此可以考虑更换它们。

拔下任何未使用的设备,例如安装时使用过一次(但不会再次使用)的光驱、USB 设备等。这可以通过在整个系统中使用外部硬盘来扩展(引导设备除外),在卸载后可以通过 X10 断电。

尽可能使用更多固态硬盘和/或笔记本电脑硬件。两者都打算用电池工作,因此内部有更合适的 CPU 和硬件。对于主控制服务器,这些已经足够了。

使用虚拟机(例如,运行在 VMware 上)而不是使用完全独立的机器。当特定设备需要特定版本或操作系统时,这可以提供真正的好处。用于处理虚拟机的额外功率远远低于物理机。

在尽可能多的情况下,都应该考虑减少负载,因为虽然你可能只节省了一瓦特,但一年下来,这可以累积起来,达到合理的节省。

服务器协调

有多台服务器来控制你的房子没问题。但是,如果它们一直都开着,你的电费将会与所获得的收益不成比例地增加。这还没有考虑各种机器因为主服务器离线而无法通信的情况。

协调如何打开和关闭特定的机器以节省电力是一个简单的问题....对于一个人类来说。但是对于一台机器来说,要实现自动化是非常困难的!您需要知道哪些服务在哪些机器上运行,在其他硬件上存在哪些依赖关系,等等。这些信息需要在所有机器之间同步,以防其中一台离线(因为断电或网络连接中断)。

因此,最好不要尝试或执行以下操作之一:

  • 每台机器都有人工指定的时间周期
  • 预计电费会比平时多

例如,当运行一个单独的媒体服务器将流代码转换到 MVPMC 时,您会知道机器需要从每个工作日的下午 6 点开始工作,例如整个周末。如果机器还负责录制电视节目,您将需要编写自定义代码来防止它在录制过程中关闭。

相反的时间表对一台打算作为下载服务器的机器来说是正确的,当你只希望它在你不太可能上网或在家工作的早晨几个小时里消耗你的带宽。

虽然机器有可能自我终止(通过 Linux 命令shutdown -h now),但是你一般不能强迫它在特定的时间醒来。因此,您将始终需要一台 24/7 全天候工作的机器(如您拥有的最低功耗设备)来协调所有其他机器。

让机器自动开机需要一种叫做局域网唤醒(WOL)的技术。WOL 在许多机器上是启用的(尽管有时在 BIOS 中默认为关闭),由此主板监控包含直接发送到有问题的机器的“神奇数据包”的特殊格式化的网络消息。由于关机的机器没有 IP 地址,因此必须始终使用 MAC 地址。(它被标记为来自ifconfig命令的HWaddr。)

启动这个魔术的命令和程序包如下:

etherwake 00:1d:33:a5:63:16

请注意,这仅在“软”断电时有效,并且需要它以及发送机器和目标之间的任何路由器可用的电源。这是停电时要记住的重要一点!此外,请注意,Raspberry Pi 没有软掉电选项,它没有开/关开关,所以它要么开,要么关。然而,它的电流消耗很低,不值得担心。

Note

有时,接受 WOL 命令需要密码。这在特定机器的 BIOS 中设置,并作为参数传递给etherwake

关闭特定的机器更容易,因为这是大多数桌面用户每天都要做的事情,所以我在这里只花一点时间。在传统的调用中,您可以用一个命令启动关机,从发出命令到使用您选择的任何控制台警告消息执行操作有一个给定的延迟。您也可以用-c标志取消任何未执行的关机命令。

所有关机命令必须由机器的 root 用户执行,因为默认情况下 root 用户不允许通过ssh连接到机器,所以如何关闭远程机器并不总是显而易见的。

标准方法是使用sudo,让一个非特权用户连接到机器,然后将他们自己临时升级到 root,用以下命令关闭机器:

sudo shutdown -h now

虽然sudo通常需要一个密码,但可以通过修改/etc/sudoers文件来取消,如下所示:

steev localhost=NOPASSWD: /sbin/shutdown

这可以通过从一个脚本发出命令来进一步自动化,该脚本依赖于ssh的一个很少使用的特性,即登录、执行命令然后退出的能力:

ssh steev@myhomemachine.homelinux.net 'sudo shutdown -h now'

因为 shutdown 命令是在所有用户都在控制台上工作时创建的,所以大多数家庭用户通常看不到警报消息,所以您可能希望创建一个 shutdown 脚本,使用语音合成或音乐来指示服务器正在关闭。然而,由于在 Linux 中重启和关机很少发生,而且您可能就在“用户”的隔壁,所以这就不那么重要了。

关闭网络上的任何 Windows 机器可能会更加困难,因为关闭的方法还不太明确。如下所示的命令:

net rpc shutdown -I 192.168.1.100 -U windows_username%their_password

可以在许多情况下工作,但依赖于防火墙、文件共享选项,甚至 Windows 版本。

给定这些命令来启动和关闭您家中的大多数机器,您可以在您的主服务器上使用一个简单的 crontab 来有效地协调它们,以确保最佳的用电场景来满足您的需求。

不间断电源

不间断电源(UPS)对于任何依赖中高成本技术的人来说都是必不可少的工具。因为您的房子现在是高成本技术的高成本外围设备,所以它成为您的高可用性设置的重要组成部分,不仅可以消除短期断电和停电的影响,还可以防止电涌造成的损害。

大多数不间断电源装置的工作原理相同;也就是说,一个看起来像超大的多联电源板的设备将电源和电池连接在一起,为四个或更多的插座提供稳定的电源。在更便宜和最常见的设备中,该设备监控主电源,如果它出现故障或低于指定阈值,则切换到电池。第二种类型的 UPS 始终提供来自电池的输出,并使用主电源为电池充电。输出波形的形状也各不相同,通常由设备成本决定。廉价设备的输出通常是方波,而昂贵设备的输出是正弦波。这对于电脑来说没什么大不了的,但是当给一个音乐发烧友的唱机提供动力时,就像在第三章中提到的那样。每当注意到电源下降时,警报就会响起,并周期性地重复声音警告。当电池电量极低时,将通过 USB(或串行)电缆启动关机程序,以便连接到 UPS 的机器可以安全关机。每个单元都有不同的 VAs 值,表明当它从电源上断开时,你可以从中提取多少。你通常需要比瓦数更高的伏安。所需的 VA 是瓦特数除以所连接设备的功率因数。保护的持续时间从几分钟到一刻钟不等,具体取决于连接到它的机器以及这些机器上运行的任务。您可以参考表 4-1 获得粗略的指导。对于购买,总是得到尽可能高的额定功率。

Note

对于大多数 UPS 装置,电源插座将被分为断电时供电的插座和断电的插座。所有插座通常都有防浪涌保护。

假设有四个电源插座,你必须决定哪些设备将使用它。自然,你的服务器应该是已知的。接下来是家庭内部路由器或交换机,这样 UPS 上的其他机器就可以发送和处理“关机”消息。(这只是为了计算机的利益,因为任何人都会注意到灯灭了,并且会立即惊慌失措,因为他们知道他们没有点击应用程序上的保存按钮。)您可能还想在 UPS 上保留宽带路由器,以便发送警告信息(例如通过电子邮件)。这通常是一个次要的考虑因素,但是如果您远程操作机器,这将促使您减轻任何处理器繁重的任务,以便 UPS 可以持续更长时间。

Note

首次安装 UPS 时,使用断路器进行测试,但不要拔出插头,因为拔出插头会引入对电子设备有危险的浮动接地。

这里再次出现了关于多服务器的讨论,因为在 UPS 上安装一个低功耗的主服务器是有益的,媒体代码转换机安装在它自己的 UPS 上,可以延长主服务器的寿命,甚至可以完成在断电期间可能会错过的《神秘博士》的重要一集的录制!

如果两台服务器的功率都相当高,而您只有一台 UPS,那么通常值得将两台服务器合并到一个机箱中,以限制设备的功耗。

您也可以考虑为显示器保留一个电源插座,也许连接到第二个媒体服务器 UPS 装置。如果您保持关闭,它将从 UPS 汲取非常少的电力,但在出现问题时,您可以看到机器运行其关闭程序,并且您可以确保其关闭程序有效工作。否则,您将不得不相信 UPS 软件守护程序正在工作,或者在手边准备一台充满电的笔记本电脑。

Tip

每天晚上使用 crontab 打开 X10 模块至少一个小时,可以确保您的笔记本电脑充满电。

一旦硬件 UPS 就位,您就需要一种方法来检测电源是否已断开,并开始关机过程。

大多数 UPS 都带有 USB 电缆(有时一端带有专用连接器,所以不要弄丢了!)允许 PC 查询单元的状态。那些没有的一般不值得买。当然,它们更便宜,并且您的数据可能在您已经安装的日志文件系统中是安全的,但是额外的成本和放心地知道您将获得干净的关机是值得的。

Note

可以通过使用heyu监控电源线来模拟 UPS 的关机功能,如果发现两个(或更多)灯同时熄灭,则触发关机。但是这种方法容易产生假阳性,而且在白天也不起作用。

有三种主要包装可用于处理 UPS,如果一起使用,所有这些包装都会发生冲突。他们是apcupsdnut-hal-driversnut。我将讨论后者,因为它是最新的、灵活的、积极开发的。

首先,执行传统安装:

apt-get install nut

设置过程包括在您的/etc/nut目录中创建四个配置文件:

# /etc/nut/ups.conf

[apc]

driver = usbhid-ups

port = auto

这引用了适合您的 UPS 单元的驱动程序, 7 ,我在这里称之为apc:

# /etc/nut/upsd.conf

ACL all 0.0.0.0/0

ACL localhost 127.0.0.1/32

ACCEPT localhost

REJECT all

这表明只有本地机器应该对 UPS 消息作出反应,这消除了黑客假冒 UPS 故障并导致您的机器关机的可能性。然后通过以下操作设置一个可以访问守护程序的基本用户:

# /etc/nut/upsd.users

[local_mon]

password = mypasswordhere

allowfrom = localhost

upsmon master

然后,您可以通过指定进程命令来配置守护程序:

# /etc/nut/upsmon.conf

MONITOR apc@localhost 1 local_mon mypasswordhere master

POWERDOWNFLAG /etc/killpower

SHUTDOWNCMD "/sbin/shutdown -h now"

如果您将从备用机器监控 UPS,您可以设置多个用户,但这不是必需的,因为您可能会创建一个保存此信息的网页。

然后,您可以修改文件的权限(因为其中有一个密码,您可能不希望外界看到):

sudo chown root:nut /etc/nut/*

sudo chmod 640 /etc/nut/*

并启动守护程序运行,如下所示:

upsdrvctl start

/etc/init.d/nut start

这可以通过编辑/etc/default/nut文件在每次启动时启动。然后,您可以通过发出以下命令来查询给定 UPS 的状态并检查它是否在工作,其中apc是前面给出的名称:

upsc apc

输出是这样的:

battery.charge: 100

battery.charge.low: 10

battery.charge.warning: 50

battery.date: not set

battery.mfr.date: 2009/01/21

battery.runtime: 705

battery.runtime.low: 120

battery.type: PbAc

battery.voltage: 13.5

battery.voltage.nominal: 12.0

driver.name: usbhid-ups

driver.parameter.pollfreq: 30

driver.parameter.pollinterval: 2

driver.parameter.port: auto

driver.version: 2.2.2

driver.version.data: APC HID 0.92

driver.version.internal: 0.33

input.transfer.high: 266

input.transfer.low: 180

input.voltage: 242.0

input.voltage.nominal: 230

ups.beeper.status: enabled

ups.delay.shutdown: 20

ups.delay.start: 30

ups.firmware: 829.D2 .I

ups.firmware.aux: D2

ups.load: 49

ups.mfr: APC

ups.mfr.date: 2009/01/21

ups.model: Back-UPS ES 700

ups.productid: 0002

ups.serial: 5B0904T46000

ups.status: OL

ups.timer.reboot: 0

ups.timer.shutdown: -1

ups.vendorid: 051d

一台服务器可以控制多个 UPS 装置。这通常是有益的,因为它允许您的主服务器处理所有的系统管理任务,为家庭网络提供了一个单一的入口点,可以根据需要进行强化。

让机器关机后,你需要一种方法让它在电力恢复时再次启动。这变成了一个硬件问题,成功与否取决于 BIOS 中是否有一个通电启动的选项或类似选项。在 NSLU2 的情况下,你可以物理地破解电路板来执行相同的任务。理论上也有可能以类似的方式黑掉标准 PC 中的交换机,但不建议这样做。

前面提到的 WOL 技巧通常不适用于互联网,因为它是一种局域网唤醒功能。即使你的机器不在过滤这种数据包的路由器或调制解调器后面,其他东西通常也会在后面。如果你的家用机器需要尽可能长时间通电,而你的机器在通电时无法启动,那么你可以使用一个 NSLU(如第二章第一节所示)作为引导程序,向你的各种服务器发出 WOL 命令。

备份

关于备份,只有两点很重要:

  • 做吧。
  • 测试他们。

其他一切都只是细节。

第一个细节是,这些数据是应该保存在现场,即家中,还是保存在异地的远程位置,如托管服务器或租用的虚拟机。在一个理想的世界里,你会两者都采用。将它们保存在异地有助于最大限度地减少本地问题造成的损失,而现场备份对于无法存储在其他地方的数据非常有用,例如在出现重大故障时重建 HA 系统所需的配置脚本和网络计划。

下一个细节是什么数据实际上需要备份。同样,在理想情况下,这将包括家中每台机器上的所有内容。实际上,您必须考虑替换数据的成本和执行备份所需的时间。这通常可以归结为您个人创造的任何东西,例如:

  • 照片
  • 程序代码
  • 艺术品
  • 数字视频
  • 音乐

每个家庭成员都有自己负责的清单。作为 HA 管理员,您还需要备份服务器配置。

从这里你可以决定执行这项任务所需的技术。程序员将已经知道源代码控制工具,如 Subversion ( http://subversion.tigris.org/ )或 Git ( http://www.git-scm.org ),并将提倡使用它们。对于门外汉来说,这些工具不只是保存最新版本的副本;他们保存数据来重新创建你曾经创建过的所有版本的副本,让你及时回到过去,看看你上周写了什么,以及为什么这样做(或不)有效!在很大程度上,对于代码和系统配置来说,这是一个很好的选择,因为作为一名开发人员,您有必要的心态来在每个接合点执行必要的更新-合并-提交循环。然而,通过一些哄骗,大多数家庭成员会变得熟悉它。访问这些文件需要一个 Subversion 客户端,有几个也有 Windows 版本的客户端可供选择(比如 TortoiseSVN 或 SmartSVN ),消除了令人头疼的支持问题。这也使家庭成员能够从家外访问他们的文件,而无需额外的努力或软件。然而,不利的一面是,你必须教育家人,文字处理文档通常以二进制格式存储,因此,如果他们在家里和学校改变同一个文件,几乎不可能合并在一起。对经常更改的大文件(如原始 Adobe Photoshop 图像)使用源代码管理也不是特别有效。

Note

Subversion 将自己的工作文件存储在当前目录中,这意味着它们将被分散在.svn文件夹中。这对最终用户来说只是一个轻微的麻烦,但是当它们出现在系统配置文件夹中,比如/etc时,可能会引起更大的问题。

要将一组文件从一个目录直接复制到另一个目录,您可以在每天结束时使用cp。但是,这样会浪费地复制没有改变的文件,于是rsync诞生了。rsync是一个非常老的拷贝和备份程序,但仍然是一个受人尊敬的老黄牛。例如,我用下面这行代码备份了我的代码目录:

rsync -a code steev@remote-backup-host.com:∼/backup/daily

我用这个恢复它们(为了测试 8 ):

rsync -a steev@remote-backup-host.com:∼/backup/daily code

这里的选项执行递归更新,同时保持所有的符号链接、权限和用户设置,这是最典型的家庭情况。手册页详细介绍了其他可能性。

然而,确实有两个问题。首先,它主要适用于面向 Unix 的平台。Windows 版本是可用的(比如 DeltaCopy 和 Cygwin 版本),但是它们需要一点时间来设置,并且可能很复杂。

第二个问题是,为了登录到远程站点,需要交互地给出密码。这是一件令人讨厌的事情,它阻止了任何类型的自动备份。对于允许用户在没有密码的情况下连接的远程站点,他们必须首先建立另一种形式的信任——在本例中是公钥交换。要从机器 A 复制到机器 B,B 必须有 A 的公钥的副本。要从机器 B 复制到机器 A,A 必须有 B 的公钥的副本。在我们的例子中,机器 A 在家保存我们的文件,而 B 是一台远程机器进行备份。

因此,我们的家用机器必须为将要进行复制的用户生成一个密钥。

ssh-keygen -t rsa

默认情况下可以在∼/.ssh/id_rsa.pub中找到。然后将其复制到远程机器(可能使用密码控制的rsync)并附加到远程用户将接受的授权密钥列表中:

cat id_rsa.pub >> ∼/.ssh/authorized_keys

完成后,您应该能够rsync无需密码:

rsync -a --bwlimit=100 steev@remote-backup-host.com:∼/backup/daily code

请注意,这将带宽(使用bwlimit参数)限制为每秒 100 千字节,以便其他应用程序可以使用互联网,因为rsyncssh在合作时相当贪婪。

这里可能存在的一个潜在管理问题是家庭用户被拒绝连接,因为他们连接的地址与密钥中使用的地址不匹配。当主机名简单地类似于linuxbox1但在远程机器上显示为 netpc-london-isproute-isp.com 或类似的无用名称时,就会发生这种情况。相比之下,目标机器通常有一个固定的名称,因为它必须可以从外部世界进行寻址。因为家用机器的名称可能会改变(由于 ISP 的突发奇想),最简单的解决方案是颠倒这里给出的所有说明!也就是说,使用远程服务器连接到家庭服务器,只为远程服务器生成一个密钥,并反转rsync命令的参数,以便远程服务器从家庭机器中提取数据来执行备份。奇怪的是,需要身份验证的是连接的方向,而不是复制过程的方向。

Note

默认情况下,root 用户不能通过ssh连接。尽管有可能覆盖它,但不建议这样做,因此创建一个新用户,为他们创建ssh键,并使用他们的 crontab 启动每日备份。

虽然这解决了 Linux 和 MacOS 用户的问题,但仍然需要一个针对 Windows 的解决方案。如果你有时间,在 Windows 上准备rsync是值得的。或者,您可能希望通过引入手动备份解决方案向家庭灌输最佳实践,该解决方案要求他们做一些事情来备份他们的工作。这是 Subversion 得分较高的一个领域,因为工作流自动鼓励这样做。相反,可以做的是在网络上创建一个可写的 SMB 共享区域,每个人都可以访问,并且他们有责任在每晚睡觉前将他们的文件添加到其中。然后,您可以使用 rsync 远程备份该网络文件夹。有几个用于 Windows 的免费共享软件工具,它们提供了第一步所需的基于拷贝的备份。

当然,我所说的一切都是假设你将数据存储在家中。在大多数情况下,这是正确的,但现在购买远程服务器上的空间比以往任何时候都容易(例如,通过亚马逊的 S3,用虚拟机),这意味着你永远不需要备份。当然,备份仍在进行中(由服务器提供商的自动化工具和支持人员完成),但它们对您是透明的。 9

在外部存储的情况下,您可能只希望存储相当小的数据,因为从远程服务器上流式传输完整的电影是不可观看的,并且必须等到它下载完毕也同样令人烦恼,并且违背了目的。这些情况在某些情况下是有益的,因为它们意味着家里不会存储任何个人数据。因此,如果窃贼偷走了你的笔记本电脑,你还没有丢失你正在写的小说。

一些人喜欢在公共场合保护他们的私人数据,通过使用像 Dropbox 这样的服务。com 、Flickr、Google Docs、Google Drive(可能通过 Grive 客户端)和 YouTube。除了免费服务之外,情况和以前一样,对数据丢失的担保更少。事实上,谷歌邮件的个人存储空间限制刚刚超过 10GB,这允许你通过将数据作为附件保存在你的邮件帐户中来备份数据!或者通过使用gmailfs

也有可能备份您家中的物理项目,即您的媒体。虽然 CD 和 DVD 的重要性在于包装,但是通过将它们(正如我们在第三章中所介绍的)翻录到外部硬盘上,并将驱动器本身存放在存储器中,或者由朋友、家人保管,或者存放在专业的保险箱中,也可以保存内容。你或许可以安排一个配对计划,让有合适技术的朋友来保管你的光盘收藏,作为回报,你可以保管他们的光盘。例如,如果你在网络流量安静的时候,比如在晚上,两个人都向对方发送你的媒体,同样的配对思想也是有效的。

隐藏你的家

拥有一个连接到互联网的家庭提供了一种在外出时使用您的媒体、远程配置您的机器以及检查您是否确实关灯的方式。它还提供了很大的吹牛的权利!然而,将它连接到这里自然会引起一些人的关注。即使有我将在第五章中讨论的技术安全问题,也有一些额外的空间来隐藏你的自动化家庭,就像你停车时在车里的贵重物品上盖一张毯子一样。

一种方法是为你的家用机器设置两个域名。第一个应该被认为是公共网站,它提供了一个障眼法,可能包含一个以你的猫为特色的网站和博客!作为默认网站,只要单独使用 IP 地址,就会使用它。(我将在第五章讨论虚拟主机时介绍该方法。)然后,您可以另外设置第二个域来访问您的家庭自动化网页。当然,您仍将保护这些页面,但这是一个良好的开端。

虽然注册域名很容易,但在处理家用机器时,它不一定是最佳选择,因为当 DHCP 租约不是由 ISP 随意更新时,您的 IP 可能会改变,并且您必须再等 24 小时,DNS 信息才能通过各种 DNS 服务器重新传播。尽管这不太可能,但即使您决定每天晚上关闭服务器,使用动态 DNS 也是更好的解决方案。该方法将已知主域中的任意子域分配给给定的 IP。因为子域名在使用之前不需要通过 DNS 进行传播,所以它们具有更直接的效果,并且只需很少的钱就可以注册——在大多数情况下是零。

dyndns.org开始就有一项这样的服务。注册后(也免费!),可以创建自己的子域,指向自己的家庭服务器。这个子域可以从几个主域中的一个扩展而来,如homelinux.netmine.nudnsalias.com。T & C 要求你定期更新这个记录,以确保它仍然有效,但这可以通过适当的路由器或通过一个包如ddclient自动完成。这应该定期运行,要么以守护模式运行,要么从 crontab 运行,以保持记录最新。该配置只需要您的 DynDNS 登录凭证和您想要更新的子域名。

# /etc/ddclient.conf

daemon=600

use=web, web=checkip.dyndns.com/, web-skip='IP Address'

login=your-username

password=your-password

protocol=dyndns2

server=members.dyndns.org

my.homelinux.net

因为这是 DNS 记录,所以只注册名称。支持这些服务仍然取决于您。但这是您想要的,因为它允许您为电子邮件、Web、SSH 等运行自己的服务器。

您可以通过只提供外部代理的访问来隐藏在更多的窗帘后面,该代理的存在和登录只有您知道。第一步是用以下内容准备hosts.allow文件:

sshd: LOCAL myhidden.privateserver.com

并将偏执逆加到hosts.deny:

sshd: ALL

正如您所猜测的,当结合使用时,这会将所有 SSH 连接限制在来自本地(192.168.x.x)网络的连接和来自外部服务器的连接,外部服务器可能是位于同一位置的服务器、工作机器或 shell 帐户。

Note

通过将前面例子中的sshd改为ALL,这些规则可以应用于所有协议,而不仅仅是 SSH。

然而,这种方法并非没有风险,因为如果您的服务器由于任何原因变得不可访问,您将只能从指定的机器连接到它(从而解决问题),如果您正在度假,这可能会很困难。

Note

如果您的私有服务器支持多个域,这里指定给sshd的名称必须是规范名称。

您可以扩展这一思想,通过一个替代协议(如简单对象访问协议(SOAP ))从远程服务器控制您的房子,尽管这确实会带来两个潜在的攻击点。

为您的家添彩

将自动化融入家庭的最简单方式是通过无线——或者至少是不使用新线路的自动化。第二种方法覆盖的范围大得惊人,包括通过 WiFi 和以太网供电的网络、电器控制(利用现有电源线上的 X10)和媒体分发(利用电视发送器)。)

但即便如此,由于如此多的设备占据了 2.4GHz 的范围,这一范围的可能性和扩展程度将会受到限制。因此,自然地,有线方式将开始赢得青睐,这将需要一些钻孔和电缆运行。

在接下来的所有建议中,记住你必须总是提前计划,考虑每个房间会有什么,明年会有什么,以及如何使用。敷设电缆是一个耗时的过程,不希望重复进行,所以当你试图插入一个新的小工具并发现你首先需要购买一个扩展单元时,最好铺设太多并有未使用的插座,而不是用完。毕竟,与安装或维护成本相比,电缆相对便宜。在以下所有示例中,如果有足够的空间容纳两根电缆,那么这也是一种有用的冗余措施。

总则

除了在非常深奥的情况下,Node0 将始终处于 HA 安装的中心。即使它实际上并不靠近房子的中心,所有的电缆都应该穿过它。这被称为星形配置。

将电缆从一个位置铺设到另一个位置的过程称为拉电缆,因为它涉及将电缆从一组孔拉到另一组孔的动作。如图 4-1 所示,当您在现有房屋上进行扩建时,通常需要在天花板上钻孔,并通过壁挂式线槽拉下电缆。通过自建,您可能有机会将电缆放置在墙壁内部,使其除了踢脚板旁边的墙板之外不可见。当然,如果你正在做一些重大的重新装修,那么你可能会决定值得拆除墙壁,重新铺设,使电缆看不见。

A978-1-4302-5888-9_4_Fig1_HTML.jpg

图 4-1。

Trunking to hide the cables and a volute to (try to) hide the join

无论你采取哪种方法,最好同时拉所有的电缆:音频、5 类和同轴电缆。如果有必要,买四卷网线,这样你就可以同时拉多根 5 类电缆了。这样会省很多力气。

Note

如果您计划在任何房间安装投影仪,那么您通常需要在天花板内部布线,这涉及到抬起上面房间的地板。当这种情况可能发生时,早点做,因为你以后不想再做了,可能没有投影仪也活不下去;此外,你可以利用这个机会在相同的空间里铺设比平时多得多的电缆。

请记住,所有电缆都有不同的柔韧性,所以在拉电缆时,最好尽可能小心,好像它们都很脆弱。作为指导,Cat5 电缆通常比立体声 AV 更硬,因此在拉动电缆时,尽量不要弯曲或扭结电缆,并以缓慢有序的方式进行。不要猛拉电缆,因为这会在护套上产生摩擦。你可能会发现使用一段排水管或暴露的线槽来提供电缆可以移动和放置的通道是有益的。排水管的使用也确保了尽可能少的拐角,而尖角是最严重的问题。

拉电缆并没有什么诀窍,尽管和同伴一起拉可以节省一半以上的时间。你应该把它们捆在一起,用两倍于电缆长度的绳子把两端绑在一起。将线缆末端系在细绳中间,这样你就可以一起拉动它们。然后你会剩下一半的绳子沿着电缆运行,绳子的两端都是可见的。(跑的一端会有半串,另一端会有少量,不过也可以。)使用这种方法,您可以将绳子留在原位,并将其系在新的电缆上,以便在需要添加新电缆时拉动。

Note

您总是需要添加新的电缆。

接下来我有两个关于文档的词——做一些!最好给所有东西贴上标签:电缆、导管、插头、插座,所有东西。这也适用于你的客厅和电视机,因为你的录像机、PVR、DVD 和电视机通常都配有相同的黑色插头!在两端各用几条彩色带子区分,如红-红-绿-蓝。(使用最接近电缆末端的颜色开始标记。)您应该记录这些颜色代码,并通过拍摄描述每个盒子内的电缆、连接和布线的设置照片来参考它们。尽管它们看起来并不十分有趣,但如果你需要改变或修理任何东西,它们将变得必不可少。

有线网络

房子里的每个房间都应该至少有两条 Cat5 电缆,直接从 Node0 连接到房间。客厅至少要有四个,主卧也是。如果你足够幸运有一个独立的电视室,那么这个也应该有。如果可能的话,你还应该在阁楼上放两个 Cat5,因为这为你的个人存储设备提供了一个非常安全的位置。如果你有足够的空间和耐心,在每个电灯开关上安装两根 Cat5 电缆也是一个很好的未来规划。确定必要插座的数量通常是通过将您认为需要的数量翻倍来计算的。然后再翻一倍!简而言之,端口越多越好。

Note

购买(或借用)一个 IDC 工具,将 Cat5 电缆固定到它们的插座中。它将简化这个过程,并且有这么多套接字要做,及时收回成本。

如前所述,拥有双插座不仅仅是为了冗余,也是为了调试等许多其他实际用途,因为任何插入 Cat5 的单元都可能(会吗?!)在未来的某个时刻出问题。解决这个问题的最简单的方法是拿着笔记本电脑坐在有问题的设备旁边来诊断问题。拥有第二个 Cat5 插座使这变得更容易,因为你不依赖于无线网络,而且它让你同时双重检查网络插座。

Cat5 也应该大量布线,因为它可以有效地应用于非网络问题。也就是说,该电缆可以重复使用,以通过以太网供电系统供电,提供 HDMI 信号、1010 或向平板电脑等低功率墙壁单元供电。这就是为什么我之前建议灯开关使用 Cat5,因为你可以用配置可能性更大的高科技触摸面板取代旧开关。如果您想使用 Cat5 电缆,也可以将 X10 模块升级到 C-Bus。

除了电源,Cat5 插座还可以安装廉价的适配器,使其与 ISDN 或标准座机电话兼容,如果你想以这种方式扩展你的标准电话。

如果您可以看到大量 Cat5 重新分配的可能性,那么将每个房间的两个端口升级到四个端口是值得的。通过这种方式,您可以保留其中两个作为传统的网络插座,通过为其中一个添加网络开关,您可以随时进一步扩展这些插座,并为另外两个插座提供电话或电源等备用用途。

Cat5 插座的位置通常由安装它们的墙壁决定。这通常是在角落附近,如果你使用外墙线槽,从美学角度来说是很好的。这也很实用,因为你会想把它们放在每个房间的电源插座附近,这样使用两个插座的设备就可以使用更短(因此更整洁)的电缆。这些设备通常包括媒体主机、打印机、笔记本电脑和触摸屏。

Note

保持网络电缆和电源电缆之间的合理距离,以最大限度地降低电气噪音。这自然适用于任何类型的数据电缆。

如果您阅读硬件目录,您会看到列出了两种类型的 5 类电缆:实芯电缆和绞合电缆,其中实芯电缆用于墙内安装,绞合电缆用于跳线,因为它更灵活。然而,实际上,自己制作跳线很少有人做,因为它们太便宜了,而且比它们的价值更麻烦。

Note

首先从电缆盘上拉出最长的电缆。剩下的将足够机器和路由器之间的短距离运行。

一旦电缆铺设完毕,你应该用一个插座在每一端进行端接,如图 4-2 所示。

A978-1-4302-5888-9_4_Fig2_HTML.jpg

图 4-2。

A typical network point. I needed to make a separate hole in this one to eliminate a sharp cable bend

然后,您可以使用跳线从插座连接到设备。(将墙内电缆直接连接到插头上是自找麻烦,因为它可能会移动并经常被拉动,这可能会破坏另一端的插头连接。)

在我的安装中,从每个插座引出的电缆颜色编码如下:

  • 蓝色:从墙上插座连接到交换机或路由器的任何电缆
  • 灰色:用于连接本地设备,如电脑、媒体设备等
  • 红色:临时设备,如笔记本电脑

您可能会决定采用不同的配色方案,但这个想法仍然有效,因为它让您知道,如果您需要重新布线或借用电缆,是否可以安全地移除电缆。

无线点

无线是有线网络的补充,而不是替代,因此 WiFi 路由器和中继器应该主要在有线网络不可用的地方提供接入。这通常包括厨房、门廊和棚屋。此外,当公共区域过于繁忙或嘈杂而无法工作时,在主要生活空间使用无线接入可以更方便地四处走动。因此,最好将接入点放在房子后面的房间里。它不需要位于 Node0,因为它是无线的;因此,只要它在某个点连接到有线网络,您就不会有事。如前所述,在某些情况下,Node0 无法为房屋的必要区域提供物理 WiFi 覆盖。

然而,接入点的位置并不是一个明显的选择,因为它的范围会受到干扰和障碍物以及距离的影响。这些只能凭经验确定。首先将接入点放在房屋中央部分的天花板附近,因为这样可以提供与大部分建筑的最佳“视线”连接,然后测试信号强度。你可以为此购买特定的设备,但除非你能借一台,否则带着笔记本电脑在房子里走来走去更便宜,也不会更困难。

WiFi 信号通过两种方法丢失,吸收和反射,尽管在一个家庭中墙是不可避免的,但隔墙的吸收效果不如砖制成的结构墙。还应避免玻璃、镜子和金属等光亮表面,因为信号反射会导致更多的内部协议冲突,从而降低带宽,增加掉线率。

我已经提到了一些工作在 WiFi 2.4GHz 范围内的设备,如电视发送器、无绳电话、微波炉和婴儿监控器,它们也会产生干扰,但你不应该忘记其他电气设备,如电机、风扇加热器和荧光灯,也会产生负面影响。

代替 WiFi,您可以通过使用以太网供电来限制这些问题,从而实现伪无线连接。市场上有几种 EoP 设备(如 MicroLink dLAN ),其中每个单元都可以插入墙壁插座和联网设备。由于这与 X10 使用相同的概念,信号隐藏在电源上,因此容易受到相同的噪声和干扰。

音频电缆

第三章讲述了远程处理的概念,音乐在电脑上解码,产生的信号通过标准音频电缆传输到其他扬声器或放大器。添加这种布线的过程相当简单,因为与 Cat5 相比,电缆数量更少、更细、更灵活,cat 5 需要的孔更小,每端的安装也更少。一个标准的立体声对只有四根线,左右两端各有两个连接器。你可以使用任何你喜欢的连接器,但是唱机插座质量很好,容易安装,而且便宜。

AV 面板比你想象的要贵,尤其是与(更复杂的)Cat5 插座的成本相比,但它们通常带有额外的 SVGA 监控器和复合视频插座。然而,使用钻孔机,你可以使用标准的空白面板来建造你自己的,如图 4-3 所示。

A978-1-4302-5888-9_4_Fig3_HTML.jpg

图 4-3。

An AV connection for stereo and composite video. The top row sends the local AV signal upstairs, and the bottom row receives an AV signal to downstairs. Note the trunking on the left and the exit for network cables on the right, which is simply passed through from the trunking

音频电缆的类型和质量是一个重要的决定,尽管没有音响发烧友让你相信的那么重要!这些电缆可能有几米长,并与一些相当标准的连接器一起使用,因此任何超过 42 股的电缆通常都会被浪费掉。事实上,对于一些单元,例如放置在厨房中的单元,环境中的额外环境噪声将使得任何关键的收听都是不可能的。在这些情况下,你可以用简单的铃线。在任何情况下,都值得购买屏蔽立体声电缆,因为它是成对捆绑的,其中一根电缆上有标记,这样就可以清楚地看到哪根电缆的两端需要接地。

音频电缆的另一面是无源扬声器分配系统的连接,其中一组扬声器的输出被路由到其他几个扬声器,无需额外的放大器。如前所述,同样的规则也适用。您也可以重复使用网络电缆的颜色编码概念,将一种颜色用于电源线(进入和离开放大器),另一种颜色用于将信号分配给其他扬声器。您可以在图 4-4 中看到这一点,您还可以注意到白色电缆上的黑线,表示接地。

A978-1-4302-5888-9_4_Fig4_HTML.jpg

图 4-4。

The speaker distribution bay. This model also support push-button switches to turn each speaker pair on or off (not shown)

如果你能确保线缆不会移动太多,你可以将线缆直接从扬声器开关盒接入墙壁,沿着扬声器,而不需要像我对唱机那样使用单独的连接器。这样做是为了获得更好的保真度,可以通过将线缆直接焊接到扬声器端子本身来提高保真度。

其他接入点?

随着 Cat5 成为如此普遍的布线方法,对布线范围的要求也比以前少了。但它们仍然值得考虑。

例如,电话可以通过廉价的适配器使用 Cat5 插座,所以没有必要明确地为它们布线,特别是随着移动电话和 VoIP 的增加,所以只有在你认为你会需要它们的时候才添加电话专用插座。

红外信号可以通过无线传输(但这增加了已经过度拥挤的频谱),也可以通过带有红外分配放大器的电缆传输(这是阻止已经很弱的信号进一步扩散所必需的)。但是一般来说,从第一章开始,使用网关设备,如 Keene IR Anywhere,通过 Cat5 发送会更好。

根据 CCTV 安装的规模,您可能还需要为每个摄像机将单独的电缆连接到摄像机开关设备。你可以在第一章中找到关于这些的信息。

在 HA 安装中,电源始终是一个问题,因为在您需要的地方永远不会有足够的电源。除非你能够自建,否则你没有选择插座的位置或数量。你总是可以通过将任何现有的插座转换成多联单元或者从楼上的灯增加一个支线来在阁楼上提供几个插座来解决这个问题。这不仅让您有机会在阁楼中添加一个小型安全文件系统,还意味着您可以使用该空间来存储 X10 DIN 导轨设备,它们不会碍事,并且不会增加 Node0 本身的热量。

Note

不要将 DIN 导轨彼此靠得太近,因为热量会导致操作问题。建议最小间距为 20 毫米。

额外的电力导管也可用于车道照明和电动车库门供电。在前一种情况下,您只需要一个低功率(约 12v)电源,它也可以用于喷泉,泛光灯,户外圣诞树,相机和 PIR。它们还可以帮助传感器供电,如 VAL-1 车辆警报,它可以指示汽车何时接近车库或车道。你甚至可以安装两个来正确确定行进方向,就像我们在第二章中为 Arduino 门垫建议的那样。

Note

例如,如果你的电动车库门需要 10 秒钟才能打开,但你的传感器只有在你离门 5 秒钟的时候才在范围内,你就需要采用定制的 RF 网关电路来提前触发门。

还有大功率设备,如车库门,以及车棚或车库中电动工具的电源插座。这些通常涂有橡胶,以隔离自然环境。在任何情况下,在室外安装电气设备之前,请咨询电工和您所在国家的法律!

Note

你也可以使用车道传感器打开门廊灯,为你的到来做好准备。

结论

家庭网络安装显然不仅仅是几根电缆和一块网卡。通过提前仔细考虑家里所有可能的功能,你可以确保你在房子的每个房间都铺设了足够的正确类型的电缆。即使那样,你可能还是会用完。此外,通过将尽可能多的技术聚集在一个地方,可以创建一个名为 Node0 的中心枢纽。这种物理上的接近使您可以在设备之间放置红外发射器和控制电缆,并确保可以从一个区域控制一切。同样,规划该区域的用途和功能,以便所有东西都适合,并且(重要的是)有一个接近机器面板、插头、插座和电源的方法。

Footnotes 1

从技术上讲,热空气密度较小,导致其上升。

2

人们通常建议卧室温度比其他房间低 2 度左右,以帮助你的身体更容易入睡。

3

这个驱动程序是闭源的,但是可以在 Linux 上使用。

4

这些不可思议的小机器的体积还不到一片口香糖。 www.gumstix.com

5

你可以在 www.mini-box.com/site/mb/Power_MB.htm 找到更完整的迷你 ITX 机功耗计算器。

6

这个名为 www.80plus.org 的 80 Plus 项目旨在促进电源效率超过 80%的制造商。PSU 的平均值大约是 60%。

7

兼容性列表可在 www.networkupstools.org/compat/stable.html 获得。

8

记住,除非经过测试,否则所有备份都是无用的!

9

作为一个偏执的极客,除了别人做的备份之外,我会自己定期做备份。

10

为此,您需要两根电缆,建议使用 6 类电缆,而不是 5 类电缆,因为 HDMI 对信号的时序非常挑剔。

六、交流:人类会说话。电脑会说话

Abstract

人们常说,语言是使其他一切成为可能的发明。在技术的世界里,语言是使所有其他事物得以存在的协议。为一台独立的机器编写软件是非常好的,但是当它设法与外界接口,通过网络与另一个程序接口,或者控制一个外部硬件时,这似乎更令人满意。用电脑控制哪怕是最简单的机器人,对于外行人(和许多极客)来说,都是令人印象深刻的。)而不是演示行进立方体的优化实现。

人们常说,语言是使其他一切成为可能的发明。在技术的世界里,语言是使所有其他事物得以存在的协议。为一台独立的机器编写软件是非常好的,但是当它设法与外界接口,通过网络与另一个程序接口,或者控制一个外部硬件时,这似乎更令人满意。用电脑控制哪怕是最简单的机器人,对于外行人(和许多极客)来说,都是令人印象深刻的。)而不是演示行进立方体的优化实现。 1

我已经在第一章中介绍了许多能够与外部硬件通信的设备,现在我将讨论人机通信,并演示我们如何与一台机器或一个软件交互,并让它在其他地方控制另一台机器。这包括使用电子邮件、短信和网页。然而,新技术的出现是无情的,随着 iPhone 等设备提供宽带 2 体验,手机的典型作用(作为语音通话、短信或电子邮件的设备)大大降低了。

为什么是通信?

技术领域有四种沟通方式:

  • 计算机对计算机
  • 人与人之间
  • 计算机对人类
  • 人对计算机

出于不同的原因,这些对我们都很重要。第一个在第一章中有所介绍,它允许设备根据一些基于时间或逻辑的程序自动控制。

人与人之间的交流每天都在发生,但现在可以通过技术来促进。在电话出现之前,我们唯一的实时交流方式是面对面交流。现在我们有电子邮件、互联网中继聊天(IRC)、即时消息(IM)和 SMS 来执行同样的任务。都去掉了“面子”元素。

我们还简化了现有的沟通媒介。电话,曾经是低质量和硬连线到一个物理位置,现在是移动的。通过 IP 语音(VoIP)技术,您可以利用互联网的(几乎)免费成本来节省资金,并且当与移动技术结合时,可以促进使用移动电话通过网页在线订购比萨饼的有趣情况!

当我们谈到计算机与人的交流时,我们是在看计算机发送给我们的有关房子的报告和信息。在最简单的情况下,这可能是每天的叫醒电话或包含一天的电视时间表的电子邮件。在更复杂的情况下,它可能是一份关于房间内计算机及其性能的完整报告。 3

最后,人机交流是最常见的,包括我们通过电子邮件、短信或网页告诉机器我们想做什么。为了成为一个真正智能和自动化的房子,这个列表将包括触觉界面。我们不需要发出明确的命令来告诉计算机做什么;它通过研究环境知道该做什么。例如,当前门被打开时,计算机会知道开灯;不久之后,内部门垫传感器将关闭,因为它已经意识到有人正在进入房子。你已经在第二章中构建了类似的触觉功能,所以我将在本章中讨论显式通信。

IP 电话

IP 电话或 VoIP 通信是常见的,也是任何智能家居的预期功能。然而,对大多数人来说,由于电话通信的个人性质,VoIP 安装将是私人的,只存在于个人笔记本电脑或台式机上。但它可以与语音识别结合使用,以提供一种有趣的(尽管容易出错)数据输入方式和一种添加内部家庭内部通信系统的方法。

网络电话

正如胡佛已经成为真空吸尘器的同义词,Google now 是一个意为搜索的动词,Skype 是 VoIP 的代名词。Skype 始于 2003 年,以免费软件的形式发布,为 Linux、Mac 和 Windows 提供了客户端,每个客户端都有不同程度的功能,所有版本都允许您与其他 Skype 用户免费通话,并像任何标准电话一样为移动电话和座机提供补贴语音通话。大多数允许您从几个不同的地方用同一个帐户登录,这意味着您可以用同一个面向住宅的电话号码将 Skype 安装到住宅中的每一个终端上,这样您就可以在住宅中的任何房间发送和接收电话。使用额外的硬件,您可以采用免提方式,在通话过程中在房间之间移动,例如查看晚餐,让您回到自 20 世纪 80 年代无绳电话问世以来就存在的漫游状态!

星号

Asterisk 是另一个基于软件的电话解决方案,它还支持 VoIP、移动电话和固定电话。它对我们的好处是,它是真正意义上的免费软件,可以支持许多协议,因为它是一个完整的专用小交换机(PBX ),可以支持高度可配置的呼叫转移、语音邮件、会议和电话菜单(因此您可以实现自己的“按 1 开灯”系统!).与 Skype 一样,您需要一个服务提供网关来将基于 IP 的协议连接到一般的电话网络。这是一项付费服务,可以从许多地方购买,包括 Skype 本身,它有自己的 Skype-to-Asterisk 模块。作为一种选择,FXO 接口是可用的,它允许您将 SIP 接口到 PSTN。你仍然需要购买 FXO 接口(大约 15 美元),但是你不需要从手机供应商之外的任何人那里购买。

目前安装大量 Asterisk 代码的最简单方法是通过 FreePBX,但即使这样,如果你有一个足够大的房子,使大喊大叫成为不可能,或者你是电话的狂热用户,因为你可以通过电子邮件或网络(现在大多数电话上都有)或短信获得更可靠的沟通,那么即使这样也值得花时间。

电子邮件

电子邮件现在是全世界个人和职业生活的命脉。在任何时候发送和接收来自任何人的消息都是非常容易的——事实上,大多数垃圾邮件文件夹的状态都证明了这一点。但它会一直存在,所以我们可以把电子邮件添加到我们的房子将支持的协议列表中,允许我们向我们的视频、电灯开关或电视发送信息,并让我们的房子发送信息。

在 Linux 中准备电子邮件

电子邮件的传播路径在任何地方都是一样的,由三部分组成:

  • 邮件传输代理(MTA):MTA 也称为电子邮件服务器,是一种通过简单邮件传输协议(SMTP)与其他 MTA 通信的软件,用于将收到的电子邮件路由到正确的收件人,记录目的地址并将其传递到该计算机上的服务器。
  • 邮件检索:这是将电子邮件从邮件服务器传输到客户端的方法。这些数据通过邮局协议(POP)或互联网消息访问协议(IMAP)进行传输。在我们的例子中,这些将在同一台机器上,因为我们将运行我们自己的 MTA,但它们不必如此,因为我们也可以将我们的谷歌邮件下载到我们的本地机器上进行处理,我将在第六章中介绍。
  • 邮件用户代理(MUA):这是用于实际阅读和发送电子邮件的客户端软件。这包括 Thunderbird 等大型 GUI 应用程序、AtMail 等网络邮件解决方案,以及 Mutt 等基于控制台的小型应用程序。

尽管公司的无人驾驶飞机会不停地抱怨 Exchange 作为 MTA ( http://en.wikipedia.org/wiki/Comparison_of_mail_servers )的好处,但你有四个主要的电子邮件服务器可供选择,而且比简单的 Outlook 多得多。此外,由于 Linux(以及一般的类 Unix 系统)的设计,您可以非常灵活地自动处理收到的邮件,并发出非交互式命令来发送回复。

每个 MTA 都有其他人没有的优点和特点。四大巨头——Exim、qmail、Postfix 和 Sendmail——都有自己的拥护者和反对者。我个人使用 Exim,因为它有一个引导式安装,而且之后“就能工作了”。对于不同的观点,有一个 wiki 页面涵盖了这些包的最新版本,以及一些商业产品。你安装其中一个的时候我会在这里等着。

发送电子邮件

安装服务器并通过给自己(和另一个用户)发送一两封电子邮件来测试它之后,您就可以开始编写自动发送脚本了。这是在 Linux 上最容易做到的事情,涉及到mail命令,它发送带有任意数量的附加标题和设置的电子邮件。这里,您只需要一个抽象脚本,如下所示:

#!/bin/bash

SUBJECT=$1; shift

TOADDR=$1; shift

MSG=$*

echo "$MSG" | mail -s "$SUBJECT" "$TOADDR"

可以这样称呼它:

xmitemail "Hello" "steev@workaddress.com" "I bet you didn't think this would work!"

该命令将发送所示的简单电子邮件,并且可以通过在命令行上键入它来调用,从日常 crontab 触发它,或者作为一些其他家庭事件的结果来运行。例如,有人从前门进来(使用第二章中的 Arduino 门垫)可能会发出这样的电子邮件,或者当其中一个硬盘太满时,它可能会作为警告发送。

我在这里颠覆了原来的界面为mail,因为用户以前面显示的方式调用命令会更常见。但是,有时您会希望通过允许脚本接受来自 STDIN 的任何输入来恢复到最初的使用方式。这需要这里显示的三行替换来取代 MSG:

if [ $# -eq 0 ]; then

while read LINE ; do

MSG="$MSG""^M""$LINE"

done

else

MSG=$*

fi

请注意^M字符,它是通过 Ctrl+V 后跟 Ctrl+M 输入到类似vi的编辑器中的。现在可以从文件中输入消息,如下所示:

cat filename | xmitemail "Here's the file" "steev@myworkaddress.com"

在第七章中,你将学习如何扩展这个功能来支持一个基本的地址簿和多个接收者。

自动处理电子邮件

代表程序而不是人类用户接受电子邮件,可以用一个词来概括:Procmail。Procmail 是 Stephen R. van den Berg 于 1990 年开始的一个项目,旨在控制电子邮件消息的传递,尽管有些人认为它是一个死项目,但这使它成为一个稳定的项目,不太可能很快中断或引入新的复杂问题!

Procmail 由电子邮件服务器(MTA,如 Exim)触发,它将每条消息传递给一系列配方中的每一个,以便进一步处理。如果这些方法都没有声明该消息,那么它将正常传递。

我将从创建一个简单的例子开始,通过这个例子你可以用电子邮件发送你卧室的电灯开关。因此,使用以下内容创建一个用户,并填写所有必要的用户详细信息:

adduser bedroom

然后,创建一个.procmailrc文件(注意点!)中,并添加以下食谱代码:

:0

* ^From steev

* ^Subject: light on

|heyu turn bedroom_light on

这要求发送者是斯蒂夫 5 并且主题在运行heyu命令控制灯之前是“灯亮”的。这两个条件都必须满足。您可以并且应该扩展这些参数,以包括完整的电子邮件地址(以防止任何 steev 控制灯光)和一个正则表达式,使主题行不区分大小写。但在我们继续之前,我将分解这些元素。

每个配方由三部分组成:

  • 模式:这通常是:0,但也可以通过附加另一个冒号和一个锁文件的名称(例如:0:mylock)来包含锁定指令(这样该配方就不能同时运行多次)。
  • 条件:零行或多行(以星号开头),表示电子邮件必须如何显示才能进行处理。这也支持正则表达式。因为每个条件都必须以 AND 逻辑方式满足,所以您可以通过不包含任何条件行来接受所有邮件。
  • 操作:最后一行指示消息是应该转发到另一个电子邮件帐户(带有! forwarded@othermail.com)、传递到脚本或程序(| command arguments)还是仅仅复制到一个文件(文件名,不带前缀字符)。为了支持多个动作,你将需要执行一些重魔法(涉及多个食谱,:0c模式,或者分支处理;详见 http://partmaps.org/era/procmail/mini-faq.html#recipe-block )。

每个配方按顺序进行评估,直到找到一个满足所有条件的配方,然后停止。您可以通过使用formail工具来验证 Procmail 的输入,作为总括配方中操作的一部分:

:0

|formail >> ∼steev/procmail-log

您可以打开一个单独的终端窗口,键入以下内容,然后观察邮件信息的显示,从而实时查看这些信息:

tail -f ∼steev/procmail-log

您还可以在调试 Procmail 调用的脚本时使用这种技术,方法是复制一封已发送的电子邮件,并将其重定向到脚本的输入。您还可以使用LOGFILE指令来调试 Procmail 脚本。这里有一个例子:

LOGFILE=$HOME/procmail.logfile

.procmailrc脚本本身也具有标准bash脚本的一些功能,因此您也可以为命令准备PATH变量,并预处理邮件以提取主题行,如下所示:

PATH=/usr/bin:/usr/local/bin:/usr/local/minerva/bin

SUBJECT=formail -zxSubject:` ```

Note

有些安装还要求您创建一个包含单行"|/usr/bin/procmail"(带引号)的.forward文件,以便触发 Procmail。此时 Procmail 不是您的本地邮件递送代理。

你现在可以创建一个单独的再次关灯的方法,它会像你期望的那样简单。但是,为了提高灵活性,我将展示如何运行一个单独的脚本,该脚本也查看电子邮件的正文,并将邮件作为一个整体进行处理,以便您可以包含调暗或提高亮度的命令。首先将主题作为参数 6 和电子邮件内容(标题和正文)传递到 STDIN,这是从一个新的菜谱启动的:

:0

* ^From - steev.*

* ^Subject: light

|∼steev/lightcontrol $SUBJECT

然后使用lightcontrol脚本将正文连接成一个长字符串,用空格而不是换行符隔开:

#!/usr/bin/perl

# Skip the header, i.e. any non-empty line

while(<STDIN>) {

last if /^\s*$/;

}

my $body = "";

my $separator = "";

# Begin the message with the subject line, if it exists

if (defined $ARGV[0]) {

$body = $ARGV[0];

$separator = " ";

}

# Then concatenate all other lines

while(<STDIN>) {

chomp;

if ($_ !∼/^\s*$/) {

$body .= $separator;

$body .= $_;

$separator = " ";

}

}

然后,您可以处理$body来控制灯光本身,使用直接比较(意味着文本必须包含命令,并且只包含命令)或简单的正则表达式来允许它出现在任何地方,就像“dim”的例子一样。

if ($body eq "light on") {

system("heyu turn e3 on");

} elseif ($body eq "light off") {

system("heyu turn e3 off");

} elseif ($body =∼ /light dim (\d+)/) {

system("heyu dimb e3 $1");

}

Note

请记住,所有脚本都必须具有 execute 属性。

有了这些简单的规则,您现在可以为家中的每个房间创建用户帐户(以及相应的电子邮件地址),并添加脚本来控制您认为合适的灯、电器和茶壶。

Note

您可以使用语音识别宏来开始(和停止)录音,从而扩展我们在第二章中创建的听写程序。

你也可以使用一个house@电子邮件地址来处理更复杂的任务,比如等待一条写着“回家”的信息,然后等一个小时(或者无论你的通勤时间有多长)再提前打开茶壶,以及门廊和客厅的灯。这创造了一个受欢迎的景象,没有浪费任何电力。或者你可以将.procmailrc脚本放在你自己的电子邮件账户上,以查看来自你女朋友的邮件(当然,这些邮件非常重要,必须立即回复!)或包含单词 free 和 beer 的线程上,按此顺序!要阻止 Procmail 处理该邮件并丢弃它,您必须在将邮件传递给 recipe 之前“克隆”该邮件,方法是在第一行添加一个c。以下示例通过在收到此类邮件时发出语音通知并将原始邮件发送到收件箱来演示这一点:

:0c

* ^From- steev.*

|/usr/bin/play /media/voices/messages/youve-got-mail.wav

安全问题

作为一种纯文本的数据传输方法,电子邮件经常被比作明信片而不是信件的发送,因为它的内容(理论上)可以被途中的任何传送服务器读取。它也是一个公共协议,允许世界上的任何人向您的服务器发送消息。这两个因素结合在一起,很难确保没有人会试图给你的电灯开关发电子邮件。

我在这里采取了一些基本的预防措施,包括以下几点:

  • 电子邮件地址或格式的保密
  • 严格的命令格式(大多数情况下,电子邮件签名会导致解析失败)
  • 不对正确或不正确的消息进行确认
  • 限制发送者(尽管是原始的)

同样,我们通过默默无闻获得了安全感。但是,即便如此,黑客仍然有可能制造麻烦。如果您打算将电子邮件用作主要渠道,那么值得花费时间和精力来确保它的安全,方法是安装 GnuPG,为您的所有电子邮件帐户生成证书,并使用它们的公钥来验证发件人。这确实意味着新用户不能控制房子,除非首先由系统管理员手动确认他们的密钥。这种方法唯一失效的时候是当你无法访问一个注册的电子邮件帐户时(例如,当你在度假时),你需要从一个临时地址发送一个命令。然而,这是一种罕见的情况,希望通过 SSH 连接来处理如此严重的问题,或者为这种紧急情况配置一个合适的备用电子邮件帐户。

为了更快地安装,并且可以在任何地方工作,可以在服务器上保存一个循环的密码列表,并且电子邮件必须声明列表中的第一个密码可以被访问。一旦通过验证,就会执行该命令,列表循环往复,第一个元素被推到底部:

tail -n +2 list >tempfile

head -n 1 list >>tempfile

mv tempfile list

通过这种方式,任何看着你输入电子邮件或监控你的流量的人都只能使用旧密码。

自然,两种方法都可以结合起来。

声音

使用语音进行交互控制是许多人的目标,尤其是在询问家庭自动化时。我个人怪《星际迷航》上的会说话的电脑!但是所有的交流都需要两个部分,说话者和听者,自然语言的流动性使得这两个任务都很困难。然而,这两个领域都取得了良好进展。

理解声音输入是一个由两部分组成的问题。第一个涉及理解实际说过的话,这与语音识别软件有关。第二种要求计算机理解这些单词的意思以及应该如何解释它们。用这些信息做一些事情的命令,比如开灯,是比较容易的。因为目的是控制你家里的物品,而不是命令电子邮件或信件,所以意思可以由你创建的一组规则来管理。因此,每个命令都必须以computer开头,例如,后跟一个设备名称(bedroom lights),再跟一个特定于该设备的命令(switch on)。再说一遍,我怪《星际迷航》!

对于那些使用多种语言的家庭来说,还需要额外考虑目标语言。诸如“卧室的灯亮着”这样的短语可以翻译成“卧室的灯亮着”的等价物这意味着任何类似这样的代码都需要根据不同的语言进行更改:

$message = "the $room light is $state";

这是软件本地化现实世界中的问题,但在这里不是!这是因为社会契约的存在,一个家庭通常会在家里对着电脑说同一种语言,即使他们在公共场合并不这么做。

相比之下,生成语音输出是一项相对简单的任务...但只是因为这是为我们做的!有三种方法:声乐音素,采样语音,以及两者的结合。我很快会谈到这些。

语音识别软件

Linux 目前对这部分问题的支持相当差,这并不奇怪。为了理解最简单的短语,您需要一个声学模型来以统计方式生成声音本身的表示(通常作为特定说话者初始训练的一部分),以及一个语言模型来考虑哪些单词和声音可能会跟随另一个单词和声音的概率(以限制分析语音时所需的处理),这两个模型都是特定于语言的。

大多数原生 Linux 软件要么是旧的、不完整的、无法编译的,要么是商业化的。即使是高级的解决方案,如斯芬克斯( http://cmusphinx.org ),也需要这么多级的安装和培训,没有人真正确定它是否有效!

商业产品存在稀缺的问题,很少甚至没有所谓的可用软件带有“在此购买”的页面。这种缺席甚至包括 IBM 的 ViaVoice,它曾经是免费的,但在 2002 年被撤回。甚至曾经作为商业 Linux 软件存在的旧软件也已经转变成了 Windows 专用的软件包。

在 Linux 下处理语音命令最简单的方法是通过 Windows,这确实是一种奇怪的情况!这可以采用运行虚拟机(通过 Wine 或 VMware 服务器)的方法,也可以使用本地 Windows 机器。

由于虚拟和真实声卡之间的不协调,虚拟化方法存在一些问题,但 ViaVoice 或 Dragon Naturally Speaking 等软件通常可以在一段时间后工作。如果该软件要在您的服务器上运行,通常是这样的,那么您也给它添加了对 X Windows 的依赖,增加了它的处理负载。

因此,最有效的方法是使用一台单独的 Windows 机器运行前面提到的软件。或者,你已经付了“Windows 税”,使用 Vista 内置的软件,下载 Windows 语音识别宏模块。随着平板电脑和笔记本电脑开始在其最新版本中包含语音识别软件,在不久的将来,可能很快就会在 Linux 机器中找到一个(封闭源代码)库。

虽然有一个好的识别算法很重要,但更重要的是能够访问它的结果。在大多数 Windows 软件中,这从来不是一个高优先级。对他们来说,更常见的是采用“我们将在一个包中为您提供我们认为您会需要的所有功能”,而 Linux 使用“这里有许多我们认为您会需要的工具;你可以想出如何产生功能”的方法。因此,您需要在购买前试用该软件。此处给出的解决方案涵盖了 Windows Vista 内置软件的使用。

从在 Vista 中训练语音识别系统开始;然后完成教程,安装 Windows 语音识别宏,可从微软网站下载( www.microsoft.com/downloads/details.aspx?FamilyID=fad62198-220c-4717-b044-829ae4f7c125&displaylang=en )。接下来,您需要为想要使用的命令编写一系列宏,例如“开灯”和“关灯”每个宏都会触发一个命令;在我们的例子中,这将是wget来欺骗 Apache 在我们的服务器上运行必要的代码。图 5-1 显示宏配置面板。

A978-1-4302-5888-9_5_Fig1_HTML.jpg

图 5-1。

Preparing a voice macro under Vista. (Used with permission from Microsoft.)

自然地,auth关键字是一个误称,因为任何人(从任何地方)都可以请求同一个页面并触发命令。然而,通过使用机器的本地 IP 地址,请求将永远不会离开您的内部网,并且通过锁定 Windows 机器,没有其他人能够发现密钥。 7 所以,再一次,你只容易受到那些能接触到机器的人(也就是你的家人,他们能接触到电灯开关本身)的攻击!

从这里开始,服务器代码是琐碎的,并且是预期的:

<?php

$cmd = $_GET['cmd'];

if ($cmd == "lightson") {

system("heyu turn bedroom_light on");

}

else if ($cmd == "lightsoff") {

system("heyu turn bedroom_light off");

}

?>

然后,您可以随意对其进行抽象和扩展。在第七章中,你将把它集成到一个通用消息系统中。

Note

在对语音识别软件进行大量投资之前,确保它能够区分可以控制系统的不同声音,因为许多软件只能听单一的预选声音,因为其主要目的是听写而不是语音识别。

请注意,大多数这种类型的软件不提供对您实际说过的话的访问;电脑只是认为这个比那个更有可能。虽然这减少了出错的机会,但也防止了使用任何模拟或缩放命令,如“调暗至 72%”

来自 iOS

云已经部分解决了语音识别的问题。通过将处理过程转移到远程设备上,意味着你可以使用比传统的手持机器更强大的算法来执行识别,尽管代价是要求你自己在线,并发现自己受到(传统的)非开放技术的支配。这方面最著名的例子是 Siri。

Siri 于 2010 年作为独立应用发布,后来被整合到 iPhone 4s 中,并成为 iPhone 和 iPad 上 iOS 5 以来版本的主要功能。在其传统操作模式下,会发生以下情况:

  • Siri 从麦克风录制您的声音
  • 您的 iOS 设备将它的渲染上传到位于 guzzoni.apple.com 的服务器上
  • guzzoni 服务器处理语音,并处理请求
  • guzzoni 服务器向您的 iOS 设备返回一个命令包

如您所见,该链的两个部分需要 iOS 设备。然而,通过修补(以及 SiriProxy 等软件),你可以避开这个过程的一半。然后,操作变成:

  • Siri 从麦克风录制您的声音
  • 您的 iOS 设备将它的渲染上传到您的服务器
  • 您的服务器将请求传递给 guzzoni.apple.com
  • guzzoni 服务器处理语音,并处理请求
  • guzzoni 服务器向您的服务器返回一个命令包
  • 然后,您的服务器可以使用已识别的文本字符串处理任何任意命令
  • 您的服务器将结果字符串(带有可选图像)传递给 iOS 设备

正如您所看到的,这里发生了一个相当传统的代理隐喻,您的服务器充当 iOS 设备和 guzzoni 服务器之间的中间人,以便它能够进入进程的中间,执行自定义命令。

请注意,路由的 iOS 部分仍然是强制性的,因为 guzzoni 服务器将只与经过身份验证的 iOS 设备通信。代理通过从您的原始 iOS 设备 ID (UDID)重新生成它来管理它。

传统上,您只能在本地网络中运行 SiriProxy,因为您不希望随机的陌生人连接到路由器上暴露的端口。然而,使用 VPN 连接到您的内部网络是可能的,尽管这超出了我们这里的范围。

为此,你需要在 https://github.com/plamoni/SiriProxy 安装软件

有安装脚本和视频可用,过程列在 https://gist.github.com/plamoni/1428474

考虑到这个软件是多么的新,我只能建议你使用最新的说明和在那个要点文件中列出的错误修复。

编写插件

假设代理是用 Ruby 编写的,那么插件也是有意义的。因为实际上不涉及任何代码,所以做起来并不困难。没有什么可以阻止您调用另一个 shell 脚本。

require 'cora'

require 'siri_objects'

require 'pp'

class SiriProxy::Plugin::ControlLights < SiriProxy::Plugin

def initialize(config)

# standard initialization

end

listen_for /computer light (on|off)/i do |light_state|

state = homedevice default #{light_state} bedroom_light``

say state

request_completed

end

end

这个库提供了额外的功能,比如一个基本的状态系统,因此您可以检测单词“next”是指下一首音乐还是下一条新闻。您还可以通过 SiriAddViews、send_object 和一个模型“ask”命令添加内容来提供视觉反馈,例如天气,这样您就可以获得关于最新命令的说明。

Note

一旦你创建了自己的插件,不要忘记把它添加到 config.yml 文件中。

来自 Android

对于 Android 来说,Siri 的最佳替代品是三星的 S Voice。它的工作方式与 Siri 相同(而是使用 Vlingo 服务器),尽管在这种情况下,它需要一个有效的 Galaxy S III 手机 id 来连接和使用该服务。然而,在撰写本文时,唯一的黑客工具是 voicetalk.apk,它需要一个根电话,因此不推荐这样做。

远程语音控制

能够在房子的几个不同房间里使用你的声音肯定有好处。但是,这增加了新的复杂性,因为您必须执行以下操作之一:

  • 在房子的每个房间里将一个麦克风连接到电脑:你可以购买小型混音器,将来自多个麦克风的输入组合起来,非常便宜。最自然的地方是在灯座和灯泡附近,因为附近已经有一根电缆了。然而,你需要屏蔽他们的电缆,以避免电源嗡嗡声。一些司法管辖区还会(合法地)要求电源线和非电源线之间保持最小距离。例如,在澳大利亚,这个距离是 300 毫米。您应该注意安全,并在继续操作之前查看您所在国家的当地法律。
  • 在每个房间都有一台单独的计算机,并在本地处理数据:这为您提供了最高级别的控制,因为多个人可以同时与服务器对话,并且服务器只处理请求数据,而不处理音频数据。然而,这更贵,而且要求你能在每个房间里藏一台(小)电脑。

在每种情况下,每个房间的音响效果会有所不同,因此您可能需要从房间的不同位置录制您的声音。

Note

使用 Siri hack 只对手持语音控制解决方案有用,因为 Siri 需要你按下按钮才能激活它。事实上,这是许多软件的一个主要障碍,这些软件不能在“触发”或初始“关键”短语或单词上开始记录。

在过去的电影中,在麦克风盛行之前,麦克风被藏在收音机或电话等大型道具中,这样它们就可以放置在离演员足够近的地方,以便在没有外来噪音的情况下拾取他们的声音。你也可以通过安装麦克风(甚至个人电脑)在更小的范围内做同样的事情。)在椅子里或桌子底下。主要考虑的是如何让电缆(电源和数据)回到语音机器。如果你正在从头开始一个家庭自动化项目,或者正在装修,那么你可以选择拉起地板,在下面铺设电缆。然而,这样的决定不能掉以轻心,特别是因为维护是非常昂贵的!

Note

旧的蓝牙耳机和免提装置既昂贵又笨重。然而,它们现在便宜得多,可以提供一种偷偷摸摸的方式,在整个房子里添加无线远程麦克风,用于捕捉语音命令或安全监控。

然而,对我来说,第二种选择更可取,因为拥有一台独立的语音识别机并不像听起来那么糟糕。好吧,这涉及到高成本和额外的电力问题,但因为机器没有其他事情可做,它可以在没有键盘、鼠标或显示器的情况下存在,并且安静地坐着,不被触摸,无需维护许多年。此外,随着低成本笔记本电脑的出现,您可以在两个或更多拥有自己麦克风的房间中放置(阅读:隐藏)一个,从而消除您可能会遇到的大多数音频声学问题,以及如何在房间之间连接麦克风和前置放大器的思考。预装 Vista(包括语音识别软件)的低端机器的成本,现在并不比其他一些软件包的软件许可成本高多少。我希望那些开发者在这本书的第二版出版之前能很快意识到这一点和他们所错过的市场!

语音合成

这是问题中容易的部分,因为困难的工作已经为我们完成了,其中一个软件包是可用的。

节日

这个领域的爸爸是一个叫节日( http://www.cstr.ed.ac.uk/projects/festival/ )的包。Festival 始于 2004 年,位于爱丁堡大学的语音技术研究中心(CSTR ),现在仍然存在,尽管最近的功能已经由许多来源提供,包括 Carnegie Melon 大学,因为它有开源许可证。它通过一个复杂的音素和韵律系统生成单词,并能够通过使用特定于语言的代码动态处理不同语言的细微差别,这些代码由 Festival 的内置 Scheme 解释器处理。

大多数发行版都提供了 Festival 的基本安装,尽管声音有限。快速研究一下/usr/share/festival会告诉你有多少。这些可以通过运行 Festival 并使用交互式提示进行采样:

$ festival

Festival Speech Synthesis System 1.96:beta July 2004

Copyright (C) University of Edinburgh, 1996-2004\. All rights reserved.

For details type (festival_warranty)``

festival> (SayText "Hello automation")

#<Utterance 0xb6a8eff8>

festival> (voice_lp_diphone)

lp_diphone

festival> (SayText "Hello automation")

#<Utterance 0xb6c56ec8>

festival> (quit)

括号符号是因为处理命令的 Scheme 解释器,lp_diphone引用是默认情况下提供的另一种意大利女性“声音”。在你继续之前,写一个简短的脚本来简化演讲过程(为明显的英语偏见道歉):

#!/bin/bash

SPEAKER=/usr/share/festival/voices/english/$1

if [ -d $SPEAKER ]; then

VOX=\(voice_$1\)

fi

shift

echo "$VOX (SayText \"" $* "\")" | festival --pipe

然后,您可以调用以下内容:

say default Hello automation

或下面的更容易切换到另一种声音:

say kal_diphone Hello automation

为了更好的声音,你需要在姆布拉看得更远。

MBROLA 是一个(目前)仅支持二进制的 Festival 后端,它提供了 Festival 的备选声音,而不需要升级 Festival 包本身。通过 Debian 在基于 Intel 的系统上安装基本的 MBROLA 代码,如下所示:

wgethttp://tcts.fpms.ac.be/synthesis/mbrola/bin/pclinux/mbrola3.0.1h_i386.deb

sudo dpkg -i mbrola3.0.1h_i386.deb

然后,您需要下载新的语音数据来使用此代码。在这里,我们可以听到几种声音,但这里最感兴趣的是以美国为中心的三种声音。我将演示 us1 的安装,us2 和 us3 需要对 URL 进行明显的更改: 8

wget -chttp://tcts.fpms.ac.be/synthesis/mbrola/dba/us1/us1-980512.zip

wget -chttp://www.festvox.org/packed/festival/latest/festvox_us1.tar.gz

unzip -x us1-980512.zip

tar xvf festvox_us1.tar.gz

然后可以将数据复制到适当的地方,根据你的分布:

# these require root privileges

mkdir -p /usr/share/festival/voices/english/us1_mbrola/

mv us1 /usr/share/festival/voices/english/us1_mbrola/

mv festival/lib/voices/english/us1_mbrola/* /usr/share/festival/voices/english/us1_mbrola/

当然,其他发行版可能会为您打包,从而节省工作。

现在你有了一个备用声部,如果安装正确,可以用 Festival 命令(voice.list)(带括号)来验证。它现在应该显示出us1_mbrola是一个合适的声音,所以您可以用下面的代码来测试它:

say us1_mbrola Hello automation

当您很高兴找到了自己喜欢的声音时,您可以通过在之前的脚本中设置 VOX 来将其设为默认声音:

VOX=\(voice_us1_mbrola\)

能够听到不同的声音是一件好事,因为人们会根据情况对不同的声音做出不同的反应。心理学家告诉我们,女性的声音有利于传递信息、提供帮助和报告文本,而人类对男性声音发出的命令反应更好。在一个家庭中,你可能会用不同的声音向不同的人传达信息。如果听者知道自己的声音,他们就有可能(通过一种被称为鸡尾酒会效应的听觉怪癖)将自己的声音从许多其他辅助噪音中分离出来,包括其他口头命令。

默认的声音(通常是kal_diphoneked_diphone)很刺耳,作为早晨的最后一个闹钟也不错。然而,确保客人知道你正在使用它,因为被斯蒂芬·霍金和 Dalek 的混合体吵醒是相当令人不安的。

除了简单的短语,您还可以通过以下方式要求 Festival 为您朗读文件:

say default cat filename``

或者通过下面的,哪个更优雅:

festival --tts filename

虽然只直接支持文本文件,但有许多工具,如 html2txt(可以与pdftohtml结合使用),允许为您朗读大多数文档,可能作为您的闹钟呼叫的一部分,或者当您正在做饭而无法从屏幕上阅读时。

Note

试着让声音尽可能的短,将较长的短语分成单独的呼叫来庆祝,因为长的段落通常会导致声音变慢,变得难以理解。

也可以为节日打造自己的声音。虽然这个过程过于复杂,无法在这里讨论,但可以通过卡耐基梅隆大学的 FestVox 项目( http://festvox.org )了解细节。如果您想要自定声音,将声音录制为音频样本会更容易。

Note

自然,也有商业语音合成包可用,这是大多数开源爱好者所忘记的。一个这样的例子可从 http://cepstral.com .获得。该网站还提供动态的示例声音。

Espeak

节日不是镇上唯一的游戏。如果你不喜欢节日的声音,或者只是喜欢改变,那么 espeak 包可以提供一个替代的解决方案。像 Festival 一样,它能够用多种语言说话,并使用音素在文本和语音之间进行转换。然而,与它的大兄弟不同,它的尺寸要小得多(对树莓派很有帮助),并且只使用共振峰合成,这使得声音对许多人来说更像机器人。用法很简单:

espeak "This is my other voice"

(引用很重要)

以及:

espeak -f weather_report.txt

这些命令可以用其他选项来补充,这些选项提供对声音的音高和速度的基本控制。它也有各种语音文件来提供地方口音,但这些都是新奇和有用的,只提供音调的轻微变化,而不是更复杂的界面。

争吵

对于非常小的 Linux 系统,比如 Raspberry Pi,您可能会从 Flite 中获得更好的收益,因为它只包含一个可执行文件,没有数据文件。正如您所料,这是本文介绍的工具中最机器人化的,但它非常适合低功耗 ARM 处理器。使用模式遵循 espeak:

flite "My quotes are also necessary"

flite -f another_file.txt

它目前仅适用于英语。

零碎样品

大多数自动列车广播由单独的语音片段组成,然后由计算机重新排序。这使用相对较小的原始样本集提供了大范围的可能短语。通过对声音文件的仔细整理,它们听起来会非常人性化。这种方法的问题是不可能将迄今未知的短语引入词典。例如,如果你用一个人的声音作为闹钟,你会提前知道可能发出的每个短语和部分短语。在软件包错误报告的情况下,你可能不会,特别是当它涉及到文件名和用户输入时。在这些情况下,您可能必须承认样本不存在,并恢复到 Festival。

例如,要制作一个语音闹钟,你首先需要考虑你需要的样本。这可以是你准备记录的最大限度。许多国家都有自己的语音时钟服务,可以通过电话获得,每隔 10 秒钟报一次时间,许多国家会用每个特定的短语记录整个 24 小时的时钟。你还需要考虑你希望在语法上有多精确。“1 秒钟”这句话让你不爽吗?如果是这样,你需要一个特定的样本。你还需要考虑个人喜好,比如“过去 15 分钟”听起来是否比“过去一刻钟”好听,等等。

就我个人而言,我有一个我认为重要的标准时钟短语列表:

  • “时间到了”
  • “下午。”
  • “上午。”
  • 《午夜》
  • “点钟”
  • “过去一刻钟”
  • “过去一半”
  • “差一刻”

所有其他时间可以由以下短语组成:

  • "过去分钟数"
  • "分钟到"
  • “过去”
  • "收件人"

还有数字 1 到 20、30、40、50 和 60,后者是我那些书生气十足的极客朋友偶尔来访时闰秒所需要的!我还为以下内容添加了特定的示例,以保持语法正确:

  • " 1 分钟过去"
  • "还有 1 分钟"

然后,我可以用以下代码检索时间,并用代码将它们拼凑在一起:

HOURS=date +%I``

MINS=date +%M``

100 行的脚本留给您作为练习! 9

虽然编程相对简单,但记录处理却不简单。你需要让你的嗓音天赋录下整个短语的几个样本,以感受他们讲话中的节奏模式。然后,你应该对所有的单词 10 进行取样,并对单个短语进行修剪,以在开头不留死角,同时在结尾留下合适的间隙,以便在第二个单词直接连接到结尾时与说话者的节奏相匹配。让他们先说一些示例短语,让你对他们的语速有一个概念,这样在某些情况下,你可以要求他们在每一项之后留下比平时更长的停顿。记住这一点,让他们读一份比你实际需要的更长的清单。所以对于以 60 结尾的数字列表,问他们要 61。除非他们是有经验的演员,否则当读列表中的最后一个元素时,人们会自然地降低他们的声音,当它以另一个数字为后缀时,听起来不自然。

整个过程可能需要几个小时进行录制、重新录制和编辑。但是,为远方的伴侣准备一个个性化的闹钟或者作为一个古怪的 22 世纪的小玩意是值得的。如果你同时录下其他短语(如“早上好”、“晚安”或“哦,滚出我的房子!”),您可以在其他时间因其他原因触发样本。

在 Arduino 上

样本的回放在所有 Linux 机器上都很简单,包括 Raspberry Pi。但是即使这个看似简单的任务对 Arduino 来说也很难处理。这是可能的。但是它确实需要你做更多的工作,而且在所有情况下,一次只能管理一个文件。

软件解决方案

只需一个 Arduino 和一个扬声器,就可以播放录制的声音样本。鉴于 Arduino 的输出水平,它可以在没有放大器的情况下管理合理的音量——得分高于不起眼的 Pi!

为了实现这个小小的工程奇迹,你需要意识到它的局限性:

  • 最大回放频率为 8KHz,这意味着可以准确描绘的最高频率声音为 4KHz(这是奈奎斯特极限)
  • 标准存储器只允许 4 秒钟的采样数据
  • 您必须将样本预先格式化为合适的格式,因此不可能有动态样本(或实时更新)
  • 使用示例播放器时,直接控制 Arduinos PWM 占空比,以提供 8KHz 采样速率。这意味着不可能有其他模拟输出。

如果这些限制还不能阻止你,那么合适的代码和示例(原谅双关语)可以从 http://hlt.media.mit.edu/?p=1963 获得。

然而,对于如此短的样本存储器,你要么需要使用一个外部存储器屏蔽,要么利用它作为比上述更基本的时钟。或者把它当成一只虚拟的狗。

硬件解决方案

Raspberry Pi 的最大好处之一是芯片足够快,可以处理开箱即用的样本回放。毕竟,它是一台真正的计算机。然而,在微控制器是首选解决方案的情况下,总是可以添加一个“wave shield ”,以允许从连接的 SD 卡回放样本。这将处理最大带宽的声音,即 22 千赫的单声道 16 位波。

虽然 shield 的成本很高,但它比软件版本的得分高,因为它能够处理 16 位波形,并且在没有放大器电路的情况下工作,因为有一个放大器电路。此外,根据您可能拥有的音频量,内置的 SD 插槽比普通的 Arduino 提供更多空间。

Web 访问

到目前为止,20 世纪和 21 世纪最有影响力的交流方式是万维网。也被称为网络、互联网、互联网、互联网(作为一个整体)、互联网(作为一系列管道),HTTP 协议无处不在,以至于它现在出现在最低端的手持和移动设备上。这本身就使它非常有价值,因为您不必考虑其他协议的技术问题、操作它们的特定代码或为市场上的每个手持设备定制的应用程序。用它来控制我们的房子意味着你,真的,有了一个主页。

Web 就像你看到的所有东西一样,既可以使用客户端组件,也可以使用服务器组件。客户端通常被称为 web 浏览器,运行在世界上某个地方的任意机器上,而服务器处理来自 web 浏览器的请求,并位于家庭服务器上。这些请求通常针对静态 HTML 网页,但它们也可以是脚本——用几乎任何语言编写——以动态生成页面或在本地运行软件。服务器在一个用户如www-data下运行,这取决于分布,意味着任何本地处理将在该用户的管辖下完成,这可能需要一些软件将需要适当的许可来访问必要的设备。音频设备(用于语音和音乐播放)和串行端口(用于 X10 控制)通常都是如此。

当对 web 服务器产生一组需求时,您必须区分哪些处理是在客户端完成的,哪些是在服务器端完成的。例如,如果您认为从网页上播放 MP3 是一个好主意,那么了解您的目的是在工作时听您的音乐收藏,还是在家里(也许在聚会期间)组织一个播放列表是很重要的,在家里您可以听到服务器的音频输出,但不一定要实际访问它。

构建 Web 服务器

许多开源社区选择的 web 服务器是 Apache。目前是第 2 版,这个项目起源于 1992 年,被称为“拼凑的”web 服务器,因为它在早期的开发过程是临时的。它已经发展成为世界上最常用的软件之一,运行着互联网上大约 50%的网站。

Apache 的强大之处在于它对模块的灵活性。这允许高效且安全的内核能够利用可以随意加载和卸载的补充代码的功能。自然,每个模块都提供了另一个打开意外安全漏洞的机会,所以我们将只安装您需要的模块。对于这些主要目的,您只需要基本的服务器和脚本语言。Debian 软件包安装了以下内容:

apt-get install apache2 libapache2-mod-php5

其他发行版的名称类似。安装完成后,你可以将浏览器指向本地主机,在那里你会看到“祝贺”网页,默认存储在/var/www中,从而证明 web 服务器工作正常。然后,您可以通过创建一个名为test.php的页面来测试脚本模块,该页面包含以下内容:

<?php

echo phpInfo();

?>

通常,这些模块的安装也会正确地配置它们,以便.php文件与 PHP 模块的执行相关联。如果这不明显,您可以通过以下方式启用该模块:

a2enmod php5

万一这些方法不起作用,会在/var/log/apache2/error.log中保存一个日志。许多重要的流量依赖于一个工作的 web 服务器,所以值得花时间来确保它的稳定性。

虚拟站点

一台 web 服务器可以为多个站点提供网页服务,即使它们位于同一个 IP 地址。这从 HTTP 协议的 1.1 版本(所有主流浏览器都支持)开始就已经存在了,它在请求中包含了域名和 IP 地址。在家庭环境中,这很不常见,但它很有用,因为它允许你将传入的网络流量分成两部分,以转移好奇者的注意力。您可以有一个供朋友和家人访问的网站,其中包含一个包含您的狗和孩子的照片的博客,另一个供 HA 控制。

你可以从建立两个域开始,也许是通过 Dyndns.org,就像你在第四章看到的那样,然后创建两个不同的目录:

mkdir -p /var/www/sites/homepublic

mkdir -p /var/www/sites/homecontrol

然后创建两个配置文件,每个站点一个。遵循这里的惯例,在每个站点前面加上一个数字。这允许您将您的可公开访问的命名为000-public,这意味着它将在任何 web 配置问题的情况下首先提供服务,或者该站点仅通过一个 IP 地址访问。以这种方式返回到公共站点造成的损害更小,但是无法使用 HA 控制网站来纠正问题。然而,这种类型的大多数错误只能通过 SSH 来修复,所以它们不是问题。

这两个文件/etc/apache2/sites-available/000-default包含以下内容:

<VirtualHost *:80>

ServerName mypublicpresence.homelinux.org

ServerAdmin webmaster@localhost

DocumentRoot /var/www/sites/homepublic/

<Directory /var/www/sites/homepublic>

Options Indexes FollowSymLinks MultiViews

AllowOverride AuthConfig

Order allow,deny

allow from all

deny from none

</Directory>

</VirtualHost>

/etc/apache2/sites-available/001-control包含相同的东西,但是用homecontrol和替代ServerName代替了homepublic。然后手动启用它们,并使用以下三个选项重新启动 web 服务器,以 root 用户身份运行:

a2ensite 000-default

a2ensite 001-control

apache2ctl graceful

现在,您可以访问两个可以相应准备的虚拟站点,其中包含稍后您将发现的模块和软件。但是,即使有了这种基本的配置,您也可以通过在deny行添加空格分隔的点四边形,而不是短语none,明确拒绝用户使用已知的坏 IP 地址。或者,更好的做法是,您只允许来自那些您知道是安全的地址的邮件,例如使用相同格式的工作、学校或家庭。后者更复杂,因为家庭用户通常由他们的 ISP 分配一个动态 IP 地址,尤其是那些有拨号连接的亲戚。因此,您通常需要使用单独的用户名和密码来保护站点。

安全服务器

随着 Web 成为自然开放的协议,而家庭机器成为传统的安全环境,提供一种安全访问您的家庭及其数据的方法是必须的。您可以提供基本的授权,将名为.htaccess的特定文件放在每个目录中。这些由 web 服务器读取,以控制执行以下操作的访问:

  • 使添加和更改用户访问权限变得容易
  • 可以基于每个目录进行更改,而无需成为超级用户
  • 更改之间不需要重启

与直接更改配置文件相比,这种方法的一个缺点是每次访问时都会读取这些文件,从而使服务速度变慢。然而,在私有 web 服务器的情况下,这不太可能被注意到。更重要的是,尽管用户名和密码以加密的形式存在于磁盘上,但在连接时它们是以明文形式通过网络发送的。此外,它们被存储(并且可以被访问)为从该区域内部运行的任何脚本的纯文本。因此,建议只对从家庭网络外部无法访问的 web 服务器使用。

要启用基本身份验证,您需要两样东西:密码文件和访问文件。密码文件通常被称为.htpasswd,它存在于文件系统中一个 Apache(即www-data用户)可以访问的位置,但 Apache 服务的文件(而不是/var/www下面的文件)不能访问。您像这样创建文件和您的第一个用户:

htpasswd -c /etc/apache2/.htpasswd steev

然后,系统会提示您输入一个加密并添加到文件中的密码。此密码仅用于访问网站。如果他们共享一个名字,它不需要匹配用户的密码,事实上你可以允许没有 Linux 帐户的用户访问网站。

然后,您必须通过在其中包含一个.htaccess文件来指示要保护的目录,如下所示:

AuthType Basic

AuthUserFile "/etc/apache2/.htpasswd"

AuthName "Enter your username and password."

require valid-user

您通常会以这种方式保护整个目录,任何基于用户的控制都是通过如下代码实现的:

if ($_SERVER['PHP_AUTH_USER'] == "steev") {

// allow this

}

添加任何带有对.htaccess的更改的每文件控件,因此:

<Files private_file.php>

require valid-user

</Files>

但是,请注意,虽然您不需要重启 Apache 来使这些更改生效(因为您没有更改apache2.conf或它的合作伙伴),但是您需要确保以下内容出现在使用该身份验证系统的目录指令中:

AllowOverride AuthConfig

这是因为大多数示例将前面的行默认为下面的行,这不支持该功能:

AllowOverride None

您还可以通过向.htpasswd文件添加行来创建用户组:

FamilyGroup: mum dad sister

HouseOwnersGroup: mum dad

您可以将需求行.htaccess修改为:

Require group HouseOwnersGroup

当访问这些仅授权的网页时,您将看到一个对话框,要求您输入用户名和密码。这自然会使页面看起来更难添加书签。其实并不是!HTTP 规范允许这两者作为 URL 的一部分传递。

http://myusername:mypassword@myprivatesite.homelinux.org

虽然这是一个安全缺陷,但必须记住,授权凭证已经以纯文本形式传递,因此它不会打开任何新的漏洞;它只是降低了脚本小子的准入门槛。只要书签没有存储在任何可公开访问的机器上,你的情况不会更糟。

Note

请注意,一些媒体播放器在播放来自此类网站的音乐时会显示完整的 URL(包括登录凭证)。

一种大大改进的安全形式是通过安全套接字层(SSL)。这是两个站点(客户端和服务器)只有在通过交换证书建立了可靠的安全连接后才能进行通信的地方。例如,这些证书证明声称是minervahome.net的服务器确实是位于minervahome.net的服务器。可以说,这份真品证书是由一个你可以信任的更高权威人士签发的。而这种权威被更高的权威所验证,等等。在这个层级的顶端是像 VeriSign 这样的公司,它们的全部价值是基于这样一个事实,即它们永远不会与其他任何公司混淆。虽然家庭用户没有被明确排除在外,但获得这些信任证书需要花钱,而且通常是为企业保留的。但是,您总是可以通过生成一个您自己签名的证书来绕过这一要求。这并不提供完整的安全包,但它提供了对您的数据的安全访问,网络上的其他任何人都无法看到。

从技术层面来说,SSL 是 HTTP 协议的一个扩展,它可以确保用户名和密码不会被监控您家用机器流量的数据包嗅探器监控到。但是,因为安全握手发生在域名之前,所以只有一个虚拟站点可以使用 SSL。 12 在我们的例子中,这将是我们的私人住宅控制网站。

自签名身份验证证书在一定天数内有效,并在启动时应用于 web 服务器。要防止此证书被复制并在另一个 web 服务器上使用(从而消除其作为安全机制的目的),您必须在创建证书时以及在任何时候使用、转换或应用到 web 服务器时键入密码(更长形式的密码,至少应包含 20 个字符和几个单词,以避免基本的字典攻击)。越长的短语自然越好,但是如果你忘记了短语,你将不得不撤销那个证书并且发行一个新的。

SSL 自签名证书是用几个(相当不透明的)命令生成的。网上有许多例子以不同的详细程度详述了这些。为了我们的目的,你不关心为什么,只关心如何。因此,作为 root 用户,从以下内容开始:

cd /etc/apache2

mkdir ssl

cd ssl

并发出以下命令,按照要求填写提示:

openssl genrsa -des3 -out server.key 1024

openssl rsa -in server.key -out server.pem

openssl req -new -key server.key -out server.csr

openssl x509 -req -days 30 -in server.csr -signkey server.key -out server.crt

chmod 600 *

然后,您可以通过克隆现有的001-control版本并用以下内容包装它,将 SSL 主机添加到您的可用站点列表中:

<IfModule mod_ssl.c>

<VirtualHost _default_:443>

# Normal configuration data goes here...

SSLEngine on

SSLCertificateFile  server.pem

SSLCertificateKeyFile server.key

BrowserMatch ".*MSIE.*" \

nokeepalive ssl-unclean-shutdown \

downgrade-1.0 force-response-1.0

</VirtualHost>

</IfModule>

然后,您应该使用以下命令重新启动 web 服务器:

a2enmod ssl

a2ensite 002-control-ssl

apache2ctl graceful

如果一切顺利,你将被要求输入密码,该网站只有在使用 HTTPS 时才可用。

Note

设置和配置 SSL 的过程充满了出错的可能性,从密钥和证书之间的差异(通常是在输入位置和域信息时)到 SSL 协议被破坏,再到优先使用旧证书而不是新证书。因此,只有当您有时间并且能够很好地访问各种互联网留言板时,才使用 SSL!

为了确保您的用户始终使用网站的 SSL 版本,您可以通过将任何 HTTP 请求重写为 HTTPS 请求,在配置中引入一些简单的规则。这使用了著名的mod_rewrite模块,可以通过虚拟主机配置文件引入,如下所示:

<Directory /var/www/sites/homeprivate>

Options Indexes FollowSymLinks MultiViews

AllowOverride AuthConfig

Order allow,deny

allow from all

deny from none

RewriteEngine On

RewriteCond %{SERVER_PORT} 80

RewriteRule ^(.*)$https://myprivatesite.homelinux.org/$1

</Directory>

然后,您必须启用该模块并重新启动:

a2enmod rewrite

/etc/init.d/apache2 restart

作为一层额外的保护,利用“通过模糊实现安全性”的方法并不罕见。这意味着你让别人很难偶然发现你的服务器。例如,您可以将真正的主目录放在一个子目录中,这个子目录是从根目录开始的,没有指向它的链接。这将使用一个更隐晦的名字,而不是housecontrol,并作为第一层密码。由于您无法查询 web 服务器来确定哪些文件可供下载,因此只有在您知道该区域存在及其名称的情况下,才可以访问该区域。如果你选择一个随机的名字,比如bswalxwibs,你可以在物理安全机器上把它加入书签。

当然,这应该是标准安全方法的补充,而不是替代。如果你注册了一个像 MyMegaCoolAutomatedHouse.com 这样的域名,那么很有可能有人会发现它,并能够使用 Whois 目录获取你的真实地址 13 (除非你记得屏蔽它)。

控制机器

虽然 Apache 能够在 web 页面被请求时动态运行脚本,但是它们是作为运行 Apache 的用户来运行的。根据您的配置,这通常是www-datanobody用户。通过在您的 web 服务器上包含以下whoami.php脚本并将其加载到浏览器中来确认这一点:

<?php

system("whoami");

?>

仔细考虑这个用户。因为服务器(代表访问网页的用户)发出的所有系统调用都将作为www-data发生,所以对正在运行的代码有进一步的考虑:

  • 该用户对您的文件系统的访问权限可能比您预期的要多。人们不再需要 Linux 机器上的用户帐户来读取文件系统;如果软件或其配置存在安全问题,他们可以通过网页来解决。
  • 此外,权限也会有所不同,不仅是必要的配置文件,还有对设备(如 CD-ROM 或声卡)的访问权限。例如,如果您允许一个网页控制您的 CD-ROM,那么/dev/cdrom必须拥有授予www-data用户的读写权限。因为这有点特殊,所以更常见的是授予一个音频组读写权限,并将用户www-data添加到该组。请注意,每当对用户组进行这样的更改时,您都必须重新启动 Apache 服务器。对/dev/dsp的访问也是如此。
  • 用于确定命名可执行文件位置的路径将与您测试的普通用户的路径明显不同。这意味着您应该在发出的所有命令中显式使用该路径。
  • 环境变量也会不同。您可能需要通过以 Apache 用户身份登录(例如,rlogin www-data@localhost)并相应地设置环境来手动设置这些。您还可以使用这种方法,通过手动运行命令来确认您的权限设置是否正确。这也允许您创建任何可能需要的配置文件。
  • 最后,记住大多数系统命令都是阻塞的。也就是说,他们直到完成任务才回来。因此,当从 web 页面内部调用任务时,用户将处于一个空白的 web 页面(带有“等待”光标),直到页面完成。因此,该命令的任何输出或错误代码都不会显示在页面上。相反,您必须编写您的软件,以便:
  • 您的命令异步执行,使用shell_exec("cmd &")或类似的。
  • 您可以通过 Ajax 更新错误或输出状态。
  • 您可以通过异步命令调用后发出的辅助命令来检索错误状态。

这些都不是未解决的问题,但是对于那些想要编写自己的家庭自动化 web 应用程序的人来说,这是一个额外的复杂性层。

媒体访问

一个常见的功能是提供从家庭以外(例如从办公室)对您的音乐集合的访问。有几个 Apache 模块可以处理这个问题;其中一个就是mod_musicindex ( http://freshmeat.net/projects/musicindex/ ,在libapache2-mod-musicindex package中也有)。尽管它能够用于列出通用目录(就像它自己的在线文档一样),但它能够呈现特定于音乐的图标,让您在世界任何地方下载和/或流式播放音乐,并为当前文件夹及其下的所有子目录交互式创建播放列表。

要为您的音乐准备一个在线门户,首先在您的 web 目录中创建一个目录:

mkdir music

然后在里面创建一个.htaccess文件,授予你认为合适的用户权限。这些权限适用于该目录及其下的所有目录,除非被另一个.htaccess文件取代。因为您的音乐收藏可能存储在 web 根目录之外,所以您必须向它添加一个符号链接:

ln -s /net/media/mp3 mp3

这也强调了您在根目录中创建单独的媒体目录的原因——它消除了对污染我们的非 web 媒体文件层次结构的目录结构的 web 特定文件的需要。然后,您可以将适当的配置行添加到您的虚拟站点配置文件中,例如001-homecontrol:

<Directory /var/www/sites/homecontrol/media>

Options Indexes``FollowSymLinks

MusicIndex On +Stream +Download +Search -Rss -Tarball

MusicSortOrder filename album disc track artist title filetype filename

MusicFields title artist album length bitrate

MusicPageTitle Media Jukebox

MusicDefaultCss musicindex.css

</Directory>

然后以通常的方式重新加载 Apache 配置。这提供了一个功能强大但不够美观的页面,如图 5-2 所示。

A978-1-4302-5888-9_5_Fig2_HTML.jpg

图 5-2。

An example of music index and your music being available anywhere

在客户端播放是一件简单的事情,安装一个网络友好的媒体播放器,如 VLC。当你的浏览器第一次遇到未知类型时(比如mp3或者m3u,它会要求启动一个合适的应用。如果可能的话,您希望设置此功能,以便每首新歌都在媒体播放列表中排队,而不是启动单独的播放器实例。这就是所谓的入队。

一些浏览器(如 Firefox)通常提供有媒体插件,这些插件控制所有媒体并试图在浏览器中播放媒体。这通常是不可取的,因此通过使用“文件类型”菜单选项,您可以移除此关联并手动应用它。

一个范围类似的备选包是smb2www。顾名思义,这提供了从 Web 上对所有 Samba 相关共享的访问。这具有难以置信的灵活性的优点,并且消除了对你想要共享的每个文件夹的特定符号链接的需要,但是代价是向外部世界开放你的许多个人网络。虽然我已经安装了这个,但我在默认情况下保持关闭状态,只有在需要时才打开它(通过 SSH 会话进入),也就是说,当我需要访问不允许远程连接的 Windows 机器时。当您的服务器经常负载很重时,也就是说,当它被用作媒体服务器时,那么smb2www的好处是在更改其配置后不需要重启。编辑文件后,新配置立即可用:

vi /etc/smb2www/smb2www.conf

或者使用以下内容:

dpkg-reconfigure smb2www

短信

毫无疑问,双向无线通信的最低标准是短消息服务(SMS)或文本消息。该协议作为移动电话网络基础设施的一部分存在,使其对提供商来说是零成本,因此对消费者来说是低成本,许多网络提供免费文本消息作为其每月套餐交易的一部分。尽管移动互联网的兴起,短信仍然是一种广泛使用的通信协议,尤其是在年轻人中。要在家中使用 SMS,您可以使用两种方法之一发送和接收信息。第一种也是最显而易见的方法是用连接到电脑的辅助手机来执行所有的处理。还有第二种方法,电信公司向你提供一个伪手机号码,其功能与物理电话相同,只是你使用的是 API 而不是键盘。在某些情况下,这个 API 就像 SMTP 网关一样简单。在这两种情况下,都有命令行工具来处理电信数据,所以您选择的方法取决于财务偏好。

Note

一些硬件设备将在接收到移动电话呼叫时控制电力线(像 GSM 遥控开关;见 www.gsm-auto.com ),但它们的功能有限,而且往往比自家酿造的同类产品更贵。

用电话处理

这是试验短信控制家庭的最快方法,因为大多数人(至少)在家里有一部旧手机,或者从伴侣那里借来测试。即使没有现有的设备,简单的现收现付设备的成本也不是很大。您还需要一张有效的用户识别模块(SIM)卡和一根连接电脑的连接线。许多手机店(甚至超市)出售信用额度非常低的 SIM 卡,如果你没有自己的第二张卡,这是一个理想的起点。

大多数移动电话套餐有两种类型,在 HA 领域各有千秋。

  • 合同交易一开始很便宜,因为一部(新)手机的成本是有补贴的,但维护起来很昂贵。除非你把所有的电子邮件都转换成短信,否则你不太可能充分利用“终身免费短信”服务来使你每月支付的订阅费物有所值。
  • 现收现付交易提供了一个相对便宜的进入壁垒,因为大部分费用是预先支付的;运营成本几乎为零。如果你有一部剩余的手机,比如说,之前升级过的手机,情况就更是如此。个别消息的价格会更高(比免费!),但是因为大多数 HA 安装发送的消息非常少,所以这是一个值得的权衡。然而,如果你的软件出了问题,发出了太多的消息,你将很快耗尽你的信用,导致进一步的(可能更重要的)通信丢失。

Note

手机的质量或年龄并不重要,因为它将永远插在家里的电脑上,不太可能遭受日常生活的虐待。

手机的具体品牌将取决于所使用的软件。这里有几个开源项目,大多数支持诺基亚设备上的大多数功能,还有一些索尼爱立信手机。从软件的角度来看,我们的基本要求是,您应该能够向我们的手机发送和接收消息。访问电话地址簿是有用的,但不是必需的,因为这可以更好地用软件来表示。它也应该作为一个命令行工具。

Gnokii ( www.gnokii.org )曾经是这个领域的领先软件,这些年来它的技术已经衍生出了几个分叉。它的名字表明了这样一个事实,即大多数受支持的设备都是基于诺基亚的,尽管这些设备确实可以使用标准电缆。(参见 http://wiki.gnokii.org/index.php/Config 了解已知良好设备列表。)对于其他人来说,使用蓝牙驱动可能运气更好。

如果您有一部兼容的手机,设置包括一个简单的配置文件,如下所示:

[global]

port = /dev/ttyACM0

model = AT

connection = serial

其中端口可以在插入手机后通过dmesg来确定,尽管其他一些端口是根据手机的品牌和型号来选择的。(从 http://wiki.gnokii.org/index.php/Config 的网站确定此点)。)插入后,您可以发出以下命令来确定连接是否正常工作:

gnokii --identify

尽管手机可能能够与 Gnokii 通信,但可用的功能可能会有所不同。所以,在没有合适备份的情况下,不要对你的手机做关键性的改动(比如把数据写入通讯录)。 14

最容易测试和演示的功能是发送文本消息。这也是支持最广泛的。

echo "This is a test message" | gnokii --sendsms myphonenumber

不再涉及消息的接收,这取决于你想做什么。要简单地检索您的所有消息,您可以执行以下命令:

gnokii --getsms ME 1 end

这将把你手机内存中的每一条短信写到屏幕上,在屏幕上它也可以被重定向到一个文件中或者被解析。有一个内置的解析器,它会将文本信息格式化成电子邮件的格式,并将其附加到您的收件箱中。

gnokii --getsms ME 1 end -a /var/mail/steev

因为这是一个已发布的命令,所以使用接收到的消息来控制家庭设备需要一些工作,但这是可行的,因为您需要定期轮询电话。要实现这一点,首先需要对收件箱中的邮件进行计数。这不是直接可用的,因为该命令报告来自每个收件箱的所有邮件:

$ gnokii --showsmsfolderstatus

GNOKII Version 0.6.26

No. Name               Id #Msg

============================================

0 Internal memory         ME  92

1 SIM card             SM  0

然而,因为我们无论如何都要解析每条消息,所以这并不困难,也不要紧,您也可以下载您之前发出的相同消息。因此,您可以得到总消息数,如下所示:

#!/usr/bin/perl

my $status = gnokii --showsmsfolderstatus 2>/dev/null;

$status=∼/ME\s+(\d+)/;

my $count=$1;

在检索最后一个总数(保存在您决定使用的临时或日志文件中)后,您可以只调用新消息,然后相应地处理它们:

for(my $msg=$lastCount;$msg<=$count;++$msg) {

my $txt = gnokii --getsms ME $msg $msg 2>/dev/null;

if ($txt=∼/Inbox Message/) {

$txt=∼/Date\/time\:(.*?)\n.*?Sender\:(.*?)Msg.*?\n.*?Text\:\n(.*)/;

my $date = $1;

my $sender = $2;

my $message = $3;

# process here...

}

}

使用消息控制其他设备需要我们创建一个标准格式并坚持使用。短信的核心要素——事实上,任何信息的核心要素——都是从一个地址到另一个地址和信息。您可以使用 from 地址验证用户,并使用消息在本地计算机上执行命令。消息系统的案例研究在第七章中。

Note

可以将两部手机连接到一台机器上。这使得你可以使用一个发送日常日程或提醒的标准信息,另一个发送任何需要发送的紧急“房屋警报”信息。这样,即使第一个帐户的信用额度用完了,您仍然可以收到高优先级的邮件。

也可以通过使用--setlogo控制手机标志中使用的文本和/或图形,将手机用作显示设备。这可能会报告有关您的电子邮件、天气或 RSS 源的基本状态信息。

您还可以使用语音拨号功能拨打另一部电话,这样您就可以通过以下方式听到房子的声音(如高科技、遥控、婴儿监控器):

gnokii --dialvoice 12345678

要做到这一点,你需要让手机的麦克风可以接触到(也就是说,不要放在 Node0 里面的橱柜里),或者给手机连接一个外部麦克风。这可以扩展为个人“拨号上网”服务,将电脑的音频输出连接到手机的麦克风,你可以通过短信点播音乐,然后以语音呼叫的形式播放。然而,这并不实际,除非你有免费(或非常便宜)的语音通话。

手机短信的使用正在减少,因为新手机标配了宽带和可用的网络浏览器。web 界面比 SMS 消息拥有更多的控制和灵活性。但是给所有家庭成员都配备一部手机是一个昂贵的首次展示,而且如果你闪亮的新手机被大象坐在上面,你也没有退路!然而,结果是,更少的新手机可能具有 SMS 驱动程序,因为开发工作将被相对较少的人口所欣赏。这就是下一个解决方案出现的地方...

自定义编号和 API

在你的电脑上安装一部(或多部)手机并不是处理信息的最划算的方式。毕竟,所有的信息都被输入到手机中,由移动网络的计算机系统处理,然后转换回来显示在手机上。显而易见,一定有一种方法可以直接连接到这些计算机系统来发送和接收消息。

有!

一些公司,如 IntelliSoftware ( www.intellisoftware.co.uk )和 Txtlocal ( www.txtlocal.co.uk )提供短信网关服务,通过一个 API 提供对移动网络的访问,让你可以从任何可以上网的电脑上发送和接收信息。他们的成本结构是一个现收现付的电话,有安装费(通常为零)和每条信息的费用。这通常比现收现付手机便宜,因为你不需要定制号码(这是贵的一点!),而且它消除了您最初购买手机的成本。因为它是一项网络服务,你可以拥有尽可能多的不同服务(例如,高优先级和低优先级的消息),而不会耗尽 USB 端口。在忙忙碌碌的时候,仍然会有信用额度用完的问题,但是你通常可以提供一个信用卡号码,在这些情况下,它会自动补足你的余额(在我看来,这很危险!),或者您可以注册(通常免费试用)许多短信网关服务,以提供单独的通信渠道,提供内置冗余来减少故障转移。

发送消息

这是最容易实现的部分,因为提到的两个服务(我将把它作为一个例子)都提供了一个 API,该 API 接受一个基本的 HTTP 请求并将其转换为文本消息。例如,我对mxsms-intelli的代码如下:

#!/usr/bin/php

<?php

include 'IntelliSMS.php';

array_shift($argv);   // ignore program name

$type = array_shift($argv);

$toAddr = array_shift($argv);

$message = implode(" ", $argv);

$fromAddr = "MinervaHome";

$objIntelliSMS = new IntelliSMS();

$objIntelliSMS->Username = 'MyUserName';

$objIntelliSMS->Password = 'MyPassword';

$objIntelliSMS->MaxConCatMsgs = 1;

$result = $objIntelliSMS->SendMessage($toAddr, $message, $fromAddr);

?>

信不信由你,这就是所有必要的代码!您可以通过以下方式可疑地调用它:

mxsms-intelli sms 012345678 This stuff really works

虽然文本消息可以扩展到几个包,但我将这里的最大值限制为 1,以防失控应用程序输出过多。自然,巧妙的格式化隐藏在库中,类似于 Txtlocal 版本中的使用,如下所示:

#!/usr/bin/php

<?php

array_shift($argv);   // ignore program name

$type = array_shift($argv);

$toAddr = array_shift($argv);

$message = implode(" ", $argv);

$fromAddr = "MinervaHome";

# Things get different now...

$uname = ' MyUserName';

$pword = 'MyPassword';

$message = urlencode($message);

$data = "uname=".$uname."&pword=".$pword."&message=".$message."&from=". $fromAddr."&selectednums=".$toAddr."&info=1&test=0";

$ch = curl_init('http://www.txtlocal.com/sendsmspost.php

curl_setopt($ch, CURLOPT_POST, true);

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);

curl_close($ch);

?>

每段代码的序言都是有意相同的。这使您可以根据您是否有信用或发送高优先级或低优先级的消息,交替使用这两种服务,也许是在循环的基础上。通过编写两个不同名称的脚本,您可以通过发出以下命令在它们之间手动切换,或者使用一个名为mxsms的单独脚本来确定使用哪种传输:

ln -s mxsms-intelli mxsms

我已经将一个$type参数传递到这段代码中,例如,SMS 可以变成sms-high,如前所述。这也可以用来更改$fromAddr,当您收到信息时,它会出现在您的手机上。它限于 11 个字符,但由于它是可定制的,它可以成为您的信息的一部分,可能表示以下内容:

  • 消息的优先级
  • 使用的服务提供商
  • 剩余的点数
  • 消息的前 11 个字母

每个提供者都有稍微不同的 API,具有不同的功能,但是就最终结果而言,它们都可以以相同的方式使用。

SMS 的一些应用包括向你的手机发送每日天气预报、新闻提要或彩票结果——或者报告其他住户何时到达或离开去工作(这样你可以打电话鼓励他们)。

Note

消费者可以使用的 SMS 协议并不保证消息会到达或会迅速到达。大多数人会,但也有可能(正如我们大多数人亲身经历的那样)它们会延迟几个小时,甚至几天,有时它们根本不会出现。因此,你应该没有什么重要的东西——比如生命维持机——依赖于这些信息。

您可能还想发送另外两种类型的消息,WAP 和二进制。WAP 消息是包含一段文本和一个 URL 的单信用 SMS 消息,可以使用电话本身打开(这可能会在该设备上产生费用)。这可用于更复杂的统计信息,其中执行摘要在文本中,URL 链接到同时上传到您的 WAP 服务器的预建图表。

二进制消息有 140 个字节,但是由于它的大小,仅限于发送小徽标(也可以表示服务器性能图!)或者铃声。

通过大多数(如果不是全部的话)SMS 网关 API 向一组用户发送多条消息是可能的,但是它们的管理通常是通过 Web。因为您有一个完全授权的 Linux 机器来控制您的环境,您也可以将地址存储在您的机器上,并以这种方式发送多条消息。费用一样,时差一般可以忽略不计。我将在第七章的中扩展mxsms脚本。

接收消息

这并不比发送信息更难,但它确实需要一些额外的步骤——而且,如果你想要自己的定制号码,成本会更高。在这两种情况下,SMS 网关公司代表您接收一条消息,然后通过另一种普遍认可的协议将它传递给您,以便您可以用它做一些特定的事情。根据公司、服务级别和 API,您可以执行以下操作:

  • 将短信作为电子邮件转发
  • 请求一个以发件人和消息为参数的网页
  • 发送自动回复
  • 转移到另一个(手机)号码

这里感兴趣的两个是电子邮件和网页处理程序。无论是哪种情况,SMS 基于文本的格式意味着解析器通常很容易编写。

用手机发送信息有几种方式。最便宜的方法是与其他用户共享一个号码。在这种情况下,您将向短信网关提供的号码发送一条包含您的用户名的消息。然后,网关用目标机器查找给定用户,并发出请求。该消息的格式可能如下:

username+your message here

或者如下:

username your message here

或者甚至如下:

null your message here

在后一种情况下(如 Txtlocal 所采用的),网关会查找您发送请求的电话号码,并在传递消息之前将其与您的帐户信息联系起来。该用户名(或 null)是否包含在消息中也取决于网关。

Tip

选择一个短用户名,如果可能的话,以节省短信字符!如果您在草稿文件夹中保存一个版本,并且每次都将它复制出来,就可以避免重复编写用户名。

或者,您可以购买特定的号码供我们自己使用。在这种情况下,您不必再在消息中包含用户名。这条路线通常会产生安装费。对于那些更有钱的人来说,你可以买一个特殊的短码(4 到 6 位数),它是长码的别名。然而,这些通常用于商业,并相应地定价。它们可能更容易记住,但只有当你的手机没电了,导致你的地址簿无法访问时,你才真正需要它们。在这种情况下,携带号码的书面副本更便宜!

因此,一旦消息到达,您必须处理它。对于电子邮件,您可以像前面看到的那样使用 Procmail,通过一个简单的正则表达式将以下内容处理成有用的东西:

##You have a new message from 012345678 saying Null This is my test.

注意,单词Null是免费协议和特定提供者的症状,如前所述。

网页请求是更简单的方法,因为 SMS 网关调用包含所有必要参数的预定 URL。每个公司都有不同的格式,所以创建一个名为echo.php的脚本用于测试是个好主意。

<?php

$rt.= "Get:\n";

$rt.= print_r($_GET, TRUE);

$rt.= "Post:\n";

$rt.= print_r($_POST, TRUE);

file_put_contents( '/tmp/log.txt', $rt, FILE_APPEND );

?>

因为 SMS 网关忽略它所请求的网页的所有输出,所以您永远看不到这些数据,这就是为什么您将其输出重定向到日志文件中的原因。您可以使用以下内容对此文件进行滚动更新:

tail -f /tmp/log.txt

然后发送一条文本消息,并让它重定向到echo.php,您将确切地看到提供了哪些参数。使用前面的示例,IntelliSoftware 提供了以下内容:

Get:

Array

(

)

Post:

Array

(

[from] => 012345678

[text] => This is my last test tonight

[msgid] => 50011005000001624552

[type] => 1

)

Txtlocal 给出了这个:

Get:

Array

(

)

Post:

Array

(

[sender] => 012345678

[content] => Null Wow this might work, you know!

[inNumber] => 447786202240

[submit] => Submit

[network] => UNKNOWN

[email] => none

[keyword] => NULL

[comments] => Wow this might work, you know!

)

两者都包含足够的信息,让你用一条短信就能打开灯。代码如下所示:

if ($_POST['from'] == "012345678") {

if ($_POST['text'] == "bedroom on") {

system("/usr/local/bin/heyu turn bedroom_light on");

} else if ($_POST['text'] == "bedroom off") {

system("/usr/local/bin/heyu turn bedroom_light off");

}

}

为了避免发送复杂的文本消息(也许还能省钱),您可以用一个简单的网页来测试这个脚本的未来排列。使用更简单的格式,您可以编写如下代码:

<form action="echo.php" method="POST">

<input name="from" value="phone num">

<input name="text" value="your message here">

<input name="msgid" value="" type="hidden">

<input name="type" value="1" type="hidden">

<input type="submit" value="Send Fake SMS">

</form>

因为这是在一个开放的 web 服务器上,所以存在一些安全问题。您可以通过在服务器上用一段代码验证电话号码来消除这种情况(不要在客户端验证凭证)。您可以通过将简单命名的echo.php脚本更改为iuytvaevew.php来进一步限制另一个问题(虽然不能消除它),通过模糊使用安全性,使它不会被意外发现。一些提供商将使用 HTTPS 调用您的网页,这是最好的解决方案,值得花费额外的时间为他们设置特定的用户名和密码。

您可以通过允许多部电话访问房屋、创建一个手机号码白名单以及显式添加到该列表来重新平衡安全性和可访问性的概念。或者,你可以禁止任何来自一个不被认可的 IP 地址访问你的页面。如果您可能通过 SMS 进行大量通信,您可以自动将新的电话号码添加到预批准设备的待定列表中,该列表反过来会向 SMS 管理员发送通知消息,管理员可以发出特殊命令将这些电话号码添加到列表中。

如果您的设施允许,在紧急情况下,当您没有互联网连接,并且您希望得到路由器正在进行自动电源循环的通知时,通过 Gnokii 连接一部物理移动电话可能会很有用(可能带有 AW12,如第一章中所述)。

结论

由于有如此多的进出系统的方式,您必须从一个坚实的框架开始。我的方法是将输入系统与处理分离,允许任何输入机制(移动电话、电子邮件或 web 界面)以已知的通用格式生成一个命令,该命令可以由一个脚本处理。同样,所有消息都被发送到一个脚本,然后该脚本将消息格式化为适合给定通信通道的特定格式。您还可以添加一个在收到任何或所有这些消息时的自动流程。因此,一旦你有了控制视频、灯开关或闹钟的代码,你就可以以任何顺序处理它们,或者通过电子邮件发送视频,或者通过短信发送灯开关,或者对着闹钟说话,或者进行上述操作的任意组合。

Footnotes 1

行进立方体算法代表了从体素空间提取多边形网格的方法,并且是 1987 年 SIGGRAPH 会议的特征。

2

真正意义上的“永远在线”宽带,与它的实际传输速度无关。然而,iPhone 用户可以启用网络共享,并在家中使用移动宽带共享坞站来利用他们的本地 WiFi 路由器。

3

如果你有几台机器,Nagios 之类的软件可以自动监控服务和应用程序,在出现故障时发送消息和更新网页。

4

为了客观起见,我也承认maildropdovecat存在并执行相似的任务。

5

显然,要将它与您将要用来测试的电子邮件地址相适应。

6

虽然我可以在主脚本中从头部解析它,但我是通过演示的方式来做的。

7

您还可以设置一个虚拟主机,只响应您的 intranet 上的机器,这样任何来自外部的请求都无法访问该文件。

8

如果你想复制粘贴,可以在 http://ubuntuforums.org/showthread.php?t=751169 查看详细内容。

9

声乐时间脚本在 Minerva 包中作为vtime提供。

10

在我看来,Audacity 仍然是 Linux 中音频采样和编辑的事实标准。

11

请给/dev/null发一封电子邮件!

12

互联网上有详细的相反的解决方案,但它们太复杂,无法在此讨论。

13

小偷使用类似的想法,在他们忙着向警方报告他们最近被盗的汽车时,按下satnav s 上的 home 按钮,开车到受害者的家。

14

Gnokii 能够用gnokii --getphonebook ME 1 end --vcard >myphonebook.vcf为你提供这种备份。

六、数据来源:智能家居

Abstract

虽然能够给你的电灯开关发电子邮件非常有趣,而且比编写另一个版本的“你好,世界”要酷得多,但它永远不会给人一种自动化房屋的感觉。毕竟,你作为一个人类正在控制它。通过向你的房子提供真实世界的信息,它就能自己做决定。这就是自动化家居和智能家居的区别。

虽然能够给你的电灯开关发电子邮件非常有趣,而且比编写另一个版本的“你好,世界”要酷得多,但它永远不会给人一种自动化房屋的感觉。毕竟,你作为一个人类正在控制它。通过向你的房子提供真实世界的信息,它就能自己做决定。这就是自动化家居和智能家居的区别。

为什么数据很重要

多年来,“内容为王”这句口头禅一直在各个技术领域重复。虽然到目前为止,您的家庭自动化环境中的大部分数据都是从您自己的私人生活模式中生成的,但仍有一小部分(但意义重大)数据是您没有生成的,例如电视时间表。我现在将介绍这些数据,看看有什么可用的,以及如何(合法地)利用它们。

法律上的义务

所有数据都受版权保护。无论是过去 20 年的降雨量表还是今晚的电视节目表,任何由人类编辑的信息都享有版权。例外的情况是,数据是由计算机程序生成的,在这种情况下,源数据的版权归创建它的个人所有,而编译版本的版权归帮助计算机生成它的人所有,通常是为机器付款的人。不幸的是,所有有用的数据都属于第一类。即使当数据公开时,例如在网站上,或者当它看起来是不言而喻的(例如前十名音乐单曲),数据仍然有版权,这要求您拥有使用它的许可。根据管辖范围的不同,版权将在最后一位在世作者去世后 50 年或 75 年失效。然而,随着新法律的出台,如《桑尼·波诺著作权保护期延长法》,即使是这么长的时间也可能会延长。在这个领域中,数据在变得可用之前就变得无用,这很不幸。

幸运的是,大多数国家都有供私人使用和研究的规定,允许您处理这些数据供个人使用。不幸的是,这不包括将数据重新分发给其他人或将数据转换成另一种格式。从纯粹的技术和法律角度来看,这意味着您不能执行以下操作:

  • 将这些数据提供给你家中的其他人。他们必须自己下载。这包括复制主页上的信息或将电视或无线电信号分发给其他机器。
  • 改进数据格式,并将其提供给技术上无法做到这一点的其他人。这包括解析来自一个网站的数据,以便在家中以更紧凑的格式显示。

在某些领域,是否允许你提供工具来改进或改变现有(受版权保护的)数据的格式,甚至存在合法性问题。幸运的是,大多数公司对这一领域视而不见,就像他们对你家庭成员的内部数据分配一样——即使你知道,他们也不会知道,或者能够证明。

更大的问题与数据的改进有关,因为大多数数据要么太原始,要么太复杂,没有用。让我们以一个包含天气预报的网站为例;原始数据可能只包含字符串“rain,25”,需要将其解析为一个漂亮的图标和一个温度条,以便于用户使用。一个复杂的报表可以在原始站点上包含一组友好的图形,但是如果其他人试图通过深层链接从另一个站点加载报表,或者试图引用用于构建图像的源表数据,则原始数据集对他们来说是不可用的。

屏幕抓取

这是一个通过命令行工具(如wgetcURL)下载网页的过程,然后由 HTML 解析器处理,以便从中读取和提取单个元素。这是法律上最可疑也是最麻烦的处理信息的方法。

这是最可疑的,因为你从一个网站下载版权内容的方式违反了该网站的条款和条件——以至于直到最近,一个著名的气象网站还将其图片标记为please_dont_scrape_this_use_the_api.gif

抓取很麻烦,因为很难准确解析网页的内容。在技术层面上解析页面非常容易,因为这种语言是基于计算机的,而且解析器已经存在。对于用户来说,解析呈现的页面中的数据也是非常容易的,因为人眼会自然地找出它想要的信息。但是知道信息在屏幕的左上角对机器来说是一件很难评估的事情。相反,大多数铲运机将根据阻塞原理工作。这是已知信息存在于特定块中的地方,由程序员预先确定,解析器盲目地从该块中复制数据。例如,它将转到网页,找到第三个表,在第五列和第二行中查找,并从第一个段落标记中读取数据。确定这一点很耗时,但很容易解析。这很麻烦,因为 HTML 格式本身的任何损坏(无论是开发人员有意引入的,还是由于广告 2 的变化而意外引入的)都需要修改或重写脚本。

由于潜在的屏幕抓取者可以使用的不同语言和库的数量,以及您想要将数据转换成的无限多的(尚未确定的)格式,所以实际上没有一个已知网站的数据库具有匹配的抓取代码。编制这样一个数据库将是一项艰巨的任务。然而,如果你不能编写合适的抓取代码,最好是去寻找当地的团体或基于相关网站的社区,比如电视粉丝页面。任何家庭通常都有大量的数据源,如果您单独尝试,为每个数据源维护刮刀将会非常耗时。

刮擦的机制最好用一个例子来解释。在这种情况下,我将使用 Perl 以及WWW::MechanizeHTML::TokeParser模块。首先,以任何适合您的发行版的方式安装它们。我个人使用 CPAN 模块,它通常在调用cpan命令时自动配置自己。可以通过添加到 URL 列表来添加其他镜像,如下所示:

o conf urllist push``ftp://ftp-mirror.internap.com/pub/CPAN/

o conf commit

接下来是模块本身的安装:

perl -MCPAN -e 'install WWW::Mechanize'

perl -MCPAN -e 'install HTML::TokeParser'

为了避免我主张抓取一个诉讼公司的页面,我将提供一个例子,使用我自己的 Minerva 站点从 http://www.minervahome.net/news.htm 的新闻页面中检索最新的故事。

首先在 web 浏览器中加载页面,感受一下页面布局,看看目标信息在哪里。此外,查看其他页面,看看是否有任何可以利用的共性。您可以通过查看源代码(查看整个页面或使用“查看源代码选择”选项)或借助 Firebug 3 来突出显示表和表中的子组件。

然后寻找任何“低垂的果实”这些是问题中容易解决的部分,所以您可能会在专门命名的div元素中找到所需的文本,或者在具有特定id属性的表中找到所需的文本。许多专业设计的网站这样做是为了让重新设计更快,并在不知不觉中帮助了刮刀。

如果文本周围没有明显的特征,就去寻找它周围的元素...以及周围的元素。向外工作,直到你找到足够独特的感兴趣的东西,或者到达根html节点。如果您没有发现任何独特之处,那么您必须用代码描述数据,例如“在第三个表的第一行第二列中”

一旦你能够用人类的语言描述数据的位置,你就可以开始写代码了!这个过程包括一个能够加载网页和遍历链接的机械化代理和一个跳过 HTML 标签的流处理器。您从一个相当常见的装载块开始刮削,如下所示:

#!/usr/bin/perl -w

use strict;

use WWW::Mechanize;

use HTML::TokeParser;

my $agent = WWW::Mechanize->new();

$agent->get("http://www.minervahome.net/news.htm

my $stream = HTML::TokeParser->new(\$agent->{content});

给定$stream,您现在可以跳到第四个表,例如,通过使用下面的代码跳过四个开始的table标签:

foreach(1..4) {

$stream->get_tag("table");

}

注意,get_tag将流点定位在给定的开始标签之后,在本例中是table。因此,流点现在在第四个表中。因为我们的数据在第一行,你不需要担心跳过tr标签,所以你可以直接跳到第二列:

$stream->get_tag("td");

$stream->get_tag("td");

因为跳过td标签将自动跳过前面的tr。该流现在被精确地定位在您想要的位置。该块的 HTML 结构如下:

<a href="url">Main title</a></td>

<td valign="top">

Main story text

到目前为止,我一直使用get_tag来跳过元素,但是它也有一个返回值,包含标签的内容。因此,您可以使用下面的代码从锚点中检索信息,根据其本质,可以返回多个标记:

my @link = $stream->get_tag("a");

因为您知道在这个特定的 HTML 中只有一个,所以感兴趣的是$link[0]。这是另一个数组,包含以下内容:

$link[0][0] # tag

$link[0][1] # attributes

$link[0][2] # attribute sequence

$link[0][3] # text

因此,您可以使用以下内容提取链接信息:

my $href = $link[0][1]{href};

因为get_tag只检索关于标签的信息,所以您必须返回到流中提取这个<a></a>之间的所有数据:

my $storyHeadline = $stream->get_trimmed_text("/a");

从这里,您可以看到您需要跳过下一个开始td标签,并在它和下一个结束td标签之间获取故事文本:

$stream->get_tag("td");

print $stream->get_trimmed_text("/td");

因为你只是从页面上获取第一个故事,所以你的抓取工作已经完成。例如,如果您想获得前两个故事,在再次重复解析循环之前,您需要正确地跳过该表或行的其余部分。

自然,如果这个网页以任何方式改变,代码就不能工作了!

当使用 Javascript 控制网页内容或布局时,这种公认的简单方法可能会失败。最常见的情况是,当页面使用 AJAX 调用进行分页时会出现这种情况。在这种情况下,next 按钮从服务器动态加载一些数据(用 Javascript)并重写适当的<div>元素的内容。您不太可能遇到这种带有有益于家庭自动化解决方案的数据源的页面,因为这里给出的示例都没有这样做。然而,如果你真的发现了一个(例如,超市经常这么做),那么你需要升级到一个无头浏览器解决方案,比如CasperPhantomJS,它允许你以编程方式点击页面上的按钮并调用这些 AJAX 请求。另一项旨在简化这一过程的新技术是“复制为卷曲”,在 https://twitter.com/ChromiumDev/status/317183238026186752 有所介绍。

幸运的是,web 开发人员和屏幕抓取人员之间的这场猫捉老鼠的游戏通常会有一个愉快的结局。为了我们!厌倦了每周重新设计他们的网站,并试图与 Web 2.0 和 Web 上的 mashup 社区连接,许多公司都提供 API 来访问他们的数据。而且,像大多数好的 API 一样,它们在不同版本之间保持稳定。

通过 API 的数据

API 是程序员与底层操作系统交互的方式。在 web 世界中,API 控制着脚本如何在 web 服务器上检索(有时改变)数据。这些可分为几大类:

  • 基本文件访问:这些文件通过网络服务器分发,文件名根据一些预先确定的规则格式化。例如,要获得三天后 BBC1 的英国电视节目表,您可以使用 URL http://www.bleb.org/tv/data/listings/3/bbc1.xml 。从最真实的意义上来说,这些不是 API,而是 REST 请求。然而,与静态文件不同的是,根据请求的时间或位置,相同的请求会产生不同的数据。
  • 公共查询:它们可以以多种形式存在,包括基本的文件请求,但它们通常基于简单对象访问协议(SOAP)对象或 HTTP 上的 XML。这允许使用强类型参数将函数调用发送到服务器,并使用 XML 或 JSON 返回类似的复杂回复。
  • 私有查询:这需要软件开发者注册一个开发者 API 密匙。这些,像 Amazon 的那些,被嵌入到您的代码中,以便服务器 API 可以验证用户并监控您的使用模式,从而消除大多数 DoS 攻击。

这些实现没有一致的法律术语。仅仅因为一个网站使用可公开访问的文件并不意味着你可以重新分发他们的数据。同样,您必须检查他们的服务条款(TOS),这些条款并不总是明显地显示出来。

在私人查询的情况下,TOS 将提前显示,并且您需要同意这些条款,然后才能分配给您一个密钥。这些条款通常会将您限制在每天或特定时间范围内的特定访问次数。通常这些限额可以随着货币的兑换而增加。

如果您正在寻找可以进行实验的 API,那么一个好的起点是 http://www.programmableweb.com/apis

分配

除非另有明确说明,否则您生成的任何数据都被视为原始版权版本的衍生作品。我只是演示了获取这些数据的方法(并且只供个人使用)。毕竟,在大多数情况下,版权所有者已经允许数据在有争议的网站上使用,但除此之外不得再分发。法律条文包括你家内部的再分配,但在大多数情况下(家庭服务器是私人的,对外界不可用),这成为一个争论点。

公开日期

在这一节中,我将介绍公众可以获得的数据。然而,它不一定在公共领域中可用,因此您仍然必须遵守前面提到的所有合法性规则。在每一节中,我将介绍一些对您的智能家居有用的示例数据,研究如何访问和处理这些数据,并讨论如何在家中私下合并公共数据。

电视指南

这么多国家有这么多电视台,为世界上所有的电视频道(更不用说它们的节目了)建立一个通用数据存储是一项巨大的任务。在英国,你要感谢 Andrew Flegg 处理英格兰、苏格兰、威尔士和北爱尔兰的所有数字、模拟和主要卫星站。

这个网站上提供的数据来自广播公司自己的网站,以及传统的数据,所以它是准确和及时的。这也是合法的,因为网站已经被允许收录。

Note

奇怪的是,英国互动电视公司的数据并不可用。这包括 ITV、ITV2、ITV3 和 ITV4。这是因为 ITV 不希望它的数据在其他网站上共享,尽管它不反对在自己的网站上使用其他电视时间表数据!这可能是因为其业务的纯商业方面。然而,在 ITV 改变规则(或者请愿书生效)之前,没有一个遵循这些指示的极客能够确定 ITV 上有什么,这反过来会限制 ITV 的广告收入,导致他们搬起石头砸自己的脚!

数据本身在网站上以网页的形式提供,或者以 XML 文件的形式提供,可以下载到你的电脑上,在你空闲的时候进行处理。每个 XML 文件的 URL 都遵循严格的格式,这样您就可以自动完成这个过程。

根 URL 是 http://www.bleb.org/tv/data/listings ,后面是:

  • 日偏移量,在-1(昨天)和 6(下周)之间
  • 站名

因此,你可以在这里找到今天的 BBC1 时间表:

http://www.bleb.org/tv/data/listings/0/bbc1.xml

明天的 TMF 指南在这里:

http://www.bleb.org/tv/data/listings/1/tmf.xml

格式是 XMLTV,很容易用合适的库甚至 XSLT 来解析。有了这种本地可用格式的数据,您就可以搜索由您最喜爱的演员主演的电影的描述,获得新系列的提醒,或者检查出现在您通常范围之外的脱口秀或节目中的音乐家。这些结果可以通过管道传输到任何文件,如网页或电子邮件,以供审查。

尽管它是免费的,但是 Bleb 本身也有一些限制,但是唯一的要求是不要通过在请求之间包含两秒钟的间隔来重复向服务器请求数据,并且在电子邮件中包含发出这些请求的程序名。

Minerva 提供了一个这样的例子;我在第七章中介绍了这一点。还有许多其他示例,如 Windows 的可执行文件、Flash 代码和 WhensItOn 代码,可在此处找到:

http://ccgi.useyourhead.force9.co.uk/

这将按字母顺序排列整周的电视时间表,以便您可以看到节目的播放时间和重播时间。

火车时刻

就像电视时刻表一样,获取世界上所有列车的完整时刻表是一项费力不讨好且不可能完成的任务。但幸运的是,像电视一样,感兴趣的铁路旅行通常基于一个国家,所以您只需要为您的地区找到一个合适的数据源。

任何搜索引擎都会为这些信息返回几个不同的数据源,这取决于您所在的国家,因此您需要花一点时间来查看每个数据源,以确定哪些具有 API(可用的),或者如果没有,哪些可以用最少的努力获得。大多数经常乘坐火车的人都有一个常规,他们知道时间表,所以最感兴趣的网站是那些报道实时信息的网站,包括晚点的火车和取消的火车。

在英国,最重要的网站是实时发车板( www.nationalrail.co.uk/times_fares/ldb/ ),它提供关于英国网络上大多数列车的相当准确的信息。不幸的是,它不包括 API,但它很容易为当前的火车时间收集信息,并且还附带了一个 Twitter feed,详细介绍了车站关闭和工程工作的超限情况。它还有一个优点是使用一个基本的GET请求来检索两个指定车站之间所有列车的时间,这使得书签更容易。我偶尔会在圣潘克拉斯和卢顿机场之间旅行。在查看该网站时,我可以看到 URL 在表单中包含了这两个位置:

http://ojp.nationalrail.co.uk/service/timesandfares/STP/LTN/today/0630/dep

所以,这可以用我们之前看到的同样的方法刮出来。然而,对该网站源代码的研究显示,有一个 AJAX 请求填充了该页面:

http://ojp.nationalrail.co.uk/en/s/ldb/liveTrainsJson

该页面可以通过修改参数(?liveTrainsFrom=STP&liveTrainsTo=LTN)来控制,并且可以合并到whattrain.php的代码 4 中,如下所示:

$url = "http://ojp.nationalrail.co.uk/en/s/ldb/liveTrainsJson

departing=true&liveTrainsFrom=$fromCode&liveTrainsTo=$toCode&serviceId=";

$contents = getContents($url, "ldb_${fromCode}_${toCode}", 5*60);

作为一个简单的请求,它只使用 GET,因此可以简单地通过 cURL 访问,或者直接在浏览器中访问,这有助于简单和直接的测试。您还可以将输出保存到一个临时的本地文件中,以便进行离线测试。URL 的结果输出提供了一个 JSON 对象,其中包含接下来要出发的几趟列车。然而,没有今天午夜之前的历史数据。

还值得注意的是,这里的 getContents 方法涉及一个临时文件,如果在上一个查询的五分钟内进行了后续查询,它可以避免再次下载数据。这可能需要根据您的需求进行更改。从这里开始,我们只需要解码 JSON:

$trainTimes = json_decode($contents);

$trains = $trainTimes->{'trains'};

这反过来允许您读取每个列车的信息:

foreach($trains as $entry) {

$expectedTime = $entry[1];

$destination = $entry[2];

$status = $entry[3];

$platform = $entry[4];

$arrivalTime = $expectedTime;

if (preg_match('/((\d+):0?(\d+))/', $status, $matches)) {

$expectedTime = $matches[0];

}

这个网站之所以被使用,部分原因是因为它提供了足够的信息,可以在赶火车时自动做出价值判断。例如,知道从工作地点到圣潘克拉斯需要 35 分钟,您可以排除在该窗口离开的任何列车。此外,通过添加宽限期,您可以将输出限制为在您到达车站后十分钟内离开的列车:

my $graceMinutes = $minutesAway - $timeToStation;

if ($graceMinutes >= $graceThreshold && $graceMinutes < $maxGracePeriod) {

print "Get the $expectedTime to $destination from platform $platform.";

print "There is $graceMinutes minutes grace.\n";

}

这个代码自然可以扩展为交换源位置和目的地位置,以便可以类似地考虑回程。例如,这可以通过观察一天中的时间来实现。

Tip

在单独的行上输出每段数据,使其他工具更容易提取信息。或者使用低级的结构化格式,比如 JSON,它有针对大多数语言的处理模块。

你现在有办法知道下一趟火车是哪趟了。这可以整合到每日新闻中,在做早餐时由语音合成器背诵,添加到个人聚合页面,或用于控制闹钟。(这种方法将在后面讨论。)

公路交通

随着全世界和他的狗都爱上了卫星导航系统,基于网络的交通报告的作用近年来变得不那么有用了。随着成本逐年下降,它不太可能很快复苏。然而,如果你只能选择一个小工具——卫星导航或有网络功能的掌上电脑——后者仍然可以通过一个实时交通网站胜出。

英国有像 Frixo ( www.frixo.com )这样的网站,报告所有主要道路的交通速度,并集成谷歌地图,这样你就可以看到各种热点。他们似乎也想到了 HA 市场,因为大部分数据都很容易获取,每个高速公路交叉口之间的道路速度、道路施工位置和旅游新闻都有清晰的标签。

天气

获取天气数据有三个来源:网上供应商、个人气象站或向窗外看!在接下来的部分中,我将只考虑前两个。

预测

虽然网上似乎有许多在线天气预报,但大多数来自天气频道自己的 Weather.com 。这个网站提供了一个网络插件( www.weather.com/services/downloads )、移动应用程序和一个本地桌面应用程序(仅限 Windows,唉)来访问其数据,但目前没有什么比 API 更开放的了。幸运的是,许多购买了这些数据的许可证的公司为他们网站的访问者提供了对这些数据的访问,并且限制较少。雅虎!例如,天气有 XML 格式的数据,可以很好地工作,但是需要一个样式表将它转换成任何可用的格式。

就像你刚刚看到的火车时刻表一样,每个网站都展示了它认为是信息和清晰度之间的最佳权衡。因此,一些天气预报只有一行每日评论,而其他的有每小时的细目分类,包括温度、风速和风寒因素。选择一个你喜欢的细节,如前所述,可以通过 API 获得,或者可以很容易地抓取。

在这个例子中,我将使用 Yahoo!报告。这是一个像天气一样经常变化的 XML 文件(真的!)并可根据您所在的地区下载。这可以通过浏览雅虎来确定!天气网站作为一个人,并注意到在网址上的论点。对于伦敦,这是UKXX0085,这使得预测源可以通过以下方式下载:

#!/bin/bash

LOGFILE=/var/log/minerva/cache/weather.xml

wget -qhttp://weather.yahooapis.com/forecastrss?p=UKXX0085

然后,您可以使用样式表和xsltproc用 XML 处理它:

RESULT_INFO=/var/log/minerva/cache/weather_info.txt

rm $RESULT_INFO

xsltproc /usr/local/minerva/bin/weather/makedata.xsl $LOGFILE > $RESULT_INFO

这将典型的 XML 转换成如下形式:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

http://xml.weather.yahoo.com/ns/rss/1.0【xmlns:geo = "http://www.w3.org/2003/01/geo/wgs84_pos#【版本= " 2.0】>

<channel>

<title>Weather - London, UK</title>

<language>en-us</language>

<yweather:location city="Luton" region=""  country="UK"/>

<yweather:units temperature="F" distance="mi" pressure="in" speed="mph"/>

<yweather:wind chill="26"  direction="50"  speed="10" />

<yweather:atmosphere humidity="93" visibility="3.73" pressure="30.65" rising="1"/>

<yweather:astronomy sunrise="7:50 am"  sunset="4:38 pm"/>

<image>

<title>Weather</title>

<width>142</width>

<height>18</height>

<url>``http://todays_weather_chart.gif</url

</image>

<item>

<yweather:forecast day="Tue" date="26 Jan 2010" low="30" high="36"

text="Mostly Cloudy" code="27" />

<yweather:forecast day="Wed" date="27 Jan 2010" low="26" high="35"

text="Partly Cloudy" code="30" />

<guid isPermaLink="false">UKXX0085_2010_01_26_4_20_GMT</guid>

</item>

</channel>

</rss>

变成这样的文字:

day:Tuesday

description:Mostly Cloudy

low:30

high:36

end:

day:Wednesday

description:Partly Cloudy

low:26

high:35

end:

这非常适合语音输出、状态报告或电子邮件。然而,makedata.xsl文件有点令人生厌:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform

xmlns:scripts="http://www.bluedust.com/sayweather

xmlns:msxsl="urn:schemas-microsoft-com:xslt"

xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0

>

<xsl:output method="text" encoding="utf-8" media-type="text/plain"/>

<xsl:template match="/">

<xsl:apply-templates select="rss"/>

<xsl:apply-templates select="channel"/>

</xsl:template>

<xsl:template match="channel">

<xsl:apply-templates select="item"/>

</xsl:template>

<xsl:template match="item">

<xsl:apply-templates select="yweather:forecast"/>

</xsl:template>

<xsl:template match="yweather:forecast">

<xsl:text>day:</xsl:text>

<xsl:if test="@day = 'Mon'">

<xsl:text>Monday</xsl:text>

</xsl:if>

<xsl:if test="@day = 'Tue'">

<xsl:text>Tuesday</xsl:text>

</xsl:if>

<xsl:if test="@day = 'Wed'">

<xsl:text>Wednesday</xsl:text>

</xsl:if>

<xsl:if test="@day = 'Thu'">

<xsl:text>Thursday</xsl:text>

</xsl:if>

<xsl:if test="@day = 'Fri'">

<xsl:text>Friday</xsl:text>

</xsl:if>

<xsl:if test="@day = 'Sat'">

<xsl:text>Saturday</xsl:text>

</xsl:if>

<xsl:if test="@day = 'Sun'">

<xsl:text>Sunday</xsl:text>

</xsl:if>

<xsl:text>

description:</xsl:text>

<xsl:value-of select="@text"/>

<xsl:text>

low:</xsl:text>

<xsl:value-of select="@low"/>

<xsl:text>

high:</xsl:text>

<xsl:value-of select="@high"/>

<xsl:text>

end:

</xsl:text>

</xsl:template>

</xsl:stylesheet>

在几个地方,你会注意到奇怪的回车产生了一个更友好的输出文件。

由于查询这些 API 涉及到 CPU 时间,所以您下载并使用一个脚本(如前面所示)处理它们,并将其输出存储在一个单独的文件中。通过这种方式,您可以将天气更新脚本安排在凌晨 4 点,如果/当您查询它时,数据将立即可用,您会很高兴。然后,weatherstatus脚本变成如下所示:

#!/bin/bash

RESULT_INFO=/var/log/minerva/cache/weather_info.txt

if [ -f $RESULT_INFO]; then

cat $RESULT_INFO

exit 0;

else

echo "No weather data is currently available"

exit 1;

fi

这允许您将文本传输到语音合成的报警电话、网络报告、SMS 消息等。这里有几个通用规则,应尽可能在此类和其他类型的数据馈送中采用:

  • 每段数据使用一行,以便于后续处理
  • 首先删除旧的状态文件,因为错误的过期信息比没有信息更糟糕
  • 不要存储时间戳;文件里已经有了
  • 不要包含图形链接,不是所有的媒体都支持它们

在天气预报的情况下,您可能会反对最后一条规则,因为为每个天气状态提供可视图像是很好的。在这种情况下,更容易采用两个不同的 XML 文件,以适当的介质为目标。Minerva 通过一个用于完整报告的makedata.xsl和一个为语音和 SMS 生成稀疏文本的更简单的sayit.xsl来实现这一点。

本地报告

大多数小工具和电子产品商店出售简单的家用气象站。这些显示温度、湿度和大气压力。所有这些,经过一些练习,可以预测你所在地区第二天的天气,并提供最准确的预报,除非你住在国家气象中心的隔壁!

不幸的是,这些设备中的大多数都没有为它提供与计算机以及世界其他地方的接口。然而,有一些设备和一些名为wview ( www.wviewweather.com )的免费软件与之连接。该软件是一个守护程序和工具的集合,用于从兼容的气象站读取存档数据。如果工作站仅报告实时信息,则软件将使用 SQL 数据库来创建档案。然后,您可以像前面显示的那样进行查询,以生成您的个人天气报告。

Note

如果温度是你唯一关心的问题,市场上有几种基于计算机的温度数据记录器,可以让你监控室内和/或室外温度。其中许多可以通过标准串行端口与 PC 通信。

收音机

长期以来,广播一直是电视的穷亲戚,以至于许多人忘记了它曾经是我们最重要的媒体,对许多国家的战争努力至关重要。而且它还没死!没有其他地方能让你获得合法免费的音乐、乐队采访、新闻和电视剧(通常没有广告——比如 Spotify!)直接传到你耳朵里。此外,这些内容是经过专业编辑和选择的,以便与广播的时间(或晚上)相匹配。编写一个智能软件来自动选择一些夜间音乐,不太可能像你当地的电台 DJ 那样选择。

从技术的角度来看,许多电视卡都可以免费使用收音机,它有简单的软件来扫描带有fmscan的电台,并使用fm调谐它们。但是,它们通常必须与电视调谐软件分开安装:

apt-get install fmtools

了解各个电台的频率可以通过研究您当地的电台列表杂志(通常与电视指南捆绑在一起)或查看您所在国家的无线电监管机构的网站来实现,例如美国的联邦通信委员会(FCC)(使用 http://www.fcc.gov/encyclopedia/fm-query-broadcast-station-search 的表格搜索电台)或英国的 Ofcom。在后者的情况下,我被允许获取其封闭格式的 Excel 无线电频率电子表格(可从 http://stakeholders.ofcom.org.uk/broadcasting/guidance/tech-guidance/tech_parameters/ 下载各种格式)并生成 RadioXML 格式的开放版本( www.minervahome.net/pub/data/fmstations.xml )。从这里,您可以使用一个简单的 XSLT 表来提取电台列表,然后使用如下命令来调谐收音机和设置音量:

fm 88.6 75%

当这些信息不可用时,您需要搜索 FM 范围(通常是 87.5 6 到 108.0 MHz)来寻找可用的电台。幸运的是,有一个自动工具可以解决这个问题,它有一个额外的参数来指示信号必须有多强才能被视为“合拍”:

fmscan -t 10 >fmstations

我在这里用了 10 %,因为我所在的地区接收信号特别差,大多数电台的信号都在 12.5%左右。您将它重定向到一个文件中,因为fmscan过程相当长,并且您可能希望以后重新格式化数据。您可以使用以下命令列出各种电台和频率:

cat fmstations | tr ^M \\n\\r | perl -lane 'print $_ if /\d\:\s\d/'

或者按实力排序:

cat fmstations | tr ^M \\n\\r | perl -lane 'print $_ if /\d\:\s\d/' | awk -F :

'{ printf( "%s %s \n", $2, $1) }'| sort -r | head

在这两种情况下,通过按 Ctrl+V,然后按 Ctrl+M 来输入^M符号。

你会注意到有些电台在列表中出现了几次,例如 88.4 和 88.6。简单地挑选一个听起来最干净的,或者检查车站呼号。

有了频率,你就可以开始在网上搜索节目指南,寻找有趣的节目。这些必须总是从通过搜索电视台自己的网站找到的网页上抓取而来。像下面这样的术语:

radio 88.6 MHz uk

如果你用你自己的国家代替uk,通常会得到好的结果。你可以在 www.bbc.co.uk/programmes 找到 BBC 的主要电台。

还有一些预先录制好的 MP3 格式的新闻报道,可以下载或者用标准的 Linux 工具播放。这里有一个例子:

mplayerhttp://skyscape.sky.com/skynewsradio/RADIO/news.mp3

光盘数据

播放 CD 时,通常有两条信息您希望保留:曲目名称和封面图片扫描。前者更容易获得并集成到大多数翻录软件中,而后者则不是(尽管许多基于新媒体中心的软件都包含它)。

确定曲目名称的过程是确定 CD 上每首歌曲的起始位置和长度,并通过哈希算法使用它们来计算单个“指纹”数。因为制作中的每张 CD 都有不同数量的歌曲,并且每首歌曲都有不同的长度,所以这个数量应该是唯一的。(实际上,它几乎是唯一的,因为存在一些副本,但它足够接近。)然后将这个数字与已知专辑数据库进行比较,以检索由世界各地的志愿者人工输入的曲目名称列表。这些曲目名称和标题随后被翻录软件添加到 MP3 或 OGG 文件的 ID 标签中,以供以后参考。

如果您使用的是 CD 本身,而不是翻录版本,那么每次您想知道正在播放什么时,都必须手动检索这些信息。可以通过使用cdcd包来使用一个兼职解决方案,它允许您检索光盘的编号、名称、轨道及其持续时间。

cdcd tracks

前面的示例将生成如下开头的输出:

Trying CDDB serverhttp://www.freedb.org:80/cgi-bin/cddb.cgi

Connection established.

Retrieving information on 2f107813.

CDDB query error: cannot parseAlbum name:

Total tracks:  19   Disc length:  70:18

Track  Length   Title

-------------------------------------------------------------------------------

1:  > [ 3:52.70]

2:   [ 3:48.53]

3:   [ 3:02.07]

4:   [ 4:09.60]

5:   [ 3:55.00]

虽然这可以让您看到当前曲目(由>指示),但它并不比任何其他媒体播放器提供的更有用。然而,如果你已经安装了abcde ripper,你也已经(并且自动地)安装了cddb-tool组件,它将为你执行 CD 散列函数和数据库查询。因此,您可以用少量的脚本代码来确定光盘 ID、其名称以及每个轨道的名称:

ID=cd-discid /dev/dvd``

TITLE=cddb-tool query[http://freedb.freedb.org/∼cddb/cddb.cgi`](http://freedb.freedb.org/)

apphost参数是指当前机器的应用程序名和主机名。尽管它们的内容被认为是强制性的,但它们并不是至关重要的,只是出于对开发人员的一种礼貌才包括在内,以便他们可以跟踪哪些应用程序正在使用数据库。神奇的数字 6 指的是正在使用的协议。从这个字符串中,您可以提取流派:

GENRE=echo $TITLE | cut -d ' ' -f 2``

以及光盘的 ID 和名称:

DISC_ID=echo $TITLE | cut -d ' ' -f 3``

DISC_TITLE=echo $TITLE | cut -d ' ' -f 4-``

使用光盘 ID 和类型,您可以为相关光盘确定一个唯一的曲目列表(因为类型用于区分哈希值中的冲突),这允许您使用以下信息检索可解析的曲目列表:

cddb-tool read http://freedb.freedb.org/∼cddb/cddb.cgi 6 $(app) $(host) ←中

$GENRE $DISC_ID

光盘标题、年份和真正的流派也可以从该输出中获得。 8

要检索的一种更复杂的数据形式是专辑的封面艺术。这是 rippers,尤其是基于文本的 rippers 不做的事情,在开源世界中是一件碰运气的事情。这也是因为缺乏可用的数据来源。苹果拥有一家音乐商店,在那里封面被用来销售音乐,并随着专辑的购买而下载。如果你自己翻录音乐,你就没有这样的选择。

一个有用的图形工具是albumart。你可以从 www.unrealvoodoo.org/hiteck/projects/albumart 下载这个包,安装如下:

dpkg -i albumart_1.6.6-1_all.deb

它使用 MP3 文件中的 ID 标签在各种网站上执行搜索,例如 Buy.comWalmart.com 和 Yahoo!这种方法只不过是屏幕抓取,但是只要文件命名合理,结果就足够好,并且包含很少的误报。然而,当它在确定正确的图像时遇到问题,它会出于谨慎而不分配任何内容,等待您手动单击“设为封面”,这可能需要一些时间来纠正。一旦它获得了这些艺术文件,它就在适当的目录中把它们命名为folder.jpg,在那里它被大多数操作系统和媒体播放器拾取和使用。然而,额外的好处是,因为专辑封面使用文件中的 ID 标签,而不是 CD 指纹,所以它可以用来查找您已经翻录的音乐的图像。

Note

与曲目列表不同,封面艺术仍然是受版权保护的材料,因此没有独立的开发者试图用他们自己的数据库来简化这一过程。

正确地找到没有任何 id 或元数据的专辑封面是非常困难的工作。如果发生这种情况,有一个两阶段的过程可用。第一部分包括通过查看歌曲的音频属性来确定标题和艺术家,从而确定标签。MusicBrainz 是这个领域的主要(免费)竞争者。然后,一旦有了 ID 标记,就可以正常检索图像。这些步骤已经在 Jaikoz 这样的软件中进行了组合,jai koz 也可以作为一个海量元数据编辑包,可能对那些已经抓取了你的音乐但没有这些数据的人有用。

新闻

任何发生变化的数据都是新的,因此也是新的,这使它成为实时访问的理想选择。制作一个个性化的新闻频道是大多数聚合器正在做的事情,通过使用 RSS 提要和定制的小部件。例如,即将退役的 iGoogle ( www.google.com/ig )也包括与谷歌邮件和日历服务的集成,当作为主页查看时,这使其成为一个令人不安的有用主页,但其封闭的性质使其难以利用它作为家庭的数据输入。相反,我将介绍将典型的新闻条目作为单独的数据元素进行检索的方法,这些数据元素可以以适合我们自己的方式进行合并。这分为两种类型:推和拉。

报道的故事:推送

基于推送的媒体的引入可以追溯到 24 小时滚动新闻(Arthur W. Arundel 在 1961 年)或 RSS 9 提要,这取决于你的情况。这两种格式似乎都是在信息一被接收到的时候,就实时地将信息推给观众。实际上,两者的工作原理都是让查看器不断地从数据流中提取数据,忽略任何没有改变的内容。以电视为例,每次拉动都由一幅新图像组成,每秒钟发生几次。RSS 出现的频率要低得多,但却是我们感兴趣的。

RSS 源

RSS 是一种基于 XML 的元数据文件格式。它描述了大量频繁更新的信息。这可能包括对博客文章的引用、从国王十字车站离开 9 号站台的下一趟列车、新闻网站上的当前故事等等。在每种情况下,每一次更改都记录在 RSS 文件中,并带有非常重要的时间戳,使 RSS 阅读器能够确定对其中提到的数据的任何更新。生成这些 RSS 订阅源的软件也可能会删除对以前故事的引用,一旦它们变得不相关或太旧。但是,老是作者定义的。

这个事实上的标准允许您使用公共库来解析 RSS 提要,并非常简单地提取信息。其中一个这样的库是基于 PHP 的 MagpieRSS ( http://magpierss.sourceforge.net ),它也支持 RSS 的替代品 Atom feeds,并包含一个数据缓存。第二个特性使您的代码更加简单,因为您可以从 RSS 提要中请求所有数据,而不必考虑最新的数据,因为库已经自动缓存了较旧的故事。

在 PHP 中使用 MagpieRSS 的方法是从通常的代码开始:

require_once 'rss_fetch.inc';

然后,您从给定的 URL 请求一个提要:

$rss = fetch_rss($url);

自然,这个 URL 必须引用一个 RSS 文件(比如 www.thebeercrate.com/rss_feed.xml ),而不是它所描述的页面(比如 www.thebeercrate.com )。它通常由一个带有白色无线电波的橙色按钮或一个简单的表示“RSS-XML”的图标来表示。在所有情况下,RSS 文件都出现在您要读取其数据的同一页面上。您可以使用一个简单的循环来处理故事,如下所示:

$maxItems = 10;

$lastItem = count($rss->items);

if ($lastItem > $maxItems) {

$lastItem = $maxItems;

}

for($i=0;$i < $maxItems;++$i) { /* process items here */ }

当添加新故事时,它们会在文件的开头添加。如果您想要捕获所有内容,那么从项目列表的末尾开始非常重要,因为它们会很快从提要中消失。

如前所述,RSS 只包含元数据,通常是标题、描述和完整数据的链接。您可以通过数据成员从每个项目中检索这些内容:

$rss->items[$i]['link'];

$rss->items[$i]['title'];

$rss->items[$i]['description'];

然后它们可以用来以你想要的方式建立信息。例如,要在您自己的主页上重新创建信息,您应该编写以下内容:

$html .= "<a href=".$rss->items[$i]['link'].">".$rss->items[$i]['title']."</a>";

$html .= "<p>".$rss->items[$i]['description']."</p>";

或者您可以使用语音合成器来朗读每个标题:

system("say default "+$rss->items[$i]['description']);

然后,您可以使用一个 Arduino 来响应传感器发出的突然噪音,如拍手或挥手(使用第二章中的分压器电路,分别带有麦克风和 LDR)来触发完整的故事。

你还可以添加更多的逻辑,这样如果故事的标题包含特定的关键词,比如 NASA,你就可以把信息直接发送到你的手机上。

if (stristr($rss->items[$i]['title'], "nasa"))

system("sendsms myphone "+$rss->items[$i]['description']);

这对于接收最新的体育比赛结果、彩票号码或来自仍在世界各地播放的大量电视真人秀的投票信息特别有用。即使它需要一点智能修剪来将相关信息减少到 140 个八位字节(在美国)或 160 个字符(在欧洲、RSA 和大洋洲),这是单个未链接文本消息的最大长度,但它通常比注册提供相同结果的付费服务更便宜。

检索数据:拉取

这包括在需要时有目的地请求的任何数据。一个典型的例子是天气或金融信息,你可能会在新闻公告的结尾。在这些情况下,尽管可以通过模拟推送技术来实时更新信息,但很少有人需要这种粒度级别—每天一次就足够了。对于本例,您将使用从在线 API 中检索的数据来生成您自己的货币报表。这可以在以后扩展到生成货币换算表,以帮助您的假期融资,因为家庭自动化,正如我们所看到的,不会停在前门。即使你在国外,你也可以利用公共数据源,通过执行货币转换来检查你的支出。

货币兑换

虽然有许多转换网站,但它们提供的内容却千差万别。有些需要注册和申请 ID。有些将广告引入数据流。有些就是不起作用!因为谷歌免费提供转换功能作为其搜索引擎的一部分,所以没有理由使用其他任何东西。因此,我们可以从请求中提取数据,例如:

http://www.google.com/ig/calculator?hl=en&q=100EUR=?USD

它以如下形式返回一个 JSON 文本:

{lhs: "100 Euros",rhs: "134.14 U.S. dollars",error: "",icc: true}

因此,很容易理解如何构建一个应用程序来提供一个方便的双向转换图表。

<?php

$amount = "1";

$fromCurrency = "GBP";

$toCurrency = "EUR";

$url = "http://www.google.com/ig/calculator?hl=en&q=$amount${fromCurrency}=?$toCurrency

$rawdata = file_get_contents($url);

$data = explode('"', $rawdata);

$data = explode(' ', $data['3']);

$conversionRate = $data[0];

for($i=1; $i<=20; ++$i) {

print "$i $fromCurrency\t= " . number_format($i * $conversionRate, 2) . " $toCurrency \t";

print "$i $toCurrency\t= " . number_format($i / $conversionRate, 2) . " $fromCurrency \t";

print "\n";

}

?>

当然,在使用 explode 方法时,你可能不会像我一样懒,你可能更喜欢正式解码 JSON!

按照编写本报告时的汇率,这将产生:

1 GBP = 1.16 EUR        1 EUR = 0.86 GBP

2 GBP = 2.32 EUR        2 EUR = 1.72 GBP

3 GBP = 3.48 EUR        3 EUR = 2.59 GBP

4 GBP = 4.64 EUR        4 EUR = 3.45 GBP

5 GBP = 5.80 EUR        5 EUR = 4.31 GBP

6 GBP = 6.96 EUR        6 EUR = 5.17 GBP

7 GBP = 8.12 EUR        7 EUR = 6.03 GBP

8 GBP = 9.28 EUR        8 EUR = 6.89 GBP

9 GBP = 10.44 EUR        9 EUR = 7.76 GBP

10 GBP = 11.60 EUR       10 EUR = 8.62 GBP

11 GBP = 12.76 EUR       11 EUR = 9.48 GBP

12 GBP = 13.92 EUR       12 EUR = 10.34 GBP

13 GBP = 15.08 EUR       13 EUR = 11.20 GBP

14 GBP = 16.24 EUR       14 EUR = 12.07 GBP

15 GBP = 17.40 EUR       15 EUR = 12.93 GBP

16 GBP = 18.56 EUR       16 EUR = 13.79 GBP

17 GBP = 19.73 EUR       17 EUR = 14.65 GBP

18 GBP = 20.89 EUR       18 EUR = 15.51 GBP

19 GBP = 22.05 EUR       19 EUR = 16.38 GBP

20 GBP = 23.13 EUR       20 EUR = 17.30 GBP

从这里开始,您可以将此扩展到您的 HA 设置中,方法是使用“我花了这个”按钮将数据写入您家庭服务器上的网页,以跟踪您在国外花了多少钱。或者加上一句“我借钱给……”按钮,连接到您的联系人列表,这样你们可以在以后用本国货币结算。作为一个工具,它并不比你可能找到的任何其他转换应用程序或网站更好,但当它能够连接到同一台服务器上的待办事项列表,提醒你还钱或重新访问兑换局时,好处就变得显而易见了。

在所有情况下,您都将当前数据写入定期更新的日志文件中,就像您对天气状态所做的那样,原因是相同的——也就是说,防止不断滥用他人的服务器。然而,随着金融市场的变化越来越快,您可能希望一天更新该文件几次。

其他公共来源

许多其他组织向公众提供数据服务;事实上,太多了,不可能在这里一一列举。谷歌、亚马逊和 bit.ly 都向公众提供内容。虽然很多数据很有趣,比如欧洲燃油价格的比较,但大多数数据在智能家居环境中的应用有限。

典型的起点包括:

http://www.google.co.uk/publicdata

http://aws.amazon.com/publicdatasets/

https://bitly.com/bundles/hmason/1

随着第三方数据源抓取器和共享器寻求成为一个独立的生态系统,难怪人们一直在考虑将其标准化,以便不同的抓取器可以与一个共享的元级 API 交互。第一次尝试是通过:

http://import.io

这是一项新技术,到本书出版时,公众应该可以使用,因此希望它能为那些希望发现和利用更多家庭自动化数据集的人提供帮助。

私人数据

我们中的大多数人都在不归我们所有或控制的电脑上存有个人数据。即使我们中更关心的人试图在每一次行动中尽量减少这种情况,但这样做通常是不可能或不方便的。此外,(现在)有许多临时的 Linux 用户,他们完全基于桌面,对运行他们自己的远程服务器不感兴趣,并且乐意将他们的联系信息、日记和电子邮件存储在另一台计算机上。便利性是不可否认的——让你的数据可以从世界上任何一台机器上获得(通过网络连接),提供了一种真正的无位置限制的数字生活方式。但是一般来说,你的家不是没有位置的。因此,你需要考虑什么类型的关于你自己的有用信息被保存在其他计算机上,以及如何访问它。

日历

群件应用程序是 Linux 桌面软件特别薄弱的领域之一。谷歌凭借自己的解决方案谷歌日历(Google Calendar)进入了这个领域,谷歌日历可以链接到你的电子邮件,允许将每日提醒发送到你的收件箱以及其他人和团体的日历上。

未来 24 小时内发生的日历事件也可以通过短信查询,通过向 GVENT (48368)发送消息可以添加新的事件。目前,此功能仅适用于美国用户,但对于受其影响的用户来说是一项免费的 HA 功能。

日历中的信息是您的,可以通过几种不同的方式获得。首先,也是最简单的,它可以作为 iframe 嵌入到任何网页中:

<iframe src=" http://www.google.com/calendar/embed?src=my_email_address

%40gmail.com&ctz=Europe/London" style="border: 0" width="800" height="600"

frameborder="0" scrolling="no"></iframe>

这将显示当前日历,并允许您编辑现有事件。但是,您需要手动刷新页面才能看到编辑内容,如果不进入 Google 日历页面,就无法添加新活动。

这个公开网址打开的明显的安全漏洞被避免了,因为你必须已经登录到你的谷歌帐户才能工作;否则,将显示登录页面。

或者,如果您想在不登录 Google 帐户的情况下看到您的日历,那么您可以生成一个私钥,让知道此密钥的任何人都可以使用您的日历数据。密钥以秘密 URL 的形式出现。

要找到此 URL,请转到 Google 日历帐户右上角的设置链接,然后选择日历。这将打开您可以编辑和不可以编辑的日历列表。自然,你不能选择暴露只读变量的细节。因此,选择你自己的个人日历,向下滚动到标题为私人地址的部分。右侧的三个图标分别标记为 XML、ICAL 和 HTML,它们提供了一个 URL 来检索指定格式的日历数据。典型的 HTML 链接如下所示:

http://www.google.com/calendar/embed?src=my_email_address ←中

%40gmail.com&ctz=Europe/London&pvttk=5f93e4d926ce3dd2a91669da470e98c5

XML 版本如下所示:

http://www.google.com/calendar/feeds/my_email_address ←中

%40gmail.com/private-5f93e4d926ce3dd2a91669da470e98c5/basic

ICAL 版本使用的格式略有不同:

http://www.google.com/calendar/ical/my_email_address ←中

%40gmail.com/private-5f93e4d926ce3dd2a91669da470e98c5/basic.ics

后两个对我们更有用,因为它们可以在你选择的任何软件中查看(但不能编辑)。

如果您不习惯 XML 处理语言 XSLT,那么可以编写一个简单的 PHP 循环来解析 ICAL 文件,如下所示:

$regex = "/BEGIN:VEVENT.*?DTSTART:[^:]*:([^\s]*).*?SUMMARY:([^\n]*)

.*?END:VEVENT/is";

preg_match_all($regex, $contents, $matches, PREG_SET_ORDER);

for($i=0;$i<sizeof($matches);++$i) {

// $matches[$i][1] holds the entire ICAL event

// $matches[$i][1] holds the time

// $matches[$i][2] holds the summary

}

ICAL 中的日期格式可以存储为以下三种格式之一:

  • 当地时间
  • 带时区的当地时间
  • UTC 时间

您不必担心使用哪个版本,因为您可以使用现有的 PHP 库函数,例如:

$prettyDate = strftime("%A %d %b %Y.", strtotime($matches[$i][1]));

Note

请注意,数据的 XML 版本包含对日历的反向引用,其中包含您的私钥。

当然,其他在线日历应用程序也存在,提供类似的功能。此版本作为指南包含在内。但是在你自己的机器上获得数据后,你可以触发你自己的电子邮件通知,向谷歌目前不支持的国家发送短信,或者在出现“奶奶”和“生日”字样时自动加载当地花店的网页。

通过 POP3 访问网络邮件

当今的大多数员工认为移动电子邮件是办公室生活的一个标准特征。但是对于家庭用户来说,电子邮件属于两种类型之一:

  • 它是发送到他们的机器并由他们的本地客户端(通常是 Outlook Express 的旧版本)收集的东西;因此,它在其他地方是不可用的。
  • 这是一个基于网络的工具,由雅虎提供!、Hotmail 或 Google,只能通过网络浏览器访问。

虽然这两种说法都是(部分)正确的,但它确实隐藏了可以非常便宜地提供的额外功能。在第一种情况下,你可以提供你自己的电子邮件服务器(正如我在第五章第一节中提到的),并使用 AtMail 等软件添加一个网络邮件组件。这允许你的家用机器继续掌管你所有的邮件,除了你不需要在家使用它。

或者,您可以使用getmail通过替代(即非 web)协议接收您的 webmail 消息。首先,您需要确保您的网络邮件提供商支持 POP3 访问。这并不总是容易找到或确定,因为使用 POP3 意味着你将不再看到他们网页上的广告。但是当它可用时,通常可以在服务的设置部分找到。所有的大公司都提供这项服务,尽管不是所有的都是免费的。

  • Hotmail 默认提供 POP3 访问,这样就不需要打开了,而且在多年只在其订阅服务中提供这一功能后,现在 Hotmail 免费提供了。服务器目前在 pop3.live.com
  • Google Mail 是第一个提供免费 POP3 访问电子邮件的,从 pop.gmail.com 。虽然现在大多数帐户默认情况下都是启用的,但一些旧的帐户没有启用。因此,您需要选择设置和转发以及 POP/IMAP。在这里,您可以为所有邮件或任何新收到的邮件启用它。
  • 雅虎!仅通过其 Yahoo!外加付费服务。一些服务上有作弊软件(虽然不是雅虎!)将所有邮件转发到另一个提供免费 POP 服务的服务(如 Hotmail 或 Gmail)上!

之前有一个项目是直接处理 HTML 邮件,不需要为 POP3 服务付费。这包括现在已经不存在的 http://httpmail.sourceforge.net 。(幸运的是)这些措施已经没有必要了。

一旦你知道了你的邮件所在的服务器,你就可以下载了。这可以用于本地读取、用于备份目的,或者用于处理通过电子邮件发送的命令。虽然大部分邮件软件都可以处理 POP3 服务器,但是我用的是getmail

apt-get install getmail4

我对此进行了配置,以便将每个电子邮件帐户下载到一个单独的文件中。我将用一个例子来演示,从目录结构开始:

mkdir ∼/.getmail

mkdir ∼/externalmail

touch ∼/externalmail/gmail.mbox

touch ∼/externalmail/hotmail.mbox

touch ∼/externalmail/yahoo.mbox

然后为每个名为∼/.getmail/getmail.gmail的服务器创建一个单独的配置文件,内容如下:

[retriever]

type = SimplePOP3SSLRetriever

server = pop.gmail.com

username = my_email_address@gmail.com

password = my_password

[destination]

type = Mboxrd

path = ∼/externalmail/gmail.mbox

[options]

verbose = 2

message_log = ∼/.getmail/error.log

如果您希望它们进入传统的 Linux 邮箱,那么您可以将path更改为以下内容:

path = /var/mail/steev

然后,您可以像这样检索它们,并观看系统下载电子邮件:

getmail -r getmail.gmail

一些服务,特别是谷歌邮件,如果你有很多邮件,就不允许你一次下载所有的邮件。因此,您需要重新调用该命令。这有助于支持两台机器的带宽。

Tip

如果您只有一个外部电子邮件帐户,那么调用您的配置文件getmailrc允许您省略文件名参数。

然后,您可以在自己选择的客户端查看这些邮件。这里有一个例子:

mutt -f ∼/externalmail/gmail.mbox

确保您让getmail完成检索电子邮件;否则,您的收件箱中每封邮件都会有两份副本。

如果你打算用procmail处理这些电子邮件,正如你在第五章中看到的,那么你需要把收到的电子邮件写到procmail本身而不是收件箱。这是通过这样配置目的地来实现的:

[destination]

type = MDA_external

path = /usr/bin/procmail

unixfrom = True

推特

Twitter 这一现象让普通大众变成了自封的微型社区,因为他们接受了一种从一个人到许多“追随者”的简单广播通信机制。尽管通信通常是公开的,但还是可以创建一个用户列表,以便同一个家庭的成员可以私下相互跟踪。这可以通过在账户设置页面选择“保护我的推文”来实现。

Twitter 比大多数社交网站做得更好的一点是,它没有偏离其最初的微博理想,这意味着查询和控制提要的 API 保持一致。这使得你(或你的房子)很容易将信息发布到你的 feeds,或者让房子处理它们并根据它们采取某种行动。然而,在任何情况下,你都必须代表你的房子手动注册一个账户。过去几年中唯一的变化是通过要求使用 OAuth 来加强安全性。

用 OAuth 发布推文

Twitter API 使用 HTTP 请求来上传新的 tweet,主要实现是通过TwitterOAuth,来自 https://github.com/abraham/twitteroauth 的库。

$auth = getTwitterDetails($user);

$connection = new TwitterOAuth($auth->ckey, $auth->csecret, $auth->oatoken, $auth->oasecret);

$content = $connection->get('account/verify_credentials');

$connection->post('statuses/update', array('status' => $all));

这个例子使用 PHP,但是任何绑定了OAuth的语言都以同样的方式工作。你只需要填写你的登录凭证,你就可以从命令行发微博了。

$auth的结构就像它看起来一样简单,它由配置文件的内容和代码组成,例如:

function getTwitterDetails($user) {

$contents = @file("twitter.conf");

$oauth = new OAuthDetails();

$oauth->ckey = trim($contents[0]);

$oauth->csecret = trim($contents[1]);

$oauth->oatoken = trim($contents[2]);

$oauth->oasecret = trim($contents[3]);

return $oauth;

}

唯一复杂的是获取这些秘密值和令牌值。幸运的是,这是标准的做法,如果你以前和 OAuth 一起工作过,就不会出现警报和意外。如果你没有,请继续阅读...

访问 Twitter API 有几种不同的方式,但是对于我们的目的来说,我们想要的解决方案被称为“只想从您自己的帐户访问 API……”。这在 https://dev.twitter.com/docs/auth/tokens-devtwittercom 有解释。

从这里,您可以创建一个 Twitter 应用程序,这是必要的,因为与 Twitter API 通信的是您的脚本(即应用程序),而不是用户。这为您提供了一个消费者密钥和一个消费者秘密,ckeycsecret。有了这些,你就可以通过 Twitter 的 API 与它对话。

为了能够代表用户发布或阅读消息,他们需要代表 Twitter 向您的应用程序进行身份验证。这需要用户获取oatokenoasecret。在创建应用程序密钥之后,Twitter web 页面上有一个名为“您的访问令牌”的部分,它提供了获取这些数据的一键解决方案。将它添加到配置文件中,以便getTwitterDetails能够解析它,现在您就能够以编程方式发送 tweets 了。

用 OAuth 阅读推文

就像 tweets 可以用简单的 HTTP 请求编写一样,它们也可以被阅读。文档包括检索你的时间线、你的朋友的时间线以及转发等细节的 URL。这些调用返回关于所选 tweets 的所有可用信息,包括发帖人的完整信息(如他们的姓名、图像和关注者数量)、消息和回复数据(包括状态、用户和昵称)。这比您通常需要的要多,但是在 API 设计中尽可能不丢失信息是一个好主意——过滤掉比重新添加容易。你可以使用这个代码在离线时跟踪推文,方法是使用计算机截取适当格式的推文,然后用 SMS 传输代码发送它们。我们在第二章的中看到了一个这样的应用,自动喂狗器。

用 RSS 阅读推文

Twitter 的本质适合现有的 RSS 技术,不需要定制的解析器。用户@apress 的 URL 如下所示:

https://api.twitter.com/1/statuses/user_timeline.rss?screen_name=apress

它可以用 XSLT 检索和处理,或者与来自每个家庭成员的提要合并成一个,显示在房子的布告板上。这里的结果比它们的cURL对应物更简洁,更容易处理,代价是上下文信息更少。

脸谱网

虽然 Twitter 已经采用了广播机制,但脸书继续致力于促进与你共享数据的个人网络。对于 HA 来说,你可能对与朋友分享信息比与陌生人分享更感兴趣,所以这可能是更好的解决方案。然而,编写一个使用脸书的应用程序有较高的门槛,收益相对较少。作为补偿,它确实提供了一个预先存在的登录机制,并且是一个许多人比查看电子邮件更频繁的网站,因此信息可以更快地传播。然而,脸书确实会定期改变它的 API,所以某一天有效的可能第二天就无效了,你必须掌握它。如果你使用脸书作为一种允许几个人控制或查看你的主页状态的方式,使用你自己的主页可能更容易,有一组访问权限,正如你在第五章中看到的。

如果你仍然对脸书感兴趣,那么你应该安装开发者应用程序,并用它创建你自己的应用密钥。这将使您的应用程序能够对使用它的用户进行身份验证,无论是在脸书境内还是通过脸书连接在脸书以外的网站上。(在 www.scribd.com/doc/22257416/Building-with-Facebook-Social-Dev-Camp-Chicago-2009 有很好的基础教程。)要在您的家人之间保密,只需将他们的 ID 添加为开发者即可。然而,如果你想和你的孩子分享信息,让他们接受你是脸书的朋友可能会更困难!在这种情况下,你可能需要说服他们创建第二个账户,专门用于你的利益。脸书不允许你给没有安装该应用的用户(或被列入开发者名单的用户)发送消息,所以这需要谨慎管理。

相比之下,技术部分要简单得多,因为脸书提供了标准代码,这些代码可以被复制到你的网络服务器上的一个目录中,只要从脸书内部调用你的应用程序,就可以使用这些代码。然后由您来检查使用您的应用程序的用户的 ID,以确定他们有权使用什么功能,并相应地生成网页。你可以在 http://developers.facebook.com 的脸书自己的页面上找到很多有用的入门信息。

自动化

有了这些信息,你就要考虑房子会怎么用。这需要最个性化的发展。毕竟,如果你是轮班工作,那么我根据日出和日落的时间来控制灯光的代码对你来说用处不大。相反,我将提出各种可能性,让您决定如何最好地组合它们。

定时事件

生命受时间控制。因此,有一个机制来影响房子在某些时候是非常可取的。因为计算机的寿命也是由时间控制的,所以已经有现成的程序可以让我们轻松完成这项任务。

Cron 作业的周期性控制

它们的名字来源于类 Unix 操作系统的按时间顺序排列的作业调度程序,该程序在一年中的给定时间自动执行一个命令。有一个名为 crontab 的文件,它对这些作业有精细的粒度控制,每个用户都有单独的文件。您可以使用以下命令编辑这个属于当前用户的文件(如有必要,首先调用export EDITOR=vi):

crontab -e

还有一个–u选项,允许 root 编辑其他用户的 crontab。典型的文件可能以如下开头:

# m  h dom mon dow command

00  7  *  * 1-5 /usr/local/minerva/etc/alarm 1

10,15 7  *  * 1-5 /usr/local/minerva/etc/alarm 2

*/5  *  *  *  *  /usr/local/bin/getmail --quiet

#行是一个注释,作为列的提示;分钟、小时、日期(从 1 到 31)、月份(1 到 12,或以缩写命名)、星期几(0 到 7,星期日为 0 和 7)以及要执行的命令。每一列都支持使用通配符(*表示任意)、包含范围(1–5)、逗号分隔的序列(仅出现在 10 和 15 处)和周期(在本例中,*/5表示每五分钟一次)。当且仅当满足所有条件时,cron 程序才会调用该命令。

典型的用途可能如下:

  • 闹钟、触发信息、天气预报或醒来时的新闻
  • 以不同的速率检索一个或多个帐户的电子邮件
  • 启动本地数据、电子邮件或项目的备份
  • 度假时控制灯光
  • 当醒来时,控制灯逐渐打开
  • 生日、周年纪念日、母亲节等的现实生活提醒

因为这些操作是在 crontab 用户(即所有者)的支持下进行的,所以对于所讨论的命令必须有适当的权限。

Note

如果可能的话,许多用户试图避免以 root 身份运行任何东西。因此,在为您的家庭添加定时任务时,建议您为一个特殊的myhouse用户将它们添加到 crontab,并只为其分配所需的特定权限。

所提供的 crontab 精确到一分钟以内。如果你是极少数需要每秒精确度的人之一,那么有两种方法可以做到。两者都涉及在前一分钟触发事件并等待所需的秒数。第一个变化是将 crontab 更改为如下所示:

00  7  *  * 1-5 sleep 30; /usr/local/minerva/etc/alarm 1

第二种方法是将相同的sleep指令添加到运行的命令中。当以人性化的方式控制灯开关时,这可能是有用的,因为在打开楼上的灯之前花整整 60 秒爬楼梯是罕见的。

对于随机计时,您可以在继续执行命令之前休眠一段随机时间(sleep echo $((RANDOM%60))s``),正如您在第一章中看到的

也有一些情况下,您想暂时忽略 cron 作业,比如在我们度假时禁用闹钟。为此,您可以随时注释掉 crontab 中的行,或者更改以下命令:

/usr/local/minerva/etc/alarm 1

致以下内容:

[ -f ∼/i_am_on_holiday ] || /usr/local/minerva/etc/alarm 1

第一个表达式检查给定文件是否存在,如果存在,则跳过报警调用。因为这可以是位于任何地方的任何文件,所以它不需要属于 crontab 所有者就可以影响任务。一种可能的情况是使用蓝牙来监控接近的移动设备,在特定的目录中为每个用户创建一个文件(当他们超出范围时,即离开房间时,再次删除该文件)。一旦每个人都回家了,一个设置为每分钟检查该目录的 cron 作业可以发送一封电子邮件,提醒你离开计算机并进行社交!

对于更复杂的计时场景,您可以使用 cron 定期运行一个单独的脚本,比如每分钟运行一次。如果您返回到之前的“下一趟列车”脚本,您可以通过从这里检索第一趟合适的列车来赢得在家的每一分钟:

NEXT_TRAIN=whattrain.php 30 35 | head -n 1``

在这种情况下,合适的火车是在 30 到 35 分钟内离开的火车,这给你时间做准备。如果该命令产生输出,那么您可以使用语音合成器来报告它:

if [ echo $NEXT_TRAIN | wc -l -ne 0 ]; then

say default $NEXT_TRAIN

fi

同样的脚本可以用来自动改变你的闹钟的唤醒时间!

在第七章中,你将了解 Minerva 如何根据你是在家、在工作还是在火车上,通过向不同的地方发送状态消息来支持更复杂的动作。

At 时的偶然控制

除了周期性事件之外,您通常还希望调用额外的事件,比如十分钟后提醒检查烹饪情况。同样,Linux 准备了at命令,如下所示:

echo "say default Check on dinner" | at now + 10 minutes

这个语法是必要的,因为默认情况下,at从命令行交互地接受命令(以 Ctrl+D 结束)。每个at事件都进入一个队列,从而能够为多部分事件生成完整的配方。

唉,这个例子在它当前的场景中工作得很好,但是对于需要更细粒度的任务有一个致命的问题,因为调度器只处理整分钟,这意味着“现在+ 1 分钟”的任务实际上意味着“在下一分钟的开始”,这可能只有 5 秒钟的时间!所以,你需要使用“睡眠秒”技巧:

echo "sleep date +%S; say default Check on dinner" | at now + 10 minutes

也可以使用at在特定时间触发事件:

echo "say default Time for CSI" | at 21:00

这总是在下次到达该时间时发生,意味着它可能是在第二天。

错误处理

在任何开发中,报告和处理错误是项目中最耗时的部分。不幸的是,哈也不例外。有些事情对你有利,主要是你控制着房子和(大部分)在机器上运行的其他软件,所以如果有可能出现问题,你可以提前解决。但是如果你给你的视频发一条短信,你就无法知道这个命令是否有效,或者它在哪个环节失败了。这里有三条规则:

  • 始终确认命令和请求
  • 总是使用相同的媒介回复
  • 始终将回复记录到本地文件中,并可以选择通过电子邮件发送它们

第二个可能是不明显的。如果有人通过短信发送命令,那么回复也应该返回到短信,即使它的成本更高。这是因为发件人使用短信是有原因的——可能他们无法访问电子邮件或者网站已经坏了——所以他们只能放心地通过相同的途径发送。当然,消息要求将回复发送到其他地方是可以接受的,但是默认应该采用相同的路线。

这条规则适用于管道的每个阶段。因此,在 SMS 到电子邮件到 IR 的链中,如果 IR 单元出现故障,那么调用它(并正在处理电子邮件)的脚本必须在电子邮件中将错误传回。此时,SMS 到电子邮件网关会发现一个基于电子邮件的错误,并将其作为 SMS 传递给最终用户。

在这里,对 HTTP 中的思想进行修改是很有用的,在这里,您以数字、参数、描述的形式对每个请求采用三部分响应:

  • 数字是描述操作结果的数字代码。使用 200 来表示 OK,也许还可以加上各种错误代码来表示“找不到设备”、“磁盘已满”等等。这意味着在最低带宽的设备上,您将得到一个足以启动诊断的描述性错误。
  • 该参数涵盖了所涉及的特定设备或单元。
  • 该描述包含一个特定于设备的错误,它不应该重复与错误号或设备名称相关的任何信息(因为它们已经存在)。

因为链中的每个人都不知道各种错误消息的大小和格式,所以这种布局确保了系统的统一视图,并意味着自定义格式脚本能够为目标介质准备信息,可能通过包括数字错误代码的完整描述,或者可能会在 SMS 和 tweet 消息上裁剪描述文本。

结论

智能自动化家庭中的数据处理主要有两个阶段。第一种是收集,通常通过屏幕抓取、RSS 提要或 API 访问,在本地机器上提供一些远程数据的副本。这种情况既可能发生在您请求它的时候,如火车出发时间,也可能发生在您提前下载并缓存它的时候,如您在天气预报和电视时间表中看到的那样。第二个阶段是处理,将数据转换成更有用的东西,如简短的口头天气预报或可以点击播放的 CD 曲目列表。您了解了各种不同的数据格式,包括私人日历和公共新闻提要。只要花一点时间,极客们就能得到所有这些。正如我在本章的介绍中提到的,内容是王道,是让你的电脑能够独立思考并改善你的生活的一块巨大的垫脚石。

Footnotes 1

IANAL:我不是律师,所有标准的免责声明在这里都适用!

2

尽管网络是作为一种免费的信息资源而存在的,但有人会为广告空间付费以抵消制作成本。

3

Firebug 是 Firefox 的扩展,它允许 web 开发人员(和好奇的极客)完全访问浏览器中出现的网页的内部工作方式。

4

这是屏幕抓取的 Perl 代码,在您阅读本文时可能已经损坏。本章前面已经介绍了这种方法的相对缺陷和注意事项。

5

然而,有趣的是,我的当地 BBC 广播电台的网站省略了它的传输频率。

6

日本频段的下限为 76MHz。

7

这最初存储在 CDDB,但最近存储在 FreeDB。

8

这种方法有一个主要的未解决的问题。也就是说,如果有两张光盘具有相同的指纹或同一张光盘有两个数据库条目,则不可能自动选择正确的一个。因此,人类需要通过选择其中一个选项来解开混乱。

9

RSS 目前代表真正简单的联合,但它漫长而有趣的历史意味着它并不总是这么简单。

10

“关心”是“偏执狂”的政治正确说法

七、控制中心:将一切整合在一起

Abstract

大多数人感兴趣的是特性和好处,而不是代码的细节。不幸的是,进入家庭自动化的门槛相当高,因为基本功能需要大量的基础工作。能够在video@myhome.com通过电子邮件发送视频的相对简单的过程需要准备 DNS 记录、电子邮件服务器、消息解析器、网络功能和 IR 传输。然而,现在你有了这些单独的组件,可以将它们组合成流程和功能,并对它们进行抽象,这样它们就可以在不破坏住宅功能的情况下进行升级或更改。

大多数人感兴趣的是特性和好处,而不是代码的细节。不幸的是,进入家庭自动化的门槛相当高,因为基本功能需要大量的基础工作。能够在video@myhome.com通过电子邮件发送视频的相对简单的过程需要准备 DNS 记录、电子邮件服务器、消息解析器、网络功能和 IR 传输。然而,现在你有了这些单独的组件,可以将它们组合成流程和功能,并对它们进行抽象,这样它们就可以在不破坏住宅功能的情况下进行升级或更改。

技术集成

正如我之前提到的,您的家庭技术是基于 Node0 的——或者更具体地说,是基于一个中心位置的 Linux 机器或 Raspberry Pi,它执行所有的处理和思考任务。从几个方面来看,这是您的单点故障。最明显的是,这意味着当机器离线或损坏时,你缺乏媒体控制或播放。幸运的是,作为 Linux,这种情况很少发生。但是正是 Linux 本身的标准安全模型使它最容易受到攻击。讽刺吧。

Linux 通过一组三级权限:usergroupother提供对每个文件和设备 1 的访问。此外,每个文件可以由一个用户和组指定所有权。对于标准文件和文档来说,这通常已经足够了,但是在 HA 中,您要控制由几个不同系统使用的设备。例如,/dev/dsp中的音频用于 MP3 播放、语音合成和电影播放的音轨。从这里很容易看出,应该允许几个程序和用户使用音频设备通过语音报告错误,但不允许控制整个房子的音频系统。类似地,当同一端口用于对 Arduino 重新编程或发送 IR 信号时,使用串行端口通过蓝牙备份移动电话 SIM 需要不同的权限。不幸的是,没有足够精细的控制粒度,因为唯一真正的保护是由操作系统提供的。正因为如此,你只能从整体上限制对设备的访问。您甚至不能限制对软件的访问,因为您可以简单地编写 MP3 播放脚本(或在本地目录中从源代码重新构建软件包)并以任何用户身份运行它,以避免对软件的任何限制。同样,您对设备文件的访问权限是有限的。

Note

有些发行版,比如 SELinux,为每个程序提供了明确的访问权限,允许这种级别的精细控制。然而,设置起来很费时间。

我们的解决方案,就像整本书一样,是忽略这个问题!这有两个组成部分。在第一种情况下,通过在 Linux 机器上只创建最少的本地用户(最好是一个),并只将主要用户添加到一个名为homecontrol的组中,可以简化这种情况。然后,您可以将该组的权限应用到您的每台设备。当您允许通过 web 或 SMS 界面控制该设备时,自然也必须将这些守护程序添加到组中,以便它们能够访问该设备。

Note

请记住,大多数守护进程,比如 Apache,在应用了对组成员的任何更改之后,都需要重新启动。

解决方案的第二个部分,一如既往地,涉及到这样的知识:房子里的任何人都有一定程度的物理访问和一定程度的社会强制,以防止用户像其他人一样滥用系统。

在给定的场景中,这两者都是安全性和易用性之间可接受的折衷。毕竟,大多数其他家庭成员不太可能直接使用服务器,而是通过可以应用安全性的接口(如电话或网络)使用。

茶壶:一个例子

当人们讨论我的家庭自动化系统时,一个经常出现的话题就是我的在线电茶壶。它的功能包括从网页或命令行启动煮沸的能力,并在我下班回家的第二天准备好一杯新的。从硬件层面来看,这只需要一对基本的 X10 模块——一个 CM11,计算机通过它发送信息,一个 AM12 这样的电器模块来控制茶壶的电源——但微妙之处在于软件和对细节的关注。

Note

在任何情况下,茶壶必须始终打开并插入 AM12。此外,茶壶里一定要有水,以防烧干。

从网络上制作一个 cuppa 和从命令行或其他地方触发一个是一样的。也就是说,有三个基本的命令:

  • "打开"
  • "等等"
  • “关闭”

传统上,您可以像这样实现一个脚本:

heyu turn kettle on

sleep 215

heyu turn kettle off

而且很管用!这个脚本可以在任何地方、任何时间被触发,以提供必要的功能。当然,如果直接从网页上的脚本执行,页面将需要 215 秒才能返回,并且通常会超时,因此应该在后台运行:

shell_exec("/usr/local/minerva/bin/kettle &");

下一个微妙之处来自茶壶本身的可配置性。每个茶壶在煮沸时间方面都有自己的特点,所以您为您的家庭创建一个配置文件,指示每个茶壶的 X10 地址及其各自的煮沸时间。 2 然后由主kettle脚本处理。我使用这样的配置脚本:

#!/bin/bash

DEVICE=$1

CMD=$2

# DEVICE here refers to a particular kettle, for those that need

# to differentiate between one in the bedroom, and kitchen.

if [ "$CMD" == "time" ]; then

# report the number of seconds the kettle takes to boil

echo 215

fi

if [ "$CMD" == "device" ]; then

# the x10 device

echo e3

fi

这允许我根据需要添加其他 kettles,这使得配置脚本看起来像这样:

DEVICE=$1

homedevice default on kettle.conf $DEVICE device``

sleep kettle.conf $DEVICE time``

homedevice default off kettle.conf $DEVICE device``

注意抽象的脚本homedevice,而不是heyu,我将在后面讨论。

接下来还有一个细节需要补充——一旦茶壶自动关闭,你就可以使用语音合成模块来宣布这个事实。您也可以在终端上弹出一个窗口,如下所示:

kdialog --msgbox "The kettle has boiled!"

当你下班回来时,提供一个新的煮沸是简单脚本的类似组合。在这种情况下,你需要知道茶壶烧开的时间(如前所示)和从工作到家的旅行时间。然后执行一个基本的减法,并在调用kettle脚本之前发出 sleep。所谓的剧本是一个品味的问题(没有双关语的意思)。如果您习惯于在命令行上工作,那么一个简单的脚本可以启动一个序列来唤醒茶壶、开灯等等。

当然,同样的代码可以从网页上运行,也可以在收到电子邮件时触发。

这在旅程持续时间一致的特定情况下有效,因为它适用于步行者、骑自行车者以及任何不依赖公共交通或受交通支配的人。

更复杂的解决方案也是可能的,例如,通过查看实时的列车发车板(如第六章所述),让计算机计算出你最有可能赶上哪趟列车,并在开始沸腾之前检查它的到达时间。这是留给你的一个练习!

自然地,如果你有一个快速沸腾的茶壶,可能有足够的时间从前门垫子下的压力垫传感器触发脚本,或者当蓝牙加密狗检测到你的手机当天第一次进入范围时。在这种情况下,当你走近房子,打开门,脱掉鞋子和外套的时候,茶壶已经准备好了。

密涅瓦

Minerva 是一个完整的、易于使用的家庭自动化套件。使用 Minerva,你可以让你的家变得更容易、更便宜,也更安全。有了 Minerva,您可以在任何地方使用手机或 PC 打开灯,通过电子邮件发送视频,查看安全闭路电视录像,控制中央供暖系统,等等。它是简介中概述的模块化设计目标的缩影,并且它是一个示例,说明了如何将您到目前为止学到的所有技术整合到一个统一的整体中。

Minerva 运行在 GNU/Linux(包括 Raspberry Pi)上,但存在于自己的小型生态系统中,有自己的用户列表、脚本集和功能。它依靠本机命令行工具来执行其许多任务,因此可以在几乎任何平台(智能手机、PDA、笔记本电脑或远程 PC)上运行,具有相同的功能。它还依赖于前面概述的安全模型,在该模型中,只有少数用户可以直接访问机器,希望他们通过备用界面,以便可以根据具体情况控制他们的用户凭据。

图 7-1 中有基本结构的指南。

A978-1-4302-5888-9_7_Fig1_HTML.jpg

图 7-1。

Minerva Block Diagram

概观

Minerva 系统并不是真正的软件集合。它更类似于一个协议包,每个协议为系统中的其他程序和脚本提供一个统一的接口。这允许每个脚本抽象它下面的工具,这样,例如,如果heyu变得不能支持必要的特性或者需要被替换,那么只需要替换 X10 控制脚本——而不需要替换使用它的代码。类似地,因为可以用第一章中概述的其他系统替换或补充 X10,所以有一个进一步的抽象层,以便在需要时可以使用替代方法。

系统的每个部分都有抽象和接口。Minerva 富有远见的宏伟设计旨在提供一种方式,通过这种方式,每一项家用技术都可以通过一种通用技术连接在一起。这个架构由三部分组成:输入、处理和输出。每个部分都是完全不同的,这意味着您可以从任何支持的输入管道(如 web 浏览器、遥控器或 SMS 文本消息)控制任何内务流程。

类似地,任何报告或通知可以被发送到任何可用的输出管道,其可以(或可以不)与输入相同。一个常见的例子是使用红外输入管道触发一个过程(例如打开茶壶),但通过计算机对你说话的语音输出管道接收确认。

由此可以看出,web 页面输入管道是建立在现有命令抽象之上的。此外,web 页面有自己的抽象(称为 Zinc ),因此如果您想构建一个更小的精简 web 页面(它不依赖于 WARP 系统),您可以在不替换任何代码的情况下这样做。

像最好的 Linux 软件一样,Minerva 采用了许多开放标准,并通过 GPL 发布代码,这提供了一个平台,可以包含每个用户和系统,而不会受到供应商的限制。您可以从 http://www.MinervaHome.net 到达其主页并下载页面。

Note

这里的大多数例子使用设置为 Minerva 安装目录的变量$MINBASE,默认情况下是/usr/local/minerva。为了简洁起见,省略了它。

$MINBASE下面是一个目录结构,它与大多数符合 Linux 文件系统层次标准的发行版所使用的目录结构没有什么不同。它有以下内容:

  • 在管道和设备本身的抽象之间发送和接收消息的脚本。
  • conf:个人配置数据,如外部账户、通讯录联系人等。这已经从传统的etc目录中分离出来,以允许共享和更新,而不会意外暴露这些私人信息。
  • etc:关于 Minerva 系统本身、其用户、设置及其设备的配置数据,如茶壶煮沸时间。
  • house:关于本机和室内其他机器设备的全局配置。它规定了每个特定命令应该使用哪些特定设备(如/dev/dsp/dev/dvd)。这也与 Marple(稍后介绍)一起使用,它允许从一个位置控制房子中的其他设备。
  • media:基层系统使用的任何声音、图像或文本文件,如开始语音通知的钟声或闹钟中使用的录制语音。这些通常由 sfx 实用程序调用,例如,它将okerrorend的参数翻译成minerva/media/wav目录中的相应 wave 文件。
  • 使用 Minerva 后,用户生成的所有数据都存储在这里。这包括由 Arduino 听写单元等项目生成的消息样本,在第二章的中介绍。为了与 Linux 兼容,它将来自命令本身的日志信息存储在/var/log/minerva中,以便像logrotate这样的工具可以正常使用。

安装 Minerva 需要调用基本的install.sh脚本。这会将文件复制到适当的目录,更改文件权限,并为系统生成默认用户。它还可以下载当天的天气预报和电视时间表。该脚本相当全面,因此您可以访问 CD 播放器的基于 web 的 applet,而无需明确授予 web 服务器对/dev/dsp的读/写权限。这种许可过程的缺点是潜在的漏洞被打开了。此外,英国以外的任何人都需要重新运行描述他们所在地区的更新脚本,以便 Minerva 报告准确的天气预报和电视时间表。

Linux 用户不是 HA 用户

Minerva 渴望拥有自己的生态系统,拥有独特的用户名和密码,这并不是为了它而自私;这仅仅是一个实用性的例子,因为不是每个使用该系统的人都会有(或者应该能够得到)一个基于 Linux 的账户。毕竟,您消除了大多数用户的 Linux 帐户,因为您希望用户通过更容易在细粒度级别上进行身份验证的方式来控制系统。这为您提供了一种多阶段方法:

  • 住在房子里的每个人或家庭亲戚都有一个 Minerva 账户。这为您提供了允许他们查看家庭照片、查看您正在收听的内容等选项。这也意味着他们可以使用您的服务从电视指南中检索节目或查看天气预报。
  • 住在房子里的每个人通常也会有一个 web 用户名,该用户名应该与他们的 Minerva 用户相匹配,以便为他们提供对这个输入管道的访问。他们将是 Minerva 用户总数的一部分。这使他们能够控制自己的音乐选择,并查看某些房屋统计数据。每个 web 用户都可以对各种设施进行可控制的读写认证。
  • 住在房子里的大多数人将可以访问其他输入管道,如 SMS 或电子邮件。
  • 很少用户,通常只有一个,会有一个 Linux 帐户,允许他们直接控制文件系统和用户。通常会有一个 guest 帐户允许对 Samba 文件服务器进行只读访问,这样就可以在本地播放音乐。例如,为了给电灯开关发送电子邮件,将创建其他用户,但是通过将 shell 设置为/bin/false,其他用户将无法访问这些用户。

因此,您将在 Minerva 文件系统中引入自己的只读层次结构(都与$MINBASE相关),覆盖每个用户、应用程序及其适当的权限。这里不包括每个输入管道的密码,因为这些文件必须是公共可读的,各种命令才能工作。相反,您依赖输入管道(如 web 浏览器)来存储自己的密码并验证用户。毕竟,比起您自己,您更有可能相信 Apache 在提供健壮的用户名安全性方面的经验。

首先,您可以使用如下代码行将用户添加到系统中:

addminervauser steev "Steven Goodwin"

这将为他们创建一个目录,从这里开始:

$MINBASE/etc/users/steev

保存所有用户特定的设置和数据,包括以下内容:

  • 全名
  • 个人通讯录
  • 默认 Minerva 偏好设置(如合成语音的首选风格)
  • 对各种设备的访问权限
  • 电视搜索词
  • 外部账户参考(如谷歌日历的链接)

系统中的每个应用程序都有一个特定的代码(homedevicecdplayer等)和一个保存文件的相关目录,用于确定访问权限,如r(用于读写)或rw(用于读写)。我使用rrw作为标准术语,尽管它们的意思并不直接类似,因为在 CD 播放器的情况下,读访问意味着“你能看看当前播放的曲目吗”,而读写意味着“能改变当前的曲目”您有一个简单的命令来查询该状态,通过将 1 或 0 设置为退出代码来返回 true 或 false 响应,如果指定的用户可以查询 CD 播放器的状态,则可以使用$?来检索该响应:

minuser auth steev cdplayer get r

当前支持的代码如下:

  • cdplayer
  • Bluetooth
  • system
  • mixer
  • mp3jukebox
  • photos
  • videostream
  • vlc
  • x10
  • sms

这些可以根据需要添加,无需配置,因为缺少访问文件被视为“不允许访问”

Minerva 用户

就像 Linux 有一个全能的根用户一样,在 Minerva 领域也是如此。那个用户叫做,呃,密涅瓦!尽管它不具备 root 所拥有的相同级别的操作系统控制,但它确实有责任处理任何内部(即用户不可知的)数据收集和处理。这包括每晚收集天气预报和搜索电视指南,这些都由它的update目录中的脚本处理。

公共用户

您还有一个公共用户,用于存储家庭信息,如家庭地址簿。因为除了通过管道之外,你不能与 Minerva 通信——每个管道都将你认证为用户——这主要用于存储默认数据。

设备抽象

在本书的代码示例中,我使用了标准的 Linux 工具,比如heyucdcd。然而,正如我之前概述的那样,这些工具可能(并且很可能会)在未来被其他工具取代,并且您不希望承担重写每个脚本和程序的任务。因此,您应该保证只对这些命令使用抽象。

Bearskin 是一系列命令包装器,它创建了一个公共接口来控制 Minerva 控制下的所有设备。它还在底层软件不支持的情况下维护该设备的状态。

选择的格式简单如下:

bearskin_command <device> <command> [command arguments]

设备的概念与正在讨论的协议有关,它允许您将命令传递给另一台机器进行处理。这在服务器无法物理定位在最佳位置的情况下很有用,包括第四章中给出的示例,其中计算机到 X10 网关(如 CM11)无法与其余设备通信,因为其他电器抑制了信号。它还可以包括您想要从非本地/dev/dsp设备的机器上播放音乐或者在不同的机器上控制 CD 播放器的情况。它是马普尔的一部分。因此,大多数命令都以下列内容开头:

DEVICE=$MINBIN/finddev x10 $*``

if [ $? == 0 ]; then

echo $DEVICE

exit 0;

fi

在幕后,finddev脚本通过查看$MINBASE/house/marple/x10/devlist文件来发现如何在当前机器上寻址 X10 模块,即 localhost。devlist文件可能如下所示,表示该模块已连接到/dev/ttyS0:

localhost dev /dev/ttyS0 - -

在本章后面的“Marple”一节中,您将看到它是如何与其他机器通信的。

此外,所有 Bearskin 命令都支持将init作为命令参数,这样它就可以准备临时日志文件、调整所有权权限,并在必要时启动任何守护进程。

典型的应用程序抽象

当前支持的抽象保存在$MINBASE/bin中,包括所有必要的功能。我将简要介绍这些,必要时指出其中的微妙之处:

  • homedevice:这是一个简单的抽象,它调用heyu(用于 X10 控制)来开关灯和电器以及调暗灯光。因为所有 Bearskin 命令之间的参数是统一的,所以这个调用看起来与heyu相反,使得典型的heyu turn bedroom_light on调用看起来像homedevice default on bedroom_light
  • 对于那些仍然喜欢那些闪亮的塑料光盘的人来说,这可以控制 CD 播放器(用cdcd)并使用cddb-tool包检索它的曲目列表。因为这些数据的检索可能相当慢,所以轨迹数据被临时存储在/var/log/minerva中,这样就可以用cdplayer default currentname等命令立即查询。
  • mp3player:这是一个通用的媒体播放器,它还处理 MP3 内部的 ID3 标签,例如用mp3player default artist报告当前的艺术家和专辑。它使用/var/log/minerva来存储这个信息,以及当前的进程 ID,这允许您使用mp3player default next在轨道间移动。它抽象了mplayer,同时利用mp3info来解析 ID3 标签。
  • wavplayer:这是一个简单的,主要是同步的音频播放器,用于使用play的一般房屋警报。
  • mixer:调节混音器中每个声道的相对音量,混音器的名称也已抽象化,因此可以使用用户友好的词语,如 master、cd 和 recording。它允许您将音量设置为 0 到 100%之间的相对值或绝对值,即使底层混音器应用程序不这样做。当前的实现使用aumix
  • say:这是最有趣的抽象,尽管是最简单的,因为它查询默认的声音(如果存在的话,作为名字存储在$MINBASE/etc/defaults/festvox中)并调用festival。当代表特定用户呼叫时,它使用他们自定义的语音设置。还有一个更长短语的sayfile变体,使用 Festival 更有效的--tss论点。
  • 这是一个重要的扩展,因为它的上下文是不同的。也就是说,它是用来通知房子有重要的事情发生。它通过播放提示音结束对say的呼叫,并降低可能正在播放的任何音乐的音量,然后发出通知并将音量恢复正常。由于此类消息的重要性,设备通常应不同于mp3player的设备,以防止某些系统中的音频设备冲突。 3 在最糟糕的情况下,这可能需要使用第二个声卡,或者在通常不使用音频的外部机器(如墙板)中使用声卡。wavplayer通常被配置为使用相同的设备。
  • report:产生关于列车时刻、时间、日期和日历的预格式化信息。这是一种有用的方法,可以创建一种呈现这些数据的同构方式,并消除注入攻击。
  • 这是一种通过微博网站 Twitter 发布公告的方式。这可以由家中的多个用户使用,因为它在$MINBASE/etc/users/[username]/external/twitter中为每个用户查询一组存储的凭证。
  • irsend:这是向连接的红外发射器发送预定红外遥控代码的一种方式。然后它会被范围内的任何传感器检测到。由于这个原因,大多数 IR 使能设备位于 Node0,在 node 0 中,单个发射机可以服务于所有这些设备。它接受两个参数,设备名称和需要发送的消息,并从保存在$MINBASE/etc/ir/[equipment]/codes/[command]中的文件中检索代码。该文件中的数据格式由$MINBASE/etc/ir/[equipment]/method中的名称控制。

每种情况下的<device>通常是default来表示默认输出流,这是前面提到的连接到服务器的一组设备。

Note

大多数 Bearskin 命令都是通过杀死并重启 Linux 进程来控制的。这意味着在很多情况下,你不能从一个没有发起的用户那里修改mp3player过程。也就是说,如果您使用 web 界面开始 MP3 播放,您不能使用 Cosmic 或命令行来停止音乐,除非管理用户拥有这样做的用户权限。

Monexec

Monexec 是一个脚本,由前面提到的各种 Bearskin 命令手动调用,以记录每个操作。例如,当 CD 播放器启动时,cdplayer脚本调用以下内容:

$MINBASE/bin/monexec cdplayer play

这又会调用一个脚本:

$MINBASE/conf/exec/cdplayer/play

然后这个play脚本可以执行任何可以想象的任务,比如当卧室的灯熄灭时,用 tweet 发送当前播放的曲目或使用另一个命令(比如say)来宣布“晚安”。正是由于这些原因,简单的日志文件是不够的。当然,monexec也可以记录命令。

TODO:一个成功的例子

为了巩固这些想法,你将成为一个全新模块的全新作者!它将是 TODO 应用程序,并且将是一个完整的工作示例,由 Bearskin 命令、输出管道、消息传递系统和 web applet 组成。设计是这样的,当某人执行以下操作时:

todo add steev "Take out the rubbish"

该消息将被添加到 steev 所在区域的任务列表中,并可在网页或命令行上查看,具体如下:

todo list steev

这种输出甚至可以作为早晨闹钟的一部分通过节日管道传送!

因此,首先,您需要创建一个像$MINBASE/bin/todo这样的文件,并处理基本参数:

#!/bin/bash

MINBASE=/usr/local/minerva

CMD=$1; shift

USER=$1; shift

MSG=$*

TODOFILE=$MINBASE/etc/users/$USER/todolist

if [ "$CMD" == "add" ]; then

date +"%Y-%m-%d $MSG" >> $TODOFILE

fi

if [ -f $TODOFILE ]; then

if [ "$CMD" == "list" ]; then

cat $TODOFILE

elif [ "$CMD" == "clear" ]; then

rm $TODOFILE

fi

fi

然后,您需要确保这个脚本是可执行的,并测试一会儿:

chmod ugo+x todo

(没关系,我已经为您完成了测试步骤!)

这是你完成的第一步;一旦你理解了管道,你将看到如何从其他地方添加条目到你的待办事项列表中。

水管

所有的通信都是双向的,因此自然会有输入和输出消息管道。哪个部分是输入,哪个部分是输出的概念取决于通信的方向,所以您从 Linux 服务器的角度来考虑它们,这意味着输出管道是向设备发送消息的管道,主要用于报告和错误消息,而输入管道是服务器从人那里接收的消息,以诱使它采取行动。

当前版本支持以下导管,可从命令msgconduit list中检索:

  • echo(仅输出)
  • email(进/出)
  • ir(仅输出)
  • log(仅输出)
  • sms(进/出)
  • twitter(仅输出)
  • vox(进/出)
  • weblog(仅输出)
  • winalert(仅输出)

每个管道都有一个目录层次结构,位于$MINBASE/etc/msg之下。每个目录在结构上都是相同的,并且可能不包含或包含以下目录:

  • addr:包含两个格式相同的平面文件。第一个是alias,这是一个面向 Minerva 的用户名和特定于管道的地址的列表。例如,在 SMS 管道的情况下,这将是移动电话号码。第二个是contacts,这是一个你可能想联系但不是 Minerva 用户的人的地址列表。后一个文件仅在向输出端发送消息时可用,从而允许您向您的朋友发送文本消息,但不允许他们以任何方式查询或更改您的家用电器的状态。
  • auth:这是为将来的扩展而保留的,尽管它很少被使用,因为目前大多数认证都是通过$MINBASE/etc/user/[username]层级完成的。
  • cmd:该目录包含与输入管道一起使用的命令别名列表。通过这种方式,您可以向管道发送短消息,例如“wakeup”,它反过来运行一个cmd/wakeup脚本,允许它一次执行几个命令,而无需您显式地指定它们。此外,该脚本可以执行智能上下文操作,因此像lightson这样的命令将确定您的位置并控制最合适的灯光。我将在本章后面讨论位置推断。
  • xmit:这包含一个名为cmd的文件,它通常是一个抽象 Bearksin 命令的符号链接,每当这个管道被用作输出时,这个命令处理参数列表。

现在,我将介绍每个函数的使用方法,这样您就知道如何在将来添加新的函数,并最大限度地利用它们。

回声

仅输出。

这是最容易理解的,因为它仅仅反映了当前控制台的所有输入参数。它主要用于调试管道和地址簿。

电子邮件

输入/输出。

像大多数支持输入和输出方法的管道一样,两者被大量的代码分开。对于管道的输入端,在解析传入邮件以确定它是否来自能够发送消息的人之后,邮件服务器会自动触发procmail。这将在第五章中详细介绍。

输出管道直接使用标准的mail程序。

红外遥控

仅输出。

这将调用irsend代码来确定所需的设备和协议。

记录

仅输出。

这将所有消息写入/var/log/minerva/msglog,也主要用于调试。

短信

输入/输出。

输出管道通过mxsms工作,它被符号链接到三个可能的驱动脚本之一,mxsms-gnokiimxsms-intellimxsms-txtlocal,这取决于谁提供当前的输出服务。如果采用第五章的思想,你可以让mxsms成为一个独立的脚本来考虑传输用户的优先级,并决定使用哪个服务。

对于输入,当从远程 SMS-PC 网关或通过 Gnokii(由 crontab 提供)从自定义脚本检查消息下载特定的 web 页面时,Apache 将触发代码。

推特

仅输出。

它使用tweet命令更新他们的 Twitter 状态,从而使用来自给定用户的配置信息,他们的凭证存储在$MINBASE/etc/users/[user]/external/twitter中。

声音管道

输入/输出。

在当前状态下,所有语音识别输入都来自一个单独页面上的 HTTP 请求,该请求用给定的命令触发msgrcv脚本。输出管道直接连接到 Festival 语音合成套件,该套件已经通过 Bearskin 与sayannounce进行了抽象。Vocal 输出也是一个非常好的调试管道,因为输出是可以立即访问的。

网络日志

仅输出。

这与标准记录器相同,但将其输出写入不同的文件/var/log/minerva/weblog

窗口警报

仅输出。

这将使用基本的kdialog程序在 X 窗口终端上显示消息。现有脚本导出DISPLAY变量以在当前系统上显示框,但是可以设置为网络上任何适当配置的 X Window 安装。

如果您需要它来支持 Windows 用户,那么您必须在那些机器上安装一些软件(比如 Apache)来监听传入的消息,然后一旦接收到适当的消息,就用它来触发一个小脚本。以下名为message.js的代码将使用 Windows 脚本宿主(WSH)来显示一个合适的框:

message = "";

for (i = 0; i < WScript.Arguments.length; i++) {

message += WScript.Arguments.Item(i) + " ";

}

Wscript.Echo(message);

请注意,文件扩展名很重要,因为它用于确定特定的脚本引擎。

管理管道

管道的管理很简单,因为主要工作由命令本身来处理。向系统添加导管的任务由msgconduit命令处理。该命令可以列出前面显示的现有导管,也可以添加一个新导管,如下所示:

msgconduit create newconduitname

或将新命令添加到现有管道中:

msgconduit add conduitname conduitcommand original command with arguments

Note

还有一个msginstall命令,在安装过程中自动执行。其唯一目的是创建前面列出的现有管道。你应该永远不需要调用这个。

消息传递渠道

现在已经有了一些发送和处理消息的管道,您需要进一步抽象它们,以便可以从单个脚本控制它们。这是因为每个管道都有很多共同的功能,比如地址簿查找,这些功能可以统一到一个地方。因此,您创建了两个命令:msgxmit,它将消息发送到输出管道,以及msgrcv,当输入管道接收到消息时,它由各种守护进程调用。

输出导管:传输

这些仅基于msgxmit脚本,这是一种通过一个或多个(也是逗号分隔的)管道协议将消息发送给一个或多个(逗号分隔的)用户的方法。这允许您使用这个主脚本来分隔目标地址,以及执行地址簿查找,以便每个管道驱动程序脚本只需要接受一个目标地址。

像所有命令一样,您需要一种标准化的格式。这一个将以管道、地址和消息的形式:

msgxmit sms myphonenumber "An SMS from the command line, but could be anywhere"

这避免了主题行、优先级、附件和嵌入链接的复杂性。它们可以被添加,但是只在特定的传输管道中有逻辑意义。因此,您不必尝试处理它们(或通过预处理删除它们),而是将消息直接传递给适当的驱动程序脚本。如果需要,管道可以自行决定选择基于消息的主题行。

例如,前面示例中的 SMS 传输将确定要使用 SMS 管道,并像这样调用特定的驱动程序函数:

mxsms sms 012345678 "An SMS from the command line, but could be anywhere"

命名惯例是,传输脚本总是被称为mx,后跟管道名称。

在某些情况下,涉及到两个抽象概念。例如,语音输出通过vox管道进行:

msgxmit vox default "I am talking to everyone in the house"

这将渗透到mxvox脚本中,该脚本将依次调用say:

mxvox vox default "I am talking to everyone in the house"

管道类型作为一个参数包含在每个阶段,作为健全性检查,并允许一个底层命令由多个管道使用。

为了在不改变msgxmit脚本的情况下添加新的管道,您创建了一个目录结构来详细描述它们。例如,该文件夹将详细描述 SMS 帐户凭证、地址簿别名以及我前面提到的传输消息的所有重要命令:

/usr/local/minerva/etc/msg/sms

因此,给定参数$1中的一个管道类型(或几个管道的逗号分隔列表)和一个以$2 类似分隔的地址列表,您可以用下面的代码处理它们:

SAVEIFS=$IFS

IFS=","

declare -a CONDUIT_ARRAY=($1)

shift

declare -a TO_ARRAY=($1)

shift

IFS=$SAVEIFS

MSG=$*

然后用以下代码枚举每个管道:

for CONDUIT in ${CONDUIT_ARRAY[@]}

do

CMD=$MINBASE/etc/msg/$CONDUIT/xmit/cmd

if [ -f $CMD ]; then

# existing conduit – send the message to each user

fi

done

了解管道后,您可以查阅$MINBASE/etc/msg/[conduit_name]中特定于管道的地址簿,将用户名替换为数字。使用空格分隔的列表,如下所示:

steev 012345678

teddy 012347890

如前所述,这导致特定于 SMS 的脚本只处理电话号码的规范形式,并限制了每个协议脚本的复杂性。显然,如果地址已经是它的规范形式,那么它不会出现在列表的左侧,您可以恢复到最初的输入。发送信息时,您还要检查第二个地址列表,该列表由非 Minerva 用户组成,可用于存储您的工作号码。该代码如下所示:

ADDRBOOK=$MINBASE/etc/msg/$CONDUIT/addr/alias

if [ -f $ADDRBOOK ]; then

ALIAS=grep -m 1 "^$TOADDR " $ADDRBOOK | sed "s/[ ]* //"``

if [ "$ALIAS" != "" ]; then

TOADDR=$ALIAS

fi

fi

这是一个调用驱动程序脚本并选择性地将消息细节记录到文件中的简单例子:

$CMD $CONDUIT $TOADDR $MSG

输入管道:接收消息

这使用了与传输相同的抽象原则,但方向相反。Minerva 有一个名为msgrcv的基本脚本,它处理在消息中找到的任何命令,不管消息来自哪里。然后,该脚本检查发送者是否被允许发出该命令,如果不被允许,则拒绝该命令。

Note

这个过程是系统存在不安全性的最明显的例子,因为任何 Linux 用户都能够用有效的参数调用脚本,绕过您的安全性。即使你把所有的文件都设置成只读的,对某些人来说,在本地复制或重新输入这些文件并执行命令也是轻而易举的。这也是为什么面向 Linux 的本地用户应该被禁止访问服务器的另一个原因。

接收和处理消息有各种各样的复杂性,因为每种类型的通信都是不同的,包括文本格式的使用方式和系统接收消息的方式。在第五章中,你看到了电子邮件和短信需要明显不同的代码来处理收到的信息的例子。

我的方法是让接收通信的软件在第一时间(例如 web 或电子邮件服务器)对用户进行身份验证。这些守护进程中的大多数将作为某种特权用户运行,因此不容易被滥用。除了推断发送者的面向 Minerva 的用户帐户之外,接收代码还将负责在向您的msgrcv脚本发送精简的命令之前,剥离所有不相关的消息信息(以页眉、页脚、签名等形式)。这将工作负载推到了它应该在的地方,并为所有输入管道提供了一个统一的脚本外观。

以 SMS 为例,您已经有了一个网页,只要有人向您家发送消息,就会调用该网页。该页面可能会处理输入,并使用以下代码调用接收方脚本:

$command = "/usr/local/minerva/bin/msgrcv sms ";

$command.= $_POST['from'];

$command.= " ";

$command.= $_POST['text'];

system($command);

该命令的计算结果如下所示:

msgrcv sms 012345678 bedroom on

然后,命令代码可以在$MINBASE/etc/msg/sms/addr/alias中查找电话号码,并推断出是谁发出的命令,以及他们是否被允许使用它。

从这里,您可以确定如何以统一的方式处理命令及其参数。然而,允许对整个 Linux 命令集的任意访问是非常危险的,尤其是在给定运行 web 服务器等软件的特权的情况下。正如您刚才看到的,即使是看似不起眼的 SMS 控件也需要 Apache,因此很容易受到攻击。因此,每个用户都有一个允许使用的应用程序列表,由minuser命令控制。

此外,你可以通过准备自己的别名集来一石二鸟。有些命令,像kettle,简短简单,对短信有效。其他的,例如下面的,则不是:

homedevice default on bedroom_light

因此,您将创建一个目录/usr/local/minerva/etc/msg/sms/cmd,其中包含许多带有短名称的命令脚本。例如,bedroom将执行前面给出的全部命令。您还可以创建一个名为sleepover的别名命令,该命令运行以下内容:

homedevice default off bedroom_light

homedevice default off studio_light

homedevice default off lounge_light

这将消除大量的输入,并限制命令注入攻击的范围。这也允许您添加新的 SMS 可控命令,而无需更改 web 目录中的 SMS 输入处理程序代码。

注意,在这个例子和所有其他类似的例子中,您总是像使用msgxmit一样将管道类型和地址传递给底层脚本。这样做不会影响性能,而且可以确保使用相同的管道将错误报告发送回正确的用户。

语音控制就是一个很好的例子。在第五章中,你使用 Apache 在特定网页被访问时触发单独的脚本。有了这个输入管道抽象,您可以非常简单地扩展语音输入的范围。像 SMS 一样,您创建一个简单的网页来接收每个请求并调用msgrcv。您已经创建了内容如下的voxcontrol.php:

<?php

$cmd = $HTTP_GET_VARS['cmd'];

$auth = $HTTP_GET_VARS['auth'];

if ($auth == "") {

$auth = "public";

}

system("/usr/local/minerva/bin/msgrcv vox $auth $cmd &");

?>

这导致任何存在于/usr/local/minerva/etc/msg/vox/cmd中的名为$cmd的现有命令脚本被执行,包括控制灯光(lightsonlightsoff)、混音器(mutequietnext)和状态报告(如timestatus)的典型命令。

此外,您知道写入输出的任何文本都是通过相同的管道返回的。因为这使用了vox语音输入管道,所以输出将通过语音输出管道(节日通过say)。因此,你可以通过创建像hello这样的脚本来说服计算机进行简单的对话:

# /usr/local/minerva/etc/msg/vox/cmd/hello

echo Hello

time:

# /usr/local/minerva/etc/msg/vox/cmd/time

$MINBASE=/usr/local/minerva

$MINBASE/bin/hdate

$MINBASE/bin/htime

TODO:建立管道

尽管在创建管道的过程中有许多必要的小文件和目录,但是通过一个自动生成它们的简短脚本,该过程变得更加简单,因此您只需要调用以下代码:

msgconduit create todo

您应该会看到创建的额外目录:

$MINBASE/etc/msg/todo/addr

$MINBASE/etc/msg/todo/auth

$MINBASE/etc/msg/todo/cmd

$MINBASE/etc/msg/todo/xmit

默认情况下,输出命令($MINBASE/etc/msg/todo/xmit/cmd)被符号链接到$MINBASE/bin/mxtodo。这目前是空的,没有理由为了它而改变标准,所以您可以编辑该文件来创建代码,该代码将在消息发送到 TODO 管道时运行。因为您有一个 Bearskin 命令来完成所有的处理,所以只需取出参数并将其传递给$MINBASE/bin/todo即可:

#!/bin/bash

$MINBASE=/usr/local/minerva

CONDUIT=$1; shift

USER=$1; shift

MSG=$*

$MINBASE/bin/todo add $USER $MSG

同样,您需要确保这个脚本可以执行:

chmod ugo+x /usr/local/minerva/bin/mxtodo

就这样!已经可以测试了:

msgxmit todo steev "Write the web applet for TODO"

消息中继

Minerva 还包括一个消息中继系统,每当收到新消息时,它就在不同的管道之间传递信息。这与monexec的工作方式类似,除了rlyexec总是并且仅仅是从msgrcv调用。典型的调用如下所示:

rlyexec email steev command arguments

这将触发$MINBASE/etc/users/steev/relay/email目录中的每个可执行脚本,为处理命令或消息提供充足的机会,例如,这可能包括作为 SMS 重新传输。每个脚本按字母顺序执行,并在第一个退出代码非零的脚本上停止。因此,你可以通过给目录中的每个脚本一个序列号来采用这个惯例,就像你在第五章中给你的虚拟主机排序一样。

基于时间的消息传递

一些系统的目标是智能化。毕竟,这是家庭自动化的下一个阶段。因此,能够根据某些参数(如time)来确定消息的目标,为用户带来了新的便利。

不幸的是,要做到真正准确,你需要让你所有的个人和工作日历都可以被系统访问。然后你需要理解如何解析它。这两个目标在短期内都不现实。然而,你可以对你的日常事务做一个大概的描述,因为它在大多数情况下都是例行公事。

Minerva 定时系统(MTS)位于消息传递管道之上的一层中,以确定在白天或夜晚的任何给定时间应该使用哪个管道。因此,计算机可能会发出以下警告,并确保以我可能最快收到的方式发送:

mtsxmit steev warn "Disc space is getting low on /dev/sdc1"

它通过一个两阶段的过程做到这一点,首先确定我可能在哪里,然后知道我在那里时希望如何联系。

第一部分是一系列个性化的时间表,在$MINBASE/etc/users/steev/mts中可以找到,这些时间表描述了用户在特定类型消息的给定时间可能在哪里。这一行设计文档已经为我们创建了四组变量:

  • 用户
  • 消息的类型或优先级
  • 一天中的时间

通过将它们按顺序排列,您可能已经猜出了目录结构,因为每个类别都位于另一个类别下面的目录中!优先级是mesg(标准信息性消息)warn(关于房屋硬件或软件的警告)和error(严重问题、安全问题和可能的入侵者)中的一个。

你会很高兴地知道,这一天可以确定少于 365 个单独的文件。事实上,您只需要与您拥有的日期类型一样多的文件。大多数员工会有三个工作日:工作日、周六和周日。因此,一年 240 个工作日的配置将是“起床、上班、工作、回家、睡觉”这相当于一个名为weekday的文件,可能如下所示:

! hourly

# 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23

* -- -- -- -- -- -- -- hp tr wk wk wk wk wk wk wk wk wk wk tr hp hp hp hq

MTS 使用的格式很简单,但是非常严格。第一行指示文件的格式,在本例中,是一个每小时一次的报告。第二个是评论,提醒我们(我!)的格式,而最后一行表示数据本身。

除了为每个相同的工作日创建一个文件之外,您还可以为星期六(称为星期六)和星期日(称为星期日)创建一个文件。此外,如果在某个特定的日期有特定的事情,你可以通过创建一个名为Dec25的文件来覆盖它,例如,它表明你根本不想被打扰!MTS 代码将首先寻找最具限制性的日期,并通过较低的优先级完成默认日期。完整的顺序如下:

  • 节日(圣诞节、开斋节等)
  • 具体日期(2014 年 2 月 30 日)
  • 一周中的每一天(周一、周二、…)
  • 一天的类型(周末或工作日)
  • 默认(每日调用;这个应该一直存在)

每个两个字母的代码恰好对应于一天中的一个小时,并指示您在那个时间应该在哪里。这些代码对每个用户来说都是任意的,所以让我们考虑一组相当典型的代码,以及您可能使用的协议:

  • hp =家庭,公共。使用语音合成器。
  • tr =旅行。仅限短信。
  • wk =工作。如果重要的话,发邮件或工作邮件。
  • 回家,但不要声张!使用电子邮件和短信。

可以使用如下发出的mtspick程序确定位置,其中返回一个双字符代码:

mtspick steev error

然后,您可以在一个键中查找该值,以确定消息应该如何发送(以及发送给谁)。为了允许多个接收者和协议,您为每个两个字母的代码创建一个脚本,该脚本将用户名作为输入,并输出管道协议和用户名。这也允许您考虑邮件的重要性,并改变电子邮件地址,就像我前面讨论的那样。

然后,这与原始消息组合在一起,并传递给我已经介绍过的msgxmit代码。

我们稍后将介绍一种叫做 mashmodes 的技术,它允许您在大粒度的基础上改变整个房子。例如,这允许 mts 配置文件在工作和假日时间表之间改变。

MTS 的其他用途

过程的mtspick部分接受两个参数,一个用户和一个优先级。这通常通过mtsxmit对用户隐藏。然而,它可以被重新分配以创建一些附加的自制功能。

你可以创建一个名为mixer的用户,并准备一个 crontab,这样房子的主音量会随着时间的推移而变化,在夜晚的最后几个小时自动降低,这样你就能自然入睡。同样的效果可以用来逐渐调暗卧室的灯光。

它还可以用来触发预先准备好的电子邮件,询问您是否顺利进入工作状态,如果没有收到回复,就会发出警报。

您也可以通过将代码用作节目时间表来创建自己的广播电台。这些可以控制哪个特定的 MP3 文件夹用于在白天或晚上的给定时间随机选择音乐。一些代码可能会启动 Festival 来阅读新闻和报告天气。

基于位置的消息传递

能够推断出你的位置也有它的用处,作为一种更准确地指导输出的方式。正如我们刚刚看到的,MTS 可以提供很大一部分功能。但是总有改进的空间。

我们可以获得硬件的支持,如 PIRs 或门垫压力传感器,以获得您所在房间的大致信息。如果你在楼梯上使用两个压力传感器(一个在顶部,一个在底部),那么你可以计算出行进的方向,以启用当前的音频织机,将你的音乐淹没在你能听到的地方。

如果你采用了语音识别系统,并且每个房间都有一台独立的机器,那么你可以创建一个简单的语音命令,比如here来通知服务器你的位置。

通过使用蓝牙监控软件,你可以确定信号的强度,通过实验,你有时可以用它来推断你在房子里的位置。当你有一所大房子和/或信号中有很多障碍物时,它会工作得更好,这两者都会在近和远之间产生明显的区别。

对于细粒度的基于位置的确定,RFID 标签可以用于提供更准确的细节,尽管您需要一个相当强大的标签,以便在您在房子里走动时可以自然地检测到它。一种可能的解决方案是将它们安装在鞋底或拖鞋上,这样当你走进任何一个房间时,它们都能被检测到。

最后,确定位置的最佳方法是利用您对问题的本地知识。如果请求来自 192.168.1.132 的网页,那么您可以确定它的 MAC 地址(从 DHCPD 日志中),从而确定它是哪台机器以及它的位置。此外,如果您总是在休息室使用笔记本电脑发送个人电子邮件,则将该信息构建到系统中,以便从该电子邮件帐户发送的任何消息都可以控制休息室中的设备。有时,您可以查看电子邮件标题的最后一行“Received: from ”,以确定发件人的 IP 地址,但这并不是绝对可靠的。

宇宙的

Cosmic 是一个 RF 到 PC 的网关,它使用何裕来拦截 X10 RF 发射机(如 HR10 或 SS13E)放在电力线上的 X10 信号,并触发任意一段代码。这可以是控制当前播放音乐的音量,跳过曲目,或启动定时器来帮助烹饪。这可能是将独立无线控制面板引入家中的最便宜的方法。

这种方法有两个主要问题。首先是这些设备没有反馈机制。因此,你需要设计你的界面,使得每个按钮在每次按键时都会产生噪音、语音输出或视觉提示。您有责任确保处理这些命令的服务器了解交换机的位置,以便它可以在可以听到这些反馈噪声的位置发出这些反馈噪声提示。

第二个问题与 X10 有关。因为控制信息是 X10 信号,它们也将控制相同地址上的任何灯。根据房子的大小,你可能不得不把你的 X10 地址一分为二,或者使用两个房屋代码。在前一种情况下,您可以将地址分为两组,1-8 用于正常控制灯光、茶壶和标准设备,9-16 作为第二组,不在任何设备上使用,仅由 Cosmic 使用。大多数遥控器上都有一个开关来切换这些特定的地址集,所以它们被选在这里并不是巧合。因此,该按钮被重新指定为家庭控制/宇宙控制任务切换器。

配置

假设您有八个可用的地址,这就给了您 16 个可用的按钮——这八个按钮中的每一个都有开和关。万一这些后来改变了,您可以在/etc/heyu/x10.conf文件中给它们起别名,如下所示:

ALIAS cosmic1 E9

ALIAS cosmic2 E10

ALIAS cosmic3 E11

ALIAS cosmic4 E12

ALIAS cosmic5 E13

ALIAS cosmic6 E14

ALIAS cosmic7 E15

ALIAS cosmic8 E16

您可以配置始终监控电力线的heyu守护进程,以便每当出现这些地址的消息时调用特定的命令。在默认配置中,Cosmic 将命令分为三组:

  • 媒体控制
  • 基于状态的操作
  • 状态控制

媒体控制始终是全球性的和起作用的。这是因为它们的相对重要性。它们允许您增加和减少音量,以及静音/取消静音音乐,并且它们提供了一种暂停所有当前播放媒体的方法。它们占据了标准 HR10 的顶部四个按钮(两行)。他们运行的命令都使用抽象的 Bearskin 命令,并像这样添加到x10.conf:

SCRIPT cosmic1 on :: /usr/local/minerva/bin/mixer default dec master 10

SCRIPT cosmic1 off :: /usr/local/minerva/bin/mixer default inc master 10

SCRIPT cosmic2 on :: /usr/local/minerva/bin/mixer default toggle

SCRIPT cosmic2 off :: /usr/local/minerva/bin/pmedia default

记住这些命令将由最初调用heyu engine的用户执行。因此,他们必须对音频输出和混音器设备拥有适当的访问权限,这样才能正常工作。

Note

您总是影响主宗卷,而不是单个设备宗卷。这是因为收音机、CD 或 MP3 的相对音量不会改变,唯一不准确的地方出现在单个范围的顶部和底部,即主音量。

基于状态的控制器稍微复杂一些。它由四个用于查询和更改状态的预定义按钮和八个特定于模式的按钮组成。其配置如下:

SCRIPT cosmic7 on :: /usr/local/minerva/bin/cosmic default modestatus

SCRIPT cosmic7 off :: /usr/local/minerva/bin/cosmic default nextmode

SCRIPT cosmic8 on :: /usr/local/minerva/bin/vstatus

SCRIPT cosmic8 off :: /usr/local/minerva/bin/cosmic default clear

请注意,您只能在一个方向上循环模式,因为这个顺序更容易记忆。此外,你已经使用了什么本来是一个先前的按钮重置宇宙到它的初始状态。这个modestatus报告提醒你处于周期的哪个阶段,以免你忘记,还有一个通用的状态报告来平衡各行。

这种分配是专门针对像 HR10 这样布置成两列的设备的,HR10 在左侧有“开”按钮。这允许您在左侧排列两个状态报告,并将两组全局按钮分为顶部的媒体和底部的宇宙状态。请注意,Linux 中的软件永远不会改变,只有配置会改变。

为了控制宇宙系统,你将剩余的按钮分配给任意的c1c2等命令。

SCRIPT cosmic3 on :: /usr/local/minerva/bin/cosmic default c1

SCRIPT cosmic3 off :: /usr/local/minerva/bin/cosmic default c2

SCRIPT cosmic4 on :: /usr/local/minerva/bin/cosmic default c3

SCRIPT cosmic4 off :: /usr/local/minerva/bin/cosmic default c4

SCRIPT cosmic5 on :: /usr/local/minerva/bin/cosmic default c5

SCRIPT cosmic5 off :: /usr/local/minerva/bin/cosmic default c6

SCRIPT cosmic6 on :: /usr/local/minerva/bin/cosmic default c7

SCRIPT cosmic6 off :: /usr/local/minerva/bin/cosmic default c8

如您所见,cosmic脚本在技术上是无状态的,因此您必须使用/var/log/minerva/cosmic目录来保存当前模式。

Note

因为heyu守护进程在对x10.conf进行任何更改后都需要重新启动,所以您可以通过调用像/usr/local/minerva/bin/cosmic default base1这样的脚本,将所有的宇宙脚本重定向到一个间接的形式,从而改进这个脚本的维护。

创建模式

然后你就有乐趣了(!?)设计状态及其接口的一部分。宇宙系统对可能的模式数量没有限制,也没有限制其中的指令必须如何运作。但是,建议每次按下按钮都会产生某种反馈,要么直接是因为命令的结果发生了一些事情(如开灯或播放音乐),要么间接通过听觉反馈来指示命令发生了,尽管您看不见。

每种模式都存在于自己的目录中,从$MINBASE/etc/cosmic/0开始按顺序编号。这包含了控制该模式所需的所有文件。它包括以下文件:

  • name:带有模式名称的文本文件。当您循环到模式时,会大声朗读此内容。
  • status:将该模式的状态报告写入 STDOUT 的脚本。例如,在多媒体模式的情况下,它将是当前播放的歌曲。这是在每个模式状态报告的末尾读出的。如果不存在文件,则只需重新读取模式名。
  • c1c2c3c4c5c6c7c8:这八个文件是当八个相应的命令按钮中的任何一个被按下时执行的脚本。通过以这种方式运行脚本,您可以在不重新编程x10.conf文件或重启何裕守护进程的情况下更改系统。

所有的主要工作都在这八个c1c8脚本中完成。Minerva 中有三个示例子系统:CD 播放器的媒体控制、一组状态报告和一组计时器。后一种模式使用无线控制器开始计时一个设定的时间段,例如五分钟。一旦时间到了,语音会宣布结束,几个计时器可以同时运行。

Tip

所有c1c8脚本的输出都应该写入标准输出。这样,通过将 Cosmic 中的代码改为读作REPORT=/bin/echo,可以更快(也更容易)地调试 Cosmic 配置。

敬牦牛

尽管 Cosmic 有很多好处,但它并不像一些人希望的那样广阔。于是牦牛诞生了。作为首字母缩略词,它代表“又一个 Kontrol 系统”,是一种将任意消息(来自 X10 设备)处理成 Linux 绑定命令的方法。有一系列保存在/usr/local/minerva/etc/x10/scripts/中的脚本,当按下指定控制器上的按钮时会调用这些脚本。每个控制器都位于自己的子目录中,每个按钮都有一个子目录。因此,例如,淋浴单元的控制面板上的按钮 8 将在目录中,

/usr/local/minerva/etc/x10/scripts/Shower/8

因为 X10 寻址协议不像这样用户友好,所以您还必须配置 Yaks 来将 X10 消息(比如 D9)映射到它们在这里的对等物。该信息存储在位于/usr/local/minerva/etc/x10/controls的基于代码的配置脚本中,如下所示:

$c = $config->addController(new YaksController("Keyfob", "c", 1, 8));

$c = $config->addController(new YaksController("Shower", "d", 8, 8));

Note

这种配置看起来像代码,因为它是!这个文件作为yaks程序的一部分被加载,该程序创建了$config对象,并声明了YaksController类。使用代码作为数据是一种欺骗,但是允许在配置中有更多的灵活性。

从这里,您可以看到智能钥匙占用了房屋代码“C”和从 1 到 8 的 8 个单元 id,而淋浴器正在处理房屋代码“D”,有 8 个单元编号为 8 到 16。接下来需要做的就是确保每个房屋代码和单元都在/etc/x10.conf中设置好,以触发yaks程序。

SCRIPT b1 on :: /usr/local/minerva/bin/yaks control b1 on

SCRIPT b1 off :: /usr/local/minerva/bin/yaks control b1 off

# etc

Note

如果您使用 mashmodes 向系统上传新的/etc/x10.conf文件,请记住在每个配置中包含这些行,或者在上传到 CM11 之前向每个版本添加一个cat模板。

生活方式

Mineva 里的模式系统叫 Mash,是“Minerva 自动化智能家居”的简称(不,真的!)是将整个房子置于特定状态的一种方式。你的房子一次只能存在于一个州,所以每种模式都是互斥的。mashmode 的一些示例如下:

  • 正在度假
  • 正在工作
  • 在家,正常
  • 在家,工作
  • 生病在家

因此,发出以下命令很简单:

mashmode set holiday

此外,无论是通过脚本、文本消息、电子邮件、MTS(基于时间的消息)还是网络界面触发,都可以让您的房子为您的假期做好准备。可以把它想象成家庭自动化的电子邮件自动回复器。这可能包括:

  • 更改自动照明计划
  • 在 18:00-23:00 期间随机播放音乐和电视频道
  • 给你的送奶员发短信取消牛奶
  • 通过电子邮件向家人发送节日提醒

Note

不管你的安全措施如何,公开宣布你正在度假是没有好处的。尽管关于窃贼通过监控 twitter 信息来判断其入室盗窃时间的报道基本上是杜撰的(有更简单的方法来确定某人是否在家),但没有必要感到无聊。

设置 mashmode 非常简单,因为它们由两个包含脚本的目录组成,一个在模式开始时,另一个在另一个模式取代它时。请注意,如果将假日模式替换为“工作”或“在家工作”,则没有区别。首先创建一个新的配置文件:

mashmode create holiday

这将创建前面提到的目录:

./etc/mode/holiday/onenter

./etc/mode/holiday/onexit

每个目录的处理方式完全相同,因此无论您是进入还是退出模式,都会扫描目录中的文件,并且:

  • 如果有一个x10.sched文件,它将作为一个新的时间表上传到您的 x10 设备
  • 如果有一个名为process的脚本,它将使用脚本中包含的任意命令运行该脚本
  • 如果有一个xmit目录,它会向指定方发送一条消息

第三个案例很有趣。文件名指示使用哪个管道发送消息(电子邮件、sms 等),而文件内容指示消息发送给谁以及消息。

$ cat etc/mode/holiday/onenter/xmit/sms

#mum,sis

#!/bin/bash

date +"We're off on holiday, beginning on the %dth %B"

正如您所看到的,第一行是一个注释,其中包含消息要发送到的逗号分隔的用户名。文件的其余部分是一个脚本,用于确定要发送的消息。

为了提醒您支持哪些导管,您可以使用:

msgconduit list

例行公事

例程是一系列定时事件,从特定时刻开始,与传统脚本没有什么不同。准备早晨淋浴的“唤醒”脚本示例可能是:

MINBIN=/usr/local/minerva/bin

sleep 0

$MINBIN/alarm 1

sleep 300

$MINBIN/homedevice default on bedroom

sleep 600

$MINBIN/homedevice default on shower

sleep 60

$MINBIN/homedevice default on shower_speaker

sleep 10

$MINBIN/report say shower calendar

sleep 1200

$MINBIN/say shower Hurry up

$MINBIN/homedevice default on shower_speaker

$MINBIN/homedevice default on shower

$MINBIN/homedevice default on bedroom

这是由 cron 通过几个内部计时间接触发的,以应对卧室和浴室之间的步行。不要直接写 crontab 行,如:

10 7 * * 1-5 /usr/local/minerva/bin/routine start 1

相反,最好这样写:

* * * * 1-7 /usr/local/minerva/bin/routine process

因为虽然每分钟都有更多的处理发生,但它将控制从 cron 中的(固定)脚本转移到 Minerva 的配置目录中的更动态的脚本。这允许您在例程脚本中使用可变时间,因为 cron 不支持这些。例如,你可以在日落时自动开灯,这由实用程序脚本sunset决定。

在结构上,描述例程进程的每个目录包括三个文件:

$ ls /usr/local/minerva/conf/routine/1

name normal script

name是一个单行文本描述,它是人类可读的,并在routine list上呈现

normal是触发该事件的正常时间,例如 7:00

列出偶数可以运行的日期,例如星期六、星期日。因此,您需要创建两个不同的例程来处理您的周末起床时间表和工作日起床时间表。

script是当时要运行的可执行文件

还有一个可选文件override,它(如果存在的话)在第二天使用其中的时间——并且只在第二天。第二天时间恢复“正常”。这是引入“我需要在明天 6:00 起床,而不是 7:00,参加会议”这一概念的简单方式,并且消除了大量临时的配置更改。

通过将脚本和时间从 cron 中分离出来,您还可以:

  • 从随机的sleep延迟开始,将事件延迟几分钟,让房子更有人情味。
  • 用基于时间的处理器 MTS 查看您的当前位置,并禁用/启用各种事件。
  • 查看天气,如果下雨,并且它知道你会开车,而不是走路,那就推迟你的闹钟。
  • 查看天气,如果下雪,早点叫醒你,知道你需要更多时间给窗户除霜。
  • 查看火车时刻表,如果火车晚点,就把闹钟延迟。或者如果取消了,自动给你的老板发邮件。
  • 如果检测到您已经洗过澡,则阻止该事件(例如,开始淋浴)发生。

用例可能涉及比正常情况更早或更晚地开始一些事情。因为时间不可能倒流,所以脚本应该总是在事件最早适用的时间触发,也就是最糟糕的情况,并且将事件延迟到最好的情况。这自然解决了“双重现实”的问题,6 点钟的闹钟可能会决定在 7 点钟叫醒你是可以接受的...而 7 点钟闹钟可能决定,由于环境的变化,它应该依靠 6 点钟事件来触发。

规则的已知例外(比如早期会议的例子)仍然最好使用override文件。

作为一个非常以开发人员为中心的实现,这可以很容易地从 iOS 远程应用程序重新编程,或者绑定到日历。

最后,我从我自己的洗澡程序中展示一个真实的例子!这个例程由我的“夜间”事件触发,为我准备淋浴。除了基本的照明,它还能为我读出第二天的日程安排。有趣的是,最后一点需要额外的逻辑,因为如果我在午夜后回家,那么“第二天”实际上是同一天,我们需要相应地修改流程:

# For early morning/late nights

if [ date +"%H" -le 4 ]; then

REQUEST_DAY=today

MESSAGE="Back late - I hope it was a good night. Let's talk about the morning"

else

REQUEST_DAY=tomorrow

MESSAGE="Let us talk about tomorrow"

fi

CONDUIT=vox

$MINBIN/report $CONDUIT shower echo $MESSAGE

# ... other messages here ...

$MINBIN/report $CONDUIT shower echo Let me look at the calendar

$MINBIN/report $CONDUIT shower calendar $REQUEST_DAY

$MINBIN/report $CONDUIT shower echo Checking house events

$MINBIN/report $CONDUIT shower lstatus $REQUEST_DAY

$MINBIN/report $CONDUIT shower weather $REQUEST_DAY

有薄荷味的

薄荷有两个用途。首先,它是一个超时系统,如果设备在最后一次使用后的三分钟内没有使用,它将自动关闭。其次,它是一个引用计数实用程序,以确保第一个组件智能地运行。因此,如果两个人一起开灯,那么灯会在最后一个人关灯三分钟后关闭。这在自动化的房子里是必不可少的,因为一个人可以在本地打开它,另一个人可以远程打开它,计算机可以自动打开它...这三个人在与设备互动时都希望设备是开着的。

为了方便起见,每个设备都有一个 Minty on事件和一个相应的off事件,用两个脚本描述,例如:

/usr/local/minerva/conf/minty/shower_speaker/on

/usr/local/minerva/conf/minty/shower_speaker/off

因此,当设备第一次被要求打开时,脚本minty start shower_speaker被调用,时间被记录。如果这是第一次打开淋浴扬声器,那么运行上面的脚本。如果没有,它的计数增加。一旦您使用完设备,并将其关闭(可预测地命名为minty end shower_speaker),计数就会递减,如果计数达到零,三分钟的超时开始。

因为on脚本只在第一次调用时被调用,所以您可以从许多不同的地方触发相同的事件。因此,举例来说,如果出现以下情况,淋浴器扬声器会保持开启:

  • 你在洗澡的时候放音乐
  • 听着电脑的声音阅读你的日历
  • 淋浴灯亮着

这些事件触发器中的每一个都对minty start shower_speaker进行相同的调用,所以只有当你停止在淋浴时听音乐,有人给你读你的日程表,你关掉灯,它才准备好关掉灯。

当然,如果你在三分钟内回到淋浴间,并播放更多的音乐,那么三分钟的暂停将重新开始。

通用遥控器

这是一个 iOS 应用程序 4 ,让你控制家庭自动化设置的任何部分,无论是否由 Minerva 运行。它之所以能够做到这一点,是因为远程只向 web 服务器发送 HTTP 请求,然后所有的配置都在服务器上进行。这与第三章中提到的各种通信桥接解决方案有相似之处。虽然在链中引入了额外的链接,但这并不意味着您只需要在控制客户端设备上设置该服务器的端点,包括:

  • URL(默认为 www.minervahome.net 的 Minerva 主页)
  • 端口(通常为 80)
  • 脚本(urc/echo.php)

这些被组合到 HTTP 请求中:

GEThttp://www.minervahome.com:80/urc/echo.php?command=menu.1.region.6.index.23&code=nocode

command参数详细说明了按下的具体按钮,其格式如下:

command=menu.[index].region.[icon_reference].index.[position_on_screen]

code参数也可以通过应用程序进行配置,并作为密码发送,以提供基本的安全级别。您的服务器端脚本可以根据需要选择处理(或忽略)该参数。

现在,我们将了解如何确定索引、图标参考和屏幕位置参考。

配置

因为我们已经说过应用程序是由服务器配置的,所以使用这样的配置文件是有意义的。

<homeremote>

<menu>

<button text="TV"/>

<button icon="20"/>

<button icon="19"/>

<button icon="35"/>

<button icon="36"/>

<button menu="1"/>

<button icon="0" text="Film"/>

<button icon="38"/>

<button icon="37"/>

<button icon="40"/>

<button icon="39"/>

<button menu="2"/>

... cut for brevity ...

</menu>

</homeremote>

该应用程序发出的第一个 GET 请求是对服务器 URL 根目录中一个名为“config.xml”的文件的请求。显示屏分为 6 x 6 个区域(在命令参数中,索引首先指的是屏幕上的位置),从左到右阅读,然后从上到下阅读,每个区域要么是一段文本,要么是带有图标的功能按钮,要么是到另一个菜单的链接。在这种情况下,我们的第一个菜单(称为 zero)以一行电视控制键开始,这些控制键有各种图标参考,后面是一个到菜单 1(即第二个)的链接。菜单的图标是预先确定的。

The available icons are:

| `0\. Blank` 1。省略号—保留给菜单更改 2。关闭电源 3。关闭电源 4。书标 5。混音器级别 6。电视输出 7。音乐 8。照片 9。内务管理 10。新闻或信息 | `11\. Film` `12.`照片 13。邮件 14。天气 15。CD 16。服务器(或云)上的文档 17。朋友 18。上升 19。下降 20。左侧/前一个 | `21\. Right/next` `22.`加/更 23。减去/少于 24。交叉/删除/移除 25。放大/显示/状态/信息 26。长 27。电池或电源。聊天信息或对话 29。30 号文件。播放/开始 | 31.暂停 32。停止 33。音量调低 34。静音 35。音量调高 36。倒带 37。前 38 页。下一个 39。快进 40。收藏夹 41。标签 |

Note

由于配置文件涉及到大量的打字工作,可以在 http://www.minervahome.net/homeremote.htm 下载示例文件

一旦按钮被按下,完整的 URL 就像前面提到的那样被调用。然后,您可以将命令拆分成点,并根据应用程序的具体情况解析每个点。一个示例处理脚本是这样工作的:

<?php

$cmd = $_GET['command'];

$code = $_GET['code'];

if ($code != "nocode") {

echo "Invalid code";

return;

}

preg_match('/menu\.(\d+)\.icon\.(\d+)\.index\.(\d+)/', $cmd, $match);

$menu = $match[1];

$icon = $match[2];

$index = $match[3];

$minbin = "/usr/local/minerva/bin/";

$menuActions = array();

// Main menu screen

$menuActions[0] = array(

10=>'media default next music 5',

16=>'media default next music 5',

19=>'mixer default toggle', 20=>'mixer default quiet', 21=>'mixer default loud',

25=>'weatherstatus',26=>'ldbquery get lut stp',27=>'todo list steev',28=>'getcalendar steev 1',

29=>'media default status',

30=>'media default stop', 31=>'media default toggle', 32=>'manifest default next music',

33=>'housenight', 34=>'homedevice default on bedroom',

);

// ... other menu actions here ...

$result = "Unknown command";

if (array_key_exists($menu, $menuActions)) {

if (array_key_exists($index, $menuActions[$menu])) {

$command = $menuActions[$menu][$index];

$command = $minbin.$command;

$command .= " >&1";

$output = array();

exec($command, $output);

$result = join("\n", $output);

}

}

print $result;

?>

该脚本输出的任何内容都将传递回应用程序,并显示在状态窗口中。默认的echo.php脚本将简单地重复传入的每个参数,并返回给应用程序。这有助于验证您对哪个菜单、屏幕位置和图标被按下的假设。很简单:

<?php

print_r($_GET);

?>

并且值得在开发过程中保留您自己的脚本。

网络小程序

对于大多数人来说,通过网络浏览器控制房子是次要目标(在语音识别之后,也就是!).正如我在第五章中提到的,这是 20 世纪和 21 世纪无处不在的通信手段,所以你有义务通过这样的接口提供对所有 Bearskin 命令的访问,隐藏在 SSL 和用户名和密码提供的安全性后面。

在最简单的层面上,您可以构建自己的站点来提供在服务器上执行 Bearskin 命令的链接列表。但是 web 提供了一个更丰富的画布,可以用来呈现现有命令没有提供的家庭友好特性。

除了从台式电脑或笔记本电脑控制您的家庭之外,您可能还想考虑购买新机器作为信息亭或家庭终端。这些可以是平板电脑、手机,或者带有触摸屏显示器和微型电脑的家庭酿酒机(如第八章第一节提到的树莓派,或者第四章第三节提到的 Fit-PC2 和迷你 ITX 机器)。这台机器可以根据你醒着的时间进行电源循环,并设置一个小型快速版本的 Linux,如第三章中提到的 Webconverger。例如,在厨房里有一个可以让你从网上阅读食谱,而使用触摸屏(相对于键盘和鼠标)可以更容易地控制你的手何时沾满面团。

在设计触摸屏界面时,有一些细微但重要的差异。首先,当你的指针在按钮区域上移动时,没有任何悬停控制。因此,您应该避免使用工具提示来呈现附加信息或解释按钮。此外,按钮区域本身通常需要更大,在它们之间有一些概念性的空间。例如,当你用手指控制一个面板时,你通常只能精确到 20 个像素左右,所以每个按钮的最小尺寸应该是 32 个像素。最后,使用触摸屏通常意味着没有键盘。在这种情况下,您在文本框中键入内容的能力会大大降低。有几个屏幕键盘可以解决这个问题,但由于前面给出的原因,它们需要足够大,并且具有将输入指向多个输入控件的机制。避免必须向一个或多个方向滚动的屏幕也是明智的——理想情况下,根本没有。

锌:在网络和本土之间

在你进入网页之前,还有最后一层要打开,锌。这是一个小型的服务器端代码库,它抽象了各种类型的设备,并允许通过 WARP 来控制它们。在 Minerva 的说法中,这也被称为 web 网关管道。

它由几个非常薄的包装类组成,允许 PHP 小程序代码以安全和结构化的方式进行系统调用。例如,如果你使用mp3player脚本,网页将不会完成加载,直到整个片段被播放完。如果您在后台启动它,那么任何输出(比如错误)都会出现在您的 web 页面的任意位置。这层可以防止这种情况。它还允许您通过zinc/conf/mp3player.conf中的配置文件使用备用设备名称,例如,它允许您替换 Bearskin 命令或 web 站点,而不会影响其他命令。如果没有 Zinc,从网页上正确运行mp3player所需的代码如下:

$cmd = MP3PlayerDevice::$binary." ".MP3PlayerDevice::$device;

$cmd.= " play $track";

$out = system("($cmd 2>&1 >/dev/null) >/dev/null 2>&1 &");

网页和小程序

Minerva 提供的 web 界面基于 WARP,因此允许您在一个网页上显示多个小程序。图 7-2 显示了一个典型的屏幕。

A978-1-4302-5888-9_7_Fig2_HTML.jpg

图 7-2。

Various Minerva applets all running on a single page

每个小程序都呈现为一个小的“面板”视图(如烹饪信息所示),最大化的小程序(天气)显示在整个窗口中。所有这些小程序都可以从一个页面中获得,比如由如下代码组成的wnews.php:

<?

require_once 'warp/warplib/appletmanager.inc';

require_once 'warp/applets/main/main.inc';

require_once 'warp/applets/weather/weather.inc';

require_once 'warp/applets/tvguide/tvguide.inc';

require_once 'warp/applets/photoframe/photoframe.inc';

require_once 'warp/applets/cookery/cookery.inc';

require_once 'warp/applets/ldb/ldb.inc';

include_once 'system/master_standard.conf';

$appman = new Warp_Applet_Manager();

$appman->init();

$appman->AddApplet(new Warp_Main_Applet());

$appman->AddApplet(new Warp_TVGuide_Applet());

$appman->AddApplet(new Warp_PhotoFrame_Applet());

$appman->AddApplet(new Warp_Weather_Applet());

$appman->AddApplet(new Warp_Cookery_Info_Applet("Cooking Info"));

$appman->AddApplet(new Warp_LiveDepartureBoards_Applet());

echo $appman->renderPage();

?>

您可以使用任何想要的小程序组合来构建自己的页面。这种灵活性允许您忽略某些来自本地网络之外的 IP 地址范围的小程序,甚至为机器专门创建一个页面。例如,知道您的 DHCP 服务器总是为您的厨房 PC 提供 192.168.1.140 的 IP,您可以构建一个只包含食谱和烹饪信息列表的页面。

Note

如果您通过任何形式的代理(包括路由器)访问网页,您可能无法获得正确的地址,因为服务器只能看到代理的 IP,除非代理配置了“X-Forwarded-For”标头。

在 Minerva 的 3.0 版本中,这个过程是通过浏览器工厂来实现的。如果您家里有多个类似 kiosk 的设备,您现在可以写:

$appman = getBrowser()->createManager();

$appman->init();

这段代码创建了一个特定于客户机的应用程序管理器。getBrowser方法保存在 system/browserlist.conf 中,用于将客户端 IP 转换为详细描述其功能和近似大小的特定浏览器对象。这是一个两步过程。第一个将 IP 映射到浏览器类型(例如触摸屏、PC),如下所示:

$ipaddr = getIPAddress();

$style = $_GET['WRP000X0_style'];

$dostyle = array_key_exists('WRP000X0_dostyle', $_GET) ? $_GET['WRP000X0_dostyle'] : "";

switch($ipaddr) {

case "192.168.1.132": // kitchen tablet PC (height accounts for border)

$style = STYLE_TABLET_LARGE;

break;

case "192.168.1.131": // hall-mounted iPod Touch

$style = STYLE_TABLET_SMALL;

break;

default:

$browser = $_SERVER['HTTP_USER_AGENT'];

if (strstr($browser, "iPhone")) {

$style = STYLE_TABLET_SMALL;

} else if (strstr($browser, "iPad")) {

$style = STYLE_TABLET_LARGE;

}

break;

}

第二步使用$style 参数构造对象,大小为:

switch($style) {

case STYLE_TABLET_LARGE:

return new WebBrowser(new WAM_FactoryTouch($style), 1024, 740);

case STYLE_TABLET_SMALL:

return new WebBrowser(new WAM_FactoryTouch($style), 480, 320);

case STYLE_FULL:

default:

return new WebBrowser(new WAM_Factory(STYLE_FULL));

}

在每种情况下,WAM_Factor*类指示当前要创建的 applet 管理器是Warp_Applet_Manager还是Warp_Applet_ManagerTouch,后者在界面上使用大的可点击图标而不是小图标和文本。

您可以生成几个页面,并使用主 applet 在它们之间切换,而不是使用包含所有 applet 的单个页面。这显示在图 7-3 的最大化视图中。

A978-1-4302-5888-9_7_Fig3_HTML.jpg

图 7-3。

The main applet

主 applet 有两个功能。第一个是枚举添加到该页面的 applet manager 中的每个 applet,从而提供与右边最小化的框相似的功能,但是具有更大的图形(也就是说,更适合触摸屏用户)。其二是提供一种在不同页面之间移动的方式。这些由配置文件system/master_standard.conf决定,如下所示:

<?php

class MasterBar

{

public static $automaticInclude = false;

public static function getPages()

{

return array("Multimedia"=>"wmm.php", "News"=>"wfeeds.php",

"Information"=>"wnews.php", "Life"=>"wlife.php",

"Status"=>"wstatus.php", "Administration"=>"wsystem.php");

}

public static function generate(&$appman)

{

if (self::$automaticInclude) {

return $appman->getMasterBar(getPages());

} else {

return "";

}

}

}

?>

这个细节应该很明显吧!因为您现在可以使用现有的小程序构建自己的定制页面,并使用上面的getBrowser方法根据浏览器对它们进行调整。现在,我们来看看有哪些小程序可用。

现有小程序

提供的小程序分为几大类—媒体、生活方式、信息和管理。大多数小程序使用 Bearskin 抽象,因为使用松散耦合的基于组件的开发模型的许多好处之一是许多小工具可以组合成更大的工具。这些网络小程序就是这样一个例子。这里介绍的每个 applet 都依赖于来自更简单前端的底层代码和数据。考虑到这一点,将完整地给出每个小程序的配置,从基本数据到面向 web 的页面,以便给出对整个数据流的即时理解,而不分散 Bearskin 命令、抽象、配置等子类之间的信息。

媒体

这些小程序允许您控制各种形式的媒体播放,包括 CD 播放器、音量混合器、MP3 自动点唱机、VLC 服务器和客户端,以及用于显示电视指南的前端。

CD 播放器是 Bearskin cdplayer命令的一个非常简单的抽象,它允许控制光盘,如图 7-4 所示,同时显示专辑和曲目名称。PHP applet 代码和 Bearskin 系统命令之间的桥梁由zinc/system/cdplayer.inc处理,其中zinc/conf/cdplayer.conf用于指示可执行文件的位置和要使用的设备。

A978-1-4302-5888-9_7_Fig4_HTML.jpg

图 7-4。

The server’s CD player being controlled through the web

混音器遵循与 CD 播放器相同的想法,只是调用底层 Bearskin 命令,尽管其设置和参数分别由zinc/system/mixer.inczinc/conf/mixer.conf配置。

有一个 MP3 自动点唱机,允许您浏览给定根目录下的各种目录,在初始化时设置如下:

$appman->AddApplet(new Warp_MP3Play_Applet("MP3 Player", "media/mp3"));

如果文件夹名称(第二个参数)以/开头,那么路径是文件系统的绝对路径,而相对路径(如此处所示)意味着它是相对于 web 服务器本身的(但不是相对于 Minerva 目录的)。MP3 自动点唱机既可以在服务器上播放音乐,也可以通过互联网传输到浏览器。(按照第五章中关于媒体访问的提示进行准备。)如果您想要支持流,根文件夹的考虑在这里很重要,因为它只有在 web 服务器可以访问音乐目录的情况下才能工作,也就是说,它在 Apache 根服务器目录下,比如/var/www/sites/homecontrol。为此,您可能需要为您的音乐收藏创建一个符号链接,并在配置中启用FollowSymLinks

电视指南使用 Minerva 用户每晚下载的数据。它生成一大块 PHP 代码,在$MINBASE/etc/users/public/tvresults.inc中存储未来三天内每个节目的节目信息。这可以由 Bearskin 命令解析出来,比如tvonnow defaulttvreport default public,或者由 applet 直接处理。

除了公共用户持有的所有节目列表之外,daily crontab还能够搜索用户特定的标准并生成定制的时间表。这是通过一个搜索字符串来实现的,这个搜索字符串以逗号分隔的术语列表的形式出现在一个文件中,比如$MINBASE/etc/users/[username]/tvsearch/listtvsearch目录也可能包含两个额外的文件。一个名为e-mail,是这个列表也要发送到的电子邮件地址;另一个是sms,这是一个短信电话号码的缩写。如果有问题的文件不存在,则不会发送任何消息。

添加新的电视频道需要添加不同的设置,因为指南和控制的电视配置统一到保存在$MINBASE/conf/tvconf.conf中的一组数组中。

#!/bin/bash

tuner=( a1 a1 d1 d1 a1 d1 a1 a1 d1 )

channel=( 55 0 0 0 65 0 0 59 0 )

names=( BBC1 BBC2 BBC3 BBC4 "Channel 4" "Film Four" Five ITV TMF )

stations=( bbc1 bbc2 bbc3 bbc4 ch4 film_four five itv1 tmf )

如您所见,它保存了电视卡的调谐信息(频道号以及它是使用模拟还是数字调谐器 5 ),以及电视台 ID 及其完整的可打印名称。对电台 ID 的唯一限制是它必须与用于检索电视指南数据的电台 ID 相匹配。在这种情况下,这可以从 http://bleb.org/services/tv/data/listings/0 处的列表中看出。

这些数据阵列由保存在$MINBASE/medimg/tvguide中的站点图标的网络专用数据补充。文件名存根必须与之前给定的 id 匹配,并以.png结尾,以便 applet 正确读取。此外,由于这些图标必须对网络服务器可用,因此有必要确保从网络友好目录(如warp/conf/tvguide/images)到原始文件夹的符号链接存在。默认情况下,这是由 Minerva 安装程序创建的,所以您不必担心。

这里讨论的最后一个媒体小程序支持视频流,并且是成对出现的。第一个是 VLC 流媒体小程序,允许你浏览一系列预定的文件夹(如/net/media/videos)并选择一个进行播放。这将在$MINBASE/conf/videostream.conf中指定的服务器和端口上创建一个媒体流,然后它可以被任何连接的计算机上的 VLC 客户端读取。另一半是一个客户端小程序,通过使用一个插件(当你安装了 VLC 的时候可以在火狐上使用),它可以将视频片段流式传输到浏览器窗口中。

Note

流式传输通常仅发生在本地网络上。要从外部访问它,您需要在防火墙或路由器上打开一个端口,将 VLC 端口(默认为 8080)上的流量重定向到给定的机器。

生活方式

这些小程序通常在室内和室内使用,包括一个 X10 控制面板,用于以可视方式开关电器,如图 7-5 所示。

A978-1-4302-5888-9_7_Fig5_HTML.jpg

图 7-5。

Using the web to switch your lights on or make a cuppa

由于它的复杂性,它有许多配置文件,我现在将介绍这些文件。(所有路径都相对于 Minerva 的 web 主目录。)

  • warp/conf/x10/x10.conf:控制出现在主 X10 控制图下方的情绪或场景栏。这通常包括像“所有灯关闭”和“电影心情”这样的引用您需要编写一个场景列表,以及选择相应场景时将运行的代码。
  • zinc/conf/x10floorplan.conf:包含房屋中 X10 设备的列表,以及它们各自在平面图上的楼层索引、X 和 Y 位置。这些名称必须以 Hu 格式(如 E3)或别名与设备匹配,如heyu配置文件(/etc/heyu/x10.conf中所提供的。这个文件还包含了房子里每一层的名字。
  • warp/applets/x10/img:除了灯泡和电器开关的标准 X10 图形,这个目录还应该包含平面图,存储为floor0.pngfloor1.png等。

如图 7-6 所示,该日历检索公共日历和当前用户的 Google 日历信息。这些由用户的 Minerva 目录中保存的icalgcal配置文件确定,$MINBASE/etc/users/[username]/external .ical文件被解析以寻找今天的事件,而gcal文件用于呈现外部日历文件的链接。使用的时钟是一个免费的 Java 软件,但是你可以很容易地把它改成你喜欢的任何设计。 6

A978-1-4302-5888-9_7_Fig6_HTML.jpg

图 7-6。

A calendar that extracts personal data from a public site

烹饪信息小程序非常简单,因为它是烹饪术语和基本转换单位的基本词典,每一个都是从warp/conf/cookery中的一个单独文件中加载的。如果您计划构建一个基于静态文本文件的 applet,那么这是一个很好的起点。

“联系人”小程序提供了您所有朋友和亲戚的详细信息,并且是按用户提供的。每当用户登录时,他们的联系信息就会从$MINBASE/etc/users/[username]/contacts.xml文件中读取、解析并显示在这个 applet 中。如果他们没有登录,那么您将获得属于公共用户的那些。

最后,相框小程序是 Minerva 中 web 管道所独有的。它读取来自warp/conf/photoframe/photoframe.conf的照片列表(图片本身保存在名为photos的子目录中)并一次显示一张,如图 7-7 所示。

A978-1-4302-5888-9_7_Fig7_HTML.jpg

图 7-7。

The photo frame can operate as a slide show on kiosk machines

通过点击主图像,该应用程序可以在整个浏览器窗口中工作,使其适合在机器不被用作控制面板的时候用作交互式相框。您可以使用图像左侧和右侧的热点在图像中循环,而图像的下部会使您返回到非全屏模式。互联网上有很多合适的图片,包括那些在 http://www.most-famous-paintings.org 的文化秃鹫。

信息

这些小程序提供关于真实世界的信息,这些信息在室外也是有用和有效的。这些和你的生活方式有潜在的重叠,但是现在这是足够好的区别!

Moonbeam 是一个小程序,它依靠 MySQL 来存储书签列表,每个书签都有多个标签。它类似于 http://del.icio.us ,只不过所有的数据都保存在自己的服务器上。为了准备数据库,您可以使用现有的 root 帐户运行build/applets/moonbeam/createdb.sql脚本:

$ mysql -u your_username -h your_machine_name -p < createdb.sql

然后输入您的密码来构建一个空数据库。您可以通过将相同的凭证添加到同一目录下的config.php文件中,并运行以下命令,用示例链接填充它:

php init.php

然后,您可以在conf/moonbeam/config.php将该帐户信息添加到 Moonbeam 的 web 配置中,并正常使用该小程序。如果您想创建一个备用用户来访问 Moonbeam 数据库(推荐),那么登录 MySQL 并输入以下内容:

CREATE USER 'moonbeam'@'localhost' IDENTIFIED BY 'some_pass';

GRANT SELECT on moonbeam.* TO 'moonbeam'@'localhost';

并修改 web 配置,如前面所示。因此,为了安全起见,moonbeam 用户被授予对数据库的只读权限,而真实用户(例如 steev)能够正常地通过数据库添加、更改和删除书签。

天气小程序只需读取存储在/var/log/minerva/cache/weather.txt/var/log/minerva/cache/weather_info.txt中的预先缓存的预报(由 Minerva 用户的crontab在当天早些时候做出),以寻找匹配的字符串来确定哪个图标将被绘制在页面上。

还有一个货币计算器,基于你在第六章的中看到的 http://xurrency.com web 服务。其内容主要是教育性的。

另一个 applet 仅仅包装了一个现有的 Bearskin 命令,由实时出发公告板组成。它调用$MINBASE/bin/ldbquery来确定从你预定的车站出发的下一趟列车。这里没有配置,因为ldbquery脚本从 applet 中的硬编码值接受指定为旅程的始发站和目的站的参数。

最后,RSS 新闻小程序利用news-read命令将最新的新闻故事呈现到浏览器中。每个新闻提要都由站点 ID 和用户名的唯一配对来管理,例如,它提供了一个存储在$MINBASE/etc/users/public/news/slashdot中的文件,该文件包含 RSS 提要的站点名称和 URL:

Slashdot

http://rss.slashdot.org/Slashdot/slashdot

这条新闻是按需下载的,要么用news-get public slashdot显式下载,要么用news-read slashdot public text 0 headline阅读故事时隐式下载。此时,RSS 内容被下载并存储在本地缓存中,在缓存中可以读取各种元素。如果内容相当新鲜,并且可以以文本、HTML 或声音友好的文本呈现输出,则系统足够智能,不会重新下载内容。后一种情况会删除任何标记。WARP applet 使用前面显示的news-read参数分别显示元素、标题、URL 和故事。可以在命令行中使用相同的方法,允许闹钟包含如下这样的一行,以便在早上显示标题:

$MINBASE/bin/say default (news-read slashdot public vox 0 headline´)`

管理

这些都是非常简单的小程序,可以快速查看状态日志、进程和服务器,而无需通过 SSH 登录。您将需要拥有使用这些工具的权限,因此请授予自己以下权限:

minuser auth [myusername] system set rw

此处可用的典型小程序报告以下内容:

  • 空闲磁盘空间(具体设备可以在warp/conf/diskfree/diskfree.conf中指定)
  • 浏览器的用户代理(主要用于调试)
  • 桑巴状态
  • 处理器顶部
  • UPS 状态
  • 各种日志文件
  • 蓝牙扫描仪结果

创建您自己的小程序

为了充分理解 applets 的开发方法,有必要了解一点 WARP。WARP 是一个建立在 WebFace 上的系统,它抽象了 web 设计的基本元素,以确保控制逻辑和表现元素严格分离。这意味着不可能在您的页面中添加包含以下内容的链接:

<a href="process.php?bedroom_light=on">Switch Light On</a>

但是,您必须要求 applet 管理器为您生成一个:

$html = $appMan->getAppletLink($applet, "on", "bedroom_light", "Switch Light On");

然后你会提出这样的论点:

$prm = $appMan->queryParameter($applet, "bedroom_light");

这种方法有几个好处。自然地,它迫使逻辑和显示分离,这鼓励了更结构化的代码,并且它意味着你可以把 applet 放在任何你喜欢的页面上,因为页面本身没有被提及。但更重要的是,它提供了一个简单的升级途径。WARP 是基于一种类似 RESTful 的方法。因为 HTTP 是一个无状态协议,所以没有办法从一个页面到下一个页面记住用户操作。一些网站通过使用许多不同的页面来做到这一点,其中页面本身就是状态的隐含提醒。有些会创建服务器端对象,这些对象会记住状态,只要浏览器在查看页面,或者直到任意超时。WARP 通过将状态记录为 URL 的一部分来实现这一点。由于每个页面上都有几个 applet,因此每个 applet 都必须有自己的 URL 部分来指示自己的状态。典型的 URL 可能如下所示:

http://my.minervahome.net/minerva/wmm.php?WRP001X1_user=0&WRP001X1_day=0&WRP002X3_dpage ←中

=0&WRP002X3_fpage=0&WRP004X6_current=/&WRP004X6_dpage=0&WRP004X6_fpage=0&wintype

=main&content=WRP002X&max=WRP002X

如果仔细分析,您会发现每个参数都符合 WRP 的模式,后面是三位数的 applet 代码、X 分隔符和参数索引号、下划线,然后是名称/值对。还有一些参数以wintypecontentmax的形式描述 WARP 的内部状态。自然,试图手动生成或解析这个 URL 是愚蠢的!

曲速目录

minerva/warp里面有三个目录值得注意:

  • 每个小程序的代码和资产,在它们自己的子目录中
  • conf:早期小程序的配置数据,位于同名子目录中
  • warplib:小程序和小程序管理器的基类和操作类
WebFace 的组件

WebFace 中的每个抽象都涵盖了 WARP 代码设计中的四个领域之一。可以从具有如下功能的 applet manager 中检索对每一个的引用:

  • getAuth():授权。这个模块将让您知道用户是否已经使用方法getUser登录并通过了 Apache 服务器的认证。由于 Apache 用户 ID 是手动管理的,以匹配 Minerva 用户名,因此它可以用于在网页上显示电视指南和其他特定于用户的数据。该模块还通过isUserValidFor连接到minuser代码,以提供对各种小程序的精细控制。这使得许多人可以看到当前播放的 CD 或 MP3 曲目,但只有少数特权人士可以改变它(warp/warplib/appauth.inc)。
  • getCtrl():控制。为 web 链接生成锚点;我将在本章的后面详细介绍这一点。
  • getView():视口。这用于将多个独立数据块合并到一个帧中。这里使用的比喻是窗格,因为它们组合在一起形成了窗口。默认功能允许您将这些窗口组合成水平或垂直对齐的两个、三个或四个窗格的窗口(webface/webview.inc)。
  • getDbug():调试。这是一个实用程序子模块,允许记录单个错误、警告和信息行。一旦构建了 HTML,就可以使用dumpAll写出完整的列表。这样做是因为写入网页任意部分的输出会严重破坏格式,并且在 cookies 的情况下,会阻止页面加载(webface/webdbug.inc)。
基本结构

几乎每个 applet 都以同样的方式开始,在warp/applets中有一个目录,从模板中取出一个新的 applet 类,如下所示:

<?php

require_once 'system/setup.conf';

require_once 'warp/warplib/applet.inc';

class Warp_TODO_Applet extends Warp_Applet

{

function Warp_TODO_Applet($caption = "TODO List")

{

parent::__construct($caption);

}

function getID()

{

return "MY_APP_V1A";

}

function getDirectory()

{

return "todo";

}

function init(&$appMan)

{

Warp_Applet::Init($appMan);

}

function renderPanel(&$appMan)

{

return "";

}

function renderWindow(&$appMan)

{

return "";

}

function renderInfo(&$app_man, $fast=false)

{

if ($fast) {

return "-";

}

return "Instructions...";

}

}

?>

您可以很容易地看到填充 HTML 代码以形成面板、主窗口和帮助屏幕的空白处。这些都是简单的部分。有趣的代码在init中,而迄今为止看不见的getRefreshParams控制着参数。

TODO:控制小程序

由于一切都由参数控制,您必须注意有效地使用它们。最好的方法是将GET请求视为具有两组参数。第一组反映了刷新参数,是您希望出现在 URL 中的参数,以便以后可以重建这个状态。第二组是命令参数,指示页面重新加载时该状态如何变化。

在 TODO 示例中,您的 applet 应该能够为当前用户或公众列出待办事项列表,并且可以选择按字母顺序进行排序。 7 这将最终为你提供五个潜在参数:

  • 刷新状态参数:哪个用户可见?
  • 刷新状态参数:列表排序了吗?
  • 命令参数:切换到用户 x。
  • 命令参数:排序列表。
  • 命令参数:Unsort list(又名,按顺序显示)。

这说明了下一点——这里有冗余。将刷新状态和命令参数合二为一在技术上是可能的,因为它们都控制相同的数据。但是,在构建网页时,您需要知道所有的刷新状态参数,以便页面上的其他链接具有正确的值。不幸的是,这需要做大量的工作来知道哪个状态参数将在以后被命令参数覆盖。您可以通过编写一个描述当前状态的刷新函数来简化这个过程,当其他 applet 向 applet manager 请求 URL 时,它将间接调用这个函数:

function getRefreshParams(&$appMan)

{

return

$appMan->getArgument($this, "user", $this->_viewuser)."&".

$appMan->getArgument($this, "sort", $this->_sortlist));

}

接下来,您将添加包含命令参数的链接,这些链接与您已经看到的相似:

$html = "Show: ";

$html.= $appMan->getAppletLink($this, "dosort", "0", "Chronologically")." ";

$html.= $appMan->getAppletLink($this, "dosort", "1", "Alphabetically");

$html.= "  For: ";

$html.= $appMan->getAppletLink($this, "douser", $user, $user)." ";

$html.= $appMan->getAppletLink($this, "douser", "public", "Public");

按照惯例,这些参数以do为前缀,表示它们应该改变刷新状态。即新状态=旧状态+ do 更改。applet 管理器通过从当前页面上出现的每个 applet 收集刷新参数来生成一个合适的链接,并将这些do链接附加到末尾。

当加载页面时,基于这些参数构建新的状态,并分两个阶段完成。第一个是检索刷新参数:

$this->_sortlist = $appMan->queryParameter($this, "sort", false);

$this->_viewuser = $appMan->queryParameter($this, "user", "public");

第二步是寻找任何改变这种状态的do参数:

$this->_sortlist = $appMan->queryParameter($this, "dosort", $this->_sortlist);

$this->_viewuser = $appMan->queryParameter($this, "douser", $this->_viewuser);

在这两种情况下,您都使用默认参数来覆盖 applet 第一次使用时没有任何可用参数的情况,以及没有命令参数的情况。

然后,您可以在显示 Bearskin 命令todo的输出时展示您的创造力(还记得几页前写的吗?!)并将列表写入 HTML:

exec("/usr/local/minerva/bin/todo list ".$this->_viewuser, $todolist);

if ($this->_sortlist) {

sort($todolist);

}

$html .= "<ul>";

foreach($todolist AS $item) {

$html .= "<li>$item</li>";

}

$html .= "</ul>";

为了给这些添加一层润色,您可以将 exec 调用移动到 Zinc 中,但这可以留到以后再说!

全局配置

Minerva 的 web 部分使用了少量配置文件来处理您可能采用的不同目录结构,如表 7-1 中所述。

表 7-1。

Web Configuration Directories

| 包括文件名 | 功能 | 缺省目录 | 描述 | | --- | --- | --- | --- | | `minerva.conf` | `getMinervaRoot` | `/usr/local/minerva` | 密涅瓦系统本身的基础。 | | `system/setup.conf` | `getURLRoot` | `/minerva` | Minerva web 组件使用的名称。可以进行更改,以防范试图破坏 Minerva 命名的目录中保存的任何网页的僵尸程序。 | | `system/setup.conf` | `getPathRoot` | `/var/www/sites/homecontrol` | web 根目录的文件系统路径。当您需要以常规方式访问文件时使用。 | | `system/utils.inc` | `getServerName` |   | 各不相同。如果使用虚拟服务器,请使用此选项,而不是 IP 点分四边形。 | | `system/utils.inc` | `getServerPort` |   | 80. | | `system/utils.inc` | `getRemotePort` |   | 因客户而异。 | | `system/utils.inc` | `getIPAddress` |   | 由客户决定。可能实际上是路由器的 IP。 |
小程序配置

作为 applet 编写者,您需要考虑两种不同类型的目录。第一类是用于向客户端提供 web 数据的,比如图像、配置数据或补充文件。每个 applet 类内部都有几个方法来检索它,每个方法都接受一个文件名并返回其完整路径,例如getConfFileName(取自配置目录)、getAppletFileName(applet 代码目录)和getImageURL(applet 文件夹内的图像目录)。

第二种类型的目录是指文件系统中的一个位置,用getFilesystemPathStub引用,并与相对文件名连接。实际上,任何相对的 web 路径都可以通过用WarpSetup::getPathRoot连接起来转换成文件系统路径,但是这些方法提供了一种简洁的代码编写方式。

还有一个有趣的方法叫做getRefreshTime,它使得当前网页(及其所有小程序)每 n 秒自动重新加载一次。这允许 applet 更容易地反映数据的变化,而不需要实现特定的推送协议。如果有多个小程序支持getRefreshTime,则使用最短的时间。这是使用 Ajax 的替代方法(如 Bluetooth、currency 和 recipe 小程序所示), Ajax 异步响应主服务器的请求。记住,大多数浏览器只支持两个并发的 Ajax 请求,所以它们的问题应该有一个超时间隔。

公用事业

作为 applet 管理器的一部分,包括了各种实用方法,以及单个 applet 基类本身。事实上,甚至有一些完整的类可以从派生出来,只需很少的工作就可以创建近乎完整的小程序。MP3 播放器和视频流使用的Warp_Browser_Applet,让您无需编写一行代码就可以遍历整个目录结构;您只需要重载renderFileLinerenderDirectoryLine方法来生成适当的可操作链接。此外,Warp_Static_Text_Applet可以用来选择和呈现许多给定的 HTML 文件中的一个,就像烹饪小程序演示的那样。

缓存是位于warp/warplib/appletutils.inc中的appletUtils类提供的许多实用工具之一。类似这样的代码会将$url的内容下载到本地数据文件,但前提是该文件不存在或者超过 6000 秒:

$contents = appletUtils::getContents($url, "local_data_file", 6000);

缓存内容存储在/var/log/minerva/cache中。

释放;排放;发布

如果您正在为自己开发一个 applet,那么这项工作现在已经完成了!否则,你应该打包好给别人。addminervaapplet脚本用于将新的小程序安装到正确的位置。因为一个 applet 可以有几个组件(Bearskin、WARP 和 Zinc),所以应该为每个组件创建目录,以便它与已经使用的目录相匹配。以下是 FM 收音机小程序的一个示例:

fmradio/example.php

fmradio/Readme

fmradio/version

fmradio/fmradio/bearskin/fmradio

fmradio/fmradio/install/install.sh

fmradio/fmradio/warp/app/ [contents of applet directory go here]

fmradio/fmradio/zinc/conf/ [Zinc configuration here]

fmradio/fmradio/zinc/cmd

显示

清单系统是一种以顺序模式呈现多个元素的方法,可以分别用命令stopnextmore交互终止、中断或扩展。通过研究提供的两个例子,News 和 Music,可以更好地解释这一点,这两个例子基于音频的输出是 Manifest 的典型用法。

新闻清单一次读取一个给定新闻提要的标题。如果在标题播放期间的任何时候发出more命令,则在继续播放下一个标题之前,会阅读整个故事。(在音乐清单的情况下,more命令是一个空操作,但是可以用来说出前一首曲目的标题和艺术家。)

可以使用如下简单命令调用清单:

manifest default start music 10

而且,因为当前清单是已知的,所以可以在不命名的情况下对其进行控制:

manifest default next

请注意,start命令是同步的,直到播放完所有项目后才会返回,这可能是因为没有新闻了,也可能是因为已经读取了最大数量的项目,在本例中为 10 个。

每个清单都有相同的驱动命令集,基于$MINBASE/etc/manifest下适当命名的目录。这些命令保存在文件中:

  • 这是一个可选的脚本,触发对整个清单的介绍。这可能是一个最初的“这里是新闻”类的公告。然而,清单的第一个元素不应该在这里播放。
  • onmore:这是另一个可选脚本,包含要播放的附加信息。脚本应该以错误代码 1 退出,以终止回放。
  • 这是必须的,在开始时调用一次,以启动第一条信息,并为清单中的每个元素重复。像onmore一样,它应该返回一个退出代码 1 以防止任何将来的结果。
  • 可选地,这在序列的结尾被调用,并且通常启动一个报时或授予,表明清单已经完成。无论是自然终止还是强制终止,都会发生这种情况。
  • terminate:这将终止从onnext输出中产生的任何进程。它是可选的,只有那些启动附加程序的脚本才需要,比如必须调用mp3player default stop的媒体播放器。如果不存在,就使用标准的 Linux 命令终止该进程。

Note

你可以将音乐清单连接到宇宙,以便在睡前触发几首随机歌曲或在早上阅读新闻。在前面关于例程的章节中有一些这样的例子。

默认情况下,新闻清单被编程为从 BBC 新闻网站读取头条新闻,而音乐清单将随机搜索给定的目录并播放它在那里找到的音乐。

自然地,过一会儿,同样的歌曲会重复出现(这就是伪随机性的本质),你会厌倦听到它们。因此,您可以使用以下命令防止当前播放的歌曲被再次听到,这是一件幸事:

manifest default block

或者使用以下命令阻止当前曲目目录中的任何歌曲(当目录中只有一首曲目时这很有用):

manifest default blockdir

被阻止内容的详细信息保存在/var/log/minerva/manifest/block中媒体目录结构的镜像中。

Note

如果一个文件可以通过两个不同的路径访问,系统只会阻止名称完全匹配的文件,因此您可能需要重新阻止从不同位置进行符号链接的文件。

您可以通过递归列出目录或使用以下命令,随时查看被阻止文件的列表:

manifest default blocklist

枫树

Marple 代表 Minerva 设备路由和协议引擎。这是一种机制,通过这种机制,您可以从一台机器上的命令控制一个设备,如电视卡,同时使用另一台机器上的命令和资源。这允许您在机器之间分配硬件负载,或者将命令分发到远程服务器,这些服务器服务于在其他位置无效的外围设备,特别是 X10 网关。树莓派的低成本现在使这成为一个非常现实的可能性。

您可以使用相同的机制来调用纯软件设备,如支持 WiFi 的媒体播放器和语音合成设备,使音乐能够传输到无法使用物理扬声器电缆的地方。这个系统是双向的,所以你也可以让一个远程机器发送任何命令到主服务器进行处理。

Marple 是在 Minerva 的 2.2.0 版本中引入的,现在所有当前的 Bearskin 命令都支持它,并且对用户透明地使用它。

工作

启用 Marple 的全部功能需要两个文件,这两个文件都被称为devlist,为每个已启用的 Bearskin 命令而存在。它们的格式如下:

localhost dev  /dev/dsp    -    -

default  dev  /dev/dsp    -    -

bedroom  soap 192.168.1.123  19781  localhost

各列按顺序如下:

  • 设备名:这总是任何 Bearskin 命令的第一个参数,比如cdplayer bedroom play 1中的 bedroom。
  • 协议类型:目前可能是devsoap。如果协议是dev,那么协议设备代表本地机器上的 Linux 风格的设备。如果是soap,那么设备指定要通话的机器的 IP 地址。
  • 协议设备:这表示哪个地址将用于设备。它通常是一个设备或 IP 地址(见上一条)。
  • 协议参数:结合协议设备使用。这通常是不使用的,但是在前面的例子中,它表示与 IP 地址相关联的端口号。
  • 远程设备名称:当在远程设备上执行命令时,使用这个名称而不是原来给定的名称。该参数不用于dev协议。

处理协议

例如,当用户调用cdplayer命令时(从 Web、命令行或 Cosmic ),脚本将检查位于$MINBASE/etc/devices/cdplayer/devlist的本地devlist文件,寻找第一列中匹配的设备名称。如果找不到匹配的设备名,它将读取全局devlist文件(格式相同,但位于$MINBASE/house/marple/cdplayer/devlist)并再次尝试。如果仍然找不到匹配,那么cdplayer使用原始设备名,希望它是特定于应用程序的,并且cdplayer应用程序可以理解它。

一旦找到匹配的设备名称(不管哪个文件包含它),就对该设备进行评估。在dev协议的情况下,协议参数(如/dev/dsp)被传回应用程序供立即使用。

所有其他协议,如soap,由位于$MINBASE/bin/xmit/[protocol_name]/cmd的外部命令处理。这会将新的协议信息(IP 地址和端口)与原始命令的所有参数结合起来,用远程设备名称(第 4 列)代替原始名称,并将其传递给适当的cmd脚本。用极客的话说就是:

$MARPLEPROTOCOL/cmd ${DEVARRAY[2]} ${DEVARRAY[3]} $COMMAND ${DEVARRAY[4]} $ALLARGS

然后,该命令可以向列出的服务器发出适当的网络数据包。在 SOAP 的例子中,调用minerva/marple/cmd.php来提取参数,一个全新的 Bearskin 命令如下所示:

<?php

function getCommand($cmd, $args) {

# in case someone tries exec'ing other programs, in different directories

# we'll try and stop them.

$cmd = str_replace("/", "", $cmd);

$cmd = str_replace("..", "", $cmd);

$minervaPath = "/usr/local/minerva";

$fullCommand ="$minervaPath/bin/$cmd $args";

return $fullCommand;

}

function marple($cmd, $args) {

$fullCommand = getCommand($cmd, $args);

$result = array();

exec($fullCommand, $result);

$rts = "";

foreach ( $result as $v ) {

$rts .= "$v\n";

}

return $rts;

}

$server = new SoapServer(null, array('uri' => "urn://www.minervahome.net/marple

$server->addFunction("marple");

$server->handle();

?>

注意,唯一可用的命令在/usr/local/minerva层次结构下,所有的实例都被删除以阻止恶意代码运行。

Note

如果您添加了自己的协议,但是它们没有被 IP/port 对寻址,那么您可以根据自己的需要重新分配这两列,只要您的$MARPLEPROTOCOL/cmd脚本能够理解它们。

再次使用cdplayer示例,远程机器处理一个命令,现在看起来像这样,如果它是在本地处理的话:

cdplayer localhost play 1

熊皮兼容性

为了使您自己的命令与 Marple 兼容,您需要用几行额外的代码开始您的脚本。这里有一个例子:

DEVICE=$MINBIN/finddev mixer $*´`

if [ $? == 0 ]; then

echo $DEVICE

exit 0;

fi

这段看起来相当奇怪的代码同时使用了finddev输出和它的退出代码。如果找到了设备名,但它不是用于这台机器的,则返回 0。换句话说,当发现一个真正的设备时,它已经发送了一个 SOAP 请求或类似的请求和 1。后者更常见,最终成为/dev/dsp或类似。就命令脚本而言,这是所有必需的。

额外的工作来自于创建一个本地devlist。但是每一个都是其他的翻版。也就是说,应该创建一个名为$MINBASE/etc/devices/new_app_name/devlist的文件,如下所示,用一个适合你的应用程序的设备替换/dev/dvd:

localhost dev  /dev/dvd   -    -

default dev   /dev/dvd   -    -

注意本地devlist文件应该总是包含一个defaultlocalhost引用。这确保了每个查询都可以终止,并阻止递归循环的发生。

Note

一些低级软件,如 CD 播放器程序cdcd,需要设置$HOME才能运行程序。这要求负责处理 SOAP 请求的机器添加这一行额外的代码,有时还要在www-data用户的主目录中准备一个.cdcdrc文件。

实用程序脚本

快速浏览一下$MINBASE/bin目录会发现一些还没有涉及到的命令。这些工具分为状态工具和用户工具。

状态

这些是最容易考虑的,并且是执行只读任务以报告系统的各种元素的基本脚本。由于架构的原因,这通常不比读取/var/log/minerva目录中的文本文件或查询现有命令更复杂。

除了vstatus之外,每个状态命令都将其报告发布到标准输出流。通过这种方式,它可以直接合并到 web 页面输出中,或者通过管道传输到announce:

  • netstatus:调用用户工具$MINBASE/bin/ipcheck来确定除了本地 web 服务器之外,外部网络是否可用。因为ipcheck是同步的,这可能需要一段时间,尤其是在没有可用互联网的情况下。
  • lstatus:生活状态,汇报今天一般应该发生的事情。例如,“今晚清空垃圾箱。”这是一条内部消息,因此会出现在每个人的状态报告中。它还接受一个(可选)参数来表示一周中的某一天(0 表示星期日,1 表示星期一,依此类推)或“明天”。
  • weatherstatus:之前用∼minerva/update/weather下载处理过的天气预报的简单回显。
  • 当前播放媒体的报告,包括 MP3 和 CD,详细描述已知的艺术家和专辑。
  • 所有早期的报告被合并成一个,连同时间和日期,使它成为一个信息报警电话。
  • tvonnow:提供当前正在播放的电视节目列表。该列表每晚被下载并存储在本地,其中该代码仅在当前时间段中取出那些节目。
  • vstatus:一个status的包装器,用announce以口语的形式呈现所有的信息,意思是在整个短语的开头和结尾有一个单一的谐音,而不是在每个单独的报告之间有一个。

可变常数

虽然电脑是非常死板的设备,但现实生活却不是。“唯一不变的是变化”这句格言是对的。因此,正如我们看到的,当使用routine代码来改变我们的闹钟呼叫时,有一些工具可以帮助解决那些总是发生的事情...但我们只是不知道它们何时发生。

  • easter:一个简短的脚本,以31 March 2013的形式计算当前年份复活节的日期。如果复活节已经过去了(可以通过传递单个参数ispassed来确定),您可以确定下一年的日期并调用easter $((date +%Y´ + 1))`
  • sunrise:日出的时间,在你当前的位置,形式为06:35。这有利于影响房子周围的灯光,尤其是如果你的工作意味着你要在日出前起床,并且希望你的灯光在早上自然变亮。您可以在/usr/local/minerva/etc/location.inc文件中用经纬度坐标指定您的位置。
  • sunset:日出的反义词,很明显,和你现在的位置指定在同一个文件里。

用户工具

正如我多次提到的,自动化房屋和智能家居之间的区别在于细微之处和额外的东西,让人惊叹不已这些工具通常属于这一类别:

  • hdate:以自然、人性化的方式报告日期,比如用Tuesday the 15th of December 2009代替Tue Dec 15 10:40:03 GMT 2009。这不仅使它对用户友好,也对机器友好,因为输出可以被送到语音处理器,在那里你会得到更好的声音,因为它比计算机化的形式更好地理解如何说出单词和句子。
  • 这是一个简单的关机脚本,用于让房子进入睡眠状态。默认脚本会说“晚安”并关闭一组预设的灯。你可能想扩展它来发送关机信息到备用电脑(如第四章中的所示)或者启动通宵下载脚本。
  • htime:以自然、人性化的方式报告时间,就像hdate报告日期一样。
  • vtime:这产生了一个使用零碎样本的时间的声音版本,如第五章所述。
  • ipcheck:这将对$MINBASE/etc/ipcheck.conf中列出的每个网站进行 pings 操作,以确定整个互联网当前是否可用。
  • 这是一个实用程序脚本,可以暂停当前正在播放的任何媒体设备,比如 MP3 和 CD。如果介质已经暂停,它会继续暂停。这是一个有用的紧急切断命令,特别是当你试图听房子里其他人在说什么时,通过 Cosmic 远程发出。 8
  • timedscale:这个阻塞脚本反复调用一个给定的命令,随时间缩放输入参数。因此,像timedscale 0 100 60 homedevice default dim e3这样的调用将在接下来的 60 秒内将光输出从 0 改变到 100,方法是将缩放后的数字附加到命令的末尾。当程序不将值作为最终参数时,您将需要创建一个小的包装器脚本来重新排列参数。

拓扑思想

每个房子都不一样。在很大程度上,运行它所需的网络和布线配置也是如此。我现在将介绍几个标准配置作为灵感。

建立关系网

图 7-8 显示了最简单的网络。它使用现成的路由器来隐藏本地地址范围(如 192.168.1.x)上的 Node0 服务器和其他机器。然后,路由器被配置为打开特定的端口,将这些请求重定向到主服务器或网络上适当的其他机器。额外的机器可以是膝上型电脑、媒体主机或辅助管理机器,如文件服务器。

A978-1-4302-5888-9_7_Fig8_HTML.jpg

图 7-8。

A simple network configuration

这使您可以将路由器重新用作网络交换机,并使用只有一个网络端口的服务器,如市场上大多数小型低功耗微型电脑。如果这种配置太受限制,比如当你想使用 Linux 作为路由器本身时,那么你可以采用如图 7-9 所示的配置。在这种设置下,您需要两个网卡和一个独立的网络交换机。

A978-1-4302-5888-9_7_Fig9_HTML.jpg

图 7-9。

Using a Linux server to separate the two network domains

在任一种情况下,您都使用远程服务器(如位于数据中心的托管服务器或虚拟机)来接受和处理所有流量,从而隐藏您的家庭计算机的身份。

A978-1-4302-5888-9_7_Fig10_HTML.jpg

图 7-10。

Using an external server

布线织机

每个房间都可以接入媒体的全屋音频和视频可以通过两种主要方式之一实现。第一种是在每个房间里使用小型个人电脑,连接到网络,在本地解码音频。这更容易升级,并允许音频和视频数据以很小的努力在本地传输和控制。然而,由于每个房间都需要硬件,所以价格昂贵。在观看或收听时,如果您想在房间之间移动,也不方便,因为您必须手动重新启动它。 9

分发 AV 数据最便宜的方法是将电缆连接到每个房间。这涉及到放大器和开关的组合,如图 7-11 所示。

A978-1-4302-5888-9_7_Fig11_HTML.jpg

图 7-11。

A simple AV distribution network

在所有情况下,根据您的需要,AV 的通称是指音频和/或视频数据。你会注意到楼上房间之间的分配更容易,因为电缆可以上到阁楼,以任何随意的方式穿过阁楼空间,然后下到其他房间。这里有一套单独的 AV 电缆在楼下,完全控制着客厅。

这种设置的主要限制是来自 Node0 服务器的单个 AV 通道,这意味着没有保存在 Node0 上的任何媒体都不能在其他地方分发或使用。例如,PVR 只能在客厅里控制和观看。这在图 7-12 中解决。

A978-1-4302-5888-9_7_Fig12_HTML.jpg

图 7-12。

Placing all the AV in Node0

在这种环境下,所有的 AV 设备都物理地放置在 Node0 内,这使得电缆布线较短,并且易于安装 IR 发射器。并且仍然只有一根 AV 电缆铺设到需要媒体的每个房间中。这既是一个好处,因为安装要便宜得多,也是一个障碍,因为每个房间只能体验相同的媒体。这可以通过矩阵切换器来解决,如图 7-13 所示,它允许将任何输入发送到任何房间。

A978-1-4302-5888-9_7_Fig13_HTML.jpg

图 7-13。

The benefits of a matrix switcher

请注意,在所有情况下,特定放大器的位置将由放大器本身决定。一些提供两个电源输出,允许所有扬声器都是无源的(即不供电),而另一些只提供一个线路输出电平,需要为安装它们的每个房间增加一个放大器(和电源插座)。

结论

正如你在使用茶壶的例子中所看到的,智能自动化一个房子需要的软件相对较少。一旦您可以处理收到的电子邮件或文本消息并发出 X10 命令,那么“给你的茶壶发电子邮件”的任务就变成了一件简单的事情,将两个脚本组合成一个微不足道的(几乎是平庸的!)时尚。下一个层次的兴趣来自于可用性特征和功能的特殊性。可用性是只有在使用配置一段时间后才能添加的东西——让 Festival 使用语音合成来说“茶壶已经烧开了”是一个简单的技术变化,但它是如此独特具体,只有生活在该环境中的极客才能如此轻松准确地实现它。充分利用这个机会。

Footnotes 1

因为每个设备也是一个文件。

2

当水少的时候,大多数水壶的沸腾时间会缩短,所以根据经验用一个装满水的茶壶来测试沸腾时间。

3

请务必确定您的声卡(及其驱动程序)是否允许您同时播放多个应用程序的音频。

4

http://itunes.apple.com/us/app/universal-remote-control/id538062489?ls=1&mt=8

5

模拟电视传输在英国和其他国家几乎已经绝迹,因此这种功能将很快效仿。

6

http://toki-woki.net/p/scroll-clockhttp://sgxengine.com/examples/clockface/html5/default.htm 的 HTML5 时钟

7

要从待办事项列表中正确删除条目,您需要锁定文件,以防两个人同时尝试删除时文件被破坏。我有一个真正了不起的解决方案,这个范围太窄了!

8

每个房间都有音乐会增加环境噪音,让别人更难听到你的声音,所以这些命令可以解决我们制造的问题。

9

管理这一点的软件目前很少甚至不存在。

八、树莓派

Abstract

图 8-1 中展示了树莓派的全部荣耀,它是计算领域的现代奇迹之一——一台信用卡大小的单板计算机,能够运行 Linux 及其应用程序,并能够处理高清视频的回放。它于 2012 年 2 月 29 日推出,现在已经发布了三个不同的版本,目前的两个版本是型号 A (256 兆字节,带 USB)和型号 B (512 兆字节,带 2 个 USB 和以太网)。为了额外的 10 美元,没有理由不考虑 B 型车!这两款机器都不附带电源、Shell、键盘、鼠标或任何使其工作的必要物品(这为用户提供了第一剂教育!),所以它是尽可能便宜。

图 8-1 中展示了树莓派的全部荣耀,它是计算领域的现代奇迹之一——一台信用卡大小的单板计算机,能够运行 Linux 及其应用程序,并能够处理高清视频的回放。它于 2012 年 2 月 29 日推出,现在已经发布了三个不同的版本,目前的两个版本是型号 A (256 兆字节,带 USB)和型号 B (512 兆字节,带 2 个 USB 和以太网)。为了额外的 10 美元,没有理由不考虑 B 型车!这两款机器都不附带电源、Shell、键盘、鼠标或任何使其工作的必要物品(这为用户提供了第一剂教育!),所以它是尽可能便宜。

A978-1-4302-5888-9_8_Fig1_HTML.jpg

图 8-1。

The barebones Raspberry Pi, at 85.6 x 56.0 x 21.0mm

公顷内的树莓派

对许多人来说,树莓派是一种小巧、廉价的 Linux 机器。但是,仅仅从这些方面考虑这个问题是没有意义的。当宽带第一次被引入时,人们认为它是“一种快速拨号服务”,有一个很好的好处就是一直在线,仅此而已。事实上,永久连接改变了每个人使用互联网的方式。拥有家庭服务器,以及随之而来的 HA,第一次成为一种可行的可能性,允许人们拥有一个私有的数据存储和控制系统。同样,拥有一台这么小的电脑并不是在你的桌子上有更多空间的问题,而是能够自动化设备的问题,否则如果有一台全尺寸的机器连接到它,使用起来会变得很麻烦。同样,拥有这么便宜的设备意味着你可以进行更多的实验,自动化更多(也更深奥)的设备。

明显的好处

尽管我在上一段有所评论,但小而便宜确实有它的好处。大小允许我们将它连接到其他设备和其他地方。令人惊讶的是,一个树莓派可以装进一个电灯开关!因为 HA 的计划是移除旧的手动技术,例如灯开关,这意味着您可以重新使用开关曾经用于 Raspberry Pi 和一些附加组件的孔。对于网络摄像头、 1 等外围设备来说尤其如此,这些都是需要复杂软件驱动程序才能工作的哑技术。如果你愿意,你可以使用 SimpleCV 在你书房或书房的开关上添加人脸识别功能,并以这种方式限制访问!或者,通过增加一个小屏幕,您可以将交换机变成一个会议或 VOIP 终端。

Note

对于钱多的人来说,把每个墙壁开关换成 iPod Touch 或者 Android 平板电脑也能达到同样的效果!

同样值得考虑的是,树莓派比任何现成的小工具更容易破解,也更便宜。在过去,开发人员会花几个月的时间对一个 35 美元的小工具进行逆向工程,只是为了增加一个功能或让它运行某个版本的 Linux 或 BSD。现在,由于树莓 Pi 的成本相同,几乎没有必要做这项工作,因为树莓 Pi 可以通过最少的硬件和突出的软件成为小工具——这些软件大部分已经可用,并在开源许可证下发布。

走向完全的地方控制

树莓派的价格意味着在家里的每个房间都有一台(或两台)电脑不再是不合理的。更重要的是,因为它比 Arduino 更强大,它可以用作媒体流和控制系统,特别是当它运行 Linux 时,因此能够使用所有传统的 Linux 软件来完成这些任务。

如前所述,Raspberry Pi 可以安装在灯开关内,因此您可以用“软”开关取代“硬”开关,电流通过“硬”开关来控制灯。在高可用性环境中,这意味着交换机不(直接)控制电流。相反,交换机连接到 Raspberry Pi,后者依次向 Node0 发送打开/关闭消息。Node0 接收该消息,对其进行解释,并向灯发送适当的控制信号。如果灯在 X10 上,或者是一个色调灯泡,那么我们已经看到的命令可以控制灯。但是,您也可以自己实现一个类似的系统,方法是将 Raspberry Pi 的 GPIO 连接到一个继电器,继电器反过来用灯泡控制现有的电路。图 8-2 中的电路在这里很有用,尽管 Raspberry Pi GPIO 接口的更多细节将在后面讨论。

A978-1-4302-5888-9_8_Fig2_HTML.jpg

图 8-2。

A method to control a relay from a Raspberry Pi

Raspberry Pi 的低功耗要求使得软开关变得非常简单,因此为了保持低能耗,建议使用单独的 led 作为状态灯,而不是耗电(且昂贵)的显示器。然后由您决定是否为交换机添加 USB 充电站...或者一个扬声器...

社区的快乐

通过在主板成本上节省大量资金,开发人员可以花时间帮助其他开发人员。除了 Arduino,Raspberry Pi 可能拥有目前市场上任何一款硬件的最大社区。除了官方论坛( http://www.raspberrypi.org/phpBB3/index.php )之外,在 Element14 ( http://www.element14.com )上还有一个(通常更技术性的)论坛,它是法内尔的一部分。

Tip

如果你在寻找更详细的社区支持,那就避开官方的 Raspberry Pi 论坛,使用 Element14 上的论坛——尽管注册过程很麻烦而且没有必要!正如帖子 http://www.element14.com/community/thread/19436 所显示的,当对话没有提出基金会的理想时,人们会被禁止进入官方网站,帖子也会被删除,这可能会妨碍你找到问题的答案,甚至无法证明此类问题的存在。

案例设计是 Raspberry Pi 社区聚集在一起讨论想法的另一个领域。这对于那些没有螺丝孔的旧主板来说尤其重要。箱子由乐高、旧游戏机和纸制成。甚至出现了铝制的专业版本,几个 kickstarter 项目也提供了一个案例。虽然目前还没有正式的案件,皮鲍颜色案件目前正在挑选了很多球迷。

Caution

并非所有预建的机箱都提供 GPIO 引脚,这是与自制外设接口所必需的,所以要注意。

缺点

当然,如果树莓派是完美的,我们就不需要发明更多的电脑了。永远不会。然而,除了它缺乏完成现代任务的能力(即使是语音合成也仅限于一种简化得多、听起来不那么令人愉快的算法),还有一些问题限制了 Raspberry Pi 的使用范围。这些问题是否重要将取决于您的用例。

要提出的第一点是,您不能使用 PXE 或类似技术通过网络进行引导。因此,你总是需要一个 SD 卡或者(不太常见的)一个连接的硬盘。所以,如果你打算把树莓派放在一个密闭的空间里,请记住 SD 会比 Shell 更突出。

物理安装设备时的另一个注意事项是,电源是通过 USB 导线连接的,这将使总尺寸增加几毫米,复合电缆、以太网插头等也是如此。树莓派更常见的尺寸实际上是 175.0 x 85.0 x 25.0mm 毫米,如图 8-3 所示。

A978-1-4302-5888-9_8_Fig3_HTML.jpg

图 8-3。

The effective size of a Raspberry Pi, without bending the cables excessively

此外,谈到安装,记得购买版本 2 板,因为这些是第一个有安装孔,所以他们可以固定到案件和附加到任意设备,使用这两个孔。 2

正如你可能注意到的,没有开关。考虑到它消耗的电流量,这对大多数人来说可能并不重要。事实上,让 NSLU2 或迷你 ITX 解决电源开关问题所需的技巧可能意味着这是一个明智的选择。然而,如果你认为你需要这样一个按钮,你必须手动将它插入 USB 电缆。

另一个缺失的元素是实时时钟。如果没有的话,你每次插上电源都必须手动设置时钟。这意味着,如果您不重新编程时间,或者重新编程不正确,日志文件和文件戳可能会陷入混乱。通常,时钟电路由一个谐振器或晶体和备用电池组成,以在机器关闭时保留时间和日期。然而,这被认为是过多的额外电路,因此在设计中被省略。因此,任何需要了解时间或日期(包括任何可能记录数据的内容)的解决方案都需要将时钟与网络时间服务器(NTP)同步,使其永久保持开启,或者购买/构建一个外部 USB 时钟,如 http://ahsoftware.de/usb-rtc 的时钟。对于基于软件的解决方案,您可以编写一个简短的脚本,在日志文件中查找最近的日期,并使用它。从人类的角度来看,时间可能是错误的,但是,由于日期戳是连续的,机器不会造成问题。

在考虑底层硬件含义时,请注意,如果没有 NDA,Broadcom BCM2835 芯片(完成所有主要工作)的完整文档将无法获得。大多数人会乐于在更高层次上使用它,甚至是编程 GPIO,或者从内核源代码开始工作。但是,如果你希望了解 SoC 的内部工作原理,或者想要调查驱动因素,那么你就不太走运了,你应该寻找完全开放的选项。 3

从接口的角度来看,缺少 VGA 端口是大多数人关心的问题。虽然 Raspberry Pi foundation 认为 VGA 是一项过时的技术,但现实是,有许多不错的显示器不支持 HDMI,因此需要您购买单独的转换器。当寻找小型显示器时,这个问题变得更加突出,因为 HDMI 的小型版本非常少,而且(到目前为止)没有明确的兼容性列表。(树莓 Pi 上的 HDMI 似乎比台式机上的 HDMI 有更糟糕的兼容性问题。)因此,你可能会被迫使用复合视频来利用小显示器,此时你使用的是比 VGA 更老的技术,而且视觉质量更差。其他视觉连接包括 Kindle(需要越狱和终端模拟器,如 http://www.ponnuki.net/2012/09/kindleberry-pi 所述)、iPad(只需使用标准终端模拟器),甚至现有的数码相框( http://www.cjb.im/2012/06/raspberry-pi-wireless-display-using.html )。

Caution

如果没有正确检测到您的 HDMI 设备,您将需要编辑/boot/config.txt文件,以包含明确定义它的参数。这显示为两行,如hdmi_group=1hdmi_drive=2,参数指示 HDMI 的类型(CEA 或 DMT)和分辨率。 http://www.raspberrypi.org/phpBB3/viewtopic.php?f=26&t=5851 都有描述。

Raspberry Pi 最大的问题似乎是 USB 堆栈的实现,硬件和软件都有问题。虽然情况正在改善,但任何需要 USB 成为“关键任务”的东西都可能需要重新设计。不幸的是,这包括通过 USB 提供的以太网。(这也是为什么你不能在 Raspberry Pi 上安装千兆以太网——你受到基本 USB 端口速度的限制。)

在撰写本文时,USB 问题还没有完全解决,但症结就在于此。Broadcom 芯片内部处理 USB 端口的硬件组件不是特别好,试图驯服它的驱动程序(dwc_otg)存在一些问题,如果收到 NAK 数据包,处理器就会中断。此时(但似乎只是部分时间), USB 堆栈的硬件部分重新发送一个入站数据包...这产生了另一个 NAK 包…导致了处理器的另一个中断。诸如此类。这很快会导致中断级联问题,可能会导致 Raspberry Pi 在大约 20 秒内不可用。关于这个话题的有趣讨论,以及为什么树莓派在空闲时每秒有 8000 次中断,线程在 http://www.raspberrypi.org/phpBB3/viewtopic.php?f=28&t=7866&start=111 仍然是打开的。

解决这个问题的一个办法是完全禁用 USB:

echo 1 > /sys/devices/platform/bcm2708_usb/bussuspend

自然,这就妨碍了键盘的工作。由于以太网也是通过 USB 控制的,这意味着您无法远程控制它来与外界通信。通过 GPIO 连接键盘或类似设备是可能的,但是这种电路超出了本书的范围。网上也有一些关于树莓派(A 型)是否避免了这个问题,或者它是否没有经常被目睹的讨论。一个帖子,比官方的更详细,可以在 http://www.element14.com/community/thread/18568 找到。

典型项目

互联网上充斥着对树莓派的使用;以至于很多人可能会认为这是一个寻找问题的解决方案!这是标准行为。对于任何新技术,总会有人喊“我能在 PI 上做 X 吗”,其中 X 等同于他们想在另一台机器上做的任何任务。我们现在将考虑这些项目中的一些,以及它们如何实现,但更重要的是,涵盖更多可能的项目,因为 Raspberry Pi 足够便宜,或足够小,允许这样的想法实现。

电话

手机和互联网的广泛使用改变了许多行业。有些,比如邮政服务,继续主张征收“电子邮件税”来补充他们垂死的商业模式。其他公司,如电信公司,正在寻找新的方式来销售他们现有的服务,在这个世界上,互联网供应商可以在大多数领域削弱他们。一个显而易见的领域是 IP 语音,在这个领域,传统的电话可以通过互联网,而不是固定电话,几乎不需要任何费用。事实上,您甚至可以使用一个“尽您所能”的数据包在手机上运行 Skype,从而绕过移动服务提供商的电话费!

对于那些对 VOIP 解决方案感兴趣的人来说,你可以通过将树莓 Pi 放在电话桌的抽屉里来利用它的小尺寸(对于那些仍然有这样东西的人来说!).然后可以加载 Asterisk 或其他 PBX 软件,以提供与另一个基于 VOIP 的内部通话系统一样有效的内部电话系统。放在这个位置的一个树莓 Pi 也提供了一个合适的借口,把它当做你手机的充电和同步站。当你回家时,你的手机可以放在连接 Raspberry Pi 的底座上,当天的照片可以自动复制(即备份)到你的家庭网络服务器上。

儿童看护

树莓派的大小也让你有机会在泰迪熊里安装一个,为孩子们提供一个舒适的故事讲述设备,同时通过使用基本的网络摄像头和麦克风组合,在他们上床睡觉后充当儿童安全监控器。这可以双向工作,包括 VOIP 功能,所有数据通过以太网或单独的 WiFi 板传输。有一个 Raspberry Pi 认可的相机模块正在开发中,在你读到这篇文章的时候应该已经准备好了。

这种模型的构造很简单。“睡前熊”是最好的,因为它们基本上没有填充物,因为孩子打算把他们的睡衣放在里面。然而,除了睡衣,你还可以用树莓酱来填充小熊!这是唯一可能的项目之一,因为 Raspberry Pi 足够小。以至于,事实上,你需要添加一些填料,因为大多数熊都足够大,可以带一个盒装的树莓派,一个电池组和各种外围设备!

因为它是由织物制成的,所以没有简单的方法将树莓派板拧入熊中,所以在熊的内部缝一个小口袋,将树莓派(在箱子或防静电袋中)插入其中,并穿孔,以便电缆进出袋子。

英国电视儿童系列节目《天线宝宝》中的泰迪熊肚子里有电视显示屏。你也可以复制这个。或者包括一个微型投影仪,在他们房间的天花板上给孩子们放映卡通片。根据二维码或 RFID 或 NFC 传感器检测到的熊在房间中的位置,可能会有不同的漫画。

ToyTalk ( http://www.toytalk.com )最近开始研究现代的泰迪·鲁斯宾,它可以通过故事和歌曲与你的孩子互动,所以,和 Kinectimals 一起,你应该能为你的虚拟儿童看护者找到许多好主意。

如果你的孩子比较大,那么也许把这样的照看孩子的设施建在一个街机游戏柜里比建一个玩具熊更好!

相框

树莓派的低成本也意味着其他家用设备的制造商不得不提高产品档次,降低价格。一个高质量的数码相框曾经非常昂贵。现在,只需一个树莓派和一个便宜的显示器,您就可以改进市场上最好的产品,提供带有图像、视频和声音剪辑的幻灯片。

从软件的角度来看,这再简单不过了。你甚至可以使用标准的屏幕保护程序,或者 OpenElec 或 XBMC 的幻灯片功能。如果你不想要基于网络的解决方案(除非你想要增加无线板或运行以太网电缆的额外成本,否则没有理由将它连接到网络上),还有许多其他的解决方案——eog(https://help.gnome.org/users/eog/stable)、gthumb ( http://gthumb.sourceforge.net/home.html )、kiosk 系统( https://github.com/csldevices/sweb )或 fbi。后者使用帧缓冲设备,因此您不需要完全的桌面安装,这有助于减少系统的启动时间和占用空间。

通过软件而不是固件运行相框,意味着您可以更轻松地升级系统,以结合夏令时的变化,显示天气,或在早上时间定期呈现日历,或向家中的多个相框添加从 Node0 发送的警报或消息(详见第七章)。您还可以更容易地调整显示的图像,也许是介绍 12 月份圣诞节过去的图像,或者在您知道他们要来住的时候添加更多的家庭成员,并在不久之后删除他们!

气象站

你也可以考虑建立或加强一个气象站。大多数有两种类型——便宜的版本可能会报告温度、风速和寒冷系数,但不提供将数据导出到设备外部的方法。昂贵的版本提供了一个无线或 USB 组件的数据输出。然而,成本的差异通常超过一个树莓派,所以它是一个有趣的项目来黑你自己的。

每次攻击的细节取决于气象站本身。您可以捕获设备发出的消息( http://hackaday.com/2011/09/06/lacross-weather-station-wireless-data-acquisition )并对协议进行逆向工程,或者重新配置传感器并将结果直接反馈给 GPIO。

如果你打算学习协议,买一个有独立室外传感器的天气单元。通过这种方式,协议将有一个明确的终点,这使得工程更容易。(我见过的都没有加密天气数据的!)

购买一个完整的单元,然后把它拆成零件,这种想法可能看起来很浪费,但这样做通常比单独购买传感器更便宜!此外,找到传感器的产品规格通常比找到协议描述更容易。为此,我建议寻找这个领域已经发生的项目(比如 Hack-A-Day 的例子),并购买相同的设备。

吉姆·伊斯特本的《Pywws》就是其中之一。这个 Python 程序从 Maplin USB 气象站读取信息,他的项目被记录为 http://www.weather.dragontail.co.uk/index.php?page=station_setup 。从这里,数据可以被制成图表、分析并呈现在网页上。当你考虑调整你的恒温器以反映温度时,特别是度假归来时,利益因素被效用函数所取代。

树莓 Pi 作为 USB 主机

看看需要强大驱动程序才能运行的 USB 设备,您可以通过简单地将一台旧打印机连接到网络并在其上安装一个 CUPS 服务器,用 Raspberry Pi 将它变成一台现代化的联网打印机。这是一个标准包装,准备如下:

sudo apt-get install cups

sudo usermod -a -G lpadmin <your_user_name>

剩下的配置可以通过 web 浏览器进行:

http://127.0.0.1:631

如果您计划将 Raspberry Pi 用作无头打印机服务器,那么您必须编辑/etc/cups/cupsd.conf来监听其他机器:

Listen 192.168.0.100:631

并继续修改/admin 部分,以包括可以使用该接口的机器的 IP 地址:

<Location /admin>

Order deny,allow

Encryption IfRequested

Satisfy All

AuthType Basic

AuthClass System

Deny All

Allow 127.0.0.1

Allow 192.168.0.100

</Location>

继续 USB 主题,低成本提供了将它作为一次性设备的机会,就像 USB 记忆棒一样。然而,由于你也有一个 CPU,所以你可以携带一个完全安全的设备(如果你愿意的话,一个个人云),并在你无法访问互联网和/或你不能信任当地网吧的时候(当你在国外并且你的智能手机缺少电池或信号时,可能会发生这种情况)携带一个数据镜像。这与几个网站上讨论的拥有个人比特币钱包的方法相同,包括使用 http://electrum.org 客户端的 https://coderwall.com/p/9i4g9a

或者,为了更轻薄的用途,连接任何 USB 新奇小工具,如保暖拖鞋,圣诞灯,轮子上的仓鼠,微型风扇,导弹发射装置,或饮料冷却器,并将树莓派作为您玩具房间的一部分!

作为设备主机

理论上,所有桌面电脑的插件模块和实用程序都适用于 Raspberry Pi。实际上,这可能毫无意义。例如,如果它节省的电力与 PC 消耗的千瓦时相比相形见绌,为什么您要运行高性能的台式机来开关您的灯呢?类似的观点也适用于监控室内能耗的设备——如果算上电脑,让所有东西都开着会更便宜!

考虑到这两个用例,Aeon Labs Z-Stick 是一个低功耗的 USB 加密狗,在 Linux 上具有良好的兼容性,包括 Raspberry Pi 和 OpenZWave(见第二章)。)在 http://thomasloughlin.com/z-wave-controller-setup-on-my-raspberry-pi 概述的项目允许你用最小的功率足迹控制 ZWave 设备。这篇文章还举例说明了每个 Raspberry Pi 应该只做一项工作的思想,它提供了一个包含完整安装的 Linux 和必要软件的 SD 映像。

在能源使用方面,Owl 系统最近受到了好评,特别是因为它可以将其 OWL 传感器接收器连接到 Raspberry Pi 并恢复数据。在 http://www.raspberrypiusers.com/?p=7486 中详细描述的项目显示了所涉及的简单性,这部分归功于 OWL 将其数据多播到网络,允许您打开一个套接字并使用 Pi 选择的语言 Python 检索数据,使用如下代码:

import socket

import struct

MULTICAST_ADDRESS='224.192.32.19'

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)

s.bind(('', 22600))

mreq = struct.pack ('4sl', socket.inet_aton(MULTICAST_ADDRESS), socket.INADDR_ANY)

s.setsockopt (socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

buffer = s.recv(800)

近程传感

对于那些希望树莓派在智能家居中扮演更重要角色的人来说,BlueProximity 项目( http://blueproximity.sourceforge.net )提供了一种自动锁定和解锁 X Window 会话的方法,这种方法基于你的蓝牙手机与相关机器的距离。这个自然不需要插在你要锁的机器上!你可以在书房的门口或者前门和后门放一个树莓派和它的蓝牙装置。在机器之间发送消息的最简单的方式包括从一台机器到另一台机器的 HTTP GET 请求,以及检查正确参数的小脚本(因为它们应该包括各种密码)。)

这个想法可以通过在房子周围放置几个接近传感器来扩展,以计算出个人的位置。为了促进这一点,BlueProximity 版本的工作正在进行中,该版本将监控几台不同机器上的蓝牙信号强度,并使用它来推断您的位置。

此位置信息可用于向您的当前位置发送反馈消息和警报。因此,举例来说,如果软件检测到你在客厅,它可以在你的电视屏幕上显示信息。通过这种方式能够针对特定设备,消除了将所有消息发送到您的手机的需要。此外,它允许您将手机用作遥控器,可以智能地锁定离您当前位置最近的任何设备。正如我所说,这个项目仍在开发中,但有潜力,是一个很好的解决方案的例子,否则,如果控制 PC 比 Raspberry Pi 大得多,或更昂贵,这是不可能的!

咖啡机

在 20 世纪 70 年代和 80 年代,奶茶是中产阶级的时髦玩意儿!晚上,你可以在机器里装满水和茶,或者咖啡,然后设定第二天早上的闹钟。然后,它会像闹钟一样,自动为你沏上早晨的第一杯茶。通过我们在第二章中提到的 X10 项目,这现在又成为可能。但随着树莓 Pi 能够有更大的控制机会,它的范围可以得到改善。

树莓派相对于 X10 的优势在于,你可以有一个从茶壶到网页的反馈回路,你可以控制设备的更多参数,因为现代浓缩咖啡机有许多用于不同咖啡类型的按钮,像茶壶一样只打开电源是不够的。作为一个例子,Shawn Wallace 和 Matt Richardson 建造了一个树莓 Pi 控制的咖啡机,如在 http://blog.makezine.com/2013/02/11/raspberry-pi-for-web-initiated-coffee 所述。

对于那些早上想喝点更烈的东西的人, http://brewpi.com 讨论了一种基于树莓派的解决方案,用于控制家庭酿酒厂的温度!

带闹钟的定时开启收音机

如果茶(或一杯清晨啤酒!)不合你的口味,那树莓派就做了一个很高级的时钟收音机。这样一个项目是进入自制家庭自动化世界的一个合适的开端,因为它需要非常简单的软件,一个非常基本的显示器就足够了。

没有理由不使用真正的收音机,它不能从你当地的媒体服务器上播放音乐,或者从 RSS 订阅源上阅读新闻,或者你的日程安排,或者第七章第一节中提出的任何其他想法。另外,与当时大多数时钟收音机不同的是,它还可以根据夏令时自行调节。然而,如果发生这种情况,它应该总是发出反馈,说它已经改变了时间,因为(正如我们所了解的)每个动作都应该有一个反馈消息,我们不想更新时间两次。

没有主电源

抛开小巧和廉价的优势,人们可以利用树莓 Pi 由电池供电的能力,在可能被认为危险或非法的地方使用电源。 4 例如,棚子、淋浴间、厨房或花园,在这些地方引入水或蒸汽会对市电供电设备产生不利影响。

这使你可以建造自己的园艺机器人,在特定的时间间隔给植物喂食和浇水,并且不需要任何额外的努力,就可以通过网页报告结果。这里的关键词是“间隔”,因为计算机,甚至是树莓 Pi,都是高功率设备,所以永久使用电池将确保机器人的寿命很短。例如,Adafruit 电源包( http://www.adafruit.com/products/962 )可以持续 5 小时左右,而基本的 AA 电池组( http://www.raspberrypi-spy.co.uk/2013/02/running-a-raspberry-pi-from-6-aa-batteries )可以持续 16 小时以上。

电池电量(除了屏幕)的最大消耗之一是 WiFi 连接。因为你不想放弃电源线,却发现自己被网线束缚,所以最好将所有数据存储在本地,并编写 rsync 脚本定期将数据卸载到另一台机器,如笔记本电脑。

装置

提供的树莓派什么也做不了。事实上,所提供的主板需要额外的硬件和软件才能像砖块一样智能。现在让我们看看这些步骤。

软件

与传统的 Linux 系统一样,第一步是选择发行版。Raspberry Pi 在这里占据了一个有趣的位置,因为虽然一些传统发行版(如 Debian)提供了自己的版本,但许多其他发行版却避而远之。总的来说,这个社区采用了一种有趣的方法,将发行版视为应用程序——如果你想将 Raspberry Pi 用作媒体中心,那么就使用预装的媒体中心发行版,如 XBMC 5 或 OpenElec。 6 如果你想要瘦客户端,那就用 RPTC。 7 等等。

不管发行版本如何,安装过程都是一样的。在这个例子中,我们将使用基于 Debian Wheezy 的官方通用发行版 Raspbian。您必须首先从一个网站(如 http://www.raspbian.org/RaspbianImages )下载一个 SD 卡映像形式的预装版本。然后,必须使用以下命令将该映像写入 SD 卡(大小适合该映像,显然,4GB 是一个不错的入门级别):

sudo dd bs=4M if=raspbian.img of=/dev/sdd

sudo sync

Warning

在这里引用错误的设备可以(并且将会!)擦除连接到机器的硬盘或其他基于 SCSI 的设备。测量两次——如制造商所说,切割一次!

然后,您可以卸载 SD(如这里的/dev/sdd所示)并将其插入您的 Raspberry Pi,然后打开它。

如果这是你第一次涉足 Linux,你将需要 PiWriter8(Mac OS X)或 ImageWriter 9 (对于微软 Windows)来执行相同的 dd 步骤。

Raspbian 映像的当前版本没有 root 帐户,因此您无法直接登录。这样做的好处之一是防止您在第一次登录时造成重大损害。但是,许多发行版的默认用户是“pi”(密码是“raspberry”),拥有 sudo 权限,允许您以 root 用户身份运行命令,以执行系统管理任务。

五金器具

没有开/关开关,你只需要插入 SD 卡,然后是电源线,你就可以走了。所有关于在插入或取出 SD 卡之前关闭的标准免责声明仍然适用。

Raspberry Pi 电源线是一个微型 USB 插头,可以从主机或连接到板上等效 USB 端口的电源适配器插头提供 5v 电源。正如我们所见,有电池组可用,但这些都不是为了长期使用。

一旦安装了操作系统,就该关机并开始物理安装了。这个是可选的!Raspberry Pi 设计的简洁优雅意味着许多人(包括我自己)更喜欢放弃保护套,或者使用透明保护套来防尘。否则,您将需要一个版本 2 板、两个螺母、四个螺栓和两个比螺母和螺栓的高度稍长的垫片。建议使用双螺母,这样它们可以用作“锁紧螺母”,防止它们意外丢失。当然,对于 geek chic 来说,一个乐高盒子永远不会出错,如图 8-4 所示。

A978-1-4302-5888-9_8_Fig4_HTML.jpg

图 8-4。

One of many LEGO cases, from LegoPunk.com/?q=node/210

与硬件接口

当您的 Raspberry Pi 到达时,它是一个防静电小袋中的电路板。这与笔记本电脑或台式机的大盒子和花哨包装大相径庭。可能正是这一点让人们更倾向于将电线直接连接到电路板上,以实现接口的目的,这种方式他们永远不可能用台式机来实现。

鉴于前面提到的 USB 问题,以及 USB 插座速度慢并且通常充满键盘、鼠标和硬盘驱动器的事实,意味着 USB 不是与 Raspberry Pi 接口的常用方式。这项荣誉由 GPIO、I2C、SPI 和 Arduino 相关技术分享。

硬件警告

调试软件虽然痛苦而困难,但与调试硬件相比,相对容易。尤其是当你出身软件背景的时候。硬件工程师可用的调试器(例如,电压表和电流表)与 GDB 最基本的版本相比已经过时了。因此,除非你是一个拥有良好逻辑分析仪的富家子弟,否则你将不得不修改你的开发方法!尤其是当一个硬件错误可能会破坏你试图构建的电路,以及连接到它的计算机。当这种情况发生时,你可能甚至没有意识到,并浪费时间试图修复一个永远不会工作的电路。

正是由于这个原因,许多接口板都有内置的保护缓冲器,所以即使你在输入端施加过大的电压,或者试图在电路中反向驱动电流,也不会损坏你的硬件。它们还可以帮助确定运行各种硬件所需的电压水平。许多分立插座组件使用 5v,这就是为什么 Arduino 可以简单地使用它们,因为它默认设置为使用 5v。然而,由于 Raspberry Pi 运行在 3.3v,当与这种芯片通信时,您需要调整电压电平。在这方面,接口板可以提供帮助。

如果您的开发方法可以说是谨慎的,那么采用 I2C 或 SPI 可能比 GPIO 更好,因为它们都需要一个芯片来有效地处理协议,例如分别采用 MCP23017 或 MCP3208。它们不仅允许比 GPIO 更多的通道,而且还提供了一种缓冲形式来帮助保护 Raspberry Pi 本身。

Caution

Linux 不是一个实时操作系统,因为你的软件不能准确地在它想要的时候运行,或者运行它想要的时间,因为操作系统总是有机会切换到另一个进程。因此,如果您的任务需要传感器或开关的精确定时,那么最好使用 Arduino,这样可以保证对每个时钟周期的控制,并相应地对代码进行定时。

使用 GPIO

GPIO(通用输入/输出)是 Raspberry Pi 电路板上的一组 26 引脚。其中包括 3.3v 和 5v 电源轨、一个时钟和几个引脚,它们可以由处理器直接控制,因此也可以由您的软件控制。这些可以与外部硬件通信。像 Arduino 一样,这些引脚可以重新配置,在我们的情况下,它们可以用作 I2C 接口、UART(通用异步接收器/发送器)、SPI(串行外设接口总线)和 PWM(脉宽调制),如图 8-5 所示。最大的缺点是,与 Arduino 相比,用 Raspberry Pi 编写这种功能更困难,因为 Raspberry Pi 是一个多任务操作系统,所以时间上的变化很小。这些微秒是否明显将取决于您的应用程序,然而,任何刚开始使用该工具包的人都不太可能在一段时间内遇到问题。

A978-1-4302-5888-9_8_Fig5_HTML.jpg

图 8-5。

The GPIO pins

Raspberry Pi 和 Arduino 都有相同的过程来配置输入或输出引脚,然后向它们写入高电平或低电平信号。因此,将 LED 和电阻器(串联)连接到物理引脚 11(以及引脚 1 上的地)后,您可以使用命令行来控制它:

gpio mode 0 out

gpio write 0 1

这个 gpio 程序是 WiringPi 包的一部分,可以在 https://projects.drogon.net/raspberry-pi/wiringpi 找到。我们使用这个包也是为了帮助解决理解引脚命名差异的复杂性。WiringPi 代码允许我们将接线引脚 0 作为系统的输出,它映射到物理引脚 11,因为 GPIO 引脚 17 恰好位于那里。(现在暂停一下,重读一遍,直到你理解每种类型的针之间的区别,因为它将在以后节省很多痛苦。)引脚的奇数编号正是这个特定芯片的配置方式。因此,如果我们将代码移植到另一个处理器,其中 GPIO-17 位于物理引脚 9 上,我们可以完全保持代码不变,只需用适当引脚上的 LED 重建电路。

当然,“Pi”这个名字参考了主要用 Python 编程的初衷。所以,如果你喜欢那种语言,你可以写:

import Raspberry Pi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)

GPIO.setup(11, GPIO.OUT)

GPIO.output(11, GPIO.HIGH)

与 Arduino 和大多数微控制器一样,Raspberry Pi 无法为电机提供足够的电流。(建议从任何引脚吸取的电流不要超过 50 毫安,总电流不要超过 150 毫安。)因此,您将需要使用一个带有继电器的驱动电路,该驱动电路遵循与之前图 8-2 所示相同的设计。

输入信号(如来自开关的信号)的代码需要您预期的代码更改:

GPIO.setup(12, GPIO.IN)

inputValue = GPIO.input(12)

允许您构建与 Arduino 相同级别的电路,还允许您强化完整 Linux 机器的能力和连接性。

Tip

要了解更多这种风格的编程,以及一些例子,请前往 http://elinux.org/RPi_Low-level_peripherals.

一旦电机连接到树莓派,你需要一个有效的方法来控制它。根据用途,这将取决于购买的电机类型,尽管总是建议使用反馈回路来告诉机器电机移动了多远。

对于需要大量运动的情况,例如窗帘轨道,可以使用步进电机或标准 DC 电机。在前一种情况下,反馈是自动的,因为电机被编程为以特定数量的离散步骤移动。对于 DC 电机,可以使用限位开关或开槽盘计数器。如果你注意到乐高头脑风暴项目中使用的马达,你就会明白如何用更坚固的部件来建造它。如果你的反馈是布尔型的,也就是说,你只需要知道是否达到了一个极限,那么一个简单的微动开关就足够了。

或者,对于机器人等轻型应用,最好的解决方案是采用伺服系统,其中电机的位置可以通过输出信号的脉冲宽度来控制。精确控制该脉冲至关重要,虽然对新手来说编程可能很困难,尤其是因为只有一个 PWM 引脚可用,但已经有一个库可以通过在软件中仿真 PWM 来解决这个问题。

Note

通过脉冲工作的伺服电机可能只能绕其轴的一部分转动,可能小于 270 度,因此不能用于所有应用。

ServoBlaster ( https://github.com/richardghirst/PiBits/tree/master/ServoBlaster )是一个能够通过 Raspberry Pi 的 GPIO 端口驱动多达八个伺服电机的库,这意味着它不需要额外的硬件。在其最基本的形式中,它只不过是一个用户空间守护进程(考虑到它需要访问 GPIO,它仍然需要作为 root 运行),当您第一次运行它时,它与 shell 分离:

$ sudo ./servod

然而,您也可以使用内核空间实现,通过创建一个新的设备/dev/servoblaster来处理所有的时序,您只需要指定脉冲宽度。电机 4 上的 1.3 毫秒脉冲宽度将被寻址:

$ echo "4=130" >/dev/servoblaster

零值将关闭它。对于 8 个伺服系统,每个伺服系统需要 2.5 毫秒的服务时间。最大延迟(从发出命令到看到效果的时间)将是周期时间,8 * 2.5 毫秒,即 20 毫秒。

给定这个周期时间,不可能有比 2.5 毫秒或 12.5%更长的脉冲。如果你正在使用发光二极管,那么更长的脉冲是必要的,并有可能使用一个称为 Pi-Blaster ( https://github.com/sarfata/pi-blaster )的伺服增强器代码的分支。给它一个明显的遗产,它以相同的方式被调用,但是使用脉冲宽度的分数百分比,而不是绝对时间。因此,12.5%的脉冲将是:

echo "0=0.125" > /dev/pi-blaster

为了扩大电机控制器的数量,也许是为了建造一个机器人,你将需要把你的调试器换成烙铁,并安装一个物理附件,例如来自 http://adafruit.com/products/815 的 Adafruit 模块,它为伺服电机提供多达 16 个通道。

对于更高级模拟 I/O,您最好考虑最近的发展 Gertboard。虽然这是一个非常昂贵的板,但它提供了丰富的接口选项,使用 GPIO 的所有功能。SPI 用于 A2D (MCP4002)和 D2A (MCP4802)转换器,而唯一的 PWM 引脚用作电机控制器(L6203,缓冲至强大的 48V/4A)。UART 被配置为使用 Atmel AVR 微控制器、 10 以及用于各种按钮和 led 的剩余 GPIO 引脚。作为一个主要的模拟控制器,这是大多数项目的更好的匹配,因为我们的(真实)世界是模拟的,而不是数字的!

Tip

如果你打算在你的 Raspberry Pi 设置中加入 Arduino,那么值得考虑只买 Gertboard 和芯片,因为这可能比购买单独/额外的屏蔽和 Arduino 板更便宜。

Gertboard 的编程很像底层的 Arduino 代码。也就是说,你是直接写内存映射 IO,因此需要汇编程序员的细心技巧。这段代码可能看起来很普通,如下所示:

PWMCLK_DIV = 0x5A000000 | (32<<12);

PWMCLK_CNTL = 0x5A000011;

PWM_CONTROL = 0; // i.e. off

PWM0_RANGE = 0x400; // all values between 0 and 1023

PWM0_DATA = 0x100; // write output

这看似很自然的代码(尽管有点重于幻数),是设置 PWM 所必需的。然而,隐藏在这些宏后面的是指针间接寻址,例如:

#define PWM_CONTROL *pwm

#define PWM_STATUS *(pwm+1)

#define PWM0_RANGE *(pwm+4)

#define PWM1_RANGE *(pwm+8)

#define PWM0_DATA  *(pwm+5)

#define PWM1_DATA  *(pwm+9)

因此,所有需要做的就是错过一个关于不正确数据类型的警告,并且您将会破坏后续的寄存器并跟踪几个小时不存在的错误!更多关于此板的信息可以在 Element14 网站 http://www.element14.com/community/docs/DOC-51726?ICID=raspi-group 找到。

自然也有其他接口板,有曼彻斯特大学的 Pi-Face,Pi Crust,Quick2Wire。每个月都会有更多的产品问世,所以在网上快速搜索“缓冲板”或“扩展板”会让你了解当前的技术水平。

用 Arduino

将 Raspberry Pi 连接到外部世界的最简单方法是通过 Arduino,因为我们已经有了多年使用该设备的经验。此外,已经有许多有用的屏蔽。对于大多数人来说,这是一种浪费,因为 Arduino 能够处理我们关心的大多数输入设备。然而,它确实提供了一定程度的安全性,因为如果你犯了一个错误,爆炸的是(更便宜的)Arduino,而不是你心爱的 Raspberry Pi!

通用串行总线

尽管之前提到了关于 Raspberry Pi 上的 USB 的问题,但这是连接两台机器最简单、最安全的方式。你只要把一个插到另一个里面就行了!

就软件而言,Arduino 使用传统的:

Serial.begin(9600);

pinMode(inputSwitchPin, INPUT);

pinState = digitalRead(inputSwitchPin);

Serial.println(pinState ? '1' : '0');

Raspberry Pi 上有一个程序从串行设备中读取这些数据。您需要设置设备,包括:

char *szUSBDevice = "/dev/ttyUSB0";

FILE *fp = fopen(szUSBDevice, "r");

然后在一个紧循环中从串行设备读取数据,执行类似于以下的操作:

if (fread(&v, 1, 1, fp)) {

if (v == '0') { }

if (v == '1') { }

}

自然,这是非常慢的,并且在事件发生、被 Arduino 发现、然后在 Raspberry Pi 上传输和处理之间有相当大的延迟。为了改善这一点,你需要考虑使用 I2C 公共汽车。

I 2 C

I2C 是一种称为内部集成电路的双线接口。这是一种总线协议,最初由飞利浦设计,用于将慢速外设直接连接到计算机主板上。通过将数据直接放到总线上,设备之间的延迟可以大大减少。此外,您可以在一条 I2C 总线上连接多达 128 个设备,这远远超过了我们之前提到的相当保守的 USB 解决方案。

Caution

当将设备直接连接到另一个设备的总线上时,您没有其他方法(如 USB)提供的隔离或保护。因此,一个设备更容易(从物理上)伤害另一个设备,或者通过不作为来允许伤害降临到它身上。在连接 Arduino 和 Raspberry Pi 的具体情况下,记住它们分别工作在 5v 和 3.3v,需要一个电平移位器来正确协调电压。

硬件组件与双线协议一样简单,只需将 Raspberry Pi 的 SDA 连接到 Arduino 的 SDA,将 Raspberry Pi 的 SCL 连接到 Arduino 的 SCL,如此即可。当然,你需要我们之前使用的电平转换器(为了安全起见,你可能想增加一些上拉电阻),但是,除此之外,所有必要的是如图 8-6 所示。

A978-1-4302-5888-9_8_Fig6_HTML.jpg

图 8-6。

Connecting an Raspberry Pi to an Arduino

构建它,然后打开电源,在 Arduino 上运行软件,以便它能够在 I2C 总线上注册自己:

#include "Wire.h"

int i2cAddress = 0x03;

void setup() {

Wire.begin(i2cAddress);

}

剩下的软件和硬件一样简单!首先检查 Arduino 是否能在总线上找到。因此,在树莓派上,只需运行:

$ sudo modprobe i2c-dev

$ sudo i2cdetect -y 0

0 1 2 3 4 5 6 7 8 9 a b c d e f

00:     03 -- -- -- -- -- -- -- -- -- -- -- --

10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

70: -- -- -- -- -- -- -- --

从这里,你可以看到你的 Arduino 成功地连接到总线,并在地址 03。如果你看不到 Arduino,那么很可能你使用的是修订版二板,因此需要使用总线 1,而不是总线 0,所以改变上面的i2cdetect命令,和下面的SMBus参考。

从 Raspberry Pi 发送数据使用 smbus 库和代码,例如:

#! /usr/bin/python

import smbus

bus = smbus.SMBus(0)

address = 0x03

dataToSend = 42

bus.write_byte_data(address, 0xC9, dataToSend)

注意,我们发送了两个字节,尽管只需要一个。第一个字节(0xC9)就像一个报头,表示我们正在发送的数据类型。然后,Arduino 可以在地址 3 的 I2C 总线上观察数据,并做出相应的响应。因此,我们将上述程序修改为:

#include "Wire.h"

int i2cAddress = 0x03;

void setup() {

Wire.begin(i2cAddress);

Wire.onReceive(receiveEvent);

}

void receiveEvent(int size) {

if (size == 2) {

int header = Wire.read();

int dataRead = Wire.read();

if (header == 0xC9) {

// Do something

}

}

}

将数据从 Raspberry Pi 发送回 Arduino 的等价但更罕见的代码留给读者作为练习!

带 SPI

作为事实上的标准,串行外设接口总线是一种在单个主机(本例中为 Raspberry Pi)和任意数量的从机外设之间进行通信的方法。虽然一次只能控制或查询一个从机,但其高速操作和全双工操作使其成为许多微控制器和其他类似项目的有用方法。

必要的硬件只涉及树莓派连接器的五个引脚,SCLK(时钟)、MOSI(主机输出)、MISO(主机输入)和 CE0/CE1(都选择使用哪个从机)。)MOSI/MISO 对为全双工通信信道提供发送/接收配对,而 SCLK 用于保持所有从机与主机同步。因此,不需要在从机上运行单独的时钟,这样更容易找到合适的振荡器,而且它们不需要很精确。这种简化电路的努力也体现在以下事实上:与 I2C 不同,不需要上拉或下拉电阻,您只需将主设备上的 MOSI 连接到从设备上的 MOSI(对 OISO 和 SCLK 重复此操作),就万事俱备了!

从机选择指示主机正在与哪个从机通话。Raspberry Pi 硬件提供了其中的两个,CE0 和 CE1,它们利用了/dev/spidev-0.0/dev/spidev-0.1。然而,作为一种协议,SPI 允许您控制任意数量的从机。因此,有可能(实际上也建议)使用其它 GPIO 引脚来选择所需的从机,使用低逻辑 0 来表示所讨论的从机。由于不能使用标准 SPI 库,因此必须通过写入 GPIO 来手动处理从机选择,如前所述。GPIO 和 SPI 之间的时序是一个正确排序的问题,首先将从机选择中使用的所有 GPIO 引脚拉高至逻辑 1,等待,然后将相应的引脚拉低。

Tip

如果您编写自己的从机选择驱动程序,那么您应该总是先将选择引脚发送至高电平,然后发送至低电平,因为有些从机只能在下降沿唤醒。

使用 SPI 可能实现的项目就像使用 GPIO 或 I2C 一样。您在简化的电子设备中获得了什么,在软件上就失去了什么,因此您需要编写自己的错误处理和握手代码,因为无法知道从机是否收到了发送给它的消息,协议本身也没有任何错误检查。如果您的项目是在一个电气噪声环境中(可能是杂物间,有洗衣机和滚筒式烘干机的大功率电机),那么这是一个有效的关注,因为 SPI 更容易受到噪声的影响。如果您没有 SPI 从机来进行实验,那么您可能错了(!)因为任何能够在四个不同管脚上通信的东西都可以被压入服务中...Arduino 是一个合适的候选者。可以在 http://hackaday.com/2013/01/06/hardware-spi-with-python-on-a-raspberry-pi 找到概念证明。

从编程的角度来看,该软件与其他协议一样易于编写。在 Python 中,您可以使用标准库并编写:

import spi

spi.initialize()

spi.transfer((1,2,3))

或者,用 C,在 http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/plain/Documentation/spi/spidev_test.c 有一个来自 Linux 内核本身的测试程序。

带 Arduino 护盾

虽然 Arduino 盾牌是一个很大的卖点,但说你必须有一个 Arduino 才能使用它们并不一定是真的。烹饪黑客( http://www.cooking-hacks.com )制作了一个连接桥,它位于你的树莓 Pi 之上,允许你直接给 Pi 添加 Arduino 护盾。

该桥带有 arduPi 库,它模仿 Arduino 的 API 所以digitalReadreadBytes的所有传统功能依然可用。因此,你可以编写标准的 Arduino 代码,只要你添加自己的main函数:

#include "arduPi.h"

// Insert your usual setup and loop methods here

int main (int argc, char *argv[]) {

setup();

while(1){

loop();

}

return (0);

}

其余的代码可以直接从原始的 Arduino 源代码中复制,然后以正常的方式编译和运行。

Note

arduPi 库是在 GPL 下发布的,因此可用于其他 Linux 机器,如果您希望模拟 Arduino,在另一个环境中测试您的软件,或者甚至尝试将 shields 连接到桌面机器!

硬件组件需要更多的工作,因为 Raspberry Pi GPIO 的电压电平是 3.3v,而原始 Arduino 始终使用 5v。不幸的是,这个桥不像处理软件那样处理硬件转换。因此,所有 5v 输入信号都需要降低到 3.3v,这可以通过 5K/10K 分压器电路来实现。或者,看看 Arduino 的最新版本及其克隆版本,因为许多新版本可以在 5v 和 3.3v 之间切换,从而根除了这个问题。

同样,3.3v 的数字输出也需要升级,也许是像我们在图 2-5 中看到的晶体管开关电路。对于元器件比较奇特的,可以用两个 2N7000 的 MOSFETs 和一个与 http://www.hobbytronics.co.uk/mosfet-voltage-level-converter 不相异的电路来构建电平移位器,或者买一个 http://www.skpang.co.uk/catalog/logic-level-converter-p-511.html 之类的预建电平转换器。

然而,最大的问题在于它是否值得。目前,这座桥的价格为€40 英镑,和 Arduino 的价格差不多,是 Uno 的两倍。因此,尽管这是一个有趣的想法,但只有当通过 I2C 直接连接 Arduino 的成本(在时间上)超过€20 时,这种设备才值得使用。

然而,在那些有一个好的 Arduino 盾可用的情况下,并且没有类似于 Raspberry Pi 的东西,那么这个盾可以很容易地证明其成本是合理的。(当然,前提是您不能通过在 Arduino 上处理数据,并将数据传输到合适的机器上进行显示来缓解对 Raspberry Pi 的需求。)

软件选项

作为一台 Linux 机器,这意味着你可以在 Raspberry Pi 上运行任何传统的开源软件。推荐使用官方的 Raspbian 发行版,因为他们已经编译了大部分 Debian 包来适应 Raspberry Pi 的 ARM 芯片。非开源或以二进制形式发布的软件将需要一个特定于 Raspberry Pi 的版本,正如您对任何非英特尔架构的预期一样。

如果您发现您需要从源代码编译您自己的包,那么您可能需要修改 make 文件以确保它使用硬浮点:

CFLAGS="-O2 -pipe -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard"

“硬浮点”选项确保所有浮点运算都在硬件、CPU 上完成,而不是在软件中模拟。原因是软件仿真比基于硬件的解决方案至少慢 10 倍。

Tip

如果你有一个基金会的 Raspberry Pi Linux 发行版的旧版本(基于 Squeeze),它很可能是用软浮点版本编译的,这使得你的硬浮点编译不兼容。虽然可以重新编译库来使用硬浮点,并重新获得一些速度,但简单地下载一个新的映像并重新安装更容易。这些较新的图像被称为 Raspbian,都使用 armhf。此外,型号 B 上的内存控制器发生了变化(当他们将 RAM 增加一倍时),因此在这种情况下,您也需要一个新的安装映像。

即使没有构建(或重新构建)自己的包,也已经有很多标准软件可用了。因此,您可以毫不费力地将您的 Raspberry Pi 变成打印服务器、BitTorrent 客户端(比如带有种子字段的客户端)、NAS 服务器等等。请注意,虽然它的小尺寸会建议一个不错的紧凑型文件服务器,但如果您打算将它用于媒体流而不是数据备份,USB 上的中断级联问题可能意味着问题。还要注意的是,Raspberry Pi 有时会因 USB 集线器而变得不稳定。(较新的驱动程序更好,但问题仍然存在。)因此,建议在系统中安装单个驱动器,这是您目前所能承受的最大容量。它可能无法实现基于软件的 RAID,但因为它主要是只读设备(因为你有 DVD 上的原始媒体文件,或者有备份),所以没有必要。

众所周知,Raspberry Pi 中的 Pi 源自 Python,这种脚本语言旨在成为机器的 de factor 标准。然而,由于包含了完整的开发工具链,大多数其他语言都可以使用。如果你正在编写小程序(比如说,少于 10,000 行),那么你可以很高兴地在设备上构建你的 Raspberry Pi 软件。对于较大的项目,通常最好在全尺寸的 Linux 机器上构建(并测试),然后针对 Raspberry Pi 进行交叉编译。

交叉编译是在一台机器上构建可执行文件,在另一台机器上使用编译器的过程——更具体地说,是为一种架构构建,使用另一种架构。例如,这可能是在 Intel 机器上为 ARM 处理器进行编译。这意味着您可以使用台式机的改进处理能力来为更小、能力更差的机器快速编译。

为了对软件进行交叉编译,你需要一个合适的工具链,包括编译器、库、头文件和其他相关语言的配套工具。确定您需要什么样的编译器、库、头文件和其他各种工具可能是一项令人厌倦的工作,但是——以真正开源的方式——其他开发人员已经完成了这项繁重的工作。在 http://crosstool-ng.org 的团队已经为许多系统和语言提供了工具链,包括我们的 Raspberry Pi。安装过程很简单,但不会太快。然而,当构建大型软件时,安装一个跨环境所花费的时间将通过您的第一次大型编译得到补偿。安装过程的完整说明可以在 http://www.kitware.com/blog/home/post/426 找到。

结论

Raspberry Pi 是一台功能强大的机器,能够支持家庭自动化领域的许多面向制造商的项目。它被称为小型、廉价的 Linux 机器并不一定准确,因为它缺少许多人们在 PC 中认为理所当然的组件,如实时时钟、VGA 输出或可靠的 USB 堆栈,并且围绕这些限制进行构建可能需要成本。然而,提供一个易于编程的 GPIO 端口使其成为一个超级强大的 Arduino,能够同时运行几种服务,这意味着它可以很容易地扩展新功能,并且比其他类似的设备更容易更新。在其开发周期中如此年轻,以及如此迷人的设备,确保了许多特定模块已经可用于其扩展,这将有望确保较长的保质期和许多新项目。

Footnotes 1

尽管一些网络摄像机(尤其是高清摄像机)会导致问题,因为 Rapsberry Pi CPU 并不像人们希望的那样能够处理它们!

2

这些最初是由索尼的工厂添加的,以帮助他们的生产过程。

3

http://www.bigboardlist.com 可以找到这些替代品的部分列表。

4

例如,许多管辖区都有电源插座到分接头的最小距离。

5

http://www.raspbmc.com

6

http://www.openelec.tv

7

http://rpitc.blogspot.se

8

http://sourceforge.net/projects/piwriter

9

https://launchpad.net/win32-image-writer

10

Gertboard 可以使用多种芯片(48A/PA、88A/PA、168A/PA、328/P ),但没有提供任何芯片。

posted @ 2024-08-02 19:34  绝不原创的飞龙  阅读(0)  评论(0编辑  收藏  举报