ZNDS智能电视网 推荐当贝市场

TV应用下载 / 资源分享区

软件下载 | 游戏 | 讨论 | 电视计算器

综合交流 / 评测 / 活动区

交流区 | 测硬件 | 网站活动 | Z币中心

新手入门 / 进阶 / 社区互助

新手 | 你问我答 | 免费刷机救砖 | ROM固件

查看: 233337|回复: 4
上一主题 下一主题
[分享]

极米new Z6X接入米家教程 实现小爱控制蓝牙开机及Wifi关机

[复制链接]
跳转到指定楼层
楼主
发表于 2024-1-10 17:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
如何将极米new Z6X接入米家,实现小爱控制蓝牙开机及Wifi关机等功能是一个不小的挑战。本文将为你提供详细的教程,帮助你轻松实现极米new Z6X与米家的完美结合。

参考前人的经验,使用ESP32开发板,写了个程序,实现了极米new Z6X投影仪接入米家,小爱控制的功能。

主要实现的有:
1、Wifi接入巴法,实现米家控制;
2、蓝牙广播特定manufacturer data实现完美蓝牙开机;
3、Wifi  UDP广播实现复杂指令的完美快速关机。

======================分割线=====================

2024.1.7更新

先说一下思路:先研究极米蓝牙遥控器开机时发射的蓝牙广播特点,再测试wifi udp广播的指令关机,没问题后使用ESP32的蓝牙和wifi模块分别模拟遥控器和手机app的关机指令。最后把这个开关功能接入巴法实现完美小爱同学开关机

一、先说开机,这个方案是用ESP32发送一个蓝牙广播,模拟原机遥控器实现的开机功能,所以不用考虑接智能开关的方案了。
使用的ESP32如图:

极米new Z6X接入米家教程 实现小爱控制蓝牙开机及Wifi关机

极米的蓝牙遥控测试:

1. 需要一个苹果的ios设备,在App Store下载 bluetooth smart scanner app,安卓上好像nRF Connect也可以实现类似功能,github上能下载到。
2. 将你的投影仪主机彻底断开电源。
3. 不停的按遥控器上的开机按键,这时在bluetooth smart scanner app上应该可以找到遥控器发射的ble advertisement信号,我的会出现名称为Bluetooth 4.0 RC的设备
4. 在上面的信号中,找到manufactorer data,我的遥控器在按下开关键时会快速闪动显示如图的字符<46004617 03efb224 40ffffff 3043524b 544d>
    这个manufactorer data是模拟蓝牙遥控的关键。有的设备可以在网上查到,ios - How can I clone a non-paired BLE signal from a remote to trigger a device? - Stack Overflow  ,但最好还是自己测一下。

极米new Z6X接入米家教程 实现小爱控制蓝牙开机及Wifi关机

5. 建议先通过EFR connect. 这个安卓app, 验证下能否使用上面的manufactorer data唤起投影仪。

极米new Z6X接入米家教程 实现小爱控制蓝牙开机及Wifi关机

如果能成功使用上面图中的Manufacturer data填写方法成功打开投影仪,这步就成功了。

======================分割线=====================

二、Wifi关机功能

这部分我是直接沿用前面几位大佬的研究直接拿来用,总结一下:

极米有2套api可用,一套是复杂指令,一套是简单的按键输入,所有指令均是通过upd连接到目标机器上。
复杂api
端口:16750
指令内容如以下格式:
  1. {"action":20000,"controlCmd":{"delayTime":0,"mode":6,"time":0,"type":0},"msgid":"2"}
复制代码

可以实现快速关机,不用等15秒。

简单按键api
端口:16735
格式如下:
  1. KEYPRESSES:116
复制代码

下面这是测试的一些功能:
  1. "power" => 'KEYPRESSES:116',
  2. "vol+" => "KEYPRESSES:115",
  3. "vol-" => "KEYPRESSES:114",
  4. "menu" => "KEYPRESSES:139",
  5. "back" => "KEYPRESSES:48",
  6. "pause" => "KEYPRESSES:49",
  7. "paly" => "KEYPRESSES:49",
  8. "down" => "KEYPRESSES:38",
  9. "up" => "KEYPRESSES:36",
  10. "left" => "KEYPRESSES:50",
  11. "right" => "KEYPRESSES:37",
  12. "home" => "KEYPRESSES:35",
复制代码

我用的是复杂指令,可以实现快速关机。测试很简单,找一个通讯测试助手一类的软件,电脑和投影仪在一个局域网内,用UDP Client填写投影仪的IP地址及端口号,然后发送复杂或者简单指令,就能实现控制。测试可用的话这步也就成功了

======================分割线=====================

三、ESP32开发板编程

我使用的是Arduino,先贴一下主程序代码,基本都注释了,如果有问题发帖吧

  1. #include <WiFi.h>               //默认,加载WIFI头文件
  2. #include "PubSubClient.h"       //默认,加载MQTT库文件
  3. #include <WiFiUdp.h>            //引用以使用UDP
  4. #include "ESP32BLEAdvertise.h"  //引用蓝牙广播头文件

  5. //********************需要修改的部分*******************//
  6. const char* ssid = "XXXX";           //修改,你的路由去WIFI名字
  7. const char* password = "XXXXXXXX";     //你的WIFI密码
  8. #define ID_MQTT  "XXXXXXXXXXXXXX"     //用户私钥,控制台获取
  9. const char* topic = "XXXXXXXXXXXX";        //主题名字,可在巴法云控制台自行创建,名称随意
  10. const int B_led = 2;       //单片机LED引脚值,D系列是NodeMcu引脚命名方式,其他esp8266型号将D2改为自己的引脚
  11. bool Turned = false;;
  12. //**************************************************//

  13. const char* mqtt_server = "bemfa.com";  //默认,MQTT服务器
  14. const int mqtt_server_port = 9501;      //默认,MQTT服务器
  15. WiFiClient espClient;
  16. PubSubClient client(espClient);
  17. SimpleBLE bleadv;

  18. //灯光函数及引脚定义
  19. void turnOn();
  20. void turnOff();

  21. //********************UDP按键信息关机*****************//
  22. WiFiUDP Udp;
  23. IPAddress remote_IP(192, 168, 3, 27);// 自定义远程监 IP 地址
  24. unsigned int remoteUdpPort = 16735;  // 简单指令端口
  25. unsigned int remoteUdpPortFZ = 16750;  // 复杂令端口
  26. const char* Keyword = "KEYPRESSES:116"; //简单指令:关机
  27. const char* KeywordFZ = {"{"action":20000,"controlCmd":{"delayTime":0,"mode":6,"time":0,"type":0},"msgid":"2"}"}; //复杂指令:快速关机
  28. //**************************************************//

  29. void setup_wifi() {
  30.   delay(10);
  31.   Serial.println();
  32.   Serial.print("Connecting to ");
  33.   Serial.println(ssid);
  34.   WiFi.begin(ssid, password);
  35.   while (WiFi.status() != WL_CONNECTED) {
  36.     delay(500);
  37.     Serial.print(".");
  38.   }

  39.   Serial.println("");
  40.   Serial.println("WiFi connected");
  41.   Serial.println("IP address: ");
  42.   Serial.println(WiFi.localIP());

  43. }

  44. void callback(char* topic, byte* payload, unsigned int length) {
  45.   Serial.print("Topic:");
  46.   Serial.println(topic);
  47.   String msg = "";
  48.   for (int i = 0; i < length; i++) {
  49.     msg += (char)payload[i];
  50.   }
  51.   Serial.print("Msg:");
  52.   Serial.println(msg);
  53.   if (msg == "on") {//如果接收字符on,亮灯并打开投影
  54.     turnOn();//开启函数
  55.     Turned = true;
  56.   } else if (msg == "off") {//如果接收字符off,关灯并关闭投影
  57.     turnOff();//关闭函数
  58.     Turned = false;
  59.   }
  60.   msg = "";
  61. }

  62. void reconnect() {
  63.   // Loop until we're reconnected
  64.   while (!client.connected()) {
  65.     Serial.print("Attempting MQTT connection...");
  66.     // Attempt to connect
  67.     if (client.connect(ID_MQTT)) {
  68.       Serial.println("connected");
  69.       Serial.print("subscribe:");
  70.       Serial.println(topic);
  71.       //订阅主题,如果需要订阅多个主题,可发送多条订阅指令client.subscribe(topic2);client.subscribe(topic3);
  72.       client.subscribe(topic);
  73.     } else {
  74.       Serial.print("failed, rc=");
  75.       Serial.print(client.state());
  76.       Serial.println(" try again in 5 seconds");
  77.       // Wait 5 seconds before retrying
  78.       delay(5000);
  79.     }
  80.   }
  81. }

  82. void setup() {
  83.   pinMode(B_led, OUTPUT); //设置引脚为输出模式
  84.   digitalWrite(B_led, LOW);//默认引脚上电高电平
  85.   Serial.begin(115200);     //设置波特率115200
  86.   setup_wifi();           //设置wifi的函数,连接wifi
  87.   client.setServer(mqtt_server, mqtt_server_port);//设置mqtt服务器
  88.   client.setCallback(callback); //mqtt消息处理
  89. }

  90. void loop() {
  91.   int i = 1;
  92.   if (!client.connected()) {
  93.     reconnect();
  94.   }
  95.   else
  96.   {
  97.     if (Turned)
  98.     {
  99.       bleadv.begin();//初始化蓝牙名
  100.       uint8_t data[] = {0x46, 0x00, 0x46, 0x17, 0x03, 0xef, 0xb2, 0x24, 0x40, 0xff, 0xff, 0xff, 0x30, 0x43, 0x52, 0x4b, 0x54, 0x4d}; //蓝牙广播内容
  101.       bleadv.advertise(data, 18);
  102.       delay(5000);
  103.     }
  104.     else
  105.     {
  106.       bleadv.end();
  107.     }
  108.   }
  109.   client.loop();
  110. }

  111. //打开投影
  112. void turnOn() {
  113.   digitalWrite(B_led, HIGH);
  114. }

  115. //关闭投影
  116. void turnOff() {
  117.   digitalWrite(B_led, LOW);
  118.   Udp.beginPacket(remote_IP, remoteUdpPortFZ);//配置远端ip地址和端口
  119.   String str_cnt(KeywordFZ);
  120.   Udp.print(str_cnt);//把数据写入发送缓冲区
  121.   Udp.endPacket();//发送数据
  122. }
复制代码

好了,到此就可以接入巴法控制了。怎么加入米家就不用说了吧~



相关阅读:
怎样用小爱音箱控制电视 用小爱音箱控制电视播放任意影视

上一篇:一文看懂极米RS10mini对比坚果N1有什么区别
下一篇:一文看懂极米RS10mini对比极米Z7X之间有哪些区别
沙发
发表于 2024-1-10 17:52 | 只看该作者
同价位个人比较偏向于更为简洁灵活的当贝D5X投影仪,毕竟当贝是以软件起家,在这方面的优势还是不容小觑的
回复 支持 反对

使用道具 举报

板凳
发表于 2024-3-5 23:27 | 只看该作者
jimi1:4:10: fatal error: ESP32BLEAdvertise.h: No such file or directory,楼主在哪里下载的这个库呢

回复 支持 反对

使用道具 举报

地板
发表于 2024-3-5 23:47 | 只看该作者
hao176 发表于 2024-3-5 23:27
jimi1:4:10: fatal error: ESP32BLEAdvertise.h: No such file or directory,楼主在哪里下载的这个库呢

...

@投影邮递员
回复 支持 反对

使用道具 举报

5#
发表于 2024-3-24 10:30 | 只看该作者
这个没有程序员基础没人会搞,算了。。。太难了,看着头晕
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|新帖|标签|软件|Sitemap|ZNDS智能电视网 ( 苏ICP备2023012627号 )

网络信息服务信用承诺书 | 增值电信业务经营许可证:苏B2-20221768 丨 苏公网安备 32011402011373号

GMT+8, 2024-4-28 11:35 , Processed in 0.061207 second(s), 15 queries , Redis On.

Powered by Discuz!

监督举报:report#znds.com (请将#替换为@)

© 2007-2024 ZNDS.Com

快速回复 返回顶部 返回列表