米家电子温湿度计Pro 数据读取(一) 您所在的位置:网站首页 温度湿度计的时间调整 米家电子温湿度计Pro 数据读取(一)

米家电子温湿度计Pro 数据读取(一)

2024-06-14 22:31| 来源: 网络整理| 查看: 265

故事背景

最近在网上发现了这款高颜值的小钟,就忍不住剁手了。几十元的价格,还是相当划算的。体积小巧、温度计、湿度计、水墨屏、可蓝牙连接米家智能……(小米,你看我这能申报广告费不,比如给我免单),产品图如下:

米家电子温湿度计Pro项目简介

现在进入主题。在某次连接这款温湿度计调时间的时候,突然发现这款温湿度计(后面简称小米Pro)可以自动记录过去半年的温湿度,这岂不是小型气象站。由于只有这款米家设备,不想使用米家APP,而且为了后续的数据处理,必须支持把原始数据导出。这就开始了一系列的折腾之旅……

技术背景

看了网络上众多大佬的文章,做出如下总结:1. 小米Pro的蓝牙是可以直接连接的 2.连接后可以直接读取小米Pro的数据,没有加密。

就此前提我们的目标是可实现的,我把总的过程分为两个步骤,数据获取和数据处理。

数据获取

(Tip:后来找到了window通过Python读取蓝牙数据的方法,数据获取就变得十分简单,直接一键运行,详情见我的第二个帖子。由于这篇里写了许多关于小米Pro记录数据格式的内容,这个段落我就不更改了)

本以为蓝牙数据获取十分简单,但是我错了。我在Windows平台上尝试用Python读取小米Pro的数据,但是没有成功。通过Windows端的包只实现了蓝牙的扫描和蓝牙服务的读取,没有实现数据的读取和发送。感觉在Linux上实现方便很多,有许多现车的包。

在Windows中的应用商店里,有一款叫 Bluetooth LE Explorer 的软件在蓝牙服务分析上还是非常好用的,在应用里蓝牙连接小米Pro后,双击可以直接查看蓝牙所有的服务名。在里面有一个服务名ebe0cb0开头的服务(如下图所示),是用来进行和小米Pro数据交互的。数据格式的解析,在Github上已经有大佬破解了,网址我会放在最后。在这里我只介绍两个,一个是当前的温湿度读取,另一个是历史数据的读取。

小明Pro数据交换服务

当前温度的数据很好读取,在这个软件中都有直接的注释。比如在图中描述为Temperature and Humidity的一行就是当前的温湿度,读取的值为28-08-46-B6-0A。读取出的数据为十六进制,所以要转换,但在转换前需要对数据提取和转化才行。在头两组数(28-08)代表的是温度,下一组(46)是湿度,最后两组(B6-0A)是当前电量。读取的顺序还必须是倒序,比如温度读取的数据是 28-08,正确的顺序应该是 08-28。转成十进制后位2088,代表着当前温度为20.88度。其他数据的读法和温度的相同。

历史数据的读取是通过蓝牙广播发送接收的,如上图中有一个notify的滑块,打开后就会自动接收来自小米Pro的广播。每次连接蓝牙打开广播后,小米Pro就会广播发送所有的历史纪录。以上图为例,历史数据为标注有data notify那一行。数据一共有14组,头四组代表的数据编号,接下来四组是记录的时间,然后两组代表最高温度,一组湿度,两组最低温度,最后一组似乎没有意义。读法都是一组一组倒着读,然后转成十进制。注意时间是通过unixtime的形式记录的,记录的是从1970年1月1日开始至现在的秒数。由于Bluetooth LE Explorer这软件不能储存广播的数据,所有的数据都会一闪而过,这就十分尴尬。回到开头,没有在windows上找到对应的读取蓝牙方法,那就借用了一下手机,有个叫BLE调试助手的软件,可以存储小米Pro广播的数据。有点繁琐,但是没有办法……读出来的数据还不能直接txt打开,需要用一个叫Replace Pioneer的电脑软件。这真的亿点点繁琐。

数据处理

通过上面的一系列操作,终于得到了所有的历史数据,由于手机上那个软件存储的数据是16组一行,原本的是14组,所有需要在额外处理一下。但是这些操作都可以Spyder直接处理,或者Matlab。总体过程就是先读取文件,然后转换成14组每行,再读取对应的数据再转化成10进制,最后画图……。最后附上参考代码:

参考:

https://github.com/JsBergbau/MiTemperature2/issues/1



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有