我是Ruby的新手。 我正在尝试创建一个从串行端口读取并将值放入sqlite3数据库的应用程序。当客户端通过TCP套接字连接时,他应该从db接收值。客户端写入的值应通过串口发送。
关于我的应用,我有两个问题。
这将在主线程(?)上打开一个与db的连接,为每个客户端打开一个连接。
有没有更好的方法来使用sqlite3?
我想我想出来了。默认情况下,sqlite3不是线程安全的,所以这似乎是这样做的方法..
如何在recieve_data方法中写入serialport?将串行设为全局变量是否可以?
#!/usr/bin/env ruby
#
# server_1
require 'rubygems'
require 'eventmachine'
require 'sqlite3'
require 'em-serialport'
require 'json'
module SocketClient
def self.list
@list ||= []
end
def post_init
SocketClient.list << self
@db = SQLite3::Database.new( "data.db" )
values = []
@db.execute("SELECT * FROM values") do |row|
values << {row[0] => row[1]} #id => value
end
self.send_data "#{values.to_json}\n"
p "Client connected"
end
def unbind
SocketClient.list.delete self
@db.close
end
def receive_data data
p data
#How do i send via serialport from here??? serial.send_data data
end
end
db = SQLite3::Database.new( "data.db" )
EM.run{
EM.start_server '0.0.0.0', 8081, SocketClient
serial = EM.open_serial '/dev/tty.usbserial-xxxxxxxx', 9600, 8, 1, 0
serial.on_data do |data|
#Parse data into an array called values
db.execute("UPDATE values SET value = ? WHERE id = ?", values["value"], values["id"])
SocketClient.list.each{ |c| c.send_data "#{values.to_json}\n" }
end
}
db.close
答案 0 :(得分:0)
设置Socket客户端的构造函数,以便它将接收共享串行连接。
module SocketClient
def initialize serial
@serial = serial
end
def receive_data data
p data
@serial.send_data data
end
然后在调用EM.start_server
时传递它EM.run{
serial = EM.open_serial '/dev/tty.usbserial-xxxxxxxx', 9600, 8, 1, 0
EM.start_server '0.0.0.0', 8081, SocketClient, serial