HomeKit如何找到附近的设备?

3
首先,如果我在这里提出的问题不是最适合的论坛,请原谅。我查看了 AskDifferent,但似乎不够技术化,而 Super User 则过于技术化。因此,由于它也涉及编程,所以我在这里提问。
描述:
我正在使用 Arduino IDE 在 ESP8266(-01) 上设置 HAP(HomeKit Accessory Protocol) 服务器。我已经成功地在它上面设置了一个 mDNS 服务器,用于使用 ESP8266mDNS 库进行发现。然而,我遇到了一个小问题:
在启动 mDNS 服务器并添加 _hap._tcp 服务之后,设备最初在 Home 应用程序中没有显示出来。只有在我使用终端从 $ dns-sd -B _hap._tcp“探测”_hap._tcp 服务之后,ESP8266 才会出现在 Home 应用程序中。
似乎这种“探测”会对网络做些什么,这最初不是由 mDNS 服务器完成的,但 HomeKit 要求可被发现。
我已经测试了其他服务,例如"_http._tcp"和使用iPhone上的Radar应用程序搜索Bonjour服务。它可以找到任何其他服务,但不是hap(除非我“探测”它)。
使用WireShark显示,Home应用程序在点击已发现的设备之前不会发送任何mDNS请求。这使我认为初始发现(以显示要点击的设备)不是通过mDNS完成的,而是通过某种其他方法完成的。也许是网络上的某种注册表,然后在我使用dns-sd探测后填充。
使用Radar应用程序,我可以看到网络上任何我选择的服务的mDNS数据包,除了hap。这很奇怪,因为如果iPhone阻止hap服务的mDNS请求。
我已经花了3天时间尝试使其工作,我真的不知道下一步该怎么做。我想知道我错过了什么,使得ESP8266可以立即被Home应用程序发现,而无需使用dsn-sd来“激活”它。如果您想重现问题,我已经放置了一个简化版本的代码,仍然存在相同的问题。您可以在安装适当的板之后,使用Arduino IDE将其上传到ESP8266。

安装完成后,请检查设备是否在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();
}
2个回答

1
我进行了更多测试并在Mac上安装了Homebridge,并使用WireShark监视了它的mDNS数据包。在服务器启动时,它会发送几个“ANY”查询和几个响应。它所做的正如RFC 6762第8节中所述,“启动时的探测和公告”。看起来ESP8266mDNS库目前没有这样做,因此我重新打开了GitHub上的问题以实现这一点。该库正在基于idf实现进行重写,该实现通过了Apple的一致性测试。一旦完成此问题应该就会解决。

你可能想看一下Bonjour浏览器(http://www.tildesoft.com),它可以让查看mDNS的内容变得更加容易。自动发现的功能有点棘手,但我们在HAP-python中也做得很好(https://github.com/ikalchev/HAP-python/blob/5214d454ed664eca1ebc289f5f8359ebff732304/pyhap/accessory_driver.py#L79)。 - Matthew Schinckel

1
在查看您的配置值时,我发现“ff”设置为0;这意味着您没有请求此设备的配对。配对请求是触发设备被发现的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接