Прежде всего, мне жаль, если это не самый подходящий форум для размещения этого вопроса. Я посмотрел на AskDifferent, который кажется недостаточно техническим для этого, и я посмотрел на Super User, который кажется слишком техническим для этого. Поэтому я спрашиваю об этом здесь, так как это также связано с программированием.
Описание
Я использую Arduino IDE для настройки сервера HAP (HomeKit Accessory Protocol) на ESP8266 (-01). Я успешно настроил на нем mDNS-сервер для обнаружения с помощью ESP8266mDNS библиотека. Тем не менее, я столкнулся с одной небольшой проблемой:
После запуска сервера mDNS и добавления службы _hap._tcp устройство изначально не отображается в приложении Home. Только после того, как я «прощупал» службу _hap._tcp с помощью $ dns-sd -B _hap._tcp
из терминала, ESP8266 появляется в приложении Home.
Похоже, что это «зондирование» делает в сети что-то, что изначально не выполняется сервером mDNS, но требуется, чтобы HomeKit мог его обнаружить.
Я проверил это с другими службами, такими как «_http._tcp», и с помощью приложения на моем iPhone под названием Radar для поиска служб Bonjour. Он находит любую другую службу, но не работает (пока я не «прощупаю» ее).
Использование WireShark показывает мне, что приложение Home не отправляет никаких запросов mDNS, пока не будет нажато (уже обнаруженное) устройство. Это заставляет меня думать, что начальное обнаружение (чтобы показать устройства, по которым можно щелкнуть) выполняется не mDNS, а каким-то другим методом. Возможно, какой-то реестр в сети, который затем заполняется после того, как я прощупываю с помощью dns-sd.
Используя приложение Radar, я могу видеть пакеты mDNS в сети для любой службы, которую я там выбираю, кроме hap. Это странно, как будто iPhone блокирует запросы mDNS для службы hap.
Я провел 3 дня, пытаясь заставить это работать, и я действительно не знаю, куда идти дальше. Я хотел бы знать, чего мне не хватает, чтобы сделать ESP8266 мгновенно обнаруживаемым приложением Home без необходимости использовать dsn-sd для «активации» этого. Если вы хотите воспроизвести проблему, я поместил упрощенную версию моего кода, которая по-прежнему имеет ту же проблему, что и ниже. Вы можете загрузить это в ESP8266 с помощью Arduino IDE после установки соответствующих плат.
После установки попробуйте посмотреть, отображается ли устройство в HomeKit. Если это не так, используйте Mac в той же сети и введите $ dns-sd -B _hap._tcp
в терминал. Пока это работает, вернитесь в приложение Home, и вы сможете увидеть там устройство.
Код
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
const char* ssid = "WiFi"; //Change to your SSID
const char* password = "xxxxx"; //Change to your password
ESP8266WebServer server(80);
void handleNotFound(){
server.send(404, "text/plain", "Not Found!");
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.hostname("ESP8266");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
if (MDNS.begin("ESP8266")) {
Serial.println("MDNS Started.");
}
server.onNotFound(handleNotFound);
server.begin();
MDNS.addService("hap", "tcp", 80);
MDNS.addServiceTxt("hap", "tcp", "md", "ESP8266");
MDNS.addServiceTxt("hap", "tcp", "pv", "1.0");
MDNS.addServiceTxt("hap", "tcp", "id", "A0:20:A6:15:46:44");
MDNS.addServiceTxt("hap", "tcp", "c#", "3");
MDNS.addServiceTxt("hap", "tcp", "s#", "1");
MDNS.addServiceTxt("hap", "tcp", "ff", "0");
MDNS.addServiceTxt("hap", "tcp", "ci", "5");
MDNS.addServiceTxt("hap", "tcp", "sf", "1");
}
void loop() {
server.handleClient();
}