gpt4 book ai didi

iot - ESP8266 UPnP 端口转发 - 物联网

转载 作者:行者123 更新时间:2023-12-01 08:50:15 26 4
gpt4 key购买 nike

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

4年前关闭。




Improve this question




是否可以在使用 ESP8266 的路由器上使用 UPNP 协议(protocol)进行自动端口转发?

即使我不在家,我也需要能够访问我的 ESP8266 模块。
目前我已经在我的路由器设置中手动配置了端口转发。

但是将来我的项目要成为商业产品,它需要能够进行自动端口转发,因为这对普通用户来说是一个障碍。

在互联网上,我发现了一些关于 ESP8266 上的 UPNP 的内容,但它与端口转发无关。

非常感谢您!

最佳答案

你可以看看我为此制作的图书馆:
https://github.com/ofekp/TinyUPnP

我在包装中有一个 IOT 设备(LED 灯)的示例,由于信誉低,我无法附加链接。

您可以查看示例代码。全部为 ESP8266 制作。
使用非常简单,只需使用您要打开的端口调用 addPortMapping 即可,如示例所示。
您必须每 36000 (LEASE_DURATION) 执行一次此操作秒,因为 UPnP 是基于租约的协议(protocol)。

宣布:

unsigned long lastUpdateTime = 0;
TinyUPnP *tinyUPnP = new TinyUPnP(-1); // -1 means blocking, preferably, use a timeout value (ms)

设置:
if (tinyUPnP->addPortMapping(WiFi.localIP(), LISTEN_PORT, RULE_PROTOCOL_TCP, LEASE_DURATION, FRIENDLY_NAME)) {
lastUpdateTime = millis();
}

环形:
// update UPnP port mapping rule if needed
if ((millis() - lastUpdateTime) > (long) (0.8D * (double) (LEASE_DURATION * 1000.0))) {
Serial.print("UPnP rule is about to be revoked, renewing lease");
if (tinyUPnP->addPortMapping(WiFi.localIP(), LISTEN_PORT, RULE_PROTOCOL_TCP, LEASE_DURATION, FRIENDLY_NAME)) {
lastUpdateTime = millis();
}
}

我只用我的 D-Link 路由器检查了它。

对于任何对图书馆如何运作感兴趣的人:
  • 它向 UPnP UDP 多播地址发送 M_SEARCH 消息。
  • 网关路由器将响应一条包含名为 Location 的 HTTP header 的消息。 .
  • Location是指向包含 IGD(Internet 网关设备)API 的 XML 文件的链接,以便创建所需的调用,将新的端口映射添加到网关路由器。
  • XML 中描述的服务之一是 <serviceType>urn:schemas-upnp-org:service:WANPPPConnection:1</serviceType>这就是图书馆正在寻找的东西。
  • 该服务将包括 eventSubURL标签是您路由器的 IGD API 的链接。 (基本 URL 也在同一文件中的标签 URLBase 下描述)
  • 使用基本 URL 和 WANPPPConnection 链接,您可以向将添加 UPnP 规则的路由器发出 HTTP 查询。
  • 作为旁注,XML 中描述的服务还包括 SCPDURL标记是指向另一个 XML 的链接,该 XML 描述了可用于服务的命令及其参数。这个包跳过了这个阶段,因为我假设查询对于许多路由器来说都是相似的,但很可能不是这种情况,所以由你来检查。
  • 从这个阶段开始,包将使用 HTTP 查询向路由器发出服务命令。实际查询可以在代码中非常清楚地看到,但对于任何感兴趣的人:

  • 标题:
    "POST " + <link to service command from XML> + " HTTP/1.1"
    "Content-Type: text/xml; charset=\"utf-8\""
    "SOAPAction: \"urn:schemas-upnp-org:service:WANPPPConnection:1#AddPortMapping\""
    "Content-Length: " + body.length()

    body :
    "<?xml version=\"1.0\"?>\r\n"
    "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n"
    "<s:Body>\r\n"
    "<u:AddPortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANPPPConnection:1\">\r\n"
    " <NewRemoteHost></NewRemoteHost>\r\n"
    " <NewExternalPort>" + String(rulePort) + "</NewExternalPort>\r\n"
    " <NewProtocol>" + ruleProtocol + "</NewProtocol>\r\n"
    " <NewInternalPort>" + String(rulePort) + "</NewInternalPort>\r\n"
    " <NewInternalClient>" + ipAddressToString(ruleIP) + "</NewInternalClient>\r\n"
    " <NewEnabled>1</NewEnabled>\r\n"
    " <NewPortMappingDescription>" + ruleFriendlyName + "</NewPortMappingDescription>\r\n"
    " <NewLeaseDuration>" + String(ruleLeaseDuration) + "</NewLeaseDuration>\r\n"
    "</u:AddPortMapping>\r\n"
    "</s:Body>\r\n"
    "</s:Envelope>\r\n";

    我希望这有帮助。

    关于iot - ESP8266 UPnP 端口转发 - 物联网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44461516/

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