我有一台配备双电池的 ThinkPad 笔记本电脑,我想为 GNOME 编写一个指示器应用程序,该应用程序在插入/拔出外部电池时执行操作。为了读取这些事件,我连接到 acpid 套接字,如下所示:
#!/usr/bin/env python3
import socket
ACPID_SOCKETFILE = "/var/run/acpid.socket"
RECV_SIZE = 4096
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect(ACPID_SOCKETFILE)
try:
while True:
data = s.recv(RECV_SIZE)
print(repr(data))
except:
s.close()
raise
我得到如下输出:
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000003 00000000\n'
b'battery PNP0C0A:01 00000003 00000000\n'
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000003 00000000\n'
b'battery PNP0C0A:01 00000003 00000000\n'
b'battery PNP0C0A:01 00000001 00000001\n'
b'battery PNP0C0A:01 00000001 00000001\n'
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000003 00000000\n'
b'battery PNP0C0A:01 00000003 00000000\n'
我认为第四列是1
电池是否已插入以及0
是否已拔出。但第二列和第三列到底是什么意思呢?我已经尝试过man acpid
,但没有找到任何有用的信息。
答案1
这第一栏是设备类别。这些值来自处理相应 ACPI 设备的内核驱动程序。它们的形式要么是“类”(例如“电池”),要么是“类/子类”(例如“按钮/电源”)。
这第二栏是内核用于设备的名称。/sys/bus/acpi/devices/
每个 ACPI 设备都有一个匹配的文件夹。这些名称的一般规则是设备类型:实例编号。如中所述内核文档,设备类型是
LNX
由内核为 BIOS 的 ACPI 表中描述的特殊设备分配的名称,以 开头。- PnP HID(即插即用硬件 ID;其中一些在 5.6.7 节中定义)ACPI规范并且有一些 列表对于在 ACPI DSDT 表中分配了 HID 的其他设备。
device
对于任何其他 ACPI 设备。
实例编号是一个递增计数器,用于区分同一类型的不同设备。例如,您的主电池是PNP0C0A:00
,辅助电池是PNP0C0A:01
。
这第三栏是事件代码或“通知值”。它们在第 5.6.6 节中定义ACPI规范。00000001
表示“设备检查”(设备出现或消失)、00000003
“弹出请求”和00000080
“电池状态已更改”。
这第四栏是内核驱动程序生成的补充值。此列的含义因事件代码、驱动程序和设备类型的任意组合而异。 Linux ACPI 电池驱动程序将“电池状态更改”事件的值设置为1
“存在”和0
“不存在”。