本文翻译自hacker博客,原文地址(略)
这个故事来源于我在Facebook上投稿。 这篇帖子讨论了体育健身追踪器缺乏API接口的问题,以及为什么数据专家有助于制造酷的东西。
帖子发出后,我的好朋友Volodymyr Shymanskyy回应帮助我,在github上找Leo Soares项目,找我的健身追踪器小米手环2的代码。 他试图执行它,但由于连接上有一些链接问题,他花了几个小时修复了他。 后来,他提交了commit,并给了我一个链接。
那个满足了我的初步需求,已经相当OK了。 其编码可以连接手环,发出通知,拍摄心脏进行测量。 但是,这对我来说还有点不够。 因为我想从传感器中获取实时的原始数据,在我的数据科学实验中使用(我想做健身运动预测器)。
正文才刚刚开始……在那之前,我从来没有使用过蓝牙设备,所以我先试着了解一下这些东西是如何组织和工作的。 事实证明,并不是什么稀罕事。
每个蓝牙设备都将启动一些服务。 每个服务都有一个特征,某些特征具有描述符(如果有多个参数或工作类型,则为读取|通知)。 也有只有读写权限的特性,如当前时间、电池状态、修订信息等。 一些循环工作更为复杂,例如实时心率监测器和批准,需要请求/通知。 基本上,要开始使用它,你需要知道所有这些。
调试蓝牙设备还需要两个APP:wireshark和BLE debugger。 需要访问Android的手机开发者选项(对不起,iOS的家伙还不知道如何实现它)。
首先,需要从手机APP程序上解除小米手环2的配对。
现在,让我们看看手镯有什么服务和特点。 打开BLE debugger开始扫描吧。 你可以看到这样的东西:
保存设备的MAC地址将用于后续操作。
现在,连接上它,看看跑了什么样的服务和特征。
在以上两个简单的操作中,我们已经得到了一些有用的设备信息。
另一种方法是使用控制台工具hcitool和gatttool。
Scan:sudo hcitool lescan
连接并获取服务和描述符:
sdogatttool-by our _ MAC-I-t random
连接
主要
char-desc
在某些情况下,BLE堆栈可能出现故障。 您可以打开或关闭蓝牙,并执行以下命令:
sudo hciconfig hci0 reset
数据探查需要启用蓝牙并在开发设置中记录日志,以便在我们的手机-基带通信中探查数据。 为此,首先需要打开安卓手机的开发者设置。
以下是操作的详细步骤。 在Android 4.1及更早版本中,缺省情况下可以使用“开发者选项”屏幕。 在Android 4.2或更高版本中,必须按如下方式启用此屏幕:
1 .打开手机设置。
2.) (仅限安卓8.0或更高版本) )选择系统。
3 .向下滚动以选择手机。
4 .向下滚动,然后单击7次Build number 7。
5 .返回上一屏幕,查找底部附近的开发人员选项。
打开开发设置,找到并启用“启用蓝牙HCI snoop log”。 这将记录所有蓝牙通信。 然后,需要找到名为btsnoop_hci.log的文件。 (在我的手机上) Android 7.0 (它位于/mtklog/btlog/btsnoop_hci.log上) )。
要获取有关身份验证(配对)如何工作的信息,请执行以下操作:
1 .打开蓝牙和HCI日志。
2 .将您的设备与小米Android程序配对。
3 .关闭蓝牙。
将btsnoop_hci.log下载到你的电脑上。
在Wireshark中打开。
找到处理0x0055的第一个ATT协议请求
可以看到如图所示的界面:
这是验证步骤:
配对设备
主要服务UUID
000 fee1- 00001000800000805 f9b 34fb
认证特征( Char ) UUID
00000090000351221180009 af 100700
通知描述符( Des )处理
0x2902 (所有流程都一样) ) )。
1 .向des发送2字节请求\x01\x00,设定auth通知(得到响应)。
2 .命令将16字节的加密密钥发送到Char,并添加2字节\x01\x00 KEY。
3.2向Char发送字节\x02\x00,请求设备的随机密钥带命令。
4 .从设备响应中获得随机密钥(最后16个字节)。
5 .使用我们的16字节密钥加密此随机数(从crypto.cipherimportaes ),并将其发送回char(x03(x00编码数据)。
将认证1.2字节\x02 \x00发送到Char,并向设备请求带命令的随机密钥。
2 .从设备响应中获得随机密钥(最后16个字节)。
3 .使用我们的16字节密钥,加密此随机数(从crypto.cipherimportaes ),并发回给char ( x03 )。
实时数据这在认证过程中会有点复杂。 因为我没有看到在这个过程中犯了错误。 (然后,这个心率监测器在15秒后关闭。
硬件服务( HRDW ) UUID
000 Fe E0-0000-1000-8000-00805 f9b 34fb
心脏监测服务( HMS ) UUID
0000180 d-0000-1000-8000-00805 f9b 34fb
心率测量特性( HRM ) UUID
00002 a37-0000-1000-8000-00805 f9b 34fb
心脏监护仪控制特性( HMC ) UUID
00002 a39-0000-1000-8000-00805 f9b 34fb
传感器特性( SENS ) UUID
0000001-0000-3512-2118-0009 af 100700
通知描述符( DES )句柄
0x2902 (所有流程都一样) )。
1 .关闭当前监听的测量。
2 .通过向HMC发送请求\x15\x02\x00,进行成批测量。
3 .通过向HMC发送请求\x15\x01\x00来进行连续测量。
通过向SENS发送命令来启用陀螺仪和心脏的原始数据
5 .通过向HRM写入DES \x01\ x00启用通知
6 .通过向HMC发送请求\x15\x01\x01开始连续心脏测量
向SENS \x02发送命令(我不知道为什么需要这个命令) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )。
8 .然后,如果您每12秒收到一次通知,则必须将\x16 ping发送到HCM
分析数据是最无聊的部分。 基本上是因为我们需要找到如何包装来自设备的包装数据。
其中的一部分可以从日志中解析,但也有不能解析的。
这是当前时间设备的响应
找到合适的数据包和编码可能需要一些时间。 在我的例子中,需要在相邻的数据包中找到相似字节的出现次数、重复的数据包。
raw heart:02102 d8c 348 c 448 c 458 C3 d8c 428 c 488 c 16
raw heart:0218468 c 418 C3 d8c 468 C3 f8c 398 c 418 c 16
Realtime heart: 93
raw heart:0220408 c 448 C3 f8c 428 c 498 C3 c8c 3d 8c 16
raw heart:02283 d8c 398 c 488 C3 e8c 468 c 488 c 328 c 16
Realtime heart: 99
raw heart:0230438 c 408 c 378 C3 a8c 318 c 458 c 388c 16
实时标题: 102
raw heart:02404 f8c 408 c 458 c 428 C4 d8c 558 C4 d8c 16
raw heart:02483 e 8c3 b 8c3 f8c 348 c 398 c 318 c 428 c 16
Realtime heart: 98
raw heart:02504 c8c 428 C5 E8 C4 f8c 588 c 498 c 558 c 16
raw heart:0258478 c 458 C3 c8c 4e 8c3 f8c 468 C4 d8c 16
实时标题: 100
raw heart:0260518 C4 D8 C4 f8c 4b8 C4 f8c 528 c 458 c 16
raw heart:0268408 C3 f8c 538 C4 d8c 408 c 548 c 598 c 16
实时标题: 102
raw heart:0278418 c 508 C4 e8c 548 c 588 c 468 c 498 c 16
raw heart:0280368 c 328 c2e 8c3 c8c 338 c 308 C3 f8c 16
实时标题: 101
可见,重复368 c 328 c-2e8c 338 c 338 c-308 c 3f8c,包长度为16字节。 因此,如果用2字节无符号的短数据进行解压缩,就可以获得7个心脏传感器的原始测量结果。 也可以看到第二个字节只是一个迭代。 我想那只是测量间的时间差。 (指响应的时间差。 ) )
raw gyro:01de 49 ffd9ff 3c 004 cffd 8f F3 b 004 dffd CFF 4400
raw gyro:01df4cffd6ff 44004 dffd8ff 40004 cffd1ff 4700
raw gyro:02e 1103231323 d 3274328 e 329632 a f32 c 732 cf 32
raw gyro:01e 34 fffd7ff 56004 BFF c7f f 590049 ffccff 4c 00
raw gyro:01e 443 ffccff 43004 effcdff 40005 bffd 4ff 4c 00
raw gyro:01e 558 ffc9ff5f 005 eff bfff 66005 fffb 0f 5900
raw gyro:01e 64 cffacff 60005 cffa7ff 410066 ffc9ff 4600
raw gyro:01e 760 ffdc ff 4b 0051 FFE 4ff 4f 0034 ff deff 5300
raw gyro:02e 903365 c 368136636103654368374139 fe3a
raw gyro:01e B4 BFF C3 ff 50004 fff C1 ff 430047 ffbb ff 4100
raw gyro:01e C3 eff B2 ff 3c 0050 ffbfff 560047 ffccff 7300
raw gyro:01ed4fff E0 ff 78005 CFF ebf F8 e 0056 fff6ff 8300
raw gyro:01ee7efffbffa 1008 BFF 0f 00 BC 00 B1 ff 1900 b 800
raw gyro:01e F9 BFF 0c 00 d 10095 fff 3ff d600 b7ff 0800 df00
raw gyro:02f 12445314600479 e 473348 aa 481 c 499749244 a
raw gyro:01 F3 C3 ff 1600 Fe 00 beff 1800 f 200 a6 ff 0800 e 700
raw gyro:01f4a9fff 8f FD 300 a7fff3ffd 700 a9 fff1ffdf 00
raw gyro:01f5b1fff8ff e800 B4 fff1fff 700 acfffcffef 00
raw gyro:01f 67 ffff7ffc 0006 bfff4FFB 00078 FFE9FFB 600
raw gyro:01f 786 FFE cffc 0006 ffff 0f FBC 0060 fff1ffc 000
raw gyro:02f9ca4cbb 4c 784 c 964 ca 84c 784 c 854 c 444 C1 b4c
raw gyro:01fb7CFF 0f 00 bb 007 eff 2700 AE 0083 ff 30009800
raw gyro:01fc 79 ff 1800 b 00076 ff 0f 00 BC 0068 ff 0900 d 900
raw gyro:01fd 78ff 07000 c01 F6 fff BFF 19011 c 000 b 00 f 600
raw gyro:01fe 4b 001100 d 30054000700 c 3004300 eff feb 00
raw gyro:01 ff1f 00 d 0f 1701 fbffe 8f f1 b01 E3 fffff 1101
raw gyro:0201214 b 014 be C4 ad 04 ABA 4a CB 4a be 4a ba 4a BD 4a
raw gyro:0103 effec fffc 00 E3 fff3fff 300 deff F3 fffc 00
raw gyro:0104 E3 fff 0f ff 400 E6 FFE fff 0301 dbffe9ff0c 01
raw gyro:0105 E3 fff 0f 0301 E6 FFE6fffc 00 dcffecffc 00
raw gyro:0106 dffff 0f ff 700 dbffeefff 600 D6 fff 0f ff 400
raw gyro:0107 dffecffff 00 E1 fff 0f 0301 deff F3 fffc 00
关于陀螺仪,有点难。 但是,我的想法应该和心脏数据一样进行打包,在这种情况下,对应该签名的每个陀螺轴进行三次测量,数据包长度为20字节。 因此,12 x、y和z测量并不涵盖所有数据包,但3保留前两个字节(与前一个数据包相同)。 所以我就这样试着做了。 否则工作正常。
代码,你可以找到我的github仓库( creotiv/MiBand2)下载案例的代码。 这很简单。 老司机请自己搜索。 这里不多做说明。
光遇1.23每日任务该怎么完成呢?在光遇世界有着各种精彩有趣的任务内容,玩家可以完成后获取大量的游戏奖励,小编
《云顶之弈》这游戏中卢安娜的飓风这件武器最近版本更新中被强化了,分裂攻击的伤害效果大大提升。有些小伙伴
迷你世界激活码2023是哪些呢?在精彩有趣的全新挑战活动中,玩家可以体验到更多丰富的游戏奖励。小编今天准备了
很多传奇的老玩家关心关于贪玩蓝月祝福油怎么用的相关问题,今天柠檬友玩小编给大家搜集整理了如下内容,希望对
《魔兽世界怀旧服》中存在着多样的公会制度,DKPROLL团就是其中之一,关于这个制度的意思好优劣势,本文将为你解
斗罗大陆魂师对决阵容最佳搭配2023,新版本上线了很多魂师,我们应该如何搭配呢?以下为大家分享新版本顶级阵容大
时间:2022-12-30
时间:2022-12-30
时间:2022-12-30
时间:2022-12-30
时间:2022-12-30
时间:2022-12-30
时间:2022-12-30
时间:2022-12-30
时间:2022-12-30
时间:2022-12-30