手机服务器长期运行,ADB本机充电、小米智能插座 自动充电策略
前言
当我们需要手机长期开机,运行挂机服务时候,自动充电是一个需要考虑的问题,涉及到安全问题,这就需要考虑自动充电策略了
软件层面实现
root手机:
控制充断电可以安装app自动充电
https://f-droid.org/en/packages/mattecarra.accapp/
软件层面实现 root两种方法
更新:我没有长期测过adb命令 adb 命令没有root情况下似乎不能真正控制是否充电,虽然电量显示不变化,但是拔掉之后发现电量依然增加
2.1 ADB(Android Debug Bridge)usb调试
在电脑端通过usb数据线ADB控制充电,缺点是,需要你有一个电脑,还得usb 不停 插着 ,局限多。。。所以本文不多介绍,主要讲解ADB电池管理操作
以下是一些常见的使用 ADB 进行电池管理的命令:
查看电池状态信息:
adb shell dumpsys battery
获取电池电量百分比:
控制充电状态
此命令将启用 USB 充电
adb shell dumpsys battery reset
adb -s 127.0.0.1:5555 shell dumpsys battery reset #指定设备
此命令将停用 USB 充电
adb shell dumpsys battery unplug
adb -s 127.0.0.1:5555 shell dumpsys battery unplug #指定设备
adb shell dumpsys battery | grep level
模拟电池充电状态:
adb shell dumpsys battery set status <status>
其中
2.2 ADB wifi调试(Android 4.0+ 无线调试)
这种方法的好处就是可以实现adb本机控制本机,也可以实现局域网群控
缺点是机型失效,即使电池图标显示没在充电,但是仍然有电流在充电,应该是厂商定制系统的问题
安装软件包
pkg install android-tools curl vim
编辑shell脚本 vim ato-charging.sh
将:i
代码复制粘贴,自己修改参数,保存退出:wq
,给予权限 chmod +x ato-charging.sh
运行./ato-charging.sh
代码已经托管到github 命令
wget https://raw.githubusercontent.com/geekplayers/termux-install-typecho-wordpress/main/ato-charging.sh && chmod +x ato-charging.sh
./ato-charging.sh #运行
#!/data/data/com.termux/files/usr/bin/bash
#script: Automatic Battery Charging Control
#blog:linzimo.com
#environment:termux
#dependences-pkg: curl,android-tools,
#企业微信推送开关"on"开启 其他值关闭
push="off"
#""内改为自己的webhook地址
webhook="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693"
#间隔时间,单位为秒
sleep="60"
# 发送企业微信消息函数
send_wechat_notification() {
local message="$1"
if [[ "$push" == "on" ]]; then
curl -s -k -H "Content-Type: application/json" -d "{\"msgtype\": \"text\", \"text\": {\"content\": \"$message\"}}" "$webhook"
fi
}
# ADB 连接函数
adb_connect() {
# 检查设备是否已连接
devices=$(adb devices | grep -v "List of devices attached")
if [[ -z $devices ]]; then
echo "未找到已连接的设备"
return 1
fi
# IP 地址
ip=127.0.0.1
# 连接设备
adb tcpip 5555
adb connect $ip:5555
echo "已连接设备:$ip"
}
# 自动充电函数
auto_charge() {
# 获取电池电量百分比
battery_level=$(adb shell dumpsys battery | grep level | awk '{print $2}')
# 获取设备温度
temperature=$(adb shell cat /sys/class/thermal/thermal_zone0/temp)
temperature=$(($temperature/1000)) # 转换为摄氏度
echo "电量:$battery_level%"
echo "温度:$temperature°C"
# 判断温度是否过高
if [[ $temperature -gt 41 ]]; then
echo "温度过高,停止充电"
adb -s 127.0.0.1:5555 shell dumpsys battery unplug
# 发送微信通知
message="温度高于41度,已停止充电"
send_wechat_notification "$message"
elif
# 判断电量是否低于50%
[[ $battery_level -lt 50 ]]; then
message="电量低于50%,开始充电..."
echo "$message"
send_wechat_notification "$message"
adb -s 127.0.0.1:5555 shell dumpsys battery reset
elif [[ $battery_level -gt 90 ]]; then
# 判断电量是否高于90%
message="电量高于90%,停止充电..."
echo "$message"
send_wechat_notification "$message"
adb -s 127.0.0.1:5555 shell dumpsys battery unplug
fi
}
# 主函数
main() {
# 连接 ADB
adb_connect
# 循环执行自动充电函数
while true; do
auto_charge
sleep $sleep # 间隔时间,单位为秒
done
}
# 执行主函数
main
打开开发者选项-->开启无线调试
查看本机ip ifconfig
连接本机 adb connect 127.0.0.1:5555
如果连了WiFi可以 adb connect <局域网IP>:5555
物理层面实现,也是最安全有效的方法
python-miio库控制小米智能插座
我用的是目前相对最便宜的一款( 淘宝¥39 ,目前618活动米家app内商城-->优品新人优惠价¥29):
Gosund电小酷智能插座CP1白色(WIFI版) 单个装 白色
1.脚本获取插座令牌(token)
相比于用找米家修改版、root安卓机查看米家日志(目前已经失效),最简单方法就是使用的是github上的python脚本了
这个脚本模拟Android米家APP的登录,以直接获取到自己账号下的智能设备信息,就能直接拿到token了,当然前提是你在米家app登陆该账号并添加插座设备,这样米家服务会在云端保存插座信息。
下载运行脚本shell命令
pip3 install requests
wget https://github.com/PiotrMachowski/Xiaomi-cloud-tokens-extractor/raw/master/token_extractor.py
python3 token_extractor.py
2.安装python-miio库
尝试用pip安装
pip install python-miio
遇到编译安装cryptography失败 ERROR: Could not build wheels for cryptography, which is required to install pyproject.toml-based projects
pip工具手动安装再次报错 $pip install cryptography,最后在cryptography项目issue上找到最新的解决方法
https://github.com/termux/termux-packages/issues/9982
手动安装官方编译好的python拓展pkg包
pkg install python-cryptography
再次安装python-miio,没有报错,安装成功。
接下来就可以测试插座是否可连接
获取设备信息
由于旧安卓版本adb可能无法连接调试本机,所以获取手机电池信息用termux插件termux-api实现,需要安装termux-api软件,
miiocli device --ip <ip> --token <token> info
注意:termux与插座连接到同一局域网,替换
成功返回结果
~ $ miiocli device --ip 192.168.6.181 --token 5735d4a2ce13e339ac560a6d7f3e2131 info
Model: cuco.plug.cp1d #型号
Hardware version: esp8266 #硬件版本
Firmware version: 2.1.3_0002 #固件版本
1.在终端中输入以下命令,使用Python解释器逐行执行代码:
python
2.在Python交互式环境中,输入以下代码,按Enter执行:
打开开关
from miio import Device; Device("<设备IP地址>", "<设备令牌>").send("set_properties", [{"siid": 2, "piid": 1, "did": "state", "value": True}])
关闭开关
from miio import Device; Device("<设备IP地址>", "<设备令牌>").send("set_properties", [{"siid": 2, "piid": 1, "did": "state", "value": False}])
执行命令后返回一串信息
[{'did': 'state', 'siid': 2, 'piid': 1, 'code': 0}]
这个列表表示发送命令的响应结果。在这个例子中,响应结果中的'code': 0表示命令执行成功,没有错误发生。
测试完毕后可以使用这个python程序来控制插座了
import argparse
import time
import subprocess
from miio import Device
#myblog:linzimo.com
# ------设置插座的IP地址和令牌-------
ip = "192.168.1.1"
token = "5735d4"
# ------设置插座的IP地址和令牌-------
def get_battery_info():
battery_info = subprocess.check_output(['termux-battery-status']).decode('utf-8')
battery_data = {
'level': int(battery_info.split('"percentgage":')[1].split(',')[0]),
'temperature': float(battery_info.split('"temperature":')[1].split(',')[0])
}
return battery_data
def toggle_gosund_plug(ip, token, state):
device = Device(ip, token)
device.send("set_properties", [{"siid": 2, "piid": 1, "did": "state", "value": state}])
print(f"Gosund插座已{'打开' if state else '关闭'}")
# 解析命令行参数
parser = argparse.ArgumentParser(description='Battery Control')
parser.add_argument('-on', action='store_true', help='打开插座')
parser.add_argument('-off', action='store_true', help='关闭插座')
parser.add_argument('-start', action='store_true', help='开始自动检测触发开关服务')
parser.add_argument('-test', action='store_true', help='测试打开和关闭')
args = parser.parse_args()
if args.on:
toggle_gosund_plug(ip, token, True) # 打开插座
elif args.off:
toggle_gosund_plug(ip, token, False) # 关闭插座
elif args.test:
print("正在尝试打开插座...")
toggle_gosund_plug(ip, token, True) # 打开插座
time.sleep(3)
print("正在尝试关闭插座...")
toggle_gosund_plug(ip, token, False) # 关闭插座
time.sleep(3)
print("正在尝试termux-api命令 termux-battery-status...")
battery_data = get_battery_info()
print("当前电池信息:")
print(f"电量:{battery_data['level']}%")
print(f"温度:{battery_data['temperature']}°C")
elif args.start:
battery_low_threshold = 50 # 电池电量低于此阈值时,打开插座
battery_high_threshold = 90 # 电池电量高于此阈值时,关闭插座
temperature_threshold = 40 # 电池温度高于此阈值时,关闭插座
print("开始自动检测并开关服务...")
# 运行自动开关逻辑
while True:
battery_data = get_battery_info()
battery_level = battery_data['level']
battery_temp = battery_data['temperature']
if battery_level < battery_low_threshold:
print("当前电量低于{battery_low_threshold},打开插座")
toggle_gosund_plug(ip, token, True) # 打开插座
elif battery_level > battery_high_threshold or battery_temp > temperature_threshold:
print("当前电量高于{battery_high_threshold},或温度高于{temperature_threshold},关闭插座")
toggle_gosund_plug(ip, token, False) # 关闭插座
time.sleep(60) # 每隔60秒检查一次电池电量和温度
else:
parser.print_help()
代码已经托管在github 使用wget下载
wget https://raw.githubusercontent.com/geekplayers/termux-install-typecho-wordpress/main/battery_control.py #wget下载
python battery_control.py #默认获取命令教程
#加入参数
python battery_control.py -start #自动检测温度控制
python battery_control.py -on #单独打开插座
python battery_control.py -off #单独关闭插座
python battery_control.py -help #使用命令教程
注意运行前填入你插座ip token,修改温度阈值,并在同一局域网
pkg intall termux-api
参考
本文系作者 @linzimo 原创发布在林子墨站点。未经许可,禁止转载。
暂无评论数据