gpt4 book ai didi

ios - HomeKit 如何找到附近的设备?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:10:55 26 4
gpt4 key购买 nike

首先,如果这不是发布此问题的最合适论坛,我深表歉意。我查看了 AskDifferent,这似乎不够技术,我查看了 Super User,它似乎太技术化了。因此,为什么我在这里问它,因为它也与编程有关。

描述

我正在使用 Arduino IDE 在 ESP8266 (-01) 上设置 HAP(HomeKit 附件协议(protocol))服务器。我已经成功地在其上设置了一个 mDNS 服务器以使用 ESP8266mDNS 进行发现。图书馆。但是,我遇到了一个小问题:

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

似乎这种“探测”在网络上做了一些最初不是由 mDNS 服务器完成但 HomeKit 要求被发现的事情。

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

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

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

我已经花了 3 天时间试图让它工作,但我真的不知道从这里该去哪里。我想知道我缺少什么才能让 Home 应用程序立即发现 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();
}

最佳答案

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

关于ios - HomeKit 如何找到附近的设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49590546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com