
本帖最后由 点点&木木 于 2019-4-12 21:22 编辑 / y3 J: J+ p7 i" @ 让我们破解这个小米设备来获取它使用ESP32传输的数据! ![]() - w8 a( A7 c m3 r 9 O2 F l" W3 x ~2 ]- n$ C 硬件组件 ESP ESP32S × 1 M+ d X( F3 L2 T; l1 ~% y" b! x x 简介:ESP32 Xiaomi Hack - 无线获取数据 亲爱的朋友们欢迎来到另一个教程!今天我们将学习如何使用ESP32板的蓝牙功能获取小米温湿度监测仪传输的数据。 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image003.png
![]() 如您所见,我使用的是ESP32板和2.8“彩色TFT显示屏。在显示屏上,我们显示温度和湿度。很酷的是我没有将任何传感器连接到ESP32板。我从这款商用小米温湿度监测仪无线获取温度和湿度。多么酷啊!小米设备上的显示每秒更新一次,但我连接到ESP32板的显示器每隔10秒更新一次,以节省小米设备的电量。 这款酷炫的小米温湿度传感器可在液晶显示屏上显示温度和湿度,还可以使用蓝牙协议将数据传输到其他小米设备或应用程序。这些设备使用单个AAA电池,因为它是商业产品,所以设备的电池寿命非常好。它可以使用单个AAA电池持续数月,这是我们DIY项目无法实现的。几个星期前,我发现一些聪明的家伙设法对小米用于从传感器传输数据的协议进行逆向工程,并设法使用ESP32板获取数据。所以我试了一下,你可以看到它是有效的! ' k* L& Q; d: t% G第1步:获取所有零件 现在让我们看看如何构建这个项目。我们需要ESP32板,2.8“ILI9341显示器,小米温湿度传感器,面包板和一些电线。 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image003.png
![]() TD B: k4 u+ i* W3 q% g$ [8 ~: R+ \+ u6 t2 U2 F 以下是我将在本教程中使用的部分的一些链接。 ESP32▶ http://educ8s.tv/part/ESP32 2.8“显示▶ http://educ8s.tv/part/28ILI9341 小米传感器▶ http://educ8s.tv/part/XiaomiThermometer 面包板▶ http://educ8s.tv/part/LargeBreadboard 电线▶ http://educ8s.tv/part/Wires USB仪表▶ http://educ8s.tv/part/UsbDoctorOLED Powerbank▶ http://educ8s.tv/part/Powerbank ) T3 E* K& ~# f0 M; |" n- _$ F$ S 第2步:ESP32板 ![]() 如果您不熟悉它,ESP32芯片是我们过去多次使用的流行的ESP8266芯片的继承者。ESP32是一个野兽!它提供两个32个处理核心,工作频率为160MHz,大量内存,WiFi,蓝牙和许多其他功能,成本约为7美元! 它提供了深度睡眠模式,只需要10μA的电流。这使得ESP32成为低功耗应用的理想芯片。 $ i4 I6 ~ {3 Q+ k; W" M2 s2 m+ V' f8 @1 b0 K 第3步:2.8“用于Arduino和ESP32的TFT显示屏 ![]() & q- b0 b* b# A w; g. K& O, R+ e5 C ![]() , Y- A8 T( J0 X7 ? U 显示屏很大,分辨率为320x240像素。与我最喜欢的显示器相比,1.8英寸彩色TFT显示屏可以看到它更大。屏幕还提供触摸功能,后面的SD卡插槽是额外的奖励。它使用SPI接口,因此与Arduino或ESP32板的连接非常简单。显示器的成本相对较低; 它的成本约为11美元,在我看来这是显示器提供的合理价格。 关于这个显示器的另一件事是它不像我们目前使用的触摸显示器那样作为屏蔽。这样,我们就可以将显示器连接到任何电路板,Arduino Pro mini,STM32,ESP8266和ESP32。这非常重要,因为我们现在有一个低成本的显示器,我们可以使用每个板。到目前为止,我们可以在这些主板上使用的唯一触控显示器是更昂贵的Nextion显示器,说实话,即使我不使用它们,我也不太喜欢它们。 d3 l$ Y7 _7 Z8 R 第4步:连接显示器 首先,我们必须将ESP32板连接到2.8“显示器。您可以找到本教程附带的原理图。我正在使用大约两年前发布的DOIT ESP32板。这个版本的电路板已不再可用,因为现在有更新版本的电路板提供更多引脚,这个版本。我使用旧版电路板的唯一原因是电路板的GND引脚位于SPI引脚的旁边,位于电路板的同一侧。 ![]() ) g& n; ?) O9 {0 @ o5 ~% S. }! j ![]() 2 V: }6 G, U* T3 | 将显示器连接到电路板后,我们可以启动项目。几秒钟后,我们会从附近的小米设备接收实时数据。由于该设备使用蓝牙4,因此它的范围非常好。我们可以轻松获取此设备从最远10米或更远的距离传输的数据!我们也可以收到小米设备的电池电量,但是我没有在屏幕上显示这个值。 ![]() : e5 r" b4 R: `+ t4 q; g* S 如果我们使用这款USB仪表,我们可以看到使用这款大显示屏,该项目的电流消耗约为120-150 mA。如果我们使用电子纸显示器,将ESP32板置于深度睡眠模式,并且每隔几分钟从传感器获取数据,我们就可以使该项目对电池友好。我将在未来的视频中尝试这一点。这个项目只是一个演示,我们可以无线地从这个设备获取数据。 ![]() $ |. |$ a5 {8 l 第5步:项目代码 ![]() 现在让我们看看项目的软件方面。 该项目的代码基于这个项目:https://github.com/turlvo/KuKuMi 我使用了从小米设备获取数据的代码,并用它构建了一个独立的项目。 在这个变量中,我们声明我们需要每10秒获取一次新数据。 #define SCAN_TIME 10 // seconds 在这里,我们声明我们要以摄氏度显示温度。如果要使用Imperial系统,只需将此变量设置为false即可。 boolean METRIC = true; //Set true for metric system; false for imperial 在设置功能中,我们初始化ESP32板的显示器和蓝牙模块,然后我们在屏幕上绘制用户界面。 , j& z7 b7 Q% @% X# E, u- D, ~1 H WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector tft.begin(); 6 Q( b& |: o7 r) l9 C Serial.begin(115200); Serial.println("ESP32 XIAOMI DISPLAY");3 y9 u% X: a9 ]/ M! y' h! y8 Z initBluetooth(); drawUI(); } , ]! ]6 z8 p' ]% L' c+ U 接下来,我们每隔10秒搜索附近的蓝牙设备。我们不与小米设备建立连接,因为它不需要。我们只扫描附近的蓝牙低功耗外设并检查广播广告包。 ) H1 ^! p y5 @( [5 T" u void loop() { char printLog[256];( @9 F/ d5 f5 m+ p0 r' T Serial.printf("Start BLE scan for %d seconds...\n", SCAN_TIME);1 i% N& \! A: P BLEScanResults foundDevices = pBLEScan->start(SCAN_TIME); int count = foundDevices.getCount();6 Z& O2 O" N5 V: s y6 | printf("Found device count : %d\n", count); delay(100); } + L" ~5 I2 a! Q+ r 湿度和温度值存储在这些数据包中,因此我们只需要读取它们。在我们读取值后,我们在屏幕上显示它们。与往常一样,您可以在本教程附带的说明中找到指向此项目代码的链接。 & a" j" x! T6 a% v0 d 第6步:最终的改进和改进 ![]() ! n+ m% s# Z9 p1 r4 J- U* O ![]() % j) I) y" Q, a2 J : h& @. j0 H6 B2 h' G2 ^: } 现在我们知道如何从这个传感器无线获取数据,我们可以建立一个完整的电池供电气象站。由于这款小米设备是商用产品,因此可提供出色的电池寿命。不幸的是,我们的项目还没有实现类似的电池消耗。因此,我计划将此传感器用作气象站项目的户外传感器,该项目将使用大型电子纸显示器。这会很酷。此外,我将搜索其他小米蓝牙设备,我们可以用类似的方式破解。 ' d E, x$ }9 f$ j+ B2 H 6 N, i7 h) p! [: h! j4 F代码 void setup() { WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector tft.begin(); Serial.begin(115200); Serial.println("ESP32 XIAOMI DISPLAY"); initBluetooth(); drawUI(); } Y* Q, T9 z& D: g$ d1 G; b$ r% P |
那个USB显示供电电流电压挺不错的,寄过来擦擦灰 |
赞一个 |