首先,如果我在这里提出的问题不是最适合的论坛,请原谅。我查看了 AskDifferent,但似乎不够技术化,而 Super User 则过于技术化。因此,由于它也涉及编程,所以我在这里提问。
描述:
我正在使用 Arduino IDE 在 ESP8266(-01) 上设置 HAP(HomeKit Accessory Protocol) 服务器。我已经成功地在它上面设置了一个 mDNS 服务器,用于使用 ESP8266mDNS 库进行发现。然而,我遇到了一个小问题:
在启动 mDNS 服务器并添加 _hap._tcp 服务之后,设备最初在 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。
描述:
我正在使用 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();
}