单位由于安全考虑需要做内外网彻底隔离,在内网有数据库服务器DB_SVR,
外网一台WEB_SVR需要将数据库中的数据显示在网页上。于是中间插入一台
“中转”服务器,如下图所示:
writer.rb放在中转服务器上,负责将数据从DB_SVR取出,然后整理格式通过
串口传递给WEB_SVR上的reader.rb,后者将数据解析成单条记录最后插入
WEB_SVR的SQL数据库中,供xxx.asp显示之用。下面上代码:
writer.rb
#hb table write by hopy 2012 require 'win32ole' require 'oci8' HB_ARR_BEGIN = "HB_ARR_BEGIN" HB_ARR_END = "HB_ARR_END" HB_DEP_BEGIN = "HB_DEP_BEGIN" HB_DEP_END = "HB_DEP_END" def com_puts(str) $com.puts str $com.flush end `mode com4 9600,N,8,1` $com = File.open("com4","w+") class Hb def initialize @oci = OCI8.new("xxx","xxx","ora_xxx") #dbo:sunshine end #将oci中的航班数据同步到access数据库 def sync zb = [64981,57520] #正班 com_puts HB_ARR_BEGIN puts "***** sync flight @ #{Time.now} *****" i = 0;start = Time.now ret = @oci.exec('select * from DBO.DPXS_ARRIVAL') do |r| next if r[7].unpack("v*") != zb zt = if r[24] == "Arrived" || r[24] == "Arriving" r[23] elsif r[25] r[25] else r[23] end tm = if r[12] r[12] elsif r[11] r[11] else r[10] end com_puts "#{r[0]} #{tm} #{r[13]} #{zt}";i+=1 end com_puts HB_ARR_END puts "sync #{i} arrival flights , take #{Time.now - start} s" sleep(1) com_puts HB_DEP_BEGIN i = 0;start = Time.now ret = @oci.exec('select * from DBO.DPXS_DEPARTURE') do |r| next if r[7].unpack("v*") != zb tm = if r[13] r[13] elsif r[12] r[12] else r[11] end com_puts "#{r[0]} #{tm} #{r[14]} #{r[27]}";i+=1 end com_puts HB_DEP_END puts "sync #{i} departure flights , take #{Time.now - start} s" puts "*"*51 end end INTERVAL_sec = 60*5 hb = Hb.new loop do begin hb.sync sleep(INTERVAL_sec) rescue =>e puts("ERROR : #{e.message} @ #{Time.now},retry it...") sleep(INTERVAL_sec) retry ensure #nothing end end
#hb table write by hopy 2012 require 'win32ole' HB_ARR_BEGIN = "HB_ARR_BEGIN" HB_ARR_END = "HB_ARR_END" HB_DEP_BEGIN = "HB_DEP_BEGIN" HB_DEP_END = "HB_DEP_END" `mode com1 9600,N,8,1` $com = File.open("com1") conn_str = "driver={SQL Server};database=db_Anhui;server=127.0.0.1,1433;uid=xxx;pwd=xxx" $sql = WIN32OLE.new('ADODB.Connection') $sql.Open(conn_str) is_geting_arr = false is_geting_dep = false $idx_arr = 0 $idx_dep = 0 $interval = 5 def add_arr(str) r = str.split(" ") print "#{$idx_arr+=1} ";p r $sql.Execute("INSERT INTO InTable VALUES('#{r[0]}','#{r[1]}','#{r[2]}','#{r[3]}')") end def add_dep(str) r = str.split(" ") print "#{$idx_dep+=1} ";p r $sql.Execute("INSERT INTO OutTable VALUES('#{r[0]}','#{r[1]}','#{r[2]}','#{r[3]}')") end loop do begin case str = $com.gets when /#{HB_ARR_BEGIN}/ $internal = 0.2 is_geting_arr = true $sql.Execute("DELETE from InTable") when /#{HB_ARR_END}/ $internal = 0.2 is_geting_arr = false $idx_arr = 0 when /#{HB_DEP_BEGIN}/ $internal = 0.2 is_geting_dep = true $sql.Execute("DELETE from OutTable") when /#{HB_DEP_END}/ $internal = 10 is_geting_dep = false $idx_dep = 0 else (sleep $interval;next) if !str || str == "" if is_geting_arr add_arr(str) elsif is_geting_dep add_dep(str) else #do nothing! end end sleep $internal rescue =>e puts("ERROR : #{e.message} @ #{Time.now},retry it...") sleep(60) retry ensure #nothing end end
串口操作使用了最原始的system功能,尽管ruby串口的库很多,但是借助
最简单的实现而同样很好的完成目的,不是很美吗?: )