Linux里控制USB口的供电

原文链接http://scateu.me/2016/05/30/linux-toggle-usb-power.html 保存一下

方法一

偶然间获得一个USB LED灯. 正好家里有OpenWrt的路由器. 插上去可以亮. 于是想看看能不能通过shell来控制它的亮灭.

居然还真行.

以我的TP-Link WR720N为例:

echo 1 > /sys/class/gpio/gpio8/value #亮
echo 0 > /sys/class/gpio/gpio8/value #灭

以后说不定可以在make或其它什么比较耗时的命令结束之后, blink一下灯. 或者把消息用Morse Code闪出来. 感觉会很好玩的样子.

看来要买一批这样的小灯啦.
在这里插入图片描述

HTTP 访问

把以下几行放到/www/cgi-bin/led:
#!/bin/sh

echo "Content-type: text/html"
echo ""

if [ $(cat /sys/class/gpio/gpio8/value) -eq 0 ]
then
echo 1 > /sys/class/gpio/gpio8/value
echo "<html> <body bgcolor="white">  <div style="text-align:center"><font color="black"><h2>Light is </h2><h1>ON</h1> </font> </div> </body> </html>"                        
else
echo 0 > /sys/class/gpio/gpio8/value
echo "<html> <body bgcolor="black">  <div style="text-align:center"><font color="white"><h2>Light is </h2><h1>OFF</h1> </font> </div> </body> </html>"
fi

这样, 你就可以通过http://example.com/cgi-bin/led来控制灯了.

还可以很方便的用bash来控:

alias blink='for i in 1 2 3 4;do curl -s -o /dev/null http://192.168.11.1/cgi-bin/led;sleep 0.3;done'
alias led='curl -s -o /dev/null http://192.168.11.1/cgi-bin/led'

这样, 就可以优雅地:

wget http://example.com/somemovie.mp4 && blink
make -j12 && blink

最棒的是, 你可以装一个我厂的阿里钱盾, 使用钱盾快启功能, 加一个自定义URL到iOS的全局下拉框中. 非常方便.
(以前用京东的WIFI插座, 拖了一个充电头, 再拖了一个USB LED小灯, 作为夜灯. 要打开手机, 解锁, 打开APP, 等广告, 找到开关, 点. 特别费劲, 而且还费电. )

在这里插入图片描述
与Siri HomeKit集成
链接

sudo npm install -g homebridge
sudo npm install -g homebridge-http

~/.homebridge/config.json里加入

{
    "bridge": {
        "name": "HomebridgePI",
        "username": "CD:22:3D:E3:CE:30",
        "port": 51826,
        "pin": "031-45-156"
    },
    
    "description": "The Onion!",

    "platforms": [],

    "accessories": [ 
    {
        "accessory": "Http",
        "name": "康神的灯的灯灯等等灯",
        "switchHandling": "realtime",
        "http_method": "GET",
        "on_url":      "http://192.168.1.117/cgi-bin/led-on",
        "off_url":     "http://192.168.1.117/cgi-bin/led-off",
        "service": "Light",
        "brightnessHandling": "no",
        "brightness_url":     "http://localhost/controller/1707/%b",
        "brightnesslvl_url":  "http://localhost/status/100054",
        "sendimmediately": "",
        "username" : "",
        "password" : ""					    
          } 
       ]
}

就可以大喊一声”Hey Siri, 开灯”

闪Caps Lock

Linux 下可以:
#turn on
xset led named "Scroll Lock"

#turn off
xset -led named "Scroll Lock"
Mac OS X:
  • https://github.com/busyloop/maclight
    貌似还有闪Morse Code:
  • http://www.psychicorigami.com/2009/03/01/5k-morse-code-app-using-capslock-led/
    以及还有Pidgin新消息到来, 闪Thinkpad的键盘灯(好感人…):
  • pidgin-blinklight
    Thinkpad的键盘灯可以直接被操作:
  • http://www.thinkwiki.org/wiki/ThinkLight
# cd /sys/devices/platform/thinkpad_acpi/leds
# ls
tpacpi::power  tpacpi::standby  tpacpi::thinklight  tpacpi::thinkvantage
# cd "tpacpi::power"
# while true;do echo 0 > brightness;sleep 0.1;echo 1 >brightness;sleep 0.1;done
  • power对应的是电源按钮的灯
  • standby对应的是机器后背的月亮待机灯
  • thinklight对应的是Thinkpad的键盘灯, 可惜在x230上支持有问题, 只能关不能开
  • thinkvantage未知, 应该是在其它Thinkpad机型上有
    以上的支持是由thinkpad_acpi这个Kernel module来支持.

参考

可以与IFTTT相联的开源USB LED灯: http://blink1.thingm.com/

方法二

使用uhubctl

github链接

支持的设备

ManufacturerProductPortsUSBVID:PIDReleaseEOL
AmazonBasicsHU3641V1 (RPi issue)43.02109:28112013
AmazonBasicsHU3770V1 (RPi issue)73.02109:28112013
AmazonBasicsHU9003V1EBL73.12109:28172018
AmazonBasicsHU9002V1SBL, HU9002V1ESL, HUC9002V1SBL, HUC9002V1EBL103.12109:28172018
AppleThunderbolt Display 27" (internal USB hub)62.020112016
AppleUSB Keyboard With Numeric Pad (internal USB hub)32.02011
AsusZ87-PLUS Motherboard (onboard USB hub)43.020132016
B+B SmartWorxUHR20442.00856:DB002013
B+B SmartWorxUSH30443.004B4:65062017
Basler200003623443.00451:80462016
BelkinF5U10142.00451:204620052010
BuffaloBSH4A05U3BK43.005E3:06102015
ByteccBT-UH34043.02109:81102010
CircuitcoBeagleboard-xM (internal USB hub)42.00424:95142010
Club3DCSV-3242HD Dual Display Docking Station43.02109:28112015
CyberPowerCP-H420P42.00409:00592004
CypressCY4608 HX2VL development kit42.004B4:65702012
D-LinkDUB-H4 rev B (silver)42.005E3:060520052010
D-LinkDUB-H4 rev D,E (black). Note: rev A,C,F not supported42.005E3:06082012
D-LinkDUB-H7 rev A (silver)72.02001:F10320052010
D-LinkDUB-H7 rev D,E (black). Note: rev B,C not supported72.005E3:06082012
DellP2416D 24" QHD Monitor42.02017
DellUltraSharp 1704FPT 17" LCD Monitor42.00424:A70020052015
DellUltraSharp U2415 24" LCD Monitor53.02014
ElecomU2H-G4S42.020062011
GlobalScaleESPRESSObin SBUD102 V513.01D6B:00032017
Hawking TechnologyUH21442.020032008
IOIU3H415E143.02012
j5createJUH470 (works only in USB2 mode)33.005E3:06102014
Juiced Systems6HUB-0173.00BDA:041120142018
LG Electronics38WK95C-W monitor43.00451:81422018
LenovoThinkPad Ultra Docking Station (40A20090EU)62.017EF:100F2015
LenovoThinkPad Ultra Docking Station (40AJ0135EU)73.117EF:30702018
LenovoThinkPad X200 Ultrabase 42X496332.017EF:100520082011
LenovoThinkPad X6 Ultrabase 42W310742.017EF:100020062009
LindyUSB serial converter 4 port41.1058F:92542008
LinksysUSB2HUB442.020042010
MaplinA08CQ72.00409:005920082011
MicrochipEVB-USB251772.02008
MoxaUport-40772.0110A:04072009
NVidiaJetson Nano B01 (details)43.02019
PhidgetsHUB0003_072.01A40:02012017
PlugableUSB3-HUB7BC73.02109:08132015
PlugableUSB3-HUB7C73.02109:08132015
PlugableUSB3-HUB7-81X73.02109:08132012
Raspberry PiB+, 2B, 3B (see below)42.02011
Raspberry Pi3B+ (see below)42.00424:25142018
Raspberry Pi4B (see below)43.02109:34312019
RenesasuPD720202 PCIe USB 3.0 host controller23.02013
RosewillRHUB-21042.00409:005A20112014
Sanwa SupplyUSB-HUB14GPH41.120012003
SeagateBackup Plus Hub STEL800010023.00BC2:AB442016
SunixSHB4200MA42.00409:005820062009
TargusPAUH212U72.020042009
Texas InstrumentsTUSB4041PAPEVM42.10451:81422015
#先安装libusb
sudo apt-get install libusb-1.0-0-dev
#再安装uhubctl
sudo apt-get install unhubctl

用法

你可以像这样控制USB端口上的电源:

uhubctl -a off -p 235

这意味着在默认的智能集线器上操作,并关闭端口 2,3,5 ( -p 235 ) 上的( -a off,或者 -a 0 ) 电源。 支持的操作是 off/on/cycle ( 或者 0/1/2 )。 cycle 表示关闭电源,等待一些延迟( 使用 -d 配置),然后将它的打开。

在Linux上,你可能需要使用 sudo 运行它,或者配置 udev USB权限。

如果连接了多个智能USB集线器,则应选择特定的集线器以使用 -l ( 位置) 参数进行控制。

要查找集线器位置,只需运行不带任何参数的uhubctl即可。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux系统中,可以通过"usbutils"工具来控制USB的电源管理。具体可以按照以下步骤进行操作: 1. 首先需要安装"usbutils"工具,可以使用以下命令进行安装: ``` sudo apt-get install usbutils ``` 2. 然后可以使用"lsusb"命令列出系统中连接的USB设备信息,例如: ``` $ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 04f2:b5a7 Chicony Electronics Co., Ltd Bus 001 Device 003: ID 04ca:7070 Lite-On Technology Corp. Bus 001 Device 002: ID 8087:0025 Intel Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ``` 这列出了系统中连接的USB设备信息,包括设备所在的总线号(Bus)和设备号(Device),以及设备的厂商ID和产品ID等信息。 3. 接着可以使用"usbhid-dump"命令来获取设备的USB报文信息,例如: ``` sudo usbhid-dump -es -m XX:YY ``` 其中,XX和YY分别代表设备的总线号和设备号。这个命令可以获取设备的USB报文信息,包括设备上下电等操作。 4. 最后可以使用"usb_modeswitch"命令来控制USB的电源管理,例如: ``` sudo usb_modeswitch -v 0x12d1 -p 0x1446 --message-content="55534243123456780000000000000011062000000100000000000000000000" ``` 其中,"-v"和"-p"选项指定了USB设备的厂商ID和产品ID,"--message-content"选项指定了发送给设备的控制消息。这个命令可以用来控制USB设备的上下电等操作。 需要注意的是,关闭USB供电可能会导致设备失去电力,从而影响设备的正常工作。因此在进行这种操作时需要谨慎操作,并且确保对设备的影响能够被接受。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值