Как HomeKit находит ближайшие устройства?

Прежде всего, мне жаль, если это не самый подходящий форум для размещения этого вопроса. Я посмотрел на 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();
}

person levidhuyvetter    schedule 31.03.2018    source источник


Ответы (2)


Я провел еще несколько тестов и установил Homebridge на Mac и отслеживал его пакеты mDNS с помощью WireShark. При запуске сервера он отправляет пару «ЛЮБЫХ» запросов и пару ответов. То, что он делает здесь, описано в разделе 8 RFC 6762, а именно: "Проверка и объявление на старте". Похоже, что библиотека ESP8266mDNS в настоящее время этого не делает, поэтому я повторно открыл свою проблему на GitHub чтобы реализовать это. Я попытаюсь сделать это сам, но призываю всех, у кого достаточно знаний, внести свой вклад! В настоящее время библиотека переписывается на основе реализации idf, которая прошла тест Apple на соответствие. Эта проблема должна быть исправлена ​​после завершения.

person levidhuyvetter    schedule 31.03.2018
comment
Вы можете заглянуть в Bonjour Browser (tildesoft.com), он значительно упрощает изучение материалов mDNS. Автообнаружение немного привередливо, но мы делаем это довольно хорошо и в HAP-python (github.com/ikalchev/HAP-python/blob/) - person Matthew Schinckel; 28.04.2018

глядя на ваши значения конфигурации, я вижу, что для «ff» установлено значение 0; это означает, что вы не запрашиваете сопряжение для этого устройства. Запрос на сопряжение — это то, что запускает обнаружение ваших устройств.

person Lorenzo Decaria    schedule 07.09.2018