2012-08-09 15 views
2

我是Ruby的新手。 我試圖做一個應用程序,從串行端口讀取並將值放入sqlite3數據庫。當客戶端通過TCP套接字連接時,他應該從db接收值。客戶端寫入的值應該通過串口發送。EventMachine服務器和使用SQL的串口

我有兩個關於我的應用程序的問題。

這將在主線程(?)上打開一個連接到數據庫,每個客戶端一個連接。 有沒有更好的方式來使用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 
+1

你應該考慮的SerialPort有時會崩潰,所以使用某種展開救援結束碼的管理錯誤 – 2012-09-06 22:54:09

回答

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