ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

小米手环6表盘自定义:iOS获取auth_key与刷入救砖全流程

小米手环6表盘自定义:iOS获取auth_key与刷入救砖全流程 小米手环6在小米手环家族里算是一代可玩性比较高的产品1.56英寸AMOLED、152×486的分辨率屏幕空间比前几代宽裕得多第三方表盘生态也因此热闹了好一阵。但官方表盘商店的更新节奏一直不快很多人想把自己喜欢的图、自己画的界面塞进去问题就来了小米手环的蓝牙通信是加密的手机App跟手环之间有一条基于共享密钥的加密通道这个密钥就是auth_key。没有它第三方工具连手环都握不上手更别谈往里面写表盘资源。安卓那边路子相对多一些iOS这边因为系统封闭、蓝牙日志不好取不少人卡在第一关就放弃了。这篇就把我这一路从固件版本选择、auth_key获取思路、表盘制作到刷入以及中途救砖的完整过程摊开讲一遍适合手里有小米手环6、愿意折腾但被iOS环境卡住的朋友安卓用户也可以对照着排查。1. 小米手环6表盘自定义的底层逻辑与前提认知1.1 auth_key到底是什么为什么绕不开它先把这个词说清楚。auth_key本质上是手环和手机配对时协商出来的一段16字节共享密钥十六进制写出来就是32个字符。手环作为蓝牙外设手机作为中心设备两者配对时会走一轮密钥协商协商结果同时存在手机App的本地数据库和手环的Flash里。之后所有涉及读数据、写资源、升级固件的指令都要用这个key做加解密否则手环直接拒绝响应。你可以把它理解成手环和手机之间的一把共享门钥匙手机拿着它进门手环也认这把钥匙。第三方工具不是官方App手上没有这把钥匙所以第一件事就是想办法把它从已有配对关系里读出来。注意这里说的是从你自己的设备上提取自己的配对凭证属于个人设备自定义范畴跟攻击别人设备是两码事。握手流程大致是这样的手机连上手环的认证特征后写一个16字节随机数过去手环用auth_key把它加密后返回手机这边用同一个key加密同一个随机数比对两边结果是否一致一致就各写一个确认字节随后这条链路就进入加密模式。整个流程在社区文档里有比较完整的整理理解它对你后面排查认证失败这类报错非常有帮助。1.2 iOS和安卓在取key这件事上的路线差异安卓的便利在于文件系统相对开放。早期做法是拿到root权限后直接读App的数据库文件找到存auth_key的那张表不开root的做法是打开系统的蓝牙HCI日志开关复现一次配对再从btsnoop日志里筛出密钥交换报文。两条路都不算复杂社区工具也成熟。iOS就麻烦不少。App沙盒是封闭的你没法直接去翻数据库。iOS这边能走的路主要是蓝牙HCI日志安装对应的蓝牙调试描述文件、重启设备、复现一次配对流程然后通过系统诊断日志把HCI记录导出来再用Xcode附带的分析工具打开。日志能拿到但格式晦涩需要你自己在成千上万条报文里定位那16字节。这里有个很多人不知道的折中方案auth_key是跟账号手环绑定的不跟手机绑定。你完全可以借一台安卓设备用同一个账号配对手环把key取出来再回到iOS侧使用。key一旦拿到换手机、换系统都不影响只要账号一致、手环没解绑。我实测这条路最省事后面会展开。1.3 动手前需要准备的东西把清单列一下免得做到一半发现缺东西小米手环6本体国行和国际版在固件分支上有差异取key流程基本一致但刷表盘时资源包要对版本。至少一台能连手环的手机iOS是你的主力安卓设备建议借一台备用。一台电脑Windows、macOS、Linux都行跑一些脚本和打包工具用。Python运行环境3.8以上很多社区脚本依赖它。表盘制作工具社区里有现成的图形化工具和命令行工具。手环电量保持在50%以上刷入过程断电是变砖高发原因。提前对现有固件版本、资源包版本做个记录方便出问题时回滚。提示动手前先把手环和App里的数据同步一次确认账号登录状态正常。登录态异常会导致后面取key时配对失败白折腾一圈。2. 固件版本对取key和刷表盘的实际影响2.1 固件、资源包、表盘三者的层级关系很多人把这三个概念混在一起结果刷错东西。简单拆一下固件是手环的操作系统管逻辑、管驱动、管蓝牙协议栈资源包是界面素材集合包含图标、字体、动画帧表盘是资源包体系里一个相对独立的资源文件通常是一个二进制文件通过蓝牙专门的服务写入。三者可以分别更新。升级固件不一定动你的表盘换表盘也不用动固件。但固件版本会影响资源写入的校验策略这就是为什么最新固件这个前提很关键。新固件往往收紧了未授权工具的写入权限改动认证特征的交互方式甚至对资源文件加了签名校验。你在旧固件上跑通的那套流程升到最新可能直接报错这不是你操作错了是规则变了。2.2 为什么最新固件反而容易踩坑社区里有个共识手环的固件越新第三方工具的兼容性越差。厂商在新版本里做的加固本意是提升安全性副作用就是自定义空间被压缩。常见的表现有三种认证特征返回的数据结构变化导致老脚本解析偏移资源写入时多了一道校验没有对应签名的表盘直接被拒DFU服务的分包大小调整老工具的传输节奏对不上进度条卡住。所以标题里说最新固件获取auth_key实际场景往往是你已经在最新固件上了或者你不得不升级那就要接受流程可能需要调整这个事实。我的建议顺序是先把手环刷到你想停留的版本把key取到手再做表盘。反过来先刷一堆表盘再升级固件很可能升级过程中表盘被清掉还得重来。2.3 升还是降一个实际的取舍参考下面这张表是我根据自己和身边人折腾的经验整理的仅供参考具体以你手环实际型号和版本为准固件状态取key难度刷第三方表盘难度建议较早版本较低认证流程简单较低校验宽松想省事就停在这里先取key再决定是否升级中间版本中等中等部分工具仍可用先备份key再升级出问题可回退最新版本偏高日志特征不明显偏高可能需专用工具已升级的不要慌优先用安卓设备取key我个人的取向是不盲目追新固件。手环这东西功能稳定比版本号好看重要。除非新固件修了你必须用的功能否则停在一个刷表盘顺畅的版本上日常体验反而更好。3. iOS环境下获取auth_key的具体做法3.1 路线一iOS原生蓝牙日志适合不借设备的人这条路纯iOS缺点是繁琐。步骤大致是在设备上安装苹果官方提供的蓝牙调试描述文件安装后重启进入设置里的分析数据界面确认蓝牙日志开始记录把手环解绑再重新配对一次让密钥协商过程完整跑一遍随后导出系统诊断日志用Xcode附带的分析工具打开HCI记录。打开之后你要做的是在海量报文里找认证特征的读写记录。密钥相关的报文通常出现在配对完成后不久特征是写入方向有一段16字节数据紧接着读取方向返回一段经过加密的数据。找到写入的那16字节结合账号信息做一次推导就能得到auth_key。难点在于日志量大、字段不直观第一次做可能要花一两个小时。注意调试描述文件用完记得卸载。长期挂着会增加系统日志量对续航和存储都有轻微影响而且没必要一直开着。3.2 路线二借安卓设备配对取key最省事的路子这是我最推荐的方式。准备一台安卓设备装官方App登录和iOS上完全相同的账号然后配对手环。配对完成后开系统的蓝牙HCI日志开关或者用支持读取本地配对信息的工具把auth_key取出来。取到之后记在安全的地方iOS侧就能直接用。关键点在于账号一致。因为密钥协商是账号维度的同一个账号在不同设备上跟同一只手环配对得到的auth_key是同一把。这就是为什么借设备这条路走得通。我实测过几次安卓取key再回iOS用完全没问题手环也不需要在两边反复解绑绑定。再强调一遍key到手后要妥善保管。它相当于你手环的通行证泄露给别人别人就能用第三方工具连你的手环。存的时候别放在随便同步的网盘或者聊天记录里。3.3 路线三从已有的日志备份里翻如果你之前折腾过电脑里可能留着旧的分析日志或者配对记录那里面说不定就藏着这把key。翻之前先确认是同一只手环、同一个账号的记录否则拿到的key是无效的。这个路线适合我好像弄过但忘了存哪的情况成功率看运气不建议作为首选。3.4 key的正确性怎么验证拿到一串32位十六进制字符串后别急着往表盘工具里填先验证。验证方法很简单用支持手动填key的工具连一次手环能正常读到电量、步数、心率这些基础数据就说明key是对的如果工具报认证失败、连上就断开那就是key错了或者格式不对注意区分大小写有些工具要求小写有些大小写不敏感。用Python验证也可以社区里有基于异步蓝牙库写的示例脚本核心逻辑就是连接、写认证随机数、用key加密、比对返回值。下面是一段结构示意具体特征值以你自己抓到的为准import asyncio from bleak import BleakClient AUTH_CHAR 00000009-0000-3512-2118-0009af100700 AUTH_KEY bytes.fromhex(你的32位十六进制key) async def check(address): async with BleakClient(address) as client: # 订阅认证特征通知 await client.start_notify(AUTH_CHAR, lambda s, d: print(recv:, d.hex())) # 写入随机数实际流程需按协议补全加密与比对 await client.write_gatt_char(AUTH_CHAR, b\x00 * 16, responseTrue) await asyncio.sleep(2) asyncio.run(check(手环蓝牙地址))这段只是骨架真实流程里加密、比对、确认字节的顺序都不能省。第一次建议直接用现成工具验证别自己从头写。4. 第三方表盘的制作与刷入全流程4.1 表盘资源包里到底装了什么一个表盘二进制文件拆开看主要是几块文件头包含魔数和版本标识图片资源区装着背景图、数字、图标格式多为压缩后的位图布局信息记录每个元素的坐标、尺寸、图层顺序还有一些控制字段决定时间怎么刷新、电量进度条怎么走。手环屏幕是152×486这是你设计素材的硬性画布尺寸。背景图一般会按块切分因为整张图直接塞进去体积太大工具会把它做成若干个小图块按需刷新。单张表盘文件通常控制在几十KB到几百KB超过限制工具会报错刷入也容易中途失败。4.2 素材准备和设计上的几个硬规范画布尺寸严格按152×486来多一个像素都可能让元素错位。图片用PNG带透明通道方便做叠加图层。数字和日期这类动态元素要单独出图做成图集不要和背景烧在一起。颜色别太艳AMOLED屏在深色背景下显示效果好浅色大面积填充容易看出色差。元素避开边缘10像素左右防止被圆角裁切。我踩过的一个坑是数字图集顺序搞反了刷进去之后时间显示成乱码排查了半天才反应过来是打包时序号没对上。做图集时命名规范一点比如用0到9对应文件名能省很多事。4.3 打包与刷入的完整流程打包这一步交给工具你只负责输出正确的中间文件。流程是导入素材、设置各元素坐标、指定刷新逻辑、导出bin文件。导出后先别直接刷用工具自带的预览功能看一眼确认元素位置没问题。预览和实机显示偶尔有细微差异但大问题都能提前发现。刷入是通过蓝牙的资源写入服务完成的手环端表现为一段进度。整个过程要保证手环和手机或电脑距离近、电量足、别切后台。刷入时手环屏幕通常会亮起进度指示进度走完后自动重启重启完成表盘就换好了。第一次刷建议选个体积小的表盘试水成功之后再上大的。注意刷入过程中不要主动断开蓝牙、不要锁屏、不要切换App。中途断连轻则刷入失败需要重来重则资源区写入一半导致手环显示异常。4.4 回滚和恢复方案刷坏了别慌先想回滚。官方App里通常有恢复默认表盘或者重新同步资源的入口把手环连上官方App让它重新下发一次官方资源包大部分软件层面的异常都能恢复。如果官方App也连不上就需要进恢复模式用手环的物理按键或者插充电器的方式触发然后用官方的升级工具重刷一次完整固件。我的习惯是每次动手前把手环当前固件版本和资源包版本记在小本本上出了问题照着版本回刷。这个习惯救过我两次尤其是折腾新固件的时候。5. 常见故障与排查速查表5.1 连接和认证类问题现象可能原因处理思路工具连上手环立刻断开auth_key错误或格式不对重新核对key注意大小写和位数配对时一直转圈账号登录态异常退出账号重新登录再配对读不到电量步数服务UUID选错或固件不兼容确认工具支持当前固件版本iOS侧连不上蓝牙缓存残留关闭蓝牙再打开必要时重启手机5.2 刷入中途失败类问题现象可能原因处理思路进度卡在某个百分比不动表盘文件过大或传输节奏不匹配换小体积表盘重试缩短设备距离刷入后表盘显示错乱素材坐标或图集序号错误回退官方表盘重新打包素材刷完手环黑屏资源文件损坏进恢复模式重刷官方资源包反复提示认证失败固件升级后校验变严换用支持新固件的工具版本5.3 手环变砖的抢救思路先说结论小米手环这类设备真正意义上的砖很少大多数是软件层面卡住。抢救手段按顺序试第一长按触摸键或者摘下来放一会儿再戴上让它重新握手第二插上充电器手环检测到供电有时会强制重启第三用官方App强制同步一次资源第四进恢复模式用官方工具重刷完整固件。我遇到过一次刷表盘刷到一半手环没了反应屏幕黑的连官方App也搜不到。当时心里咯噔一下后来插上充电器等了三分钟它自己亮起来进了恢复界面重新同步资源就恢复了。所以遇到黑屏先别下结论说坏了给它点时间和电量往往能缓过来。6. 我在这件事上踩过的坑和长期维护心得6.1 几个真实的教训第一个坑是电量。我图省事在电量不到30%的时候刷表盘刷到八成进度手环自动关机吓得我够呛。后来养成了50%以上再动手的习惯再没出过这类问题。第二个坑是图省事跳过验证。拿到key直接往工具里填刷了半天连不上最后发现是key里多了个空格。这种低级错误浪费的时间最多写下来提醒自己。第三个坑是升级固件前没备份key。有次手环自动升级了固件原来的工具连不上我以为key失效了折腾半天才发现是工具版本没跟上key本身没问题。从那以后key我存在本地一个加密文档里升级前一定会确认手里有备份。6.2 关于这套流程的长期看法小米手环6的自定义生态能玩多久取决于固件更新的节奏和社区工具的跟进速度。客观讲厂商收紧权限是趋势第三方工具的适配会越来越吃力。但这不影响已经跑通的用户继续用只要固件不强制升级你手环上的表盘就一直能用。我的建议是把核心信息掌握在自己手里key、固件版本、资源包版本这三样记清楚。工具可以换流程可以调但这三样是所有操作的基础。至于表盘本身做几个自己真正喜欢的就够了没必要追数量。我现在手环上就留了两个自己做的表盘一个显示信息多的一个极简的换着戴用着舒服比看起来热闹重要得多。如果后面你还想继续折腾可以试试把表盘制作脚本化素材准备好之后一条命令出bin文件批量做主题系列会轻松很多。这条路我已经走通一半素材版本管理是个小难点等整理利索了再单独写一篇。
返回列表