はじめに
前回、以下の記事
を書き、またその記事中の
他の方法で対応(その2)
で記載したコードを組み込み評価を進めてきた。
ところがとあるIPカメラにて、カメラのパスワードとシステム側のパスワードが不一致だが、RTSP DESCRIBEで稀に200 OKが返り、システム側はそのカメラが生きていると判断しているケースに遭遇した。
またそのIPカメラにVLCで視聴を試みると確実に401となり、ID/PASS入力ダイアログを表示していた。
この違いは何か。改めて前回のサンプルとVLCを動かした時のパケットをキャプチャし比較してみた。
比較結果
比較した結果、違いがあったのは以下の3点。
- CSeqの振り方
- UserAgent
- OPTIONSの有無
CSeqの振り方
サンプルでは1からにしているが、VLCでは2からになっていた。でもたかがシーケンス番号なのでね、、、。VLCと同じにしたところで変化はなさそうである。
UserAgent
たかが文字列なのでね、、、。VLCと同じにしたところで変化はなさそうである。というか同じにするのもイマイチである。
OPTIONSの有無
前回の記事で書いたサンプル通り、サンプルではDESCRIBEをリクエストしているが、VLCではOPTIONS → DESCRIBEとなっていた。
正しい。確かにOPTIONSで何を利用できるかを判断してからDESCRIBEをするのは。
が、ほぼ確実に利用可能な(と思っている)DESCRIBEを最初から利用しても問題ないんじゃね???、とも思うが他の違いと比べると一番改善・回避できる可能性が高そうである。
結果
OPTIONSの有無では変化がなかった。
え、じゃぁCSeq?と試してみた。OPTIONSのリクエストは残しつつ、CSeqもVLCと同じで2からに。
となるともうほぼVLCと手順は同じである。しかし!変化はなかった。え?。え??
UserAgent???。たかが文字列じゃないの???。
と、まずはVLCのUserAgentをそのまま記載してみる。え?。え??
ばっちり。今のところ200 OKになっちゃうことはない。
User-Agent: rtspclient/1.0.0
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
※バージョンは若干古い。経緯については後述する。
curlも変更前の形式と同じである。
User-Agent: curl/7.81.0
UserAgentの書き方
調べてみるとMDN Web Docsにたどり着く。
User-Agent: <product> / <product-version> <comment>
となっている。また、よくある書式として、以下のようにも書かれてある。
User-Agent: Mozilla/5.0 (<system-information>) <platform> (<platform-details>) <extensions>
ということは、
<product> / <product-version>
は
Mozilla/5.0
で、
<comment>
は
(<system-information>) <platform> (<platform-details>) <extensions>
あたりか。
いずれにしろ、このIPカメラは<comment>
部分の文字列または書式によって想定外の挙動をする問題が潜んでいそうだ。(最悪、認証を回避できたり???)
ひとまず
User-Agent: rtspclient/1.0.0 (RTSP Streaming Meida v1.0.0)
にして様子をみることにする。
おわりに
IPカメラのCGI呼び出しでも発生
この記事ではRTSP DESCRIBEの話に焦点を当てているが、システム側から呼び出すCGIも稀に200 OKになることが判明した。
・
・
・
get : options.url = http://nnn.nnn.nnn.nnn/sd/
dumpResponse : url = http://nnn.nnn.nnn.nnn/sd/ , statusCode = 401
get : options.url = http://nnn.nnn.nnn.nnn/sd/
dumpResponse : url = http://nnn.nnn.nnn.nnn/sd/ , statusCode = 200
get : options.url = http://nnn.nnn.nnn.nnn/sd/20250326/
dumpResponse : url = http://nnn.nnn.nnn.nnn/sd/20250326/ , statusCode = 401
get : options.url = http://nnn.nnn.nnn.nnn/sd/20250326/
dumpResponse : url = http://nnn.nnn.nnn.nnn/sd/20250326/ , statusCode = 401
・
・
・
このIPカメラは今回とは逆の事象(通常は200だが稀に401を返す)も発生することがあり、ひとまず200以外になってもリトライするようにしている。上記のログは401が返り、リトライしたら200が返って時のものである。(以降はまた401が返り始め、再度200になることはなかった)
この辺りもUserAgentを変更すると改善するのかもしれない。
VLCのバージョンが古い
経緯については以下にまとめている。
curlのUserAgent
RTSP DESCRIBEをcurlで試す話を書いているので良ければ。