如何攻克小米手环2并基于Linux控制它


如何攻克小米手环2并基于Linux控制它,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
这个故事源于我在Facebook一个帖子,帖子中讨论了运动健身追踪器都缺乏API接口的问题,还有为啥不用它帮助数据专家为做一个炫酷的东西。帖子发出之后,我的好基友Volodymyr Shymanskyy就响应来帮助我,并在github上找了Leo Soares项目,为我的健身追踪器小米手环2找了一些代码。他尝试运行它,但是连接出现了一些链接问题,所以他花了几个小时修复了他。之后,他提交了个commit,并给了我链接。那满足了我的初步需求,已经相当OK了。那代码可以连接到手环,发布通知,并获取一次拍摄心脏测量。但这对我来说还有点不够,因为我想从传感器获得实时原始数据,以便在我的数据科学实验中使用(想要做一个健身运动预测器)。在此之前,我没有任何使用蓝牙设备的经验,所以首先我试着了解了所有这些东西是如何组织和工作的。事实证明,也没啥难得。每个蓝牙设备都会启动几个的服务,每个服务都有特征,并且一些特征具有描述符(如果特征有多个参数或工作类型(阅读|通知))。某些特性只有读/写访问权限,比如当前时间,电池状态或修订信息。其中一些更复杂并且通过请求/通知循环工作,例如实时心率监视器和授权。基本上,你需要知道这一切的,才能开始使用它。您还需要两个应用程序来帮助调试蓝牙设备:Wireshark和BLE debugger。你还需要需要访问安卓手机开发者选项(对不起,对于iOS家伙我还不知道如何做到这点)。首先,您需要从手机应用程序中取消小米手环2的配对。现在让我们看看手环有什么服务和特征。让我们打开BLE debugger,开始扫描,你会看到类似这样的东西:

将设备的MAC地址保存下,后续操作会用到它。现在让我们连接它,看看它跑了什么服务和特征。
以上两个简单的操作中,我们已经获得了一些有用的设备信息。另一种方法是使用控制台工具hcitool和gatttool。连接并获取服务和描述符:在某些情况下,BLE栈可能会出现故障,您可以打开/关闭蓝牙或运行以下命令:为了我们的手机基带通信中嗅探数据,我们需要启用蓝牙在开发设置记录日志。要做到这一点,您需要先打开安卓手机上的开发人员设置。在Android 4.1及更低版本上,开发者选项屏幕默认可用。在Android 4.2及更高版本中,您必须按如下所示启用此屏幕:1.打开手机设置。2.(仅适用于Android 8.0或更高版本)选择系统。3.滚动到底部并选择关于手机。4.滚动到底部并点击Build number 7次。5.返回到上一屏幕以查找底部附近的开发人员选项。现在打开开发设置并找到“启用BleutoothHCI snoop log”并启用它。这样,所有蓝牙通信都会被被记录。然后你需要找到名为btsnoop_hci.log的文件(在我手机中(Android 7.0)它位于/mtklog/btlog/btsnoop_hci.log)现在我们还要要执行一下步骤来获取有关认证(配对)如何工作的一些信息。1.打开蓝牙和HCI日志。2.将免费云主机域名您的设备与小米安卓程序配对。3.关闭蓝牙。4. 下载btsnoop_hci.log到你的电脑。5.用Wireshark打开它。6.找到第一个处理0x0055的ATT协议请求你会看到如图的界面:
这是验证步骤:配对设备主要服务UUID0000fee1-0000–1000–8000–00805f9b34fb认证特征 (Char) UUID00000009–0000–3512–2118–0009af100700通知描述符 (Des) 处理0x2902 (所有的过程都一样)1.通过向Des发送2个字节请求 x01x00来设置auth通知(以获得响应)。2.用命令将16字节的加密密钥发送给Char,并附加2字节x01x00 + KEY。3.通过发送2个字节x02x00到Char来向设备请求带有命令的随机密钥。4.从设备响应中获取随机密钥(最后的16个字节)。5.使用我们的16字节密钥,用AES/ECB/ NoPadding(来自Crypto.Cipher import AES)对此随机数进行加密,并将其发送回Char(x03x00+编码数据)1.通过发送2个字节x02 x00到Char来向设备请求带有命令的随机密钥。2.从设备响应中获取随机密钥(最后16个字节)。3.使用我们的16字节密钥和使用AES / ECB / NoPadding(来自Crypto.Cipher import AES)对此随机数进行加密,并将其发送回Char( x03 x00 +编码数据)这在认证过程中稍微复杂一些,因为我没有看到在这个过程中犯了一个错误:)并且因为这个心率监视器在15秒后关闭。硬件服务(HRDW)UUID0000fee0-0000-1000-8000-00805f9b34fb心脏监护仪服务(HMS)UUID0000180d-0000-1000-8000-00805f9b34fb心率测量特征(HRM)UUID00002a37-0000-1000-8000-00805f9b34fb心脏监护仪控制特性(HMC)UUID00002a39-0000-1000-8000-00805f9b34fb传感器特性(SENS)UUID00000001-0000-3512-2118-0009af100700通知描述符(DES)句柄0x2902(所有过程都一样)1.关闭当前监听的测量。2. 通过向HMC发送请求x15x02x00进行一次性测量。3. 通过向HMC发送请求x15x01x00进行连续测量。4.通过向SENS发送命令到x01x03x19来启用陀螺仪和心脏原始数据5.通过向HRM写入DES x01 x00启用通知6.通过向HMC发送请求x15x01x01来启动连续的心脏测量7.发送命令到SENS x02(不知道为什么需要这指令)8.然后,在每12秒收到一次通知时,需要将x16 ping发送到HCM这是最枯燥部分,因为基本上你需要找出如何解包来自设备的打包数据。它的一部分可以从日志中解析出来,有些不能。
这是当前时间的设备的响应找到合适的数据包和编码可能需要一些时间。就我的例子而言,我需要找到相邻的数据包中相似的字节出现次数,有些重复的数据包。从中我们可以看到清晰的数据,重复368c 328c 2e8c 3c8c 338c 308c 3f8c,数据包长度为16字节。因此,如果我们用2个字节的无符号短数据解压缩,那么我们可以得到7个心脏传感器的原始测量结果。我们也看到第二个字节只是迭代,我认为它只是测量之间的时间差异(我指的是响应的时间差)
至于陀螺仪,就有点困难。但是我的想法是它应该与心脏数据类似的方式打包,但在这种情况下,我们对每个应该签名的陀螺仪轴进行3次测量,数据包长度为20个字节。因此,12 x,y,z测量不会覆盖所有包,但3将会保留前2个字节(与之前的包相同)。所以我这样试了,过不然工作是正常的。关于如何攻克小米手环2并基于Linux控制它问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注云编程开发博客行业资讯频道了解更多相关知识。

相关推荐: python中怎么使用模块函数

今天就跟大家聊聊有关python中怎么使用模块函数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。import 模块名注意再此方法中函数的调用方法:模块名.函数名()import 模块名 as 别名注意别…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/02 16:47
下一篇 02/02 16:48