0

我正在使用 UPS 服务从应用程序监控我的 UPS 的状态 - HKLM\SYSTEM\CCS\Services\UPS\Status 的键包含您可以从电源控制面板获得的所有信息。但是——我也希望能够告诉 UPS 从我的应用程序中关闭。我知道该服务可以告诉 UPS 关闭 - 例如,在使用电池运行一定分钟数后 - 我想知道是否可以向服务发送某种命令以手动启动关闭.

我在搜索这些信息时遇到了麻烦——人们倾向于拼错“Uninterruptible”(hrm,Firefox 用红线标记了它,但没有其他选择),而“UPS”只是在运输服务中得到了点击。也许我可以通过 System.ServiceController 或 WMI 做点什么?

澄清:是的,我说的是关闭物理 UPS 设备。我知道如何停止服务。我认为这将是一个常见问题——我希望我的 UPS 与 PC 一起关闭。基于此页面,我有一个想法要尝试。你看,APC(和其他所有人)必须提供一个 DLL 供 UPS 服务调用,而且由于函数调用有据可查,我没有理由不能 P/Invoke 它们。一旦我知道它是否有效,我会重新编辑它。

更新:我尝试调用 UPSInit,然后调用 UPSTurnOff,但没有任何反应。我会再修改一些,但直接调用 apcups.dll 可能是死路一条。

4

3 回答 3

2

查看我对 Herman 的评论,您要关闭 UPS,而不是 UPS SERVICE,对吗?我的意思是,你想让那个东西关闭,切断电源等等,对吧?

如果是这样,您正在通过 UPS 型号查看 UPS。我怀疑其中两个会起作用。

在您的搜索中,请尝试“APC”或“电池”,而不是 UPS。我认为很多代码是在笔记本电脑上运行以处理电池等问题......

一些地方隐藏在一些尘土飞扬的旧文件中使用串行电缆...您实际上可以使用 Qmodem 或 Hyperterm 与 UPS 通话...

从与 APC 的人交谈中学到的。他们非常好,乐于助人。现在,我认为您只需发布一个来自您的 Powerchute 软件的 URL,它就会直接与 UPS 对话,并执行您的命令。

于 2008-12-23T00:49:36.740 回答
1

好的,我有答案(经过测试!),但它并不漂亮。我的 APC UPS 使用APC“智能”协议进行通信(更多信息在此处)。在我的情况下,您需要的是“软关机”、“S”命令。但首先您需要确保它处于“智能”模式(“Y”)。现在,如果您想让 Windows UPS 服务监控状态,该服务将牢牢抓住 COM 端口。因此,您可以 a) 让 Windows 服务关闭 UPS,或 b) 终止服务并自行关闭 UPS。

UPS 本身在收到“S”命令后有一个“宽限期”,让您有时间关闭操作系统。这意味着要执行上述 (a),您必须:

  • 终止公用事业(市电)电源
  • 等待 Windows UPS 服务超时(默认,最少 2 分钟)
  • 等待 Windows 关闭——就在接近尾声时,它会发送“S”命令
  • 等待 UPS 宽限期,之后它实际上会自行关闭

我认为我们将选择 (a),因为 (b) 涉及额外的工作来终止服务和实现串行通信。

于 2009-01-22T15:08:29.673 回答
-1

请告诉您您尝试使用哪种语言...如果您使用的是 .NET,您可以使用 ServiceController 类来做到这一点(阅读文档)。

用于使用 C/C++ 控制 Win32 API 中的服务,Service Functions (Windows)

例如,要停止服务,您可以按如下方式使用 ControlService 函数(这是一个快速而肮脏的示例):

OpenService (hServMgr, TEXT("\\UPS_SERVICE_0"), SC_MANAGER_ALL_ACCESS);

SERVICE_STATUS stat;
ControlService (hUpsService, SERVICE_CONTROL_STOP, &stat)

请注意,您需要在 hServMgr 中提供服务管理器句柄,并且 \\UPS_SERVICE_0 名称是必须与您所需的 UPS 服务(Windows 内置或其他)匹配的名称。

请记住,要停止服务,您需要适当的安全权限。这不是管理员帐户的问题,但请记住使用非管理员帐户登录时会发生什么。

希望有帮助。

关于关闭物理 UPS 设备,我记得在 WIn98 天我能够关闭通过 COM 端口与 UPS 通话的设备,虽然我不记得品牌或编程接口是如何的。

于 2008-12-23T00:33:05.620 回答