AirBattery - 在Mac上实时监控所有苹果设备电量

news/2025/10/10 21:43:07/文章来源:https://www.cnblogs.com/qife122/p/19133932

项目简介

AirBattery 是一款功能强大的 macOS 应用程序,专门设计用于监控和显示您所有苹果设备的电池使用情况。通过创新的"Nearbility Engine"技术,它能够自动搜索并显示周边支持设备的电量信息,无需复杂的配置过程。无论是 iPhone、iPad、Apple Watch 还是其他蓝牙设备,AirBattery 都能在 Dock 栏、状态栏或小组件中实时展示它们的电池状态。

功能特性

  • 多设备电池监控:自动检测并显示 iPhone、iPad、Apple Watch 等苹果设备的电池电量
  • 多种显示方式:支持在 Dock 栏、状态栏和小组件中显示电池信息
  • 智能设备发现:基于"Nearbility Engine"自动搜索周边设备,无需手动配置
  • Nearcast 功能:支持在局域网内查看其他 Mac 及其外设的电量信息
  • 实时状态栏图标:可配置为实时显示电量图标,类似系统原生风格
  • 设备隐藏管理:可根据需要隐藏特定设备,随时恢复显示
  • 蓝牙设备支持:通过蓝牙权限获取周边设备数据包并解析电池信息

安装指南

系统要求

  • macOS 11.0 及更高版本

安装方法

方法一:直接下载
前往 发布页面 下载最新版安装文件。

方法二:Homebrew 安装

brew install lihaoyun6/tap/airbattery

使用说明

基础使用

  1. 启动 AirBattery 后,默认会同时显示在 Dock 栏和状态栏上
  2. 应用程序会自动搜索所有支持隔空电量获取的设备
  3. 点击 Dock 图标、状态栏图标或添加小组件即可查看设备电量

高级功能

  • 在偏好设置中可切换状态栏图标为实时电量显示
  • 使用 Dock 栏菜单或状态栏菜单隐藏/显示特定设备
  • 利用 Nearcast 功能查看局域网内其他设备的电量状态

核心代码解析

蓝牙设备电池数据解析

# 从系统日志中提取蓝牙设备的电池信息
PRED='subsystem == "com.apple.bluetooth" AND (category == "CBStackDeviceMonitor" OR category == "Server.GATT") AND (eventMessage CONTAINS "Battery" OR eventMessage CONTAINS "statedump: 0x001A" OR eventMessage CONTAINS "statedump: 0x001D")'# 查询系统日志获取蓝牙设备数据
data=$(/usr/bin/nice -n 19 /usr/bin/log show $STYLE $LVL --predicate "$PRED" --last "$WINDOW")# 解析电池信息并生成JSON格式输出
for i in `echo "$data"|grep "Battery"|grep -v "VID 0x004C"`
dotime=`echo $i|awk '{print $1"T"$2}'`name=`echo $i|grep -o ", Nm '.*', PID"|sed "s/, Nm '//g;s/', PID//g"`type=`echo $i|grep -o ", DvT [A-z]*"|sed "s/, DvT //g"`batt=`echo $i|grep -o ", Battery M [+-]*[0-9]*%"|grep -o "\d*"`stat=`echo $i|grep -o ", Battery M [+-]*[0-9]*%"|grep -Eo "\+|\-"`mac=`echo $i|grep -o ", BDA [A-z0-9:]*"|sed "s/, BDA //g"`# 输出格式化JSON数据echo "{\"time\": \"$time\", \"vid\": \"$vid\", \"pid\": \"$pid\", \"type\": \"$type\", \"mac\": \"$mac\", \"name\": \"$name\", \"level\": $batt, \"status\": \"$stat\"}"
done

Apple Pencil 电池监控

# 查询Apple Pencil的电池信息
data=`$syslog $type -u $id --process SpringBoard -m '"Accessory Category" = Pencil;' -T SpringBoard`# 解析电池容量和充电状态
batt=`echo "$data"|grep "Current Capacity"|grep -o "[0-9]*"|sed -n '$p'`
stat=`echo "$data"|grep "Is Charging"|grep -o "[0-9]*"|sed -n '$p'`
model=`echo "$data"|grep "Product ID"|grep -o "[0-9]*"|sed -n '$p'`
vendor=`echo "$data"|grep "Vendor ID"|grep -v Source|grep -o "[0-9]*"|sed -n '$p'`# 输出Pencil设备信息
echo "{\"level\": $batt, \"status\": $stat, \"model\": \"$model\", \"vendor\": \"$vendor\"}"

设备特征值数据解析

# 解析GATT特征值数据获取设备信息
devData=`echo "$data"|grep -E "statedump: 0x001A Characteristic Value|statedump: 0x001D Characteristic Value"|grep -o "\[[A-z0-9 ]*\]"|sed 's/\[ //g;s/ \]//g'|awk '{if (NR%2==1) {line=$0} else {print line, $0}}'|awk 'length($0) == 23'`# 结合系统蓝牙配置信息完善设备数据
btData=`/usr/sbin/system_profiler SPBluetoothDataType`
for i in `paste -d ' ' <(echo "$times") <(echo "$devData")`
do# 提取设备VID、PID并匹配设备名称vid=`echo $i|awk '{print "0x"$4$3}'`pid=`echo $i|awk '{print "0x"$6$5}'`name=`echo "$btData"|grep -B3 $pid|sed -n '1p'|sed 's/^ *//g;s/:$//g'`type=`echo "$btData"|grep -A5 $pid|grep "Minor Type: "|sed 's/^ *Minor Type: //g'`
done

更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

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

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

相关文章

HTML学习日记

2025.10.10 打卡HTML中尽量不要省略结束标签,而且空元素最好写<br />而不是<br>,这样子做是保证每一个元素都被关闭(空元素在开始标签中关闭)。 使用小写标签,尽管大写也能解析,但是小写标签更被推荐…

10.10每日总结

今天主要的课程有人机交互和机器学习,还有大数据的作业题差一道没完成(用hbase建表),后天就是外语能力大赛的初赛了,加油!

二分图与网络流 Trick

dag 最大独立集(也叫最长反链)Dilworth 定理:一个 dag 中最大独立集的大小,等于其偏序集的最小不可重链覆盖的大小。听着很神秘,实际是这样: 偏序集:对于每一个点三元组 \((i, k, j)\),如果原图中有边 \((i, k…

10月10号

今天进行了日语的学习。 以及对数据结构和离散数学的复习。

win11 系统如何进行硬盘分区?固态硬盘怎么分区?SSD 固态硬盘分区教程

win11本身就有自带的分区功能,所以不用借肋第三方软件也能分区,下面开始分享分区方法。 win11其实和win10差不多,功能也差不多,如果分区过win10可能都不用学就会。 理解原理 将硬盘分区,就是把原有硬盘类式于一个…

10/10

今天上午就一节课,明天放假,雨什么时候停呀

数论(未完)

前言: 复习一下数论(部分) 裴蜀定理 结论: \(∀a,b∈Ζ\),设\(d=gcd(a,b)\) ,则\(∃x,y\)使得\(ax+by=d\) 推论:\(ax+by=m\)有解,当且仅当\(d|m\) 若\(gcd(a,b)=1\),则存在\(x,y\)使得\(ax+by=1\) 对于\(n\)个…

没做完的题

放在这里待办 定义 \[g(n)=2\sum ^n_{i=2}\left \lfloor \frac{n}{i} \right \rfloor^2 \phi(i)+n^2 \]求 \(g(n)\) 定义 \[f(n)=\frac{g(n)-n^2}{2} \]则 \[f(n)=\sum ^n_{i=2}\left \lfloor \frac{n}{i} \right…

JavaScriptDay1

1.什么是JavaScript 1.1 概述 JavaScript是一门世界上最流行的脚本语言 Java、JavaScript 一个合格的后端人员,必须要精通JavaScript 2.快速入门 2.1、引入javaScript内部标签 <script>//... </script> 外…

淘宝NPM镜像地址https://registry.npm.taobao.org不可用

1 地址已经更新了,https://registry.npm.taobao.org已经停服2 新地址是 https://registry.npmmirror.com

星星充电一面

1、你是否了解ThreadLocal吗 2、如果有父线程和子线程,那么子线程是否能访问到父线程ThreadLocal里面的内容吗 3、那你的项目中只是一个单体项目吗,没有子线程?那如果我想要子线程访问父线程里面的内容怎么办 4、布…

6 CF1034 div3 题解

CF1034 div3 打了一下虚拟赛,感觉自己写代码不够认真,前面三个题都是能秒的,结果还寄了几发 这波直接写不会的题的题解吧,节省时间 F 题面 给定一个 \(n\) ,对于一个长度为 \(n\) 的排列,称满足下面条件的排列为…

5 ABC413 题解

ABC 413 题解 D 题面 给定一个长度为 \(N\) 的整数序列 \(A=(A_1,A_2,\ldots,A_N)\) 。 保证对于任何 \(i\ (1\le i\le N)\) , \(A_i\) 不为 \(0\) 。 判断是否存在 \(A\) 的一个排列 \(B=(B_1,B_2,\ldots,B_N)\) 使得…

4 CF 1032 div3 题解

31 CF 1032 div3 题解 C 题面 给你一个行数为 \(n\) 列数为 \(m\) 的整数矩阵。在第 \(i\) 行和第 \(j\) 列的交叉处的单元格中包含数字 \(a_{ij}\) 。 您可以执行以下操作次:选择两个数字 \(1 \leq r \leq n\) 和 \(…

3 ABC411 C ~ E题解

ABC411 C~E 题解 又是赤石的一天 C 有个长度为 \(N\) 的序列,初始序列中每个数为0 每次操作给定 \(pos\) ,将 pos^1 ,然后输出序列中有多少段不连续的 1 用小样例模拟一下可得,设当前颜色为 \(b\) ,左边颜色为 \(…

9 ABC408 D~F 题解

ABC408 D~F 题解 D 题面 给定一个长度为 \(n\) 的由 01 组成的字符串 \(S\),每次操作可以将某个 0 改成 1,或者将某个 1 改成 0 。 求字符串中至多有一个连续 1 串的最小操作次数。 题解 解法1 考场思路,将每个连续…

8 ABC425 G 题解

ABC425 G 题面 给定两个正整数 \(N,M\) 以及一个长度为 \(N\) 的非负整数序列 \(A = A_1, A_2, ..., A_N\)。求 \[\sum_{x = 0}^{M - 1} \min_{1 \le i \le N} (x \oplus A_i) \]\(1 \le N \le 2 \times 10^5\) \(1 \l…

智能防御,安全赋能:AI-FOCUS 滤海AI DLP 化解外部 AI 风险

在“员工把数据投喂给第三方AI”的常见场景下,企业需要一款可在输入与上传瞬时介入的产品。AI-FOCUS 滤海AI DLP 以流式网关为核心,在用户向大模型输入文本与提交文件/图片时进行敏感数据识别,按风险等级执行放行、…

VS code 中代码补全 自动补全函数括号

使用vscode的pylance插件补全python代码的时候无法补全函数的括号 需要在settings.json中添加这一行即可

学习ReAct并使用langgraph实现一个简单的ReAct AI Agent!!

ReAct介绍 要介绍ReAct最好要知道它是从哪来的。 ReAct这个概念出自《REACT : SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS》这篇很牛的论文。 论文地址:https://arxiv.org/abs/2210.03629 我们先来看下这篇…