问题场景描述
我手头有一个带USB控制功能的智能插排,它通过一个USB接口与电脑连接。当电脑开机并通过USB连接插排时,插排就会给所有插座供电。现在我需要实现一个功能:通过编程方式禁用电脑上连接插排的那个USB端口的供电。
尝试过的方案
最初我尝试使用Linux系统的电源管理接口:
$ echo suspend > /sys/bus/usb/devices/usb*/power/level
-bash: echo: write error: Invalid argument
但这个命令执行失败了,提示参数无效。
可行的解决方案
经过研究,我发现可以通过以下方法实现USB端口的电源控制:
方法一:使用uhubctl工具
这是一个专门用于控制USB集线器电源的实用工具:
# 安装uhubctl
sudo apt-get install uhubctl
# 列出所有USB集线器
uhubctl
# 关闭指定端口的电源(示例)
sudo uhubctl -a off -p 2
方法二:直接操作sysfs接口
对于某些USB控制器,可以尝试:
# 首先找到对应的USB端口
lsusb
ls /sys/bus/usb/devices/
# 然后尝试禁用电源
echo 0 > /sys/bus/usb/devices/usbX/power/autosuspend_delay_ms
echo auto > /sys/bus/usb/devices/usbX/power/control
方法三:使用Python脚本控制
这里提供一个Python示例脚本:
import os
def disable_usb_port(port_num):
try:
with open(f'/sys/bus/usb/devices/usb{port_num}/power/control', 'w') as f:
f.write('auto')
print(f"USB端口{port_num}已设置为自动休眠")
except IOError as e:
print(f"操作失败: {e}")
# 示例:禁用usb1端口
disable_usb_port(1)
注意事项
- 操作USB电源需要root权限
- 不同USB控制器实现可能不同,某些方法可能不适用
- 建议先测试再应用到生产环境
- 频繁开关USB电源可能影响设备寿命
扩展应用
结合这个功能,可以开发一个远程控制服务:
from flask import Flask, request
import subprocess
app = Flask(__name__)
@app.route('/control_power', methods=['POST'])
def control_power():
action = request.form.get('action')
port = request.form.get('port', '1')
if action == 'off':
subprocess.run(['sudo', 'uhubctl', '-a', 'off', '-p', port])
return '电源已关闭'
elif action == 'on':
subprocess.run(['sudo', 'uhubctl', '-a', 'on', '-p', port])
return '电源已开启'
else:
return '无效操作'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)