如何通过编程禁用USB供电控制智能插排的电源开关


阅读 9 次

问题场景描述

我手头有一个带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)