使用 SQL 的事件机器服务器和串行端口



我是 Ruby 的新手。我正在尝试制作一个从串行端口读取并将值放入 sqlite3 数据库的应用程序。当客户端通过TCP套接字连接时,他应该从数据库接收值。客户端写入的值应通过串行端口发送。

关于我的应用程序,我有两个问题。

这将在主线程(?)上打开一个与数据库的连接,并为每个客户端打开一个连接。有没有更好的方法来使用 sqlite3?我想我想通了。SQLite3 不是线程安全的 defaul,t 所以这似乎是这样做的方法。

如何在recieve_data方法中写入串行端口?可以将串行设置为全局变量吗?

#!/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

设置 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

最新更新