:私はパッケージ内IOTデバイス(LEDライト)のための例を持って https://github.com/ofekp/TinyUPnP
を、私は、低評判へのリンクを添付することはできません。
サンプルコードをご覧ください。すべてESP8266のために作られました。 非常に使いやすく、例のように、開くポートでaddPortMappingを呼び出すだけです。 UPnPはリースベースのプロトコルなので、36000 (LEASE_DURATION)
秒ごとにこれを行う必要があります。
宣言:
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ヘッダーを含むメッセージで応答します。
Location
は、ゲートウェイルーターに新しいポートマッピングを追加するために必要な呼び出しを作成するために、IGD(Internet Gateway Device)APIを含むXMLファイルへのリンクです。
- XMLで示されているサービスの1つは、
<serviceType>urn:schemas-upnp-org:service:WANPPPConnection:1</serviceType>
であり、これは図書館が探しているサービスです。
- このサービスには、ルータのIGD APIへのリンクである
eventSubURL
タグが含まれています。 (ベースURLはタグURLBase
の下の同じファイルにも記載されています)
- ベースURLとWANPPPConnectionリンクを使用すると、UPnPルールを追加するHTTPクエリをルータに発行できます。
- 注釈として、XMLに描かれているサービスには、
SCPDURL
タグも含まれています。このタグは、サービスで使用可能なコマンドとそのパラメータを示す別のXMLへのリンクです。パッケージはこの段階をスキップしています。これは、多くのルータでクエリが似ていると想定しているためですが、そうではない可能性があります。チェックするのはあなた次第です。
- この段階から、パッケージはHTTPクエリを使用してルータにserviceコマンドを発行します。実際のクエリは非常にはっきりコードで見られるが、興味がある人のためにすることができます:
ヘッダ:
"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()
ボディ:
"<?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";
私はこのことができます願っています。