IP 供电:首个实验设施的测试






4.98/5 (45投票s)
IP上的联合电力项目已进入公开测试阶段。所有测试者都可以尝试在有限时间内免费为其笔记本电池充电。
目录
1. 引言
如今,通过 IP 交付不同服务的概念正逐渐占据比早期技术更多的市场份额。传统电话正在被网络电话 (VoIP [1]) 缓慢取代,无线电和电视都为通过 TCP/IP 进行的媒体流 [2] 让路,而传统的货币交易则被在线交易取代。然而,由于严重的技术和经济障碍,电力输送在很长一段时间内仍然是未知的领域。同时,智能移动设备及其能源供应是真正的瓶颈。用户已尽可能地实现了移动性,但这种移动性受限于他们获取能源的途径以及电池续航时间。虽然他们缺乏无线互联网访问的时间越来越短,越来越不可能,但电池续航时间的增长,尽管速度相当快,但已经停滞不前,成为比互联网访问更关键的限制因素。
与此同时,按需提供能源并非不可能。例如,以太网供电技术早在 2003 年就已标准化 [3]。无线充电也是一项成熟的技术 [4]。这项技术甚至被用于为电动汽车充电 [5];另请参阅 [6]。IP 上的电力实验工作始于 20 世纪 90 年代末,IETF 发布了第一个标准提案 RFC 3251,名为“IP 上的电力” [7]。该提案引用了 1999 年关于“离散电压编码”的开创性工作 [8]。当时,首次实验证明存在严重的技术障碍,但也显示出该技术的某些有前景的前景,我们对此表示 极大的热情。
经过十多年的研究、开发和基础创新,技术,目前称为 IP 上的电力 (PoIP) 的前景已变得清晰,因此我们现在可以谈论其未来的商业化。目前,公众测试已经开始。每个互联网用户都有机会免费参与测试,并在有限的时间内进行。本文提供了客户端软件的完整源代码,包括详细的使用说明。此外,还提供了一个单一的互联网网关接入,但可能会有更严格的流量限制,并且可能无法 24 小时可用。
基本上,在正常情况下,电源应足以驱动典型笔记本电脑或上网本的中等能耗(Microsoft Windows 操作系统在笔记本电脑上的默认电源计划“节能”通常不是问题),并能完全为其电池充电。
2. 实验技术测试设施
第一个实验设施是 俄罗斯科学院、莫斯科物理技术学院、赛默飞世尔科技 和多任务面向对象分布式实验室 (MOOD Lab) 联合努力的成果,并得到了 美国总统行政办公厅替代能源和另类人才研究理事会 的财政支持。
该设施基于一个独立于所有电力网络的微型发电厂。发电机依靠来自乌克兰顿涅茨盆地废弃煤矿区的有限煤炭供应。剩余的煤炭供应足以满足测试设施的需求。电力传输服务器(所谓的“电力供体站点”)完全由这个独立的发电厂供电,位于以下地址:乌克兰基辅市独立广场 6 号,13 室。
公众测试将基于 先进先出 的原则进行,并且应谨慎操作,并理解由于对该设施的 竞争性 访问,我们无法保证任何时候都能为所有测试者提供服务。
3. 免责声明
电力能源按“原样”提供,不附带任何明示或暗示的保证,包括对适销性、不侵犯知识产权或特定用途的适用性的保证。在任何情况下,我们不对因电力供应中断或电力供应的任何特定变化而导致的任何直接、间接、附带、特殊、惩戒性或后果性损害(包括但不限于利润损失、数据丢失或硬件组件损坏)负责。
4. 硬件架构
操作的主要原理基于离散电压编码 (DVE) 方案,并在 [7] 中进行了详细描述。
我们开发的硬件框图显示在文章顶部。我们创新性的核心是实现实时传输协议 (RTP) 的 RTP 处理器(根据 RFC 3251 [7] 的术语)。它基于框图中的射频调制器 (RFM)。频率值可以通过客户端代码指定(请参阅下一节的接口规范),但这仅用于研究目的。通常,它们不被指定,并且其选择和优化留给服务部分。您可以发送请求并查看响应中获得的值。RFM 技术的原理在 RF 网站 上有详细解释。这些原理和调制优化问题极其复杂,但目前 有坚实的基础。
图表中所有其他元素均根据 [7] 命名。
5. IP 上的电力接口
客户端与电源(电力供体站点)的接口基于 WCF *服务约定*。服务使用 TCP 传输。有两种不同类型的约定:一种主要基于拉式技术,另一种完全基于推式技术。在拉式接口的情况下,电力是按时间段请求的。客户端软件的线程可以请求在某个时间段内提供特定级别的电力,收到实际提供的时段的响应,然后可以在时段到期之前休眠。但是,到期可能不是停止供电的唯一原因(由于各种异常情况)。为此,客户端可以(可选地)接收有关可能停止供电和其他事件的通知。为此,实现了*双工服务* [9]。
相比之下,推式接口面向客户端的永久能源消耗,从请求输电开始,到与服务断开连接停止。此服务也是双工的,并且通过客户端实现的*回调约定*通知客户端所有与电力相关的事件。
请求基于两个类的层次结构,第一个类描述了所需的功率级别和射频调制频率;派生类将其添加了时间切片数据。
using System;
// ...
public class PowerConsumptionSpecification {
public PowerConsumptionSpecification(float averageLevel, float rf) {
this.AverageLevel = averageLevel;
this.DoubleAverageLevel = double.NaN;
this.RadioFrequency = rf;
this.DoubleAverageLevel = double.PositiveInfinity;
} //PowerConsumptionSpecification
public PowerConsumptionSpecification(double averageLevel, double rf) {
this.DoubleAverageLevel = averageLevel;
this.AverageLevel = float.NegativeInfinity;
this.DoubleRadioFrequency = rf;
this.AverageLevel = float.NaN;
} //PowerConsumptionSpecification
public PowerConsumptionSpecification(float averageLevel) {
this.AverageLevel = averageLevel;
this.DoubleAverageLevel = double.NaN;
this.RadioFrequency = float.NegativeInfinity;
this.DoubleAverageLevel = double.PositiveInfinity;
} //PowerConsumptionSpecification
public PowerConsumptionSpecification(double averageLevel) {
this.DoubleAverageLevel = averageLevel;
this.AverageLevel = float.NegativeInfinity;
this.DoubleRadioFrequency = double.NaN;
this.AverageLevel = float.NaN;
} //PowerConsumptionSpecification
public float AverageLevel { get; private set; }
public double DoubleAverageLevel { get; private set; }
public float RadioFrequency { get; private set; }
public double DoubleRadioFrequency { get; private set; }
} //PowerConsumptionSpecification
public class PowerSlice : PowerConsumptionSpecification {
public PowerSlice(float averageLevel, TimeSpan duration, float rf) : base(averageLevel, rf) { this.Duration = duration; }
public PowerSlice(double averageLevel, TimeSpan duration, double rf) : base(averageLevel, rf) { this.Duration = duration; }
public PowerSlice(float averageLevel, TimeSpan duration) : base(averageLevel) { this.Duration = duration; }
public PowerSlice(double averageLevel, TimeSpan duration) : base(averageLevel) { this.Duration = duration; }
public TimeSpan Duration { get; private set; }
} //class PowerSlice
请注意,级别和频率以双重方式指定:单精度和双精度。它们具有不同的默认值,并导致连接到不同的电源插座。通常,如果您请求双精度,则输电响应更快,允许更高的功耗水平,但可靠性较低,这应在任务关键型应用程序中予以考虑。
基于拉式和推式技术的两种接口类型都基于公共接口 IPowerRecipient
。
using System;
using System.ServiceModel;
// ...
public enum PowerStatus {
Listening, Powered, TerminationWarned, Expired,
PowerPlantMulfunction, PowerPlantDestruction, GovernmentShutdown,
Disconnected, }
public interface IPowerRecipient {
DateTime? MostRecentRequest { get; }
TimeSpan? MostRecentRequestDuration { get; }
} //interface IPowerRecipient
[ServiceContract(
Name = "Power Pull",
Namespace = "http://microsoft.WTF.PoIP",
CallbackContract = typeof(IPowerDonor),
SessionMode = SessionMode.NotAllowed)]
public interface IPowerPullRecepient : IPowerRecipient {
PowerSlice Request(PowerSlice request); // returns actually provided slice
} //interface IPowerPullRecepient
[ServiceContract(
Name = "Power Push",
Namespace = "http://microsoft.WTF.PoIP",
CallbackContract = typeof(IPowerDonor),
SessionMode = SessionMode.Required)]
public interface IPowerPushRecepient : IPowerRecipient {
// duration is not specified; power is supplied when it is possible;
// the user gets event notifications through the callback interface IPowerDonor
PowerConsumptionSpecification Request(PowerConsumptionSpecification request); // returns actually provided power spec
} //interface IPowerPushRecepient
注意 ServiceContract
的 CallbackContract
参数。这些参数允许客户端定义用于利用双工服务所需的回调约定。此回调约定(如果已实现)允许客户端响应通过 IPowerDonor
接口传递的事件。这些事件会通知电力供应停止,告知客户端原因,并提供对请求电源的接收方对象的实例的访问;反过来,它提供了对最近请求(如果有)的详细信息的访问。
让我们看看双工机制如何用于处理服务发送的警告客户端电力供应停止以及实际停止的事件。在此简化示例中,该功能实现在抽象类 PowerDonorHandler
中。派生类 PullPowerDonorHandler
用于演示在使用拉式技术时如何通过警告通知发送请求以获取更多电力。
internal abstract class PowerDonorHandler : IPowerDonor {
internal PowerDonorHandler() { }
void IPowerDonor.PowerSupplyTerminationWarning(PowerStatus reason, IPowerRecipient recepient) {
if (reason == PowerStatus.Expired) {
RequestMorePower();
System.Windows.MessageBox.Show("No way! I want more power!");
} //if
System.Windows.MessageBox.Show("Save your work or find another energy source");
} //IPowerDonor.PowerSupplyTerminationWarning
void IPowerDonor.PowerSupplyEnded(PowerStatus reason, IPowerRecipient recepient) {
System.Windows.MessageBox.Show("Too late...");
} //IPowerDonor.PowerSupplyEnded
protected abstract void RequestMorePower();
} //class PowerDonorHandler
internal class PullPowerDonorHandler : PowerDonorHandler, IPowerDonor {
internal PullPowerDonorHandler(IPowerPullRecepient puller) { this.puller = puller; }
protected override void RequestMorePower() {
puller.Request(new PowerSlice(3.14d, new TimeSpan(3, 610, 0))); // just for example: power for 3 hours and 610 minutes
} //RequestMorePower
IPowerPullRecepient puller;
} //class PullPowerDonorHandler
现在,让我们将所有内容整合在一起,看看应用程序如何启动电源接收器客户端,将其连接到某个电源供体站点,然后请求并消耗输送的电力。
// "PowerFactory" refers to the Factory Method Pattern,
// not factory producing power, which we call "power plant":
IPowerPullRecepient recepient = PullPowerFactory.GetProxy();
PullPowerDonorHandler donorHandler = new PullPowerDonorHandler(recepient);
// this is a blocking method; if the request cannot be satisfied at all, we get response immediately:
PowerSlice deliveredPower = recepient.Request(new PowerSlice(2.71d, new TimeSpan(2, 0, 0), 300.13)); //for example
// now we can assert that we are getting what we requested:
if (deliveredPower.Duration <= new TimeSpan(0))
System.Windows.MessageBox.Show("What kind of service is that?");
// we can also check actual power level and other parameters
// otherwise we have started to consume power
很简单,不是吗?
要获取真正可用的、功能完整的电源接收器客户端代码,请下载本文顶部的源代码。
除了裸 WCF 服务(使用 TCP 通道)外,我们还在服务器端提供了包装此服务的 HTTP 接口。IP 上的电力站点还可以通过我们在此页面上提供的 PoIP 客户端进行访问。
6. 测试说明
测试过程在其基本容量下非常简单。我们建议仅使用您从此页面下载的客户端,或者作为不太理想的替代方案,使用 互联网 PoIP 网关。我们不建议修改负责创建和发送电源请求到服务器的源代码部分,该部分使用电源级别和调制频率的默认值(称为“功耗规范”;请参阅上面的接口代码)。但是,如果您同意承担损坏硬件的最小风险,也可以这样做;在大多数情况下,它将导致拒绝服务响应,即使成功输电。
通过 WCF 客户端和互联网网关进行测试的过程几乎相同。首先,您单击“连接”按钮(不设置任何地址信息,因为我们目前只有一个测试设施),这将带您到下一个页面。在我们的客户端中,它使用拉式接口。您只需从下拉列表中选择所需的持续时间,然后单击“请求”按钮。页面将显示响应信息,其中包含实际时间段和实际功耗规范。此外,当前状态消息将提醒您拔掉计算机的电源插头(如果之前未这样做)。
这是一个重要时刻。要开始消耗能源,您需要确保您的计算机未连接到电源。您需要拔掉电源插头,但不要拔掉电池。没有这一步,您就无法通过 PoIP 消耗能源。如果计算机没有电池(例如,台式机),您仍应拔下电源线。当然,在这种情况下,您需要承担因各种异常情况(例如,因各种原因丢失互联网连接)而丢失电源的轻微风险。
但是,如果互联网连接没有中断,通过 IP 上的电力传输的电力丢失的风险非常低。客户端被编程为在通过回调接口接收到电源警告时自动重复电源请求。此机制在上面通过类 PullPowerDonorHandler
对回调服务约定接口 IPowerDonor
的简化示例实现中得到演示。
与 IP 上的电力功耗的永久断开发生在与服务约定接口的 TCP 通道断开时。当您关闭应用程序窗口时会发生这种情况。对于 HTTP 网关接口,您需要关闭浏览器窗口。此外,由于任何异常情况(例如,总能耗超过发电厂的容量),服务器端可能会断开 IP 上的电力连接。在这种情况下,当前 TCP 会话期间消耗电量较少的客户端将获得优先权。
7. 安全
对服务的分析研究揭示了几种特定的电力输送漏洞可能性。下面我将描述最常见的可能漏洞类型。
电源注入。恶意软件有可能伪造真实的客户端请求,并注入不切实际或危险的功率和射频频率值。在最坏的情况下,这种攻击可能会中断通信并阻止攻击点的功耗,由于这种攻击的局部性质,这相对无害。更严重的漏洞变体是将服务器端地址伪装成伪造的电力供体站点地址。这些恶意供体站点可以自行生成和输送能量,可能提供比应用程序协议声称的更多的功率。过量能量的输送可能导致接收设备电源插座过热并损坏客户端硬件。此漏洞通过对通过接口传递的请求/响应数据进行清理来缓解。
拒绝供电服务攻击(“DOPS 攻击”)。客户端软件的正确行为假定当前提供的电力切片几乎被完全消耗,至少直到收到警告(请参阅示例 PowerDonorHandler 的实现)。由于时间切片总是相当长,它不会压倒流量。恶意客户端可以生成电源请求而不等待其到期。这不仅可能导致与分布式拒绝服务攻击 (DDoS) 相同的问题,而且客户端设备中能量的缺乏耗散会损坏路由器和其他网络设备。此类漏洞的缓解是可能的,但仍是正在进行的研究课题。
其他攻击方法也是密集研究的主题,目前无法透露。
我们鼓励任何人记录检测到任何恶意活动迹象的所有情况,并通过本文中引用的客户端代码提供的故障报告设施报告它们。
参考文献
[1] http://en.wikipedia.org/wiki/VoIP
[2] http://en.wikipedia.org/wiki/Media_streaming
[3] http://en.wikipedia.org/wiki/Power_over_ethernet
[4] http://en.wikipedia.org/wiki/Inductive_charging
[5] http://en.wikipedia.org/wiki/Inductive_charging#Electric_vehicles
[6] http://en.wikipedia.org/wiki/Plugless_Power
[7] IP 上的电力,http://www.ietf.org/rfc/rfc3251.txt
[8] 国际费率公用事业协会草案标准,ITU,G.110/230V,“离散电压编码”,1999 年 3 月
[9] 双工服务,http://msdn.microsoft.com/en-us/library/ms731064%28v=vs.110%29.aspx