私はRubyが初めてです。シリアルポートから読み取り、値を sqlite3 データベースに入れるアプリを作成しようとしています。クライアントが TCP ソケット経由で接続する場合、クライアントはデータベースから値を受け取る必要があります。クライアントによって書き込まれた値は、シリアル ポート経由で送信する必要があります。
アプリに関して 2 つの質問があります。
これにより、メイン スレッド (?) でデータベースへの 1 つの接続が開かれ、クライアントごとに 1 つが
開かれます。sqlite3 を使用するより良い方法はありますか?
私はこれを理解したと思います。sqlite3 はデフォルトでスレッドセーフではないので、これがその方法のようです..
recieve_data メソッドでシリアルポートに書き込むにはどうすればよいですか? serial をグローバル変数にしてもいいですか?
#!/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