如何將極米new Z6X接入米家,實現(xiàn)小愛控制藍牙開機及Wifi關機等功能是一個不小的挑戰(zhàn)。本文將為你提供詳細的教程,幫助你輕松實現(xiàn)極米new Z6X與米家的完美結(jié)合。
參考前人的經(jīng)驗,使用ESP32開發(fā)板,寫了個程序,實現(xiàn)了極米new Z6X投影儀接入米家,小愛控制的功能。
主要實現(xiàn)的有:
1、Wifi接入巴法,實現(xiàn)米家控制;
2、藍牙廣播特定manufacturer data實現(xiàn)完美藍牙開機;
3、Wifi UDP廣播實現(xiàn)復雜指令的完美快速關機。
======================分割線=====================
2024.1.7更新
先說一下思路:先研究極米藍牙遙控器開機時發(fā)射的藍牙廣播特點,再測試wifi udp廣播的指令關機,沒問題后使用ESP32的藍牙和wifi模塊分別模擬遙控器和手機app的關機指令。最后把這個開關功能接入巴法實現(xiàn)完美小愛同學開關機
一、先說開機,這個方案是用ESP32發(fā)送一個藍牙廣播,模擬原機遙控器實現(xiàn)的開機功能,所以不用考慮接智能開關的方案了。 使用的ESP32如圖:
極米new Z6X接入米家 (1).jpg (28.98 KB, 下載次數(shù): 195)
下載附件
保存到相冊
2024-1-10 17:08 上傳
極米的藍牙遙控測試:
1. 需要一個蘋果的ios設備,在App Store下載 bluetooth smart scanner app,安卓上好像nRF Connect也可以實現(xiàn)類似功能,github上能下載到。
2. 將你的 投影儀主機徹底斷開電源。
3. 不停的按遙控器上的開機按鍵,這時在bluetooth smart scanner app上應該可以找到遙控器發(fā)射的ble advertisement信號,我的會出現(xiàn)名稱為Bluetooth 4.0 RC的設備
4. 在上面的信號中,找到manufactorer data,我的遙控器在按下開關鍵時會快速閃動顯示如圖的字符<46004617 03efb224 40ffffff 3043524b 544d> 這個manufactorer data是模擬藍牙遙控的關鍵。有的設備可以在網(wǎng)上查到,ios - How can I clone a non-paired BLE signal from a remote to trigger a device? - Stack Overflow ,但最好還是自己測一下。
極米new Z6X接入米家 (2).jpg (21.29 KB, 下載次數(shù): 203)
下載附件
保存到相冊
2024-1-10 17:08 上傳
5. 建議先通過EFR connect. 這個安卓app, 驗證下能否使用上面的manufactorer data喚起投影儀。
極米new Z6X接入米家 (1).png (326.11 KB, 下載次數(shù): 194)
下載附件
保存到相冊
2024-1-10 17:08 上傳
如果能成功使用上面圖中的Manufacturer data填寫方法成功打開投影儀,這步就成功了。
======================分割線=====================
二、Wifi關機功能
這部分我是直接沿用前面幾位大佬的研究直接拿來用,總結(jié)一下:
極米有2套api可用,一套是復雜指令,一套是簡單的按鍵輸入,所有指令均是通過upd連接到目標機器上。
復雜api
端口:16750
指令內(nèi)容如以下格式:
- {"action":20000,"controlCmd":{"delayTime":0,"mode":6,"time":0,"type":0},"msgid":"2"}
復制代碼
可以實現(xiàn)快速關機,不用等15秒。
簡單按鍵api
端口:16735
格式如下:
下面這是測試的一些功能:
- "power" => 'KEYPRESSES:116',
- "vol+" => "KEYPRESSES:115",
- "vol-" => "KEYPRESSES:114",
- "menu" => "KEYPRESSES:139",
- "back" => "KEYPRESSES:48",
- "pause" => "KEYPRESSES:49",
- "paly" => "KEYPRESSES:49",
- "down" => "KEYPRESSES:38",
- "up" => "KEYPRESSES:36",
- "left" => "KEYPRESSES:50",
- "right" => "KEYPRESSES:37",
- "home" => "KEYPRESSES:35",
復制代碼
我用的是復雜指令,可以實現(xiàn)快速關機。測試很簡單,找一個通訊測試助手一類的軟件,電腦和投影儀在一個局域網(wǎng)內(nèi),用UDP Client填寫投影儀的IP地址及端口號,然后發(fā)送復雜或者簡單指令,就能實現(xiàn)控制。測試可用的話這步也就成功了
======================分割線=====================
三、ESP32開發(fā)板編程
我使用的是Arduino,先貼一下主程序代碼,基本都注釋了,如果有問題發(fā)帖吧
- #include <WiFi.h> //默認,加載WIFI頭文件
- #include "PubSubClient.h" //默認,加載MQTT庫文件
- #include <WiFiUdp.h> //引用以使用UDP
- #include "ESP32BLEAdvertise.h" //引用藍牙廣播頭文件
- //********************需要修改的部分*******************//
- const char* ssid = "XXXX"; //修改,你的路由去WIFI名字
- const char* password = "XXXXXXXX"; //你的WIFI密碼
- #define ID_MQTT "XXXXXXXXXXXXXX" //用戶私鑰,控制臺獲取
- const char* topic = "XXXXXXXXXXXX"; //主題名字,可在巴法云控制臺自行創(chuàng)建,名稱隨意
- const int B_led = 2; //單片機LED引腳值,D系列是NodeMcu引腳命名方式,其他esp8266型號將D2改為自己的引腳
- bool Turned = false;;
- //**************************************************//
- const char* mqtt_server = "bemfa.com"; //默認,MQTT服務器
- const int mqtt_server_port = 9501; //默認,MQTT服務器
- WiFiClient espClient;
- PubSubClient client(espClient);
- SimpleBLE bleadv;
- //燈光函數(shù)及引腳定義
- void turnOn();
- void turnOff();
- //********************UDP按鍵信息關機*****************//
- WiFiUDP Udp;
- IPAddress remote_IP(192, 168, 3, 27);// 自定義遠程監(jiān) IP 地址
- unsigned int remoteUdpPort = 16735; // 簡單指令端口
- unsigned int remoteUdpPortFZ = 16750; // 復雜令端口
- const char* Keyword = "KEYPRESSES:116"; //簡單指令:關機
- const char* KeywordFZ = {"{"action":20000,"controlCmd":{"delayTime":0,"mode":6,"time":0,"type":0},"msgid":"2"}"}; //復雜指令:快速關機
- //**************************************************//
- void setup_wifi() {
- delay(10);
- Serial.println();
- Serial.print("Connecting to ");
- Serial.println(ssid);
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED) {
- delay(500);
- Serial.print(".");
- }
- Serial.println("");
- Serial.println("WiFi connected");
- Serial.println("IP address: ");
- Serial.println(WiFi.localIP());
- }
- void callback(char* topic, byte* payload, unsigned int length) {
- Serial.print("Topic:");
- Serial.println(topic);
- String msg = "";
- for (int i = 0; i < length; i++) {
- msg += (char)payload[i];
- }
- Serial.print("Msg:");
- Serial.println(msg);
- if (msg == "on") {//如果接收字符on,亮燈并打開投影
- turnOn();//開啟函數(shù)
- Turned = true;
- } else if (msg == "off") {//如果接收字符off,關燈并關閉投影
- turnOff();//關閉函數(shù)
- Turned = false;
- }
- msg = "";
- }
- void reconnect() {
- // Loop until we're reconnected
- while (!client.connected()) {
- Serial.print("Attempting MQTT connection...");
- // Attempt to connect
- if (client.connect(ID_MQTT)) {
- Serial.println("connected");
- Serial.print("subscribe:");
- Serial.println(topic);
- //訂閱主題,如果需要訂閱多個主題,可發(fā)送多條訂閱指令client.subscribe(topic2);client.subscribe(topic3);
- client.subscribe(topic);
- } else {
- Serial.print("failed, rc=");
- Serial.print(client.state());
- Serial.println(" try again in 5 seconds");
- // Wait 5 seconds before retrying
- delay(5000);
- }
- }
- }
- void setup() {
- pinMode(B_led, OUTPUT); //設置引腳為輸出模式
- digitalWrite(B_led, LOW);//默認引腳上電高電平
- Serial.begin(115200); //設置波特率115200
- setup_wifi(); //設置wifi的函數(shù),連接wifi
- client.setServer(mqtt_server, mqtt_server_port);//設置mqtt服務器
- client.setCallback(callback); //mqtt消息處理
- }
- void loop() {
- int i = 1;
- if (!client.connected()) {
- reconnect();
- }
- else
- {
- if (Turned)
- {
- bleadv.begin();//初始化藍牙名
- uint8_t data[] = {0x46, 0x00, 0x46, 0x17, 0x03, 0xef, 0xb2, 0x24, 0x40, 0xff, 0xff, 0xff, 0x30, 0x43, 0x52, 0x4b, 0x54, 0x4d}; //藍牙廣播內(nèi)容
- bleadv.advertise(data, 18);
- delay(5000);
- }
- else
- {
- bleadv.end();
- }
- }
- client.loop();
- }
- //打開投影
- void turnOn() {
- digitalWrite(B_led, HIGH);
- }
- //關閉投影
- void turnOff() {
- digitalWrite(B_led, LOW);
- Udp.beginPacket(remote_IP, remoteUdpPortFZ);//配置遠端ip地址和端口
- String str_cnt(KeywordFZ);
- Udp.print(str_cnt);//把數(shù)據(jù)寫入發(fā)送緩沖區(qū)
- Udp.endPacket();//發(fā)送數(shù)據(jù)
- }
復制代碼
好了,到此就可以接入巴法控制了。怎么加入米家就不用說了吧~
相關閱讀:
怎樣用小愛音箱控制電視 用小愛音箱控制電視播放任意影視
|