LBP-1820のステータスを一括取得
20数台のプリンタのステータスを取得したいのが、エラーに悩まされたりして解決に時間が掛かった。
頭を悩ませていたのが「Timeout::Error」って奴。
参考にしたのがこのあたり。
- [http://d.hatena.ne.jp/cesar/20070409/p1:title=OVERT MEMO [ruby]net/httpの例外捕捉方法(2)]
- Ping.pingecho
- [http://moriq.tdiary.net/20080805.html:title=3 日坊主日記 [Ruby] Net::HTTP#open_timeout の使い方]
def lprlist @page_title = "プリンタの状態" ip_ary = ["192.168.1.200","192.168.1.201","192.168.1.202"] @printers = Array.new require 'ping' count = 0 ip_ary.each{|host_name| if Ping.pingecho(host_name, timeout = 5, "80") @printers[count] = lpr_state(count, ip_ary[count]) count += 1 end } end
def lpr_state(id, ip) #LBP-1820用 require 'net/http' Net::HTTP.version_1_2 # おまじない $proxy_addr = 'proxy_address' $proxy_port = 80 lpr = Array.new lpr[0] = id lpr[1] = "http://"+ip begin http = Net::HTTP::Proxy($proxy_addr, $proxy_port).new( ip ) http.open_timeout = 5 http.read_timeout = 10 http.start do response = http.get('/dev/dev_env.shtml') find_flag = 0 response.body.toutf8.each{|l| #ホスト名を取得する if /izm/ =~ l s = l.index("izm") e = l.index("</b>") lpr[3] = l.slice(s,e-s) end #総印刷ページ数を取得する if find_flag == 1 s = l.index("<td>") e = l.rindex("</td>") lpr[2] = l.slice(s+4..e-1) break end find_flag = 1 if /総印刷ページ数/ =~ l.toutf8 } #用紙の状態を表す画像のURLを取得する。 response = http.get('/dev/dev_stat.shtml') response.body.toutf8.each{|l| if /cassette/ =~ l s = l.index("image") e = l.index("gif") lpr[4] = "http://"+ip+"/cab/image/"+l.slice(s+6,e-s-3) end } #デバイスの状態を取得する find_flag = 0 response.body.toutf8.each{|l| if find_flag == 1 s = l.index("><b>") e = l.index("/b>") lpr[5] = l.slice(s+4..e-2) break end find_flag = 1 if /デバイス状態/ =~ l.toutf8 } end rescue puts "exception on HTTP: StandardError #{$!}" rescue Timeout::Error puts "exception on HTTP: TimeoutError" rescue Exception puts "exception on HTTP: #{$!}" end return lpr end
他にも試したのがこれら。
- Hashにパラメータを入れてリダイレクト(URLがアホみたいになった!)
- Tempfile.rbを使った(意味が無かった)
- ファイルを作った(意味が無かった)
どれもTimeout::Errorには対処できなかった。