node.jsをrubyに書き換えたいのですが、node.jsがわからず困っています。
わかる限りで質問に答えていただければと思います。
プログラムはONVIFというネットワークカメラのスナップショットを取得するというものです。
ライブラリはhttps://github.com/agsh/onvifを使用
ruby onvifのgemもあるのですが、V1.8.7には非対応のため使用できず…またこれにはスナップショットをとるメソッドがない。
質問はコメントアウトしています。
難易度が高く、また読み取って頂かないと回答が難しいと思いますのでわかる範囲で構いません。
SOAPリクエストをRubyでかけたらいいのかなと思っていますがあってますかね・・
質問自体は初心者レベルかとは思いますが、大変恐縮ですがご教授いただければと思います。
node.js
1<class='javascript'> 2var CAMERA_HOST = '0.0.0.0', 3 USERNAME = 'admin', 4 PASSWORD = 'pass', 5 PORT = 80; 6 7var http = require('http'), 8 Cam = require('./lib/onvif').Cam; 9 10new Cam({ //質問① このCamは 11 hostname: CAMERA_HOST, 12 username: USERNAME, 13 password: PASSWORD, 14 port: PORT 15}, function(err) { //質問① Cam(オブジェクト?)にhostnameなどのプロパティと関数を入れている? 16 if (err) { //質問② errはなにか、このif errでerrがあればtrueなのか。 17 console.log('Connection Failed for ' + CAMERA_HOST + ' Port: ' + PORT + ' Username: ' + USERNAME + ' Password: ' + PASSWORD); 18 return; //質問③ if文をぬけるといった使い方? 19 } 20 console.log('CONNECTED'); 21 this.getSnapshotUri(function(err, ans){ //質問④このerrにはなにが入っているのか。このthisはRubyのself? 22 console.log(ans); //質問⑤ ans など定義されていないように見えるが、なにが表示されるのか。 23 }); 24}); 25</class>
▽ライブラリの使用されていると思われるメソッド
Cam.prototype.getSnapshotUri = function(options, callback) { if (callback === undefined) { callback = options; options = {}; } this._request({ //質問⑥ このthisはCam.prototype.getSnapshotUri それとも Cam.prototype.getSnapshotUri.function? service: 'media' , body: this._envelopeHeader() + '<GetSnapshotUri xmlns="http://www.onvif.org/ver10/media/wsdl">' + '<ProfileToken>' + (options.profileToken || this.activeSource.profileToken) +'</ProfileToken>' + '</GetSnapshotUri>' + this._envelopeFooter() }, function(err, data, xml) { if (callback) { //質問⑦ if callbackってcallbackがあればtrue? callback.call(this, err, err ? null : linerase(data).getSnapshotUriResponse.mediaUri, xml); } }.bind(this)); //質問⑧ このthisは? }; Cam.prototype._request = function(options, callback) {//質問⑨ 変数の中に関数をいれてる? var _this = this; var callbackExecuted = false; var reqOptions = options.url || { //質問⑩ ||がないとしたら_request変数のなかにまた変数を定義して options.url入れてる? hostname: this.hostname , port: this.port , path: options.service ? (this.uri[options.service] ? this.uri[options.service].path : options.service) : this.path }; reqOptions.headers = { 'Content-Type': 'application/soap+xml' , 'Content-Length': Buffer.byteLength(options.body, 'utf8')//options.body.length chinese will be wrong here , charset: 'ut-8' }; reqOptions.method = 'POST'; var req = http.request(reqOptions, function(res) { var bufs = [], length = 0; res.on('data', function(chunk) { bufs.push(chunk); length += chunk.length; }); res.on('end', function() { if (callbackExecuted === true) { return; } var xml = Buffer.concat(bufs, length).toString('utf8'); /** * Indicates raw xml response from device. * @event Cam#rawResponse * @type {string} */ _this.emit('rawResponse', xml); parseSOAPString(xml, callback); callbackExecuted = true; }); }); req.setTimeout(this.timeout, function() { if (callbackExecuted === true) { return; } callback(new Error('Network timeout')); callbackExecuted = true; }); req.on('error', function(err) { if (callbackExecuted === true) { return; } /* address, port number or IPCam error */ if (err.code === 'ECONNREFUSED' && err.errno === 'ECONNREFUSED' && err.syscall === 'connect') { callback(err); /* network error */ } else if (err.code === 'ECONNRESET' && err.errno === 'ECONNRESET' && err.syscall === 'read') { callback(err); } else { callback(err); } callbackExecuted = true; }); this.emit('rawRequest', options.body); req.write(options.body); req.end(); };
node.js
1//実行結果 2CONNECTED 3{ uri: 'http://0.0.0.0/onvif/snapshot', 4 invalidAfterConnect: false, 5 invalidAfterReboot: false, 6 timeout: 'PT0S' }
//質問① Cam(オブジェクト?)にhostnameなどのプロパティと関数を入れている?
//質問② errはなにか、このif errでerrがあればtrueなのか。
//質問③ if文をぬけるといった使い方?
//質問④ このerrにはなにが入っているのか。このthisはRubyのself?
//質問⑤ ans など定義されていないように見えるが、なにが表示されるのか。
//質問⑥ このthisはCam.prototype.getSnapshotUri それとも Cam.prototype.getSnapshotUri.function?
//質問⑦ if callbackってcallbackがあればtrue?
//質問⑧ このthisは?
//質問⑨ 変数の中に関数をいれてる?
//質問⑩ ||がないとしたら_request変数のなかにまた変数を定義して options.url入れてる?
質問が多くて申し訳ございません。足りない情報があればコメントください
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。