iOS备用机自动充电方案

news2025/2/21 23:23:45

搬到新加坡以后,我拥有了很多张手机卡:

  • 1张国内的电话卡,回国时使用

  • 1张新加坡电话卡,本地使用

  • 1张马来西亚电话卡,去马来西亚旅行时使用

  • 1张英国电话卡,去欧洲旅行时使用

相对应的,我需要有备用机来运行这些号码。正好手上有一台旧的iPhone XR,于是我就把其中两张卡插到了这个手机里。但随之而来的是另一个问题,手机长期插电对电池非常不友好,很有可能导致备用机电池彻底废掉。

垃圾佬的家里从来不缺少设备,很快我翻出一个之前从国内带来的米家智能插座2,前几年买来当智能网关用的。但来新加坡以后家里基本没有智能设备了,所以一直在吃灰。

我完整的预想是,将备用机插在智能插座上,然后通过iOS的Shortcuts来监控手机电量——当手机电量小于30%的时候自动开启插座;当手机电量充到80%的时候自动关闭插座。

控制米家智能设备

说干就干,查了下资料,网上对米家生态的协议、工具其实都分析地比较完善了,没有遇到太多困难。

首先,使用 https://github.com/PiotrMachowski/Xiaomi-cloud-tokens-extractor 这个Python脚本获取我的小米账户绑定的智能设备:

ee012e84347e8eb6f55162ff59535485.png

可见,我只有3个智能设备,第一个就是米家智能插座2(“Mi Smart Power Plug 2”)。

这个插座信息里包含了其ID,Mac地址,IP地址,通信使用的Token和其设备型号(Model):

NAME:     Mi Smart Power Plug 2 (Wi-Fi and Bluetooth Gateway)
ID:       xxxxx
MAC:      12:34:56:78:90:AB
IP:       192.168.1.187
TOKEN:    token....
MODEL:    chuangmi.plug.212a01

米家设备通信端口是54321,协议是UDP,所以想知道自己家里的米家设备地址,也可以用nmap扫描这个端口,比如:

nmap -sU -p54321 --open 192.168.1.0/24

def5cf2d56d0911c8e0429cb07133bb8.png

拿到IP地址和token以后,我们可以使用python-miio这个工具来访问我们的设备。

miiocli chuangmiplug --ip 192.168.1.187 --token xxxxx info

尝试一下后发现工具报错,并不识别我的插座model:

6ece1482b5bee0b9b9ced767cd6717bb.png

原因可能是我的设备型号比较小众,所以命令没有添加进来。问题不大,到 https://home.miot-spec.com 使用Model名称是可以搜索到这款产品的:

5b254915a7a0520a879056296a04fb22.png

点击进去,就能看到米家智能插座2全部功能的通信协议属性:

776f1b690a80c42ecb750eda26c6432d.png

还挺全的,其中我最需要的当然是第一个“Switch”。

看到其中的SIID和PIID了吗?Switch功能的SIID是2,开关on的PIID是1,所以发送如下信息就可以开启开关:

[{'did': 'MYDID', 'siid': 2, 'piid': 1, 'value':True}]

同理,发送如下信息可以关闭开关:

[{'did': 'MYDID', 'siid': 2, 'piid': 1, 'value':False}]

参考这个issue,使用如下命令来发送raw message:

miiocli device --ip 192.168.1.187 --token xxxxx raw_command set_properties "[{'did': 'MYDID', 'siid': 2, 'piid': 1, 'value':True}]"

成功点亮。

自动化控制

在网上浏览一番,发现有一个系统 Home Assistant ,基本可以完全实现自动化,且不需要编程。不过我家里智能设备少得可怜,杀鸡焉用牛刀呢?如果我只为了控制开关,其实简单写个脚本就行了。

家里正好有一个树莓派上面运行着一个DNS服务器,是PHP写的,所以我也用PHP写了一个简陋的脚本丢在树莓派Web目录下:

<?php
header('content-type: text/plain');
if (empty($_SERVER["HTTP_X_CSRF_TOKEN"]) || $_SERVER["HTTP_X_CSRF_TOKEN"] != "xxxxxx") {
    echo "csrf check error\n";
    exit;
}

define('TOKEN', 'token');
define('IP', '192.168.1.187');
define('PUSHDEER_KEY', 'pushdeer key');

$action = $_POST['action'] ?? '';
$battery = $_POST['battery'] ?? '';
if ($action === 'on') {
    $result = shell_exec('miiocli device --ip '.IP.' --token '.TOKEN.' raw_command set_properties "[{\'did\': \'MYDID\', \'siid\': 2, \'piid\': 1, \'value\':True}]"');
    $message = "当前电量:${battery}%,已开始充电";
} else if ($action === 'off') {
    $result = shell_exec('miiocli device --ip '.IP.' --token '.TOKEN.' raw_command set_properties "[{\'did\': \'MYDID\', \'siid\': 2, \'piid\': 1, \'value\':False}]"');
    $message = "当前电量:${battery}%,已停止充电";
}

echo $result;
file_get_contents('https://api2.pushdeer.com/message/push?pushkey='.PUSHDEER_KEY.'&text=' . urlencode($message));

echo "done\n";

前两行主要是为了防止CSRF漏洞,不要正常上网的时候插座被其他人控制。

后面的代码就非常简单了,主要就是调用miiocli的命令开关插座,并且在开启和关闭时,通过 pushdeer 给我发送通知。

使用burp来测试一下效果,实测可以正常开启插座:

f09ce59279c4247f666bf53e1336eee1.png

我的主力机也收到了pushdeer的推送:

e2f9902c4e8e12b1064c10b849e5b5da.png





集成iOS快捷指令

现在完成了服务端,还需要定制一下客户端,用于触发开关。

首先添加一个开启插座的快捷指令,其内容是发送HTTP请求给树莓派:

176e65a59a280621f3bf9c4f4cdaa599.png

然后在捷径里增加一个Automation,选择在电量小于30%时触发:

e44f44cf87cc537bb471d4f60608127a.png

找到刚才添加的Shortcut,组成一个完整的指令:

34b579c5888a49ce593bd506b3c1495d.png

注意,要把Ask Before Running关掉,否则不能实现全过程自动化。

同理,增加一个电量大于80%时自动关闭的自动化。

另外,我还增加了一个定时任务,每天检查一次一次当前手机电量,如果发现大于90%或小于20%,说明前面的动作没成功,那么再重启关闭或开启一次开关。这是为了防止某一天网络出问题,开关没有成功开启或关闭的情况下,能够有兜底机制。

不知道为何苹果没有提供小时级别的定时任务,否则这个方案会更完美一些。

总结

最后,花了大概3个小时时间,把整个流程搞完了,又等了一天测试,完美运行,非常顺滑,妈妈再也不用担心我的电池~

从成本上来讲,这个方案其实还是有点浪费,智能插座的大部分功能实际上并没有用上(虽然它本身也是吃灰)。以后有机会,可以研究研究更廉价的方案,早日实现多备用机同时待机。

866bf57bc5ba99e95506ebd14b0765e0.gif

喜欢这篇文章,点个在看再走吧~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DSP篇--C6701功能调试系列之 FLASH测试

目录 1、 FLASH介绍 2、 FLASH功能测试 调试的前期准备可以参考前面的博文&#xff1a;DSP篇--C6701功能调试系列之前期准备_nanke_yh的博客-CSDN博客 1、 FLASH介绍 FLASH作为EMIF的外设&#xff0c;对其操作就需要根据EMIF相关配置来确定FLASH的地址了。 一般地&#xff…

Django第二天学习记录

1.对于路由配置的正则化补充(re_path的正则匹配) 对于第一天学习的path转换器过于暴力&#xff0c;对于需要匹配的内容不能很精准的进行转换。为了实现精准的字符串匹配规则&#xff0c;因此引入了re_path&#xff08;reg,view,namexxx&#xff09;进行路由规则的精确匹配。 正…

关于云计算的 7 大误区

一直以来&#xff0c;有几个关于云计算的误区四处传播&#xff0c;散布恐惧和不必要的不信任。在使用新技术之前研究新技术并检查事实是很好的。让我们来看看关于云计算的 7 大误区&#xff0c;看看哪些是真的&#xff0c;哪些不是。 1.云迁移可能很麻烦 云迁移包括许多过程&am…

KMP算法讲解与实现

0、概述 KMP是用于字符串查找/匹配的算法&#xff1b; KMP算法的时间复杂度&#xff1a;O(n)O(n)O(n)&#xff1b; KMP算法的核心&#xff1a; 1&#xff09;如何理解 next 数组2&#xff09;如何利用 next 数组加速匹配过程&#xff0c;优化时的两个实质 KMP算法的实现 1…

推荐|资深架构师 10 年 10 条干货职场心得

出道这么些年&#xff0c;跳过好多公司&#xff0c;除了国企其他的基本上都去过&#xff0c;甲方、乙方、外包、外企、互联网公司、创业公司…总结下来有这么些体会&#xff0c;希望能对你和大家有些参考价值。1. 保持学习可能离开了学校之后&#xff0c;所有的学习几乎都出于工…

b站黑马的Vue快速入门案例代码——图片切换(类似手动播放的轮播图)

目录 目标效果&#xff1a; 重点原理&#xff1a; 1.用数组储存图片的数据 2.v-bind指令可以设置元素属性 e.g.src 语法 v-bind:属性名表达式 简写【实际开发常用】 :属性名表达式 3.v-show和v-if都可以切换元素的显示/隐藏状态 (1)频繁切换显示/隐藏的dom元素用 v…

Opencv项目实战:17 贪吃蛇游戏

目录 0、项目介绍 1、效果展示 2、项目搭建 3、项目代码展示与讲解 4、项目资源 5、项目总结 0、项目介绍 这次是一个有意思的计算机视觉游戏——贪吃蛇&#xff0c;我们以食指为蛇头&#xff0c;不断的移动我们的手指&#xff0c;当吃到甜甜圈的时候&#xff0c;蛇身增…

浅谈字节码增强技术系列2-Asm与Cglib

作者&#xff1a;董子龙 前言 记得那是2022年秋天的第一场雨&#xff0c;比2021年来的稍晚一些&#xff0c;在那个秋雨朦胧的下午&#xff0c;正在工位上奋笔疾书的我突然听到了前面波哥对着手机听筒说出来的"温柔"的话语&#xff1a;说说你了解的spring-aop。话音…

基于Vision Transformers的文档理解简介

文档理解是从pdf、图像和Word文档中提取关键信息的技术。这篇文章的目标是提供一个文档理解模型的概述。 文档理解算法使用编码器-解码器结构分析文档内容&#xff0c;该管道结合了计算机视觉(CV)和自然语言处理(NLP)方法。管道的CV部分将文档作为输入图像进行分析&#xff0c…

对数据库索引的理解以及索引在MySQL中的数据结构

引言 索引在本质上相当于书的目录&#xff0c;通过目录就可以快速的找到某个章节对应的位置。索引的效果&#xff0c;就是加快了查找的速度。日常进行数据库的操作&#xff0c;一般地都是进行增删查改&#xff0c;而在很多场景中&#xff0c;进行查找的概率要比增删改大很多。…

搭建Flutter Web开发调试环境

Setting up the Framework/Engine development environment背景搭建 framework 开发环境修改调试 framework 源码运行 framework 测试用例同步更新 framework 源码搭建 engine 开发环境准备 depot_tools部署 engine 源码编译 engine 源码修改调试 engine 源码指定 --local-engi…

​极氪汽车被曝拟美股上市:最高募资10亿 李书福接连收获IPO

雷递网 雷建平 12月13日极氪汽车日前被曝出已“秘密递交申请”&#xff0c;准备在美股上市&#xff0c;此次拟募资10亿美元&#xff0c;估值可能高达100亿美元。有分析认为&#xff0c;极氪汽车秘密递交招股书&#xff0c;是为尽可能向其他竞争对手隐藏招股书细节&#xff0c;以…

十二、对象继承深入、call_apply、※圣杯模式、※构造函数和闭包、※企业模块化

十二、对象继承深入、call_apply、※圣杯模式、※构造函数和闭包、※企业模块化 对象继承深入 原型链继承 原型链定义 ​ 对象沿着__proto__在原型上寻找属性形成一种链条式的继承关系&#xff0c;这种继承关系就叫做原型链。 例如&#xff1a; Professor.prototype {na…

Linux(二)vim编辑器,gcc,库

vim 简介 vi是“visual interface”的简称。 类似于Windows下的记事本。 vim可以视为vi的高级版本 按下vimtutor进入帮助文档&#xff0c;以下内容在其中都有 vim的三种模式 Vi有三种基本工作模式&#xff1a;命令模式、文本输入模式、末行模式 基本操作 命令模式下的操作…

迷宫--dfs解法以及迷宫问题要不要回溯

文章目录题意题解思路&#xff1a;问题&#xff1a; 迷宫问题dfs要不要回溯&#xff1f;题意 一天Extense在森林里探险的时候不小心走入了一个迷宫&#xff0c;迷宫可以看成是由 n∗n 的格点组成&#xff0c;每个格点只有2种状态&#xff0c;.和#&#xff0c;前者表示可以通行…

装载问题 ——分支限界法(Java)

装载问题 ——分支限界法&#xff08;Java&#xff09; 文章目录装载问题 ——分支限界法&#xff08;Java&#xff09;1、 问题描述2、算法设计3、算法的改进4、程序代码5、参考资料1、 问题描述 有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船&#xff0c;其中集 装箱…

数图互通高校房产管理——教职工住宅方案

数图互通房产管理系统在这方面做得比较全面&#xff1b; 1、住房管理 1.1 住房档案 住房模块的管理主要是针对学校的承租住宅和已售住宅的管理&#xff0c;用于登记已售住宅的产权人信息&#xff0c;记录承租住宅的租赁起止日期、月租金等基本信息。 支持住房的坐落信息、楼栋…

Cas:146368-11-8(水溶)|Sulfo CY5-羧酸|Cyanine5 Carboxylic Acidic acid

Cas:146368-11-8(水溶)|Sulfo CY5-羧酸|Cyanine5 Carboxylic Acidic acid Sulfo CY5-羧酸这种分子可以被认为是非活性染料&#xff0c;用于控制样品和仪器校准。为了与胺和蛋白质标记偶联&#xff0c; 中文名&#xff1a;Sulfo CY5-羧酸 英文名&#xff1a;Cyanine5 Carboxy…

rate-limit 一款 java 开源渐进式分布式限流框架使用介绍

项目简介 rate-limit 是一个为 java 设计的渐进式限流工具。 目的是为了深入学习和使用限流&#xff0c;后续将会持续迭代。 特性 渐进式实现 支持独立于 spring 使用 支持整合 spring 支持整合 spring-boot 内置多种限流策略 快速开始 需求 jdk 1.7 maven 3.x mav…

ARM S5PV210 时钟系统与时钟体系框图

前言 This chapter describes the clock management unit (CMU) supported by S5PV210. The system controller (SYSCON) manages CMU and power management unit (PMU) in S5PV210. 本章介绍 S5PV210 支持的时钟管理单元&#xff08;CMU&#xff09;。系统控制器&#xff08…