2

私は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
4

1 に答える 1

0

ソケット クライアントのコンストラクターをセットアップして、共有シリアル接続を受信できるようにします。

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
于 2012-09-09T02:05:57.090 に答える