HomeKit如何找到附近的设备?

时间:2018-03-31 17:31:57

标签: ios arduino esp8266 homekit mdns

首先,如果这不是发布此问题的最合适的论坛,我很抱歉。我看了一下AskDifferent,这看起来不够技术性,我看着看起来太技术的超级用户了。因此,为什么我在这里问它,因为它也与编程有关。

描述

我正在使用Arduino IDE在ESP8266(-01)上设置HAP(HomeKit附件协议)服务器。我已成功在其上设置mDNS服务器,以便使用ESP8266mDNS库进行发现。但是,我面临一个小问题:

启动mDNS服务器并添加了_hap._tcp服务后,设备最初不会显示在Home应用程序中。只有在我"探测"使用来自ESP8266在Home应用程序中显示的终端的$ dns-sd -B _hap._tcp的_hap._tcp服务。

这似乎是"探测"在网络上执行的操作最初不是由mDNS服务器完成的,但HomeKit要求可以发现它。

我已经使用其他服务进行了测试,例如" _http._tcp"并在我的iPhone上使用名为Radar的应用程序来搜索Bonjour服务。它找到了任何其他服务,但没有发现(直到我"探测"它)。

使用WireShark向我显示,在点击(已发现的)设备之前,Home应用程序不会发送任何mDNS请求。这让我觉得最初的发现(显示设备点击)不是由mDNS完成的,而是由其他方法完成的。也许网络上有某种注册表,然后在我使用dns-sd进行探测后填写。

使用雷达应用程序我可以在网络上看到我选择的任何服务的mDNS数据包,除了hap。这很奇怪,好像iPhone正在阻止针对hap服务的mDNS请求。

我花了3天时间试图让这个工作起来,我真的不知道从哪里开始。我想知道我错过了什么让ESP8266立即被家庭应用程序发现,而不必使用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 个答案:

答案 0 :(得分:1)

我已经做了一些测试并在Mac上安装了Homebridge,并使用WireShark监控了它的mDNS数据包。在启动服务器时,它会发出一些“任何”查询和几个响应。它在这里所做的是如section 8 of RFC 6762所述,即“探索和宣布启动”。 ESP8266mDNS库目前似乎没有这样做,所以我重新打开了我的issue on GitHub来实现这一点。 我将自己尝试,但我敦促任何有足够知识的人做出贡献!该库目前正在根据通过Apple一致性测试的idf实现进行重写。一旦完成,应该修复此问题。

答案 1 :(得分:1)

查看您的配置值,我发现“ ff”设置为0;这表示您不要求与此设备配对。配对请求是触发您的设备被发现的原因。