一对轻便小巧的收发器程序(ruby实现)
单位由于安全考虑需要做内外网彻底隔离,在内网有数据库服务器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'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 = falseis_geting_dep = false$idx_arr = 0$idx_dep = 0$interval = 5def 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]}')")enddef 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]}')")endloop do begin case str = $com.getswhen /#{HB_ARR_BEGIN}/$internal = 0.2is_geting_arr = true$sql.Execute("DELETE from InTable")when /#{HB_ARR_END}/$internal = 0.2is_geting_arr = false$idx_arr = 0when /#{HB_DEP_BEGIN}/$internal = 0.2is_geting_dep = true$sql.Execute("DELETE from OutTable")when /#{HB_DEP_END}/$internal = 10is_geting_dep = false$idx_dep = 0else(sleep $interval;next) if !str || str == "" if is_geting_arradd_arr(str)elsif is_geting_depadd_dep(str)else#do nothing!endendsleep $internal rescue =>e puts("ERROR : #{e.message} @ #{Time.now},retry it...") sleep(60) retry ensure #nothing endend
串口操作使用了最原始的system功能,尽管ruby串口的库很多,但是借助
最简单的实现而同样很好的完成目的,不是很美吗?: )