デバイスで UPnP イベント サブスクリプションを更新しようとすると、412 HTTP エラー: Precondition Failed, bad SID が発生します。
このエラーは 1 つのデバイスでのみ発生し、他のすべてのデバイスは正常に動作します。バギーデバイスはD-Link XTreme N GIGABIT Router DIR-655 (Firmware Version:1.34WW, 2010/09/30), H/w ver: A4.
UPNP サブスクリプション ログ (Wireshark によってキャッチ)
サブスクリプション:
SUBSCRIBE /l3fw HTTP/1.0
Host: 192.168.0.1
CALLBACK: <http://192.168.0.100:7169/evt/43E47718-E7F6-D950-A503-71346C1D9944>
NT: upnp:event
TIMEOUT: Second-60
HTTP/1.1 200 OK
SID: uuid:5B68F900-2863-104D-8000-002401F35BC2
TIMEOUT: Second-60
SERVER: ipOS/7.6 UPnP/1.0 ipGENADevice/1.0
リニューアル:
SUBSCRIBE /l3fw HTTP/1.0
Host: 192.168.0.1
SID: uuid:5B68F900-2863-104D-8000-002401F35BC2
TIMEOUT: Second-60
HTTP/1.1 412 Precondition Failed, bad SID
SERVER: ipOS/7.6 UPnP/1.0 ipGENADevice/1.0
初めてサブスクリプションの有効期限が切れる 5 秒前、たとえば最初のサブスクリプションから 55 秒後にサブスクリプションを更新しようとしました。2 回目の試行: 45 秒目ですが、結果は同じです。
また、サブスクリプション要求で HTTP/1.1 を使用しようとしました (そして "Connection:close" ヘッダーを追加しました) が、効果はありません。
私が間違っていることは何ですか?
UPD1 フォームウェアを 1.37WW に更新しても何も変わらない
UPD2
購読直後に購読を更新しようとすると、うまくいきます。750 ミリ秒待ってから更新 - 動作します。900 ミリ秒待ってから更新 - HTTP 412 で失敗します。D-Link 機器にバグがあるようです (別の D-Link ルーター DI-624 も同様に動作します)。インテル デバイス バリデーター ( https://software.intel.com/en-us/articles/intel-tools-for-upnp-technologies ) は、DIR-655 および DI-624 イベントをエラーなしで検証しますが、購読と更新のステップの間で一時停止します。したがって、UPNP イベンティングは信頼できるメカニズムではなく、使用しない方がよいと思います。
このようなデバイスの動作は、upnp イベント メカニズムのアイデアを危うくします。