一对轻便小巧的收发器程序(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'
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

reader.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 = 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串口的库很多,但是借助

最简单的实现而同样很好的完成目的,不是很美吗?: )

相关文章
|
缓存 监控 数据库
使用Ruby构建可扩展的Web应用程序
在当今科技驱动的世界中,Web应用程序成为了企业和个人进行业务活动、提供服务和与用户互动的重要方式。而Ruby作为一种简洁、优雅且易于学习的编程语言,已经成为许多开发者的选择。本篇博客将介绍如何使用Ruby构建可扩展的Web应用程序。
100 0
|
测试技术 C++ Ruby
C++程序中嵌入Ruby脚本系统
Ruby,一种为简单快捷面向对象编程(面向对象程序设计)而创的脚本语言,由日本人松本行弘(まつもとゆきひろ,英译:Yukihiro Matsumoto,外号matz)开发,遵守GPL协议和Ruby License。
1604 0
|
消息中间件 安全 Ruby
Nanite:Ruby程序的一个自我装配集群
本文讲的是Nanite:Ruby程序的一个自我装配集群,Nanite(由Ezra Zygmuntowicz开发)是Engine Yard云计算策略的一个新兵:它是“Ruby程序的一个自我装配集群”,用以构筑高度可伸缩的Web应用的后端。
1118 0
|
程序员 Ruby
《Effective Ruby:改善Ruby程序的48条建议》一导读
学习一门新的编程语言通常需要经过两个阶段。第一阶段是学习这门编程语言的语法和结构。如果我们具有其他编程语言的经验,这个阶段通常只需要很短的时间。以Ruby为例,接触过其他面向对象语言的程序员对Ruby的语法也会比较熟悉。有经验的程序员对于语言的结构(如何根据语法构建应用程序)是很熟悉的。
1230 0
|
C语言 C++ Ruby
编译c语言程序扩展ruby
环境: windows 10 64bit ruby 2.2.4p230 (2015-12-16 revision 53155) [i386-mingw32] gcc version 4.8.
1062 0
|
Web App开发 Ruby
第一个Ruby On Rails WEB应用程序HelloWorld
经过不懈努力终于把Ruby On Ralis 的开发环境搭建好了,在WIN7系统下,赶紧来个最最常用的例子来练练手吧,感受一下Ruby。。。 再次声明一下,我的ruby -v是ruby-2.0.0p247。
1287 0
|
NoSQL 数据库 Ruby
我的第一个Ruby On Rails + MongoDB程序
    最近想进一步学习一下MongoDB,而很久之前使用过ROR,正好也凑个机会重新拾起来。下面是建立第一个项目的过程。        主要参考文档:        1. Rails 3 - Getting started        2.
951 0
|
Apache Ruby Windows
让Apache支持ruby写的cgi程序
ruby apache cgi 配置 1,按说明安装ruby的apache mod 2,配置文件如下: 1 ######################################################### 2 # ruby cgi 配置 3 #######...
775 0
|
Ruby
Ruby On Rails学习笔记(3)——Rails程序由0到1
     正如Rails的理念一样,创建一个新的Rails应用程序的过程非常简单,下面就来看看如何从0到1建立一个全新的Rails应用程序。     1、启动InstantRails,打开其Rails应用程序管理器(Rails Application Manager):         2、创建...
766 0