ruby (thread/http)

thread処理の中でカードリーダ読取データを鯖へ送信します。送信済みフラグが’0’のモノを持ってきて、パラメータを組み、鯖へPOST。その後、送信済みフラグを’1’に更新すれば処理は終了です。通信エラー時は送信済みフラグは更新されないので、次回のthreadでリトライする事になります。これで完成。ついでに汎用的に使えるように、鯖系のパラメータやCOMのポート等、定数にマトメマシタ。

require "wincons"
require "wincom"
require 'sqlite3'
require 'net/http'
class INI
@server
@php
@plc
@comm
attr_accessor :server, :php, :plc, :comm
def initialize
@server = "192.168.1.100"
@php    = "/barcode/recv.php"
@plc    = "0001"
@comm   = 5
end
end
$initial_c = INI.new
class BCR
@db
@bcd
def initialize
@bcd = ""
@con1 = Console.new
@com5 = Serial.new
end
def Open
ir = @com5.open($initial_c.comm, 0x1807, 9600, 8, 0, 0, 256, 256)
return ir
end
def Close
@com5.close
end
def main
rc = @com5.receive
if rc != nil
for ia in 0..(rc.length - 1) do
if rc[ia].chr == "\r"
day = Time.now
printf("%s %s\r\n", day.strftime("%Y-%m-%d %H:%M:%S"), @bcd)
$db.execute(sprintf("INSERT INTO BCR01 (INFO01, INFO02) VALUES ('%s', '%s') ",
day.strftime("%Y-%m-%d %H:%M:%S"), @bcd))
@bcd = ""
else
@bcd += rc[ia].chr
end
end
end
ca, = @con1.keyin
if ca == "e" || ca == "E"
return 1
end
return nil
end
end
$db = SQLite3::Database.new('bcr.db')
Thread.start {
while true
day = Time.now
printf("%s -> \r\n", day.strftime("%Y-%m-%d %H:%M:%S"))
Net::HTTP.version_1_2
begin
Net::HTTP.start($initial_c.server, 80) { |http|
rc = $db.execute("SELECT * FROM BCR01 WHERE INFO03 = 0 ORDER BY KEYCD ");
rc.each do |obj|
buf = sprintf("PLC=%s&TIM=%s&COD=%s", $initial_c.plc, obj[1], obj[2])
rc2 = http.post($initial_c.php, buf)
case rc2
when Net::HTTPSuccess
puts rc2.body
$db.execute(sprintf("UPDATE BCR01 SET INFO03 = 1 WHERE KEYCD = %d ", obj[0]))
else
puts "error ..."
end
end
}
rescue Errno::ECONNREFUSED
puts "ECONNREFUSED"
rescue Timeout::Error
puts "TIMEOUT"
end
sleep 60
end
}
b = BCR.new
c = b.Open
if c != nil
print "open error"
end
while c == nil
c = b.main
sleep 0.01
end
b.Close

鎌倉観光 深谷霊園 インターンシップ